© 2023 DiyTronic

Открыл для себя PlatformIO

На днях много времени потратил на доводку и калибровку 3d принтера. В связи с этим пришлось довольно часто обновлять прошивку принтера. Ну и т. к. в принтере используется плата, совместимая с Arduino, то пользовался я для этого Arduino IDE, что очень неудобно, т. к. постоянно приходилось менять порт подключения. В итоге начал искать как зафиксировать порт в Arduino. Но в итоге я нашёл нечто более удобное, а именно PlatformIO и как раз впечатлением об этой штуке я и хочу поделиться.

Зачем оно?

В общем как я понял это некий репозитарий библиотек, фреймворков и конфигураций для различных типовых отладочных плат. Судя по описанию поддерживается более 200 отладочных плат и около 10 библиотек (включая кстати поддержку BLE чипов от Nordic, что лично меня очень радует)

В общем суть проекта такова — выбираем плату, выбираем фреймворк и всё — остальное оно делает за нас — выкачивает все библиотеки и зависимости, настраивает конфигурацию для разработки кода и заливки его в плату. В общем это просто чудовищное облегчение и избавление от рутины.

Что не так с Arduino IDE

Не может само найти правильный порт. При переподключении устройства и смене нумерации порта начинаются проблемы. Порт меняется в меню (с какой-то задержкой), но при этом он не выбран. В итоге надо постоянно лазить в меню с выбором порта, ждать пока оно обновиться и снова прокликивать, чтоб подключилось. Бесит жутко. Ладно если это нужно не часто, но когда идёт отладка на это уже невозможно не обращать внимание.

Не понимает, что файл изменился во внешнем редакторе. Бывает, что файл прям под рукой и проще открыть и поправить текстовым редактором прям из консоли, чем лезть в IDE и снова искать этот файл и нужную строку кода. Но после этого в IDE файл не меняется, т. е. IDE не следит за содержимым файла. Соответственно все изменения легко потерять.

Нет интеграции с системами контроля версий. На дворе если что 2018 год.

Убогий GUI под Linux. Это конечно проблема Java на Linux-е, но тем не менее. Лучше уж никак чем смотреть на эти корявые менюхи и шрифты без нормального сглаживания.

Установка

Сначала установил из пакетов, но при попытке обновиться командой platformio upgrade получил кучу ошибок на тему, что надо удалить пакет, чего-то там конфликтует и прочие ошибки, поэтому решил ставить родными средствами питона.

Питон тоже слегка заартачился — в общем 3-я версия питона не катит — ставить нужно на вторую. Но у меня оно есть, поэтому особых проблем не испытал.

1
$ sudo pip2 install -U platformio

После этого апгрейд радостно сообщил мне, что у меня последняя версия.

1
2
3
$ platformio upgrade
You're up-to-date!
PlatformIO 3.5.1 is currently the newest version available.

Конфигурация для Marlin-а

О чудо! В корне папки с Marlin-ом обнаружил заветный файлик platformio.ini. А это означает ничто иное как то, что Marlin уже имеет поддержку PlatformIO и конфигурировать ничего не надо. Да и в конфиге по умолчанию уже стоит именно ардуина от моего принтера.

Пробую обновить ардуинские библиотеки.

1
2
3
4
5
6
7
8
9
$ platformio update
Please wait while upgrading PlatformIO...
Platform Atmel AVR
--------
Updating atmelavr @ 1.8.1 [Up-to-date]
Updating toolchain-atmelavr @ 1.40902.0 [Up-to-date]
Updating framework-arduinoavr @ 1.10620.2 [Up-to-date]

PlatformIO has been successfully upgraded to 3.5.1!

Ну и запускаю сборку

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ platformio run
Warning! Ignore unknown `envs_dir` option in `[platformio]` section
[Mon Jan 29 19:08:39 2018] Processing megaatmega2560 (build_flags: -I $BUILDSRC_DIR -fmax-errors=5; lib_deps: U8glib@1.19.1, TMC2130Stepper, Adafruit NeoPixel, https://github.com/lincomatic/LiquidTWI2.git, https://github.com/trinamic/TMC26XStepper.git; board_f_cpu: 16000000L; platform: atmelavr; board: megaatmega2560; framework: arduino)
------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
Converting Marlin.ino
Collected 29 compatible libraries
Scanning dependencies...
Library Dependency Graph ( http://bit.ly/configure-pio-ldf )
|-- <U8glib> v1.19.1
|-- <TMC2130Stepper> v2.1.3
| |-- <SPI> v1.0
|-- <Adafruit NeoPixel> v1.1.5
|-- <LiquidTWI2> #30aa480
| |-- <Wire> v1.0
|-- <TMC26XStepper> #c1921b4
| |-- <SPI> v1.0
|-- <SoftwareSerial> v1.0
|-- <LiquidCrystal> v1.0.5
|-- <SPI> v1.0
|-- <Wire> v1.0
Compiling .pioenvs/megaatmega2560/src/G26_Mesh_Validation_Tool.o
Compiling .pioenvs/megaatmega2560/src/I2CPositionEncoder.o
Compiling .pioenvs/megaatmega2560/src/M100_Free_Mem_Chk.o

....

======= [SUCCESS] Took 12.14 seconds ===========

Просто идеально! Всосало все какие нужно зависимости и собрало проект под моё железо.

Заливаю прошивку

Для заливки прошивки в платформу по умолчанию используем команду

1
2
3
4
5
6
7
8
9
$ platformio run -t upload

...
Looking for upload port...
Auto-detected: /dev/ttyUSB2
Uploading .pioenvs/megaatmega2560/firmware.hex

avrdude: AVR device initialized and ready to accept instructions
...

При этом оно само выкачало avrdude, определило нужный порт и залило прошивку. Сказать, что я удивлён это ничего не сказать. Больше не нужен этот геморрой с переключением портов.

Источники

В общем-то уже после того как это написал нашёл статью на Geektimes о PlatformIO. А так в общем и целом в рунете какой-то информации о PlatformIO не сказать, что много.

Итого

У меня конечно ещё вау-эффект не закончился, но тем не менее хочу сказать, что это просто находка. Рекомендую всем хотя бы попробовать. Лично для меня это удобно тем, что я могу избавиться от использования Arduino IDE (собственно и раньше ничего не мешало, но городить кучу скриптов не было желания) и переключиться на обычный редактор, а код безболезненно собирать PlatformIO.

Планирую попробовать заменить этой штукой makefile-ы в других проектах. Думаю должно получиться.

Ну и уже руки чешутся попробовать использовать PlatformIO для разработки кода под nRF чипы, что вроде как PlatformIO позволяет.

Комментарии