Ino — работа с Arduino из командной строки
Хабрадевелоперам, привет!Те, кто работал с Arduino, знает, что для его программирования существует специальная Arduino IDE. По сути это блокнот с двумя кнопками: «прошить» и «послушать через serial». Блокнот подходит для написания маленьких программок-экспериментов, но выбешивает при написании чего-то большего.
Многие привыкли работать в своих любимых Visual Studio, Eclipse, KDevelop и т.п. Я сам — убеждённый фанат Vim’а, окна терминала и кнопок Alt+Tab. Давно хотелось, чтобы сборка проектов для Arduino была такой же простой, как в официальной IDE, а вот их ужасный редактор на глаза больше не попадался. Тем более, что язык «Arduino» несмотря на позиционирование как отдельного, простого языка программирования — это не что иное, как C++. А собирается всё в конечном итоге инструментами avr-gcc.
Для решения проблемы Амперкой был создан Ino.
Предыстория
Мне никогда не было понятно почему Arduino Software была сделана в виде монолитного решения, а не была разбита на 2 слоя: командная строка и UI. Именно это ограничивало возможности работы в любимых редакторах. Непонятно было не мне одному, поэтому народ то и дело делился всяческими Makefile’ами, CMake-скриптами, wscript’ами, SConstruct’ами. Однако всё это было не достаточно универсально, тянуло за собой копипаст между проектами и плохо расширялось.
Я пробовал оформить удобную сборку в виде расширений для SCons и Waf. Обе попытки были удачны в какой-то степени, но в итоге структура проекта и пайплайн сборки оказывались достаточно сложны для того, чтобы можно было кому-то за полминуты объяснить как этим правильно пользоваться.
В итоге решил сделать что-то с крайне простым интерфейсом. Таким же простым как у git, mercurial, svn:
программа что-сделать --как-сделать
Выделив основные действия, которые нужны при работе с Arduino, получилось следующее:
ino init # создать скелет проекта
ino build # собрать бинарник
ino upload # прошить arduino
ino serial # поговорить с ним по serial
Что получилось
Получилось то, что хотелось. Дабы не изобретать велосипед с нуля, для сборки за кадром используется make. Реализовано автоматическое отслеживание используемых библиотек, как и в оригинальном IDE; исходники разыскиваются так же на автомате, без помощи каких-либо xfile’ов в каждой директории.
В общем, совместимость была сохранена по-максимуму, чтобы сделать Arduino IDE и Ino взаимозаменяемыми. Надеюсь инструмент окажется полезен другим. Что думает публика?
комментарии (27)
К сожалению, питона не знаю, но с тестированием с удовольствием помог бы.
Если готовы посодействовать, можно попробовать сегодня-завтра, как будет время.
pipocom что-то я не догадался заюзать, написал простенький чат-велосипедик.
Кстати, вот это, github.com/amperka/ino/blob/master/ino/commands/upload.py#L60, меня вводит в недоумение. Почему разработчики avrdude не могли запихать это в свою утилиту — непонятно. Приходится костылик вставлять.
Позвольте еще за код похвалить: чистенько и понятно.
В avrdude я слыхал это есть в сааамой последней версии, но пока она не у всех — лучше так.
Но по крайней мере теперь оно подробно скажет где производился поиск, должно стать ясно как нужно изменить значение для -d.
Новая версия уже залита.
pip install --upgrade inoСпасибо за репорт.
Сам провел несколько ночей в попытках избавиться от родной IDE, и заодно от препроцесора C++. Обязательно воспользуюсь ino в следующем проекте.
ino serial # поговорить с ним по serialЭто для того, чтобы управлять Ардуино с компьютера? Именно так создаются управляющие софтину для устройств на Ардуино? Только недавно купил, пока не разобрался еще.
Для автоматизации и эффективности берётся язык, с библиотекой для работы по serial и фигачется то, что нужно бинарным протоколом.
Но прототип можно так сделать, ага.
Для того, чтобы не повторяться постоянно достаточно написать конфиг-файл в 2 строки.
И нет в нем параметра -d?
В нём есть любой параметр, только его нужно писать целиком:
arduino_dist = ~/Downloads/Arduino/arduino-0022
Не очевидно, нужно ещё задокументировать
1) в доках параметры с "-", а работает только с "_"
2) Ищет boards.txt, не находит, а потом находит.
anton@eee-fy ~/1 $ ino buildSearching for Board description file (boards.txt) ... FAILED
Searching for Arduino core library ... /home/anton/projects/arduino/ide0022/hardware/arduino/cores/arduino
Searching for Arduino standard libraries ... /home/anton/projects/arduino/ide0022/libraries
Searching for Arduino lib version file (version.txt) ... /home/anton/projects/arduino/ide0022/lib/version.txt
Detecting Arduino software version ... 22
Searching for avr-gcc ... /usr/bin/avr-gcc
Searching for avr-g++ ... /usr/bin/avr-g++
Searching for avr-ar ... /usr/bin/avr-ar
Searching for avr-objcopy ... /usr/bin/avr-objcopy
Searching for Board description file (boards.txt) ... /home/anton/projects/arduino/ide0022/hardware/arduino/boards.txt
Scanning dependencies of src
2) Интересная ботва, попробую воспроизвести