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

08.04 | 13:22 | Richard | Richard

Prepínať sa do terminálu a spúšťať príkazy kompilácie je otrava. Radšej si to zakomponujeme do iného IDE. A aby to nebolo stále len o Emacse, tak to budem aplikovať v Geany.

Obsah minulej časti + čo je to Makefile?

V minulej časti sme si stručne ukázali, ako využiť arduino-cli na zostavenie a nahratie programu pre (nielen) Arduino z príkazového riadku. S nahrávaním takýmto spôsobom by sme sa ešte zmierili, ale spúšťať kompiláciu, pamätať si čísla riadkov, v ktorých je chyba, a potom tam ručne skákať, to by bol krok späť, s porovnaním s originálnym Arduino IDE.
Ani zadávanie celého príkazu nie je pohodlné, hoci aj s využitím histórie shellu.
Preto si na to spravíme skript - a hoci by mohol byť aj nejaký klasický bash-ový, využijeme na to tzv. Makefile.


Múdra definícia vraví, že: "Makefile je súbor obsahujúci pravidlá a akcie určené na automatizáciu procesu kompilácie a spustenia programov v rámci vývojového prostredia. Tento súbor definuje závislosti medzi zdrojovými kódmi a objektovými súbormi, ako aj príkazy potrebné na kompiláciu a linkovanie programu. Makefile je často používaný v projektoch napísaných v jazykoch C a C++, ale môže byť použitý aj pre iné programovacie jazyky."


Nevýhodou Makefile je trochu odlišná syntax, ktorá je špecificky navrhnutá na definovanie cieľov a akcií, ktoré majú byť vykonané pri kompilácii projektu.
Avšak je možné použiť bash príkazy aj v Makefile súbore, aby sa dosiahla väčšia flexibilita a zložitejšie operácie pri automatizácii kompilácie projektov.

 

Makefile s využitím arduino-cli

Tak si rovno ukážme, ako taký súbor Makefile vyzerá. Je treba poznamenať, že názov súboru musí byť Makefile, s veľkým "M" na začiatku.

 

PROGRAM ?= $(wildcard ./*.ino)

PORT ?= $(shell ls /dev/ttyACM* | /usr/bin/grep -o '/dev/ttyACM.*')

FQBN ?= arduino:avr:uno

ARDUINO-CLI-BIN ?= /home/richard/.arduino15/arduino-cli

kompiler-verify ?= $(ARDUINO-CLI-BIN) compile -b 
kompiler-verbose ?= $(ARDUINO-CLI-BIN) compile -v -b
kompiler-upload ?= $(ARDUINO-CLI-BIN) upload -v -b

### Arduino dosky
#FQBN ?= arduino:avr:leonardo
#FQBN ?= arduino:avr:uno

### IndustrialShields dosky
# napr.:
#FQBN ?= industrialshields:avr:mduino:cpu=mduino42plus
#FQBN ?= industrialshields:avr:ardbox:cpu=ardboxanaloghfplus485
#FQBN ?= industrialshields:avr:ardbox:cpu=ardboxanaloghfplus232


all:
        $(ARDUINO-CLI-BIN) compile -b $(FQBN) $(PROGRAM)

verbose: 
        $(ARDUINO-CLI-BIN) compile -v -b $(FQBN) $(PROGRAM)

upload:
        @echo "Upload >>>"
        @if test -e /dev/ttyACM*; then \
            echo "Zariadenie na $(PORT) pripojené"; \
            $(ARDUINO-CLI-BIN) upload -v -b $(FQBN) -p $(PORT) $(PROGRAM); \
        else \
                echo "Zariadenie na /dev/ttyACM* nepripojené"; \
        fi

fqbn:
        $(ARDUINO-CLI-BIN) board listall


Trochu si to rozoberme:

PROGRAM ?= $(wildcard ./*.ino)
Vytvoríme si premennú PROGRAM, do ktorej si načítame názov súbor s príponou ino (môže byť len jeden taký súbor v adresári s Makefile, inak ho treba explicitne definovať).

PORT ?= $(shell ls /dev/ttyACM* | /usr/bin/grep -o '/dev/ttyACM.*')
ttyACM je systémový súborový symbolický odkaz, ktorý sa používa na komunikáciu s USB zariadeniami pripojenými k počítaču cez sériový port (niekedy je to i ttyUSB, ale to som videl hádam iba raz v živote).

FQBN ?= arduino:avr:uno
Je plný kvalifikovaný názov dosky, ako sme si o ňom hovorili v 2. časti seriálu.

ARDUINO-CLI-BIN ?= home/richard.arduino15/arduino-cli
Je cesta k binárke arduino-cli.

kompiler-verify ?= $(ARDUINO-CLI-BIN) compile -b
kompiler-verbose ?= $(ARDUINO-CLI-BIN) compile -v -b
kompiler-upload ?= $(ARDUINO-CLI-BIN) upload -v -b

Sú len také pomocné premenné, aby sme nemuseli tie reťazce písať celé v neskorších receptoch. Tie sa totiž konštruujú tak, aby boli ľahko upraviteľné práve zmenami premenných.

all, vebose, upload, fqbn
Sú konkrétne "recepty". To časti kódu, ktoré sa vykonajú, ak zavoláme z príkazového riadku príkaz make.
all: sa vykoná, ak je make bez parametrov, verbose, ak je príkaz make verbose atď.


Zásadná informácia: príkazy v rámci receptov musia byť odsadené tabulátorom. Teda nie medzerami!
Dobrý textový editor na to upozorní 😉.


V recepte upload sú tieto zaujímavosti:

A ešte:
V Makefile znamená ?= priradenie do premennej, ale iba ak ešte nebola definovaná. Ak premenná už má hodnotu, nedôjde k prepísaniu. Tento operátor je užitočný na definovanie predvolených hodnôt pre premenné v prípade, že by užívateľ nezadal žiadnu hodnotu.

Volanie make z (nejakého) IDE

Osobne používam roky Emacs, ale poznám aj Geany, ktoré je nenáročné, rýchle a má veľa pluginov a podporuje všakovaké jazyky.

Obr. 0: Info o Geany


V nastavení zostavovania, ak už máme otvorený náš ino súbor - menu Zostaviť ⟶ Nastaviť príkazy pre zostavenie si nastavíme príkazy pre Zostavenie (build, build verbose), Nahratie (upload), a duplicitne môžme i Spustenie (tiež upload). Viď obrázok nižšie.

Obr. 1: Nastavenie príkazov pre zostavenie


Ďalším fotkám stačí len komentár. Ešte dodám, že ak nastane pri kompilácii chyba, tak kliknutie na ňu nás teleportuje na príslušný riadok.

Obr. 2: Prebiehajúca kompilácia v spodnej časti obrazovky

 

Obr. 3: Súbor Makefile v 2. tabe

 

Obr. 4: Geany bez rušivých prvkov so "zbalenými" funkciami


V iných IDE sa to určite nastavuje nejako obdobne. A určite je možné k tomu nastaviť i klávesovú skratku. Napr. ja som si z čias Turbo Pascal-u a Turbo C zvykol mať F9 na kompiláciu.

 

Obsah ďalšej časti

V budúcej časti si ukážeme malú odlišnosť pri práci s Rasperry Pi Pico.