четверг, 19 марта 2015 г.

Ардуино

Штука очень симпатичная. Есть плата, к которой "бутербродиком" подключаются платы расширения, причем их полно всяких разных - ethernet, радио, что-то для роботов и т.п.
И есть среда разработки, в которой полно готовых примеров и библиотек для работы с самой ардуинкой и платами расширения. Там используется некий язык processing - по факту это с++ с некоторыми библиотеками и скрытой от пользователя функцией main()
В плату ардуино встроен usb-usart преобразователь, компьютер определяет ее как com-порт. В процессоре уже сидит загрузчик, который позволяет залить свою программу с компьютера без использования аппаратных программаторов.
Все это очень удобно для быстрого старта.

Однако редактор очень уж примитивный  - даже до нотепад++ не дотягивает. Нет фолдинга, нет перехода от ошибок к строчке кода, я уже молчу про автокомплит и подобные фичи.
Ну и программа состоит из 1 файла и библиотек, что не всегда удобно.

На работе для мег я пользуюсь связкой eclipse + scons + avrstudio. Но дома у меня отладчика нет, avrstudio не нужна. Для заливки программы в ардуино воспользуемся avrdude.

Итак, задача минимум - сделать программу вывода "hello world" в порт, построить проект, залить его на плату. Дальше прикрутить eclipse - и уже можно жить.

scons - это аналог make. В отличие от make - это программа на питоне и билд-файл также является программой на питоне, в которой доступны примитивы сконса. Это приводит к некоторым тормозам в процессе выполнения билд-файла, однако открывает широчайшие возможности - нам доступны все возможности языка программирования общего назначения и куча готовых библиотек для питона.

Компилятор и avrdude можно взять из установленной среды arduino, я скачал актуальные версии. avr-gcc у меня 4.9.2, со всей мощью с++11 :)

Сразу перейдем к результату.
Файл Sconstruct очень простой
e = Environment(tools=[(
                    'build', {
               'board':'UNO'})],
                toolpath=["../common"],
                COM='COM8')

e.ObjectH("test.cpp")
e.Libraries(['Ethernet', 'SPI'])

e.Prog('test')


Команда  scons в папке с проектом собирает программу. scons write=1 собирает программу и записывает ее на плату. Также эклипс настроен так, что информацию о путях и макросах он берет автоматически, вызывая тот же scons. Эклипс фактически используется как (очень) продвинутый редактор, все настройки компиляции - через scons.

Основная работа делается в файле build.py. Я выдрал из установленной среды файлы библиотек и ядра - мне так проще с точки зрения последующих модификаций. Также я вручную преобразовал в питоновские структуры информацию о платах из файла boards.txt. Можно было бы пойти по другому пути и сделать разбор файлов среды - брать оттуда ключи компиляции и т.п. - но мне пока это не нужно.

Готовый реп со всем этим добром доступен по ссылке

Комментариев нет:

Отправить комментарий