Настройка Eclipse для работы с Arduino Uno

Преамбула


У меня дома стоит масляное отопление. Для измерения уровня масла в баке используется допотопный датчик со стрелкой и поплавком на веревке. Принцип работы датчика поражает свой неточностью. Но так как мы с вами живем в далеком будущем, по отношению к моему детству, то мне захотелось сделать датчик, который выполняет следующие условия:
  • Датчик должен быть цифровым.
  • Его показания должны сохранятся для последующей обработки.
  • Данные должны быть доступны для меня всегда и везде.
  • Все устройство должно быть дешевле 200€.
Вот с такой спецификацией я и начал поиск подходящих компонентов. Выбор довольно быстро упал на платформу Arduino. Само железо устраивало меня полностью, но вот среда разработки была просто ужасна. Поэтому было принято решение перейти на Eclipse.

Можно было, конечно, перейти на горячо любимую Visual Studio, но в данный момент я открываю заново для себя линукс, поэтому виндоуса нет в наличии.

Сегодня, я хочу поделиться с вами о том, как настроить Eclipse для работы с Arduino Uno под Ubuntu 10.10.

Что нам нужно


Софт
  • ПК с установленной Ubuntu 10.10
  • Eclipse IDE, я использовал версию 3.5.2
  • C Development Toolkit, я использовал версию 6.0.2
  • AVR Plugins for Eclipse, я использовал версию 2.3.4
  • GNU AVR-GCC toolchain
  • Arduino IDE, я пользовал версию 0022
Железо
  • Arduino Uno
  • USB кабель для плдключения Arduino к компу
  • Свободный USB порт в компьютере.

Установка софта

1.1 Ставим Eclipse, для этого идем в Ubuntu Software Center, вводим в поиске слово «Eclipse», в строчке Eclipse нажимаем кнопку «Install».

Альтернативно можно в терминале написать:
sudo apt-get install eclipse-platform

1.2 Устанавливаем C Development Toolkit. Для этого открываем Eclipse, идем в меню Help, потом кликаем на «Install New Software…».

Открывается окно. В поле «Work with» выбираем страницу «Galileo Update Site».

В поле поиска вставляем строчку «Eclipse C/C++ Development Tools»



Ставим галочку раком левее результата поиска, т.е. напротив строчки »Eclipse C/C++ Development Tools» и жмем Next, потом опять Next, Accept, Finish. После этого супер-комбо, начнется установка CDT. После установки, перезапускаем Eclipse.

1.3 Устанавливаем AVR Plugins. Открываем окошко «Install New Software», кликаем на кнопку «Add…», для ввода адреса откуда брать плагин. Вводим в поле Name «AVR plugins for Eclipse», a в поле «Location» вводим:
http://avr-eclipse.sourceforge.net/updatesite/
и жмем OK. Отмечаем строчку «AVR Eclipse Plugin» и выполняем комбо из шага 1.2. Закрываем Eclipse.

1.4 Установку GNU AVR-GCC toolchain выполняем из терминала. Для этого вставляем в терминал строчку:
sudo apt-get install avrdude binutils-avr gcc-avr avr-libc gdb-avr
Жмем Enter и немного ждем.

Настройка Eclipse

После установки всех нужных плагинов для Eclipse, нам надо настроить AVRDude. Для этого идем в Eclipse, в меню настройки (Window → Prefrences).

Пишем в строке поиска «AVRDude» жмем Enter и видим следующее окно.



жмем кнопку «Add» и добавляем новую конфигурацию для программатора. Для этого в открывшемся окне меняем имя и описание конфигурации (для порядка). Выбираем Arduino в списке «Programmer Hardware (-c)». В поле «Override default baudrate (-b)» выбираем значение 115200 а в поле «Override default port (-P)» должно стоять значение /dev/ttyACM0 (Порт к которому подключен Arduino, может отличатся от моего. Подсмотреть значение порта можно в Arduino IDE).



Жмем OK. Потом еще раз OK.

Создаем проект для Arduino

Для первого проекта нам придется настроить проект ручками. Поэтому я рекомендую создать этот проект как «базовый» проект для Arduino, а потом копировать его по необходимости.

2.1 В Eclipse, идем в меню (File → New → Project…), выбираем «C Project» и кликаем Next.

2.2 Называем дитя, в моем случае ArduinoUno и выбираем тип проекта, у нас должен быть «AVR Cross Target Application«. Кликаем Finish.

2.3 Выбираем наш проект в окне «Project Explorer» и идем менять настройки проекта (Project → Properties). В левой области открывшегося окна находим закладку AVR, разворачиваем ее.

2.4 Кликаем на AVRDude, выбираем конфигурацию программатора (мы создали ее ранее).

2.5 Подключаем Arduino к компу при помощи USB кабеля. Убеждаемся что Arduino включен.

2.6 Слева кликаем на Target Hardware. Справа видим кнопку «Load from MCU», нажимаем ее. MCU Type и частота должны изменится на подходящие к вашему микроконтроллеру. Сверяем тип с надписью на кристалле, если совпадает — хорошо. Если автоматически опознать контроллер не удается, курим описание к железу и выставляем значения руками. В случае с Uno тип опознается как ATmega328P и частота 16МГц.

2.7 Закрываем окно Properties, нажав на OK.

Создаем библиотеку для Arduino Uno

Для каждого проекта с Arduino нам понадобится библиотека ядра. Есть несколько способов ее достать, самый быстрый это вытянуть его из оригинальной среды разработки Arduino. Чем мы сейчас и займемся.

3.1 Стартуем Arduino IDE

3.2 Выбираем наше железо (Tools → Board → …) В данном примере выбираем Arduino Uno.

3.3 Загружаем любой пример кода, например Blink (File → Examples → Basics → Blink).

3.4 Жмем на кнопку Verify

3.5 Теперь идем в папку где лежит нужная нам библиотека. Искать ее надо в папке /tmp/buildXXXXXXXX.tmp/ где XXXXXXXXX — куча цифр. Если таких папок несколько, стираем все директории и goto 3.4

3.6 Переименовываем файл core.a в libArduinoUnoCore.a

3.7 Перетаскиваем файл в наш Eclipse проект и бросаем его туда.

Настраиваем билд

Теперь осталось только сделать несколько настроек для успешного билда и все готово.

4.1 В Eclipse нажимаем Alt + Enter и попадаем в настройки проекта.

4.2 Идем в ветку C/C++ (Build → Settings). В закладке Tool Settings выбираем пункт Additional Tools in Toolchain и ставим галочки напротив
  • Generate HEX file for Flash memory
  • Print Size
  • AVRDude
4.3 Убираем галочку у пункта Generate Extended Listing. Получается вот так:


4.4 Идем в закладку AVR Compiler, кликаем на нее и меняем значение поля Command с «avr-gcc» на «avr-g++».

4.5 Далее идем в ветку AVR Compiler → Directories, добавляем путь где можно будет найти заголовочные файлы к нашей libArduinoUnoCore.a. Нужный нам путь лежит в папке с Arduino IDE. У меня …/arduino-0022/hardware/arduino/cores/arduino/ (многоточие заменить на ваш путь до IDE). Вот этот путь мы и указываем компилятору.

4.5 Далее идем в ветку AVR Compiler → Debugging, выставляем значение Generate Debugging Info на No debugging Info.

4.6 Идем в ветку AVR Compiler → Optimization, выставляем значение Optimization Level на Size Optimizations (-Os)

4.7 В ветке AVR Assembler → Debugging, выставляем значение Generate Debugging Info на No debugging Info.

4.8 В ветке AVR C Linker → General, в поле Other Arguments пишем «--cref -Wl,-gc-sections». Это должно уменьшить HEX файл раза в четыре.

4.9 И последние штрихи в AVR C Linker → Libraries:
  • Добавляем библиотеку «ArduinoUnoCore» в Libraries (-l)
  • Добавляем путь в Libraries Path (-L), в этом проекте «${workspace_loc:/ArduinoUno}«
получается вот так:


Создаем main.c

Ну вот мы и добрались до заветного main файла. Как мы помним из Arduino IDE, там нам надо создать две функции и все работает (setup и loop). В нашем проекте нам надо написать больше кода и я предлагаю просто создать в проекте новый файл с именем main.c (File → New → Source File). И вставить в него следующий код:
/*
* main.c
*
* Created on:     12.01.2011
*
* Basic main file for the Arduino Project.
*/
#include «WProgram.h»
// Global variables
int g_LedPin = 13; // LED on digital pin 13
void setup()
{
  // opens serial port, sets data rate to 9600 bps
  Serial.begin(9600);
  // sets the pin as output
  pinMode(g_LedPin, OUTPUT);
  Serial.println("*******************");
  Serial.println("*  hello world  *");
  Serial.println("*******************");
}
void loop()
{
  digitalWrite(g_LedPin, HIGH);    // set the LED on
  delay(1000);                     // wait for a second
  digitalWrite(g_LedPin, LOW);     // set the LED off
  delay(1000);                     // wait for a second
}
extern «C» void __cxa_pure_virtual()
{
  while(1);
}
int main(void)
{
  init();
  setup();
  //endless loop
  for (;;)
  {
     loop();
  }
  return 0;
}

Вставив код, нам осталось только построить наш проект. Но думаю что с этим вы справитесь сами. И еще, в предложенном варианте, размер HEX файла соперничает с оригинальной средой разработки для Arduino.
Поделиться публикацией

Похожие публикации

Комментарии 29

    0
    Отличная статья. Спасибо автору.

    Я и сам заказал BlackWidow на неделе. Пока прикручиваю SDK к xCode, если не получится Еклипс на очереди.
      0
      Если ни секрет, что собираетесь конструировать?
        0
        Мобильную Выключалку/включалку/мониторилку системы отопления в квартире.
          0
          А, понятно — «умный дом»,
          спасибо за ответ!
      0
      Не понял только, зачем использовать avr-g++ вместо avr-gcc — проект вроде на чистом Си?
        0
        В wprogram.h есть инклюды которые написаны на с++, они не будут компилироваться с gcc. Хотя если функции типа Serial.print не нужны, можно использовать и с компилятор.
        0
        оо хорошая статья, спасибо, давно хотел, но руки недоходили
          0
          а сразу вопрос, почему получился более компактный выходящий HEX?
            0
            Пока еще не разобрался, хотя он меньше на пару байт всего. Думаю настройки для линкера другие в оригинальной IDE.
              0
              просто встречал (в том числе и на хабре) что код получаемый оригинальной де, избыточен сильно…
                0
                я ассемблер еще не смотрел, у меня после настройки линкера код стал меньше… потом пробовал крутить компилятор но он не сильно влияет на размер hexa.
                  0
                  спасибо, значит надо поискать получше… мб и найду чего
                    0
                    А можно вопрос? А что, конкретно, вы пытаетесь найти?
                      +1
                      откуда появляется разница в размере генерируемого HEX
                      robocraft.ru/blog/arduino/116.html
                      вот сдесь пишут под авр процессор с учетом ардуии (если я правильно понял) и получается колосальная разница
                      Компилируем, загружаем в протеус – работает!
                      Сравним размеры файлов :)
                      Ардуиновский Blink.hex весит 2031 байт
                      Наш hex при оптимизации по размеру (OPT = s) по размеру весит 410 байт
                        0
                        А я понял, в Ардуино IDE core библиотека всегда вся содержится в hex файле, а у них может компилируется библиотека вместе с проектом и в hex заносятся только функции которые использовались.
              +1
              Скорее всего в родной среде выключена оптимизация.
                0
                там тоже все, вроде, включено… разница в библиотеке которая линкуется вся в оригинальной IDE.
                  0
                  Исходники есть, покопаюсь.
                +3
                По первой же ссылке в гугле:
                sourceware.org/ml/crossgcc/2003-12/msg00171.html

                Смысл в том, что те функции которые не вызываются, не включаются в исходный бинарник.

                Решил проверить =>
                добавил в свой makefile строчки для компилятора -ffunction-sections и -fdata-sections


                ну и конечно -Wl,-gc-sections для линкера:


                Ну и написал соответственно простенькую прогу с функцией, -gc-sections пока закомментил.
                Откомпилил:


                Раскомментил -gc-sections, откомпилил:


                Добавил вторую функцию, -gc-sections пока закомментил.
                Откомпилил:


                Раскомментил -gc-sections, откомпилил:


                Так же я так понимаю, что --cref тоже должен быть, для построения связей, и определения используемых функций.

                Собственно исходники: Gdocs
                  0
                  спасибо, понял
                0
                О самом устройстве напишите?
                  0
                  О моем сенсоре или об Arduino платформе?
                    +1
                    Про железную составляющую сенсора интересно узнать и про сопряжение с Arduino.
                      +1
                      Напишу, как только соберу все… я сейчас с сетью разбираюсь.
                  0
                  Вот за такие статьи я и люблю Хабр.

                  Кстати, возник вопрос: каким образом скомпилированная программа заливается на Ардуино? В настроеном IDE есть кнопочка? Или автоматом, после билда происходит заливка? Или нужно ручками заливать?
                    0
                    Заливается все с помощью AVRDude, он вызывается автоматом после усешного билда. Ну и кнопочка есть отдельная.
                    0
                    Для владельцев Arduino Duemilanove: чтобы скомпилированный hex-файл залился в контроллер через AVRDude, необходимо в его настройках установить частоту передачи данных 57600 bod (в Eclipse — пункт меню Window -> Preferences -> AVR -> AVR Dude, выбрать свою конфигурацию и нажать Edit, в поле ввода «Override default baudrate» установить значение 57600). С частотой, указанной в статье, возникала ошибка доступа к контроллеру (и при попытке заливки прошивки, и при попытке считать тип контроллера и кварца).

                    Также маленькое дополнение — чтобы не подсвечивалось предупреждение на extern «C» — нужно в самом начале создавать не проект C, а проект C++, и все настройки, которые в статье описаны для компилятора C, устанавливать также и для компилятора C++.
                      0
                      Для Ubuntu 10.04 понадобиться пакет eclipse-pde.
                      У меня Mega 2560. По кнопке «Load from MCU» ругается, что не может распознать ответ. По светодиодам видно, что обмен даными происходит, затем железка перезапускается. Указал вручную «ATmega2560». Жму «билд» получаю:
                      Type unrecognised emulation mode...
                      Пробовал другие значения, в том числе и ATmega328P. Ошибка сохраняется.
                        0
                        Для Mega 2560 нужно выставлять не Arduino в списке "Programmer Hardware (-c)"
                        а Atmel STK500 Version 2.x firmware

                        в command preview получаем:
                        avrdude -cstk500v2 -P/dev/ttyACM0 -b115200 [...part specific options...]

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое