Programovanie Arduino (a derivátov) bez Arduino IDE #4

14.04 | 08:57 | Richard | Richard

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:

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