Série Arduino základy
- Čtení a zápis do EEPROM pomocí I²C
- Analogový výstup z Arduina
- Arduino a knihovny
- Vývojové prostředí a programování Arduina
- Arduino a sériová komunikace
- Arduino a přerušení
- Kde sehnat Arduino?
- Arduino a USB
- Arduino na nepájivém poli
Úspěch Arduina a jeho velké rozšíření není jenom díky zajímavému hardwaru, ale především jednoduchému vývojovému prostředí (zkráceně nazýváno Arduino IDE, Integrated Development Environment). IDE obsahuje jednoduchý textový editor a pár tlačítek s jasnou funkcí, takže i začátečník je schopen velmi rychle psát své vlastní programy a nahrávat je do Arduina.
Arduino IDE je psáno v jazyce Java a díky tomu je multiplatformní. To znamená, že lze spustit pod libovolným operačním systémem, pro který existuje Java Virtual Machine. Stručně řečeno to znamená, že můžeme Arduino programovat ze systémů jako GNU/Linux, Mac OS X i MS Windows.
Původ tohoto programovacího rozhraní leží v nástroji Wiring — programovací jazyk, vývojové prostředí a prototypovací deska s AVR mikrokontrolerem a projektu Processing — programovací jazyk a IDE, původně vyvinuté na MIT jako projekt pro výuku programování (mimochodem, Processing lze využít i při práci s Arduinem). Jazyk, který se používá pro psaní programů (v Arduino světě se jim říká sketch) je podobný C a C++.
Používání Arduino IDE je velmi jednoduché a přímočaré. Poté, co vytvoříme požadovaný program (případně stáhneme z internetu) jej jedním tlačítkem přeložíme (spustí se překladač, což je program, který překládá programy z vyšších programovacích jazyků do strojového kódu) a druhým pak nahrajeme přímo do mikrokontroleru na Arduino desce. Začátečník se tak nemusí téměř nic učit a na rozdíl od jiných vývojových platforem jako je třeba AVR Studio od Atmelu, jej nic nezdržuje od vlastní tvorby.
Samotné používání Arduino IDE tak není potřeba nijak zdlouhavě vysvětlovat. I reference jazyka a dokumentace knihoven je volně dostupná na webu. Pojďme se proto podívat na detaily, o kterých se moc nemluví, ale které mohou pokročilé uživatele zajímat.
Podrobnější informace behěm překladu
Tlačítko Verify slouží k překladu sketche. Pokud překlad uspěšně skončí, v dolní části obrazovky se objeví pouze stručná informace o velikosti výsledného programu.
Binary sketch size: 1018 bytes (of a 32256 byte maximum)
Co se ale děje na pozadí? Pokud těsně před zmáčknutím tlačítka podržíte klávesu Shift, získáte veškeré podrobnosti o překladu. Vypisují se informace o tom, co se překládá a s jakými parametry.
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=22 -I/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino /var/folders/KY/KYFgwrOeFhq3vNvZFr1HQ++++TI/-Tmp-/build1810051053490847361.tmp/Blink.cpp -o/var/folders/KY/KYFgwrOeFhq3vNvZFr1HQ++++TI/-Tmp-/build1810051053490847361.tmp/Blink.cpp.o /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-gcc -c -g -Os -w -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=22 -I/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/pins_arduino.c -o/var/folders/KY/KYFgwrOeFhq3vNvZFr1HQ++++TI/-Tmp-/build1810051053490847361.tmp/pins_arduino.c.o /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-gcc -c -g -Os -w -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=22 -I/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/WInterrupts.c -o/var/folders/KY/KYFgwrOeFhq3vNvZFr1HQ++++TI/-Tmp-/build1810051053490847361.tmp/WInterrupts.c.o ... ... Binary sketch size: 1018 bytes (of a 32256 byte maximum)
Zkuste si to třeba na jednoduchém příkladu Blink, který je mezi příklady v každé instalaci IDE. Uvidíte, že se spouští a překládá velké množství souborů — samotný soubor Blink.cpp, soubory použitých knihoven a další soubory, o kterých se zmíním později.
Jednotlivé soubory se překládají do tzv. objektového kódu (přípona .o), který obsahuje strojový kód a další informace. Také se vytvářejí statické knihovny (přípona .a), které se později přilinkují k výslednému binárnímu souboru. Vše je nakonec sloučeno do jednoho spustitelného souboru typu elf (Executable and Linkable Format), ze kterého se úplně na závěr pomocí objcopy vykopíruje strojový kód pro mikrokontroler Arduina. Tento soubor má příponu .hex a pokud jej otevřete v obyčejném textovém editoru, uvidíte množství nul a jedniček. Ty představují sekvenci instrukcí a jejich operandů.
Zdrojové kódy knihoven
V předchozím podrobném výpisu, si lze všimnout množství zdrojových souborů, které se nacházejí v instalačním adresáři IDE. V mém případě se jedná o adresář z instalace pro Mac OS — /Applications/Arduino.app/Contents/Resources/Java/hardware. Pojďme se tam podívat.
Tento adresář obsahuje dva podadresáře — tools a arduino. Prvně jmenovaný obsahuje AVR nástroje potřebné pro vývoj. Jedná se o hlavičkové soubory pro jazyk C, překladač GCC, statické knihovny, manuálové stránky a dokumentaci. Pokud chcete pracovat pouze s Arduinem, nemusí nás obsah tohoto adresáře příliš zajímat. Pokud se ale budete chtít v budoucnu podrobněji zabývat mikrokontrolery AVR, můžete tyto nástroje využít, protože jsou plně funkční i mimo Arduino IDE.
Druhý adresář, tools je pro nás v tuto chvíli mnohem zajímavější. Obsahuje totiž zdrojové kódy bootloaderu, firmware pro ATMega8U2 (v případě Una, které tento mikrokontroler používá pro komunikaci s USB, starší desky používají FTDI čip a tento firmware nepoužívají) a další zdrojové kódy, které se při překladu linkují k našemu programu. Ty nás budou zajímat především. Bootloader a firmware pro USB komunikaci necháme na některý další článek, jelikož se jedná o velmi rozsáhlé a pokročilé téma (které je zároveň velmi málo dokumentované a s vydáním Arduino Uno se vše ještě více zkomplikovalo).
Jsme tedy v adresáři hardware/arduino/cores/arduino/, který obsahuje soubory s příponami .cpp, .c a .h. Pokud alespoň trochu ovládáte jazyk C nebo C++, jistě víte, že první funkce, která je volána ihned po spuštění programu je funkce main(). V programech pro Arduino se ale tato funkce nevyskytuje, místo toto se používají dvě funkce setup() a loop(). Jak je to možné?
Na začátku jsem říkal, že Arduino IDE nepracuje s jazykem C, ale s jazykem, který je mu syntakticky podobný. Rozdíly jsou jen minimální, většinou se jedná o zjednodušení a malé modifikace. Oproti tomu překladač pro AVR (gcc) pracuje s jazykem C. Vývojové prostředí Arduina proto těsně před samotným překladem upraví naše zdrojové kódy tak, aby byly pomocí tohoto překladače přeložitelné. Prakticky to znamená jen velmi malé úpravy, především se includují některé hlavičkové soubory (ty s příponou .h), ostatně můžete se sami přesvědčit v již zmiňovaném souboru Blink.cpp. Tento jednoduchý kód byl doplněn o pár řádků, z nichž nejdůležitější je řádek
#include "WProgram.h"
který dále includuje množství knihoven a definuje spoustu maker. O podrobnější informace odkážu do zdrojových kódů.
Teď již víme, jak je možné překládat Arduino jazyk překladačem GCC, to ale stále nevysvětluje absenci funkce main().
Zpět do adresáře hardware/arduino/cores/arduino/. Odpověď, kterou hledáme se nachází v souboru main.cpp. Celý jeho obsah zabýrá cca 14 řádků:
#include <WProgram.h> int main(void) { init(); setup(); for (;;) loop(); return 0; }
A to je celé. Při překladu a následném linkování našeho programu je přiložen i tento kód. Funkce setup() a loop() již dobře známe — jsou to funkce z našeho programu. Co ale dělá funkce init()? Odpověď je v souboru wiring.c. Tato funkce nastavuje potřebné časovače a jejich frekvence a hlavně, odpojí piny 0 a 1 (značení na Arduino desce, čísla pinů na ATMega328P jsou 2 a 3) od rozhraní USART. Pokud se totiž podíváte na desku Arduina, je u těchto pinů napsáno RX a TX a ze schématu pak zjistíte, že jsou připojeny (přes 1K rezistory) k pinům 8 a 9 (RXD1 a TXD1) na ATMega8U2. Opět připomínám, že se bavíme o desce Arduino Uno, starší desky (jako je například Duemilanove) používají pro USB komunikaci FTDI čip.
Další soubory
Mezi další zajímavé soubory v adresáři arduino/ patří textové soubory programmers.txt a board.txt. Jsou to konfigurační soubory pro nástroj avrdude, pomocí kterého probíhá samotné programování mikrokontroleru na desce Arduina. Prvně jmenovaný soubor definuje různé typy programátorů (například AVR ISP, USBtinyISP, nebo dokonce druhé Arduino) které lze využít pro nahrání kódu. Druhý soubor pak popisuje nastavení různých Arduino desek. Ukažme si například nastavení desky Uno:
uno.name=Arduino Uno uno.upload.protocol=stk500 uno.upload.maximum_size=32256 uno.upload.speed=115200 uno.bootloader.low_fuses=0xff uno.bootloader.high_fuses=0xde uno.bootloader.extended_fuses=0x05 uno.bootloader.path=optiboot uno.bootloader.file=optiboot_atmega328.hex uno.bootloader.unlock_bits=0x3F uno.bootloader.lock_bits=0x0F uno.build.mcu=atmega328p uno.build.f_cpu=16000000L uno.build.core=arduino
Z těchto informací lze vyčíst mnoho zajímavých věcí, které se v dokumentaci téměř neuvádějí (a v diskusních fórech se o nich vedou dlouhé spory). Uno se programuje pomocí jednoduchého protokolu STK500, který používá i programátor STK500 od Atmelu, programuje se rychlostí 115200 Baudů, jsou zde fuses bajty, použitý bootloader a další. Pro běžné používání Arduina není potřeba tohle znát a rozumět tomu, ale pokud plánujete přeprogramovat bootloader, nebo jej úplně obejít (to se často dělá kvůli nedostatku paměti, jelikož bootloader zabírá 0,5 nebo 2 KB drahocené paměti) je nutné to vědět.
Závěr
V popisovaném adresáři lze ještě nalézt další soubory. Ty obsahují bootloader a firmware pro USB komunikaci. Jak jsem ale řekl na začátku, jedná se o rozsáhlé témata, které nechám na jindy.
Tím jsme skončili s popisem toho, co se děje při překladu a programování Arduina, pokud používáte jeho vývojové prostředí. Jak je vidět, spousta špinavé práce se provede automaticky a za normálních okolností není potřeba aby uživatel cokoliv tušil. Pokud ale plánujete nějaký rozsáhlejší projekt, nebo použít Arduino jako vývojovou platformu pro vaše pozdější, finální produkty, je vhodné tyto podrobnosti znát.
Vzhledem k jednoduchosti, s jakou se dá Arduino používat si mnoho lidí ani neuvědomuje, že se nejedná o žádnou magii, ale o obyčejnou desku s mikrokontrolerem ATMega a několika součástkami okolo. Uživatel tak může zahodit Arduino IDE a používat comand-linových programů jako jsou avr-gcc nebo avrdude. Dokonce lze zajít tak daleko, že se Arduino bootloader kompletně přeprogramuje, stejně tak druhý mikrokontroler ATMega8U2 a vytvoří se z desky něco úplně jiného, než je Arduino.