Programovanie Arduino (a derivátov) bez Arduino IDE #1
Arduino a jeho vývojové prostredie (IDE) prinieslo zjednodušený proces programovania a nahrávania kódu na dosky Arduino, čo začiatočníkom výrazne pomohlo a otvorilo im svet mikrokontrolérov.
Avšak pre mnohých bolo príliš obmedzujúce.
Pochvala Arduino IDE, CLI
Originálne IDE obsahuje celý rad zabudovaných knižníc a príkladov, ktoré môžu používateľom pomôcť rýchlo vytvoriť projekty bez toho, aby museli písať kód od začiatku. Už v prvých verziách mal integrovaný sériový monitor, zvýrazňoval syntax, umožňoval skákanie na chyby počas kompilácie… a veľa ďalších dobrých vecí.
Verzie označené 1.xx boli programované v Jave, verzia 2.xx, ktorá je pomerne veľkým vylepšením, je naprogramovaná v C++.
Zásadnou zmenou bol pridanie do verzie 1.5x možnosť kompilovania a nahrávania mikrokontrolérov z príkazového riadku.
Niežeby to nešlo aj predtým. Len to bolo ťažsie.
Teoreticky to (vtedy) vyzeralo takto:
- skompiloval sa .ino (zdrojový súbor) pomocou kompilátora avr-gcc (príklad pre Arduino Uno):
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o out.o <súbor>.ino
- potom sa zlinkoval out.o a vytvoril sa spustiteľný súbor .elf (ak bolo viacej zdrojákov, napr. knižnice,…, tak sa muselo zkompilovať a zlinkovať všetko):
avr-gcc -mmcu=atmega328p out.o -o out.elf
- potom sa vytvoril .hex súbor:
avr-objcopy -O ihex -R .eeprom sketch.elf out.hex
- a ten sa nahral pomocou avrdude do mikrokontroléra:
avrdude -p atmega328p -c arduino -P /dev/ttyUSB0 -b 115200 -U flash:w:out.hex:i
Na internete a fórach sa objavovali Makefile súbory, ktoré to automatizovali, napr. známy arduino.mk
Arduino IDE toto plne automatizovalo, zjednodušovalo, človek si len vybral procesor (dosku), port, "klik, klik", a bolo "vymaľované".
No ale samozrejme mnohí nad jednoduchým Arduino IDE ohŕňali nos. Chýbali im také veci, ako dokončovanie kódu, nápoveda, folding (zbaľovanie) funkcií, a keď človek používal iné IDE, kde mal už svoj zažitý workflow, tak bol dosť neobratný.
Zrejme si to uvedomovali i autori Arduino IDE už na začiatku, pretože už v prvých verziách bola možnosť, že kód sa editoval v inom programe a Arduino IDE sa používalo na kompiláciu a upload. Nefungovalo to dobre, ehm, upload šiel, ale kompilácia… čitateľ si vie predstaviť, že pri chybe počas kompilácie bolo potrebné skočiť do druhého IDE a ručne prejsť na konkrétny riadok a opraviť to.
Od verzie 1.5x došlo k zásadnému zlepšeniu. Táto verzia pridala možnosť kompilácie a nahrávania z príkazového riadku. Robilo sa to takto nejako:arduino --upload [resp. --verify] --board arduino:avr:uno <program.ino>
Toto bolo perfektné, aj keď trochu pomalé. Ale dalo sa to dať do Makefile a iné IDE (skúsenosť mám len s Emacsom), vedelo výstup z kompilácie spracovať.
A hneď som to aj, počas písania tohto textu, vyskúšal, starú verziu (asi 1.8.14) mám stále na disku. Pomocou klávesovej skratky alebo príkazu (alebo klikaním, keď máme čas), je možné skákať na riadok s výskytom chyby.
Obr. 1: Chýbajúca ; a chybové hlásenie |
Arduino IDE 2.xx, arduino-cli
Vo februári 2021 bolo publikované vylepšené IDE, vo verzi 2.00. Toto prinieslo niekoľko dobrých a užitočných vylepšení, námatkou spomeňme:
- vylepšený výkon - rýchlejšia celková odozva,
- lepšia kompatibilita - podpora viacerých platforiem, ale najmä:
- vylepšený editor kódu s:
- údajne (lepším) zvýrazňovaním syntaxe,
- automatickým dokončovanie,
- folding funkcií,
- nápovediu,
- kartami (tabmi = lepšia práca s viacerými súbormi súčasne).
A možno aj viac. Ale podstatou vecou bolo, že kompilácia/nahrávanie je postavené na rozhraní "Arduino CLI".
Aha, ešte sme nepovedali, čo to to arduino-cli vlastne je.
Arduino-cli je nástroj pre príkazový riadok, ktorý umožňuje kompilovať, nahrávať a spravovať knižnice (a dosky) Arduino (a iné) bez potreby prostredia Arduino IDE.
Wait! Ako je to teda?
No jednou z jeho výhod je aj to, že môže bežať ako server, v daemon režime.
Ale - arduino-cli nepotrebuje Arduino IDE, avšak potrebuje avr-gcc
a avrdude
. Ale kompiláciu, nahrávanie zjednodušuje, lebo to (voľajako) zastrešuje.
Tak tu už láskavého čitateľa pletiem! Čo je teda potrebné?
Aby som to ozrejmil a očistil:
Máme v súčasnosti tri možnosti (podobne, ako tie tri ondatry, ktoré plávali po…, ale to je o inom 😉):
- Použiť Arduino IDE, ktoré má v sebe kompilovanie a nahrávanie zabudované (do verzie 2.xx vlastnými procedúrami, od verzie 2.xx sa spolieha na arduino-cli). Toto všetko je dostupné out-of-box, človek nemusí kompilátor alebo samotné arduino-cli sťahovať a instalovať, všetko je to v jednom balíku.
- Stiahnuť a použiť Arduino IDE, a osobitne arduino-cli a potom používať iba arduino-cli a obľúbené IDE. Lebo, ako hovorí názov blogu, o toto sa snažíme.
- Stiahnuť si arduino-cli a potrebné nástroje ako avr-gcc, avr-g++, a iné. A samozrejme definície dosiek. Všetko ručne.
Riešenie č. 2 je najjednoduchšie. Pretože pomocou Arduino IDE môžeme jednoducho inštalovať nové dosky, knižnice. Hlavne s tými doskami je to "opruz", pretože musia byť v správnych adresároch,… viac o tom nižšie.
Pod ostatnými doskami myslím všetky deriváty arduín, ktoré nie sú v základnej inštalácii Arduino IDE. Tie, ktoré sa inštalujú cez Board Manager-a.
Napríklad:
- Arduino UNO Wifi,
- dosky s 32-bitovým ARM Cortex-M3 alebo M0+,
- Arduino Nano BLE,
- Arduino Nano RP2040,
- Arduino (featuring Finder) OPTA,
- Arduino UNO R4,
- Raspberry Pi Pico (veru, aj to!),
- Industruino,
- IndustrialShields,
- dosky založené na ESP32,
- a veľa iných.
Len pripomeniem, že URL adresy neoficiálnych dosiek sa pridávajú v Súbor → Nastavenia.
Obr. 2: Zadávanie URL neoficiálnych dosiek |
A tieto dosky sa sťahujú a ukladajú do ~/.arduino15/packages
.
Ja osobne používam (okrem originálnych dosiek) najmä tieto:
- Raspberry Pi Pico 2040,
- IndustrialShields - pretože sme distribútor týchto PLC automatov (https://www.industrialshields.com/) a hodne ich používame.
Ako sú definované dosky, ako ich získať a ako s nimi pracovať?
Všetko budem ukazovať na doskách IndustrialShields.
Ak sa pozrieme na štruktúru definícií dosiek, vidíme (posledná verzia 1.1.43, len do úrovne 2 podadresárov)
~/.arduino15/packages/industrialshields/hardware/avr/1.1.43 │ ├── bootloaders ├── cores │ └── industrialshields ├── libraries │ ├── DALI │ ├── EEPROM │ ├── Ethernet │ ├── Ethernet2 │ ├── GPRS │ ├── LoRa │ ├── RadioHead │ ├── RS232 │ ├── RS485 │ ├── RTC │ ├── SoftwareSerial │ ├── SPI │ ├── Utils │ ├── WifiModule │ └── Wire ├── package.json ├── platform.txt ├── programmers.txt └── variants ├── ardboxanalog ├── ardboxanaloghf ├── ardboxbasic ├── ardboxrelay ├── ardboxrelayhf ├── mduino ├── mduinoplus ├── mduinorelay └── spartan
A ešte sa pozrieme na ~/.arduino15/packages/industrialshields/tools
~/.arduino15/packages/industrialshields/tools │ ├── arduinoOTA │ └── 1.3.0 │ └── bin ├── avrdude │ └── 6.3.0-arduino17 │ ├── bin │ └── etc └── avr-gcc └── 7.3.0-atmel3.6.1-arduino5 ├── avr ├── bin ├── include ├── lib ├── libexec └── x86_64-pc-linux-gnu
Vidíme, že pri inštalácii dosiek IndustrialShields sa nám stiahli potrebné verzie avrdude a avr-gcc. Tým sa celá inštalácia zväčšuje, ale na druhej strane, nemusíme sa starať o nejaké závislosti.
Podľa môjho názoru, je najjednoduchšie mať nainštalované prostredie Arduino IDE, cez neho nainštalovať dosky (a event. knižnice), a osobitne si stiahnuť arduino-cli.
Bližší pohľad na definície jednotlivých dosiek nám povie, že je tú sústava definícií a konštánt. Zjednodušene sa dá povedať, že zariadenie, ktoré má arduino v srdci - a je jedno, či je tam vložená konkrétna arduino vývojová doska (typicky Industrialshields), alebo nejaká custom-made s Atmel čipom (typicky Industruino) - stále má vstupno/výstupné obvody nejakými spôsobmi tieto pripojené na vývody Atmel (a iných) čipov. A definície zachytávajú tieto mapovania tak, aby ich užívateľ nemusel ručne definovať.
Napríklad je tam niečo také:
#elif defined(ARDBOX_ANALOG_HF_PLUS_RS485) || defined(ARDBOX_ANALOG_HF_PLUS_RS232) #define PIN_I0_0 (2) #define PIN_I0_1 (29) #define PIN_I0_2 (24) #define PIN_I0_3 (26) #define PIN_I0_4 (23) #define PIN_I0_5 (22) …
Takže ak v programe referujeme pin I0_1, reálne sa používa Arduino Pin č. 29.
Rýchly náhľad do dokumentácie:
Obr. 3: Úsek z návodu z PLC Ardbox Analog HF+ |
Súčasťou týchto definícií dosiek sú aj dodatočné knižnice, napr. na prácu s priemyselnými protokolmi (napr. RS485, LoRa), mapovaním analógových signálov (pretože PLC pracuje s určitými priemyselnými štandarmi, ako 24 VDC, 0 - 10 VDC, 4..20 mA); ďalej sú tam príklady,…
Ručné získanie týchto dosiek a ich umiestnenie
Výrobca zariadení to publikuje vo forme json súboru, v ktorom sú opisy a linky na stiahnutie, ktoré využíva Board Manager. Konkrétne u IndustrialShields je súbor umiestenený na webe:
http://apps.industrialshields.com/main/arduino/boards/package_industrialshields_index.json
Konkrétne pre verziu 1.1.43 v package_industrialshields_index.json
nájdeme:
{ "name": "industrialshields-avr", "architecture": "avr", "version": "1.1.43", "category": "Contributed", "help": { "online": "https://www.industrialshields.com" }, "boards": [ { "name": "ARDBOX family" }, { "name": "ARDBOX DALI family" }, { "name": "ARDBOX GPRS family" }, { "name": "ARDBOX LoRa family" }, { "name": "ARDBOX WiFi/BT family" }, { "name": "M-Duino family" }, { "name": "M-Duino DALI family" }, { "name": "M-Duino GPRS family" }, { "name": "M-Duino LoRa family" }, { "name": "M-Duino WiFi/BT family" }, { "name": "Spartan family" } ], "archiveFileName": "industrialshields-boards-avr-1.1.43.tar.bz2", "url": "https://apps.industrialshields.com/main/arduino/boards/industrialshields-boards-avr-1.1.43.tar.bz2", "toolsDependencies": [ { "packager": "industrialshields", "name": "avr-gcc", "version": "7.3.0-atmel3.6.1-arduino5" }, { "packager": "industrialshields", "name": "avrdude", "version": "6.3.0-arduino17" } ], "size": 502142, "checksum": "SHA-256:729c1a19b467386c058bbcab5f7a7994a426b8f5e9630724b5ad288de3224e7f" },
Ak si teda stiahneme https://apps.industrialshields.com/main/arduino/boards/industrialshields-boards-avr-1.1.43.tar.bz2 a rozbalíme, dostaneme identickú adresárovú struktúru, ktorú by sme nakopírovali do ~/.arduino15/packages/industrialshields/hardware
.
Všimnime si ešte, že v json-e je i sekcia "toolsDependencies"
. Tá hovorí, aké verzie avr-gcc a avrdude sú doporučované. A niekde nižšie v onom súbore sú linky na stiahnutie konkrétnych verzií, napríklad:
"tools": [ { "name": "avr-gcc", "version": "4.9.2-atmel3.5.3-arduino2", "systems": [ { "size": "27400889", "checksum": "SHA-256:77f300d519bc6b9a25df17b36cb303218e9a258c059b2f6bff8f71a0d8f96821", "host": "arm-linux-gnueabihf", "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino2-armhf-pc-linux-gnu.tar.bz2", "url": "https://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino2-armhf-pc-linux-gnu.tar.bz2" },
Ak si tieto stiahneme, rozbalíme, nakopírujeme do ~/.arduino15/packages/industrialshields/tools/avr-gcc/7.3.0-atmel3.6.1-arduino5/
, tak dostaneme presne to, čo vlastne robí onen Board Manager.
Takže ide to aj takto ručne. A týmto sa úplne zbavíme Arduino IDE. Je len na nás, čo nám vyhovuje viac.
Ja osobne si sťahujem a zálohujem priečinok ~/.arduino15
. V ňom mám i stiahnutú binárku arduino-cli, na ktorú mám potom symlink. Takže ak migrujem na iný počítač, zoberiem si so sebou len tento jeden adresár a obľúbené IDE.
Arduino-cli si stiahneme na https://arduino.github.io/arduino-cli/0.35/
Mám ich na gitlab-e: https://gitlab.com/arduino91/arduino-is-avr_esp-boards, aj s postupom. Ale zbalené súbory sú hostované na mega.nz, pretože gitlab má problém s max. veľkosťou jedného súboru. Alebo je tam iný zádrheľ, nepamätám sa presne.
Obsah ďalšej časti
V ďalšej časti si ukážeme, ako pracovať s arduino-cli a ako to implementovať do iného IDE. A v tom je to najväčšie čaro - používanie nástroja, ktorý nám "padol do ruky", ktorý používame aj v iných situáciách a ktorý si vieme dostatočne prispôsobiť.
Pre pridávanie komentárov sa musíte prihlásiť.
Tak toto ma zaujíma. Som rád, že si sa do toho pustil. Alespoň sa mi v tom urobí jasno.
Mozno je lepsie Arduino co najskor preskocit a ist rovno na ESP32 s ESP-IDF... hlavne ked uz je niekto Linuxak a vie programovat.
V podstate sa tu jedna o náhradu Aduino IDE → iné IDE, v konečnom dôsledku. A pomocou Wiring jazyka sa dajú programovať aj iné kontroléry,…
Navyše, svet Arduino-like zariadení, certifikovaných a oskúšaných v priemysle, aj keď to pred 20-mi rokmi znelo ako utópia, je veľmi živý a aktívny.
Nechcem si vopred prihrievať polievočku, navyše všetko sa môže ešte n-krát zmeniť, ale o tom budem/chcel by som mať prednášku (čiastočne pokračovanie prednášky z roku 2019) v rámci konferencie OSSConf, 2.-4. júla, na pôde Žilinskej univerzity. A teda nielen o tom.
A ešte jedna vec - svet mikrokontrolérov, SBC a podobných zariadení je neuveriteľne dynamický a rýchly. Ale ak človek obsiahne nejakú technológiu viac, vybuduje na nej nejaké zariadenia, tak neskočí okamžite po novej. Veď len učenie nového, úprava okolitých DPS,… to je veľmi prácna vec.
A to nehovoriac o kvantu komunikačných nástrojov, od priemyselných klasík, až po Dali, SigFox,… Človek za tým objektívne nestíha.