Programovanie Arduino (a derivátov) bez Arduino IDE #4
Chceli sme si stručne povedať o Raspberry Pi Pico, ale nakoniec som sa rozhodol povenovať ešte FQBN. A programu v Tcl, ktorý nám tieto FQBN bude generovať.
Obsah minulej časti
V minulej časti sme si ukázali, ako vyzerá taký Makefile pre zostavovanie a nahrávanie programov, nielen pre Arduino.
V ňom máme premennú FQBN, ktorej hodnotu sme zadefinovali viacerými spôsobmi, uvedenými v 2. časti tohto seriálu.
Niežeby to nefungovalo, ale napadlo ma, že by sa to dalo spraviť zase nejako efektívnejšie. A o to nám ide (!), ak by totiž nešlo, mohli sme pokojne ostať pri tom, čo nám ponúka(lo) originálne Arduino IDE.
Shame on me!
Kritika je na mieste. Pretože až do nedávna som si myslel, že najlepším spôsobom, akým zistiť podrobnejšie parametre (ak sú potrebné), ako je to v prípade definície cpu:xxx
pre IndustrialShields, alebo určenie CPU pre rôzne dosky Mega, je "dolovať" to použitím niekoľkých príkazov sed
.
A veru nie!
Podobnú funkcionalitu má i arduino-cli, ak sa vypíšu podrobné informácie o doske, napr.:arduino-cli board details -b arduino:avr:mega
A tieto jeho funkcionality som využil i pri tvorbe skriptu v jazyku Tcl.
Rýchlo o Tcl
Zacitujem zo staršieho blogu, v ktorom som citoval definíciu legendárneho p. Tišnovského:
Tcl, neboli plným názvem Tool Command Language, je interpretovaný programovací jazyk vyvinutý Johnem Ousterhoutem v osmdesátých letech minulého století, který se, podobně jako jeho ideový předchůdce Lisp, snaží z faktu, že je interpretovaný, vytěžit maximum. Příkladem může být skutečnost, že samotný jazyk neobsahuje žádné příkazy pro tvorbu smyček, podmínek ani matematických či logických výrazů – tyto elementy, jež nám na první pohled mohou připadat jako neoddělitelná součást jakéhokoli rozumně použitelného programovacího jazyka, jsou v Tcl řešeny pomocí funkcí, které jako své parametry mohou získávat programový kód (ten například tvoří tělo smyčky či výraz představující podmínku). I z tohoto důvodu bude vlastní popis jazyka velmi stručný, protože obsahuje pouze několik poměrně jednoduchých pravidel pro psaní programů (na druhou stranu to však poněkud mate začátečníky, kteří se kvůli neexistenci speciálních syntaktických pravidel pro výrazy a řídicí příkazy špatně orientují v jinak výborné dokumentaci).
Ak teda chceme vyskúšať skript na generovanie FQBN názov, potrebujeme mať nainštalovaný samotný Tcl. Nepotrebujeme jeho rozšírenia, Tk (Tkinter), alebo UDP, alebo iné.
V debian-like distrách je to klasika: sudo apt install tcl
. V iných nejaká obdoba. \\ S najväčšou pravdepodobnosťou, hraničiacou s istotou, bude Tcl v repozitároch.
Samotný skript
Na gitlab-e umiestenený skript, príznačne nazvaný Arduino FQBN Generator, robí tieto veci:
- v 1. kroku zistí a vypíše zoznam dosiek, ktoré máme nainštalované,
- po zvolení dosky (defacto výrobca) zistí, aké máme jej verzie,
- a po zvolení verzie ešte zistí, či je potrebné ešte upresnenie typu cpu, ak áno, ak je možné si nejaký zvoliť.
- následne vypíše vygenerovaný FQBN a tento uloží do súboru fqbn.txt, na ktorý sa bude odkazovať (upravený) Makefile.
Spustenie skriptu sa doporučuje z adresára, kde máme náš program i Makefile, aby sme vytvorený súbor fqbn.txt nemuseli do neho kopírovať.
Skript spustíme príkazom:tclsh <cesta ku skriptu>/arduino-fbqn-generator.tcl
Čas na galériu:
Obr. 0: Spustenie skriptu a výber z inštalovaných dosiek |
Obr. 1: Výber z variantov tej-ktorej dosky |
Obr. 2: Ak je potrebné, upresnenie typu cpu |
Obr. 3: Vygenerovaný FQBN |
Program je lajdácky a nekontroluje, či zadané číslo z ponuky je v rozsahu reálne zadávateľných. Hádam v nejakej inej verzii, napr. s grafickým interfejsom.
A ešte jedna vec - nepodarilo sa mi úspešne escapovať parametre príkazu awk
, preto so to spravil okľukou, že som výstupy (dočasne) uložil do iného súboru a potom ich načítal ako zoznam, s definovaným oddeľovacím znakom.
Nevravím, že by to nešlo spraviť i v bash-i, ale skripty v ňom už takmer vôbec nepíšem a ktovie, ako si ten poradí so zložitejšími dátovými typmi, ako sú spomínané zoznamy. A možno aj áno, ale zisťovať sa mi to nechcelo.
Každopádne, prípadné otázky zodpoviem (v rámci mojich schopností ☺) alebo zlepšenia rád zapracujem.
V našom Makefile máme iba jednu zmenu: FQBN ?= $(shell cat fqbn.txt)
A čo tie parametre v options.txt
Zostručnený výpis napr. pre RP2040 od Waveshare vyzerá takto:
Board name: Waveshare RP2040 One FQBN: rp2040:rp2040:waveshare_rp2040_one Board version: 3.7.2 Package name: rp2040 Platform name: Raspberry Pi RP2040 Boards(3.7.2) Platform architecture: rp2040 Option: Flash Size flash 4MB (no FS) ✔ flash=4194304_0 4MB (Sketch: 4032KB, FS: 64KB) flash=4194304_65536 4MB (Sketch: 3968KB, FS: 128KB) flash=4194304_131072 4MB (Sketch: 1MB, FS: 3MB) flash=4194304_3145728 Option: CPU Speed freq 133 MHz ✔ freq=133 50 MHz freq=50 100 MHz freq=100 120 MHz freq=120 125 MHz freq=125 Option: Optimize opt Small (-Os) (standard) ✔ opt=Small Optimize (-O) opt=Optimize Optimize More (-O2) opt=Optimize2 Optimize Even More (-O3) opt=Optimize3 Fast (-Ofast) (maybe slower) opt=Fast Debug (-Og) opt=Debug Option: Stack Protector stackprotect Disabled ✔ stackprotect=Disabled Enabled stackprotect=Enabled Option: Debug Port dbgport Disabled ✔ dbgport=Disabled Serial dbgport=Serial Serial1 dbgport=Serial1
Parametre označené "fajkou" ✔ sa predvolene použijú, ak sa nenanúti použitie iných. Ak by sme to požadovali, tak do FQBN sa musí dopísať napríklad toto:rp2040:rp2040:waveshare_rp2040_one:flash=4194304_65536,freq=120,dbglvl=Bluetooth
Odkaz na gitlab
https://gitlab.com/tcl-tk-public/arduino-fqbn-generator
Obsah ďalšej časti
V budúcej časti si hádam ukážeme malú odlišnosť pri práci s Rasperry Pi Pico.
Prílohy
Pre pridávanie komentárov sa musíte prihlásiť.
Tak ma napadla taká blbosť keď som videl titulný obrázok. Čo tak si dať vygenerovať titulný obrázok pomocou AI? Tu je výsledok ;)