войти зарегистрироваться

Амперка

Амперка
хабраиндекс
7,66

Ino — работа с Arduino из командной строки

imageХабрадевелоперам, привет!

Те, кто работал с 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)

  • Ух ты! Здорово! :) Спасибо, Амперка! ;)
  • удобно. вы сами это к vim прикрутили?
    • К vim не прекручивал. Я всегда альт-табился, альт-таблюсь и буду альт-табиться
  • Очень нужная программа. У меня на маке, правда, не запустилось. Могу сразу сказать что для МакОС нужно изменить пути поиска библиотек и прочих файлов на /Applications/Arduino.app/Contents/Resources/Java/
    К сожалению, питона не знаю, но с тестированием с удовольствием помог бы.
    • Стоит все платформозависимые штуки вынести в отдельный файл, затем найти Маковода и гонять через GitHub пока не заработает. С поддержко макоси должно быть минимум проблем. Винда напрягает чуть больше.

      Если готовы посодействовать, можно попробовать сегодня-завтра, как будет время.
  • Я в свое время сваял вот такую штуку: github.com/mdevaev/arduino-cli
    • Круто! Цивильный такой makefile. Вижу по крайней мере один минус: -документация
      • Увы, документацию нет времени писать :-)
        pipocom что-то я не догадался заюзать, написал простенький чат-велосипедик.
        Кстати, вот это, github.com/amperka/ino/blob/master/ino/commands/upload.py#L60, меня вводит в недоумение. Почему разработчики avrdude не могли запихать это в свою утилиту — непонятно. Приходится костылик вставлять.
        Позвольте еще за код похвалить: чистенько и понятно.
        • Спасибо >.<

          В avrdude я слыхал это есть в сааамой последней версии, но пока она не у всех — лучше так.
  • Левая половина сайта пропадает за экраном слева (ширина экрана у меня 1024).
    • Чёрт, и правда. Недоглядел. Буду исправлять.
  • Не находя файлы arduino (у меня в ~ он стоит), грязно ругается (traceback).
    • Можно traceback в личку? Работает ли с `-d ~/your/path/to/arduino-0022`?
      • Отправил. С -d не работает. ino установлено с pip.
        • Дело было в сценарии, когда не находился board.txt. Т.е. ни в стандартных местах, ни по подсказке -d.
          Но по крайней мере теперь оно подробно скажет где производился поиск, должно стать ясно как нужно изменить значение для -d.

          Новая версия уже залита. pip install --upgrade ino

          Спасибо за репорт.
  • Это восхитительно!
    Сам провел несколько ночей в попытках избавиться от родной IDE, и заодно от препроцесора C++. Обязательно воспользуюсь ino в следующем проекте.
  • Подцепить в Qt Creator возможно? Есть плагин?
    • Не пользовался этой средой, но быстрый взгляд на документацию говорит о том, что вы легко можете менять build steps, а следовательно поставить Ino в качестве билдера.
  • ino serial # поговорить с ним по serial

    Это для того, чтобы управлять Ардуино с компьютера? Именно так создаются управляющие софтину для устройств на Ардуино? Только недавно купил, пока не разобрался еще.
    • Ну не совсем так. Это для того, чтобы просто посмотреть чего оно печатает и в ответ, быть может, пару строк послать руками.

      Для автоматизации и эффективности берётся язык, с библиотекой для работы по serial и фигачется то, что нужно бинарным протоколом.

      Но прототип можно так сделать, ага.
  • Неплохо бы еще для upload и serial сохранять на следующий раз -p, -m настройки
    • В текущем проекте, раз уж -d сохраняется.
      • Хм. Нарушение дзена «Explicit is better than implicit». То, что сохраняется -d — это скорее баг, я только после прочтения вашего коммента понял, что это действительно так.

        Для того, чтобы не повторяться постоянно достаточно написать конфиг-файл в 2 строки.
        • А почему inorc не скрытый?
          И нет в нем параметра -d?
          • Потому что опечатка. Номинально читается из ~/.inorc

            В нём есть любой параметр, только его нужно писать целиком:

            arduino_dist = ~/Downloads/Arduino/arduino-0022

            Не очевидно, нужно ещё задокументировать
            • Еще пара глюков:
              1) в доках параметры с "-", а работает только с "_"
              2) Ищет boards.txt, не находит, а потом находит.
              anton@eee-fy ~/1 $ ino build
              Searching 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
              • 1) Заметил, исправляю
                2) Интересная ботва, попробую воспроизвести
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.