Пятница, вечер: надо проверить, что двенадцать скетчей из папки проекта всё ещё собираются после переезда на новую машину. В IDE это двенадцать открытий, двенадцать нажатий «Загрузить» и честный риск забыть одно окно открытым. Среда создавалась для работы с одной платой и одним скетчем за раз, и массовые операции — не её жанр. Был и второй сценарий тише: сервер без экрана, куда я захожу по SSH, — IDE там просто нечему запускать, а терминал уже открыт. И бонус, который оцениваешь со временем: команды не зависят от версии среды — заметки двухлетней давности сработали на новой машине без единой правки.
Arduino CLI — та же кухня под капотом: те же ядра, тот же компилятор, тот же avrdude — но управление через команды терминала. Для одиночного скетча это не лучше и не хуже IDE, а для бэкапов, проверки всего проекта одной строкой и автоматики в CI — единственный разумный путь. Сам код в git я держу по уроку про бэкап проектов — здесь добавляем к нему проверку, что всё это ещё собирается. Выбираете среду целиком? Я сравнивал подходы в уроке про PlatformIO. Моё отношение к CLI прошло через скепсис: третий инструмент рядом с IDE и PlatformIO выглядел лишним. Поменял его не любовь к терминалу, а первая автоматизация: строка проверки всех скетчей в pre-commit хуке git — и сломанный скетч больше не попадает в коммит. Для этого не нужны тяжёлые системы сборки, достаточно одного бинарника и одной строки.
Установка: три команды до ядра AVR
Установка короткая на любой системе: на Linux и macOS работает официальный скрипт install.sh из репозитория проекта, на macOS ставится через brew install arduino-cli, на Windows — через scoop или exe-файл из релизов. Проверка одна: команда arduino-cli version печатает номер версии — знак, что бинарник попал в PATH. Конфиг живёт в домашней папке и печатается командой arduino-cli config dump: там видно, какие URL плат добавлены и где лежит sketchbook — по умолчанию папка ~/Arduino, та же, что у IDE. Дальше два шага, ровно как в Boards Manager: обновить индекс плат и поставить ядро.
core update-index подтягивает свежий список плат, core install arduino:avr качает ядро AVR с поддержкой Uno, Nano, Mega и Pro Mini. Это то же ядро, которое качала IDE: в уроке про Boards Manager мы ставили чужую платформу ESP32 по стороннему URL — из CLI делается то же самое, о нём ниже. После установки ядро лежит в собственной папке CLI, и компилятор начинает видеть ваши скетчи. Раз в месяц-другой я повторяю ту же связку командой core upgrade arduino:avr: ядра обновляются, и старая версия со свежим бинарником рано или поздно расходятся.
# Linux и macOS: официальный скриптcurl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh # проверка: печатает версиюarduino-cli version # индекс плат и ядро AVR: Uno, Nano, Mega, Pro Miniarduino-cli core update-indexarduino-cli core install arduino:avr # что видит CLI: порты и подписи платarduino-cli board listПеред первой компиляцией проверьте структуру папки: для CLI скетч — это папка, в которой лежит файл .ino с тем же именем, что и папка, — ./Blink/Blink.ino. Нарушение этого правила даёт отказ компиляции с текстом про несуществующий скетч: самая частая находка при переезде с IDE, где файл мог лежать как угодно. Вторая привычка — шпаргалка в README проекта: команды CLI длинные, и скопировать строку быстрее, чем вспоминать ключ.
Компиляция: fqbn, бюджет памяти и старый Nano
Компиляция без железа — главная команда для проверок: arduino-cli compile --fqbn arduino:avr:uno ./Blink. Ключ --fqbn — полностью квалифицированное имя платы: производитель arduino, ядро avr, модель uno. В ответе приходит строка вида Sketch uses ... bytes (x%) of 32256 bytes maximum: у Uno бюджет прошивки — 32256 байта после вычета места под загрузчик. Проект, собиравшийся в IDE, соберётся и здесь: компилятор и ядро те же самые. Бюджет не абстракция: у меня был проект на 96% флеша, где каждая новая строка Serial.print ставила вопрос, влезет ли — compile отвечает на него до всякой платы. А ключ --warnings all включает предупреждения компилятора в полный голос: IDE по умолчанию молчалива, и часть подсказок всплывает только здесь.
Плата со старым загрузчиком задаётся суффиксом: --fqbn arduino:avr:nano:cpu=atmega328old — это те самые китайские Nano на скорости 57600, и урок про Old Bootloader рассказывает, откуда берётся этот пункт меню. Если проект держит библиотеки в своей папке, добавляется флаг --libraries с путём к ней — CLI берёт библиотеки оттуда в дополнение к стандартным. В CI именно этот флаг спасает, когда репозиторий хранит библиотеки рядом со скетчами. Скорость тоже радует: без окна среды и пересканирования примеров компиляция маленького скетча занимает секунды, и цикл по двенадцати папкам не превращается в обеденный перерыв.
Прошивка и массовая проверка
Заливка повторяет компиляцию плюс адрес порта: arduino-cli upload -p /dev/ttyUSB0 --fqbn arduino:avr:uno ./Blink. На Windows порт выглядит как COM3, и его вписывают так же после -p. Адрес подсказывает arduino-cli board list, и перед заливкой я пробую его всегда: строка с портом и подписью платы стоит дешевле одной догадки. Если upload падает, а порт живой — ищите захватчика: монитор и сторонние терминалы держат порт так же, как в IDE, а у операционки порт один. Почему Serial-канал так ревниво охраняется, объясняет урок про первый монитор порта. Смотреть журнал можно и без IDE: у CLI есть собственный монитор — arduino-cli monitor -p /dev/ttyUSB0 --config 115200 открывает канал прямо в терминале, выход по Ctrl+C.
Массовая проверка — ради чего всё затевалось. Цикл по папкам sketchbook прогоняет компиляцию каждого скетча и печатает упавших: одна строка в скрипте или в CI заменяет час ручных нажатий. У меня она смотрит папку ~/Arduino: for d in ~/Arduino/*/; do arduino-cli compile --fqbn arduino:avr:uno "$d" || echo "FAIL: $d"; done — и молчит, пока всё собирается, а упавших называет по имени папки, так что открывать после прогона нужно один скетч, а не все двенадцать. Для повторяющихся плат я выношу порт и fqbn в начало bash-скрипта: путь меняется в одном месте, а не в десяти командах. Прибавьте сюда ключ --output-dir build у компиляции, и рядом с командой появится готовый .hex: его можно отдать коллеге, зашить внешним программатором USBasp или сохранить артефактом в CI.
Порядок работы у меня сложился такой: скетч пишется в IDE или любом редакторе, собирается и проверяется компиляцией CLI, заливка и просмотр журнала идут из терминала той же строкой. Это не религия, а привычка: IDE удобна для письма кода с подсказками, CLI — для всего, что повторяется и обязано выполняться без вашего присутствия. Терминал пока в новинку? На весь урок понадобится пять команд, и все они уже выше. Настройки при этом не конфликтуют: у IDE и CLI свои копии ядер, переустановка одной не ломает другую, и возвращаться можно в любую сторону.
# компиляция для Uno: в ответе — размер прошивкиarduino-cli compile --fqbn arduino:avr:uno ./Blink # заливка через порт (Linux: /dev/ttyUSB0, Windows: COM3)arduino-cli upload -p /dev/ttyUSB0 --fqbn arduino:avr:uno ./Blink # проверка всех скетчей sketchbook одной строкойfor d in ~/Arduino/*/; do arduino-cli compile --fqbn arduino:avr:uno "$d" || echo "FAIL: $d"; done| Команда | Что делает |
|---|---|
| arduino-cli version | проверка установки: печатает номер версии |
| arduino-cli core install arduino:avr | ставит ядро AVR: Uno, Nano, Mega, Pro Mini |
| arduino-cli board list | список плат и портов: /dev/ttyUSB0 или COM3 |
| arduino-cli compile --fqbn arduino:avr:uno ./Blink | компиляция без железа: размер прошивки в ответе |
| arduino-cli upload -p /dev/ttyUSB0 --fqbn arduino:avr:uno ./Blink | заливка на плату через указанный порт |
| arduino-cli monitor -p /dev/ttyUSB0 --config 115200 | Serial-монитор в терминале: выход по Ctrl+C |
- arduino-cli — те же ядро, компилятор и avrdude, что у IDE, но в командах терминала: путь к CI и массовым проверкам
- Установка: скрипт install.sh, brew или scoop; затем core update-index и core install arduino:avr
- Плата задаётся ключом --fqbn: arduino:avr:uno для Uno, arduino:avr:nano:cpu=atmega328old для Nano со старым загрузчиком
- compile печатает размер прошивки и бюджет Uno в 32256 байт; upload требует порт: -p /dev/ttyUSB0 или COM3
- --output-dir build сохраняет готовый .hex: его шлют коллегам, хранят в CI или шьют внешним программатором
- 1. Что делает arduino-cli core install arduino:avr?
- 2. Какой фрагмент команды задаёт целевую плату при компиляции?
- 3. Чем отличается команда прошивки для китайской Nano со старым загрузчиком?
- 4. Что сообщает строка Sketch uses 924 bytes (2%) of 32256 bytes maximum?
- 5. Зачем arduino-cli в бэкапах и CI?
Частые вопросы по теме урока
- Что делает arduino-cli core install arduino:avr?
- core install скачивает платформу: инструменты сборки, загрузчики и определения плат AVR. Компиляция и заливка — это compile и upload, монитор в CLI живёт отдельно, а Serial-монитор IDE здесь ни при чём. ставит ядро AVR с поддержкой Uno, Nano и Mega
- Какой фрагмент команды задаёт целевую плату при компиляции?
- --fqbn называет плату целиком: производитель, ядро, модель. Порт нужен только upload, --libraries добавляет папку библиотек, --output-dir складывает готовую прошивку. --fqbn arduino:avr:uno
- Чем отличается команда прошивки для китайской Nano со старым загрузчиком?
- Старый загрузчик слушает на 57600, и выбор кодируется суффиксом cpu=atmega328old в fqbn. Отдельного флага скорости у команды нет — всё зашито в имени платы. fqbn меняется на arduino:avr:nano:cpu=atmega328old
- Что сообщает строка Sketch uses 924 bytes (2%) of 32256 bytes maximum?
- 32256 байта — флеш-память Uno за вычетом загрузчика, 924 байта и 2% — сколько занял скетч. Это главный сигнал проверки «влезает ли проект» без всякого железа. размер прошивки и долю от бюджета Uno в 32256 байт
- Зачем arduino-cli в бэкапах и CI?
- Ценность CLI — автоматизация: цикл по папкам sketchbook собирает каждый скетч и называет упавших. Скорость заливки та же — это тот же avrdude, а IDE компилирует прекрасно. цикл из одной строки проверяет компиляцию всех скетчей