Arduino: Oprava bootloaderu
Co vlastně dělá z Arduina to, čím je? Jedním z klíčových prvků je bezesporu způsob, jakým můžeme desku velmi jednoduše programovat pomocí prostředí Arduino IDE. Stačí ji připojit k USB portu počítače a stisknout tlačítko „Nahrát“, čímž se náš program automaticky přenese do paměti mikrokontroléru. Tento proces je pro uživatele maximálně jednoduchý a nevyžaduje žádné speciální vybavení ani hlubší znalosti nízkoúrovňového programování.
Za touto jednoduchostí se ale skrývá důležitý mechanismus, který celý proces zajišťuje. Při každém resetu mikrokontroléru se nejprve spustí malý program, který po krátkou dobu naslouchá sériové komunikaci a čeká, zda se nepokoušíme nahrát nový kód. Pokud ano, zajistí jeho přijetí a uložení do paměti. Pokud žádný požadavek na nahrání programu nepřijde, předá řízení uživatelské aplikaci. Právě tento speciální program, který toto vše zajišťuje, nazýváme bootloader (či zavaděč).
Bootloader je uložen ve vyhrazené části paměti mikrokontroléru (viz obrázek č. 1), oddělené od prostoru pro běžný uživatelský program. Díky tomu zůstává zachovaný i při standardním nahrávání kódu přes Arduino IDE a umožňuje nám desku opakovaně přeprogramovávat bez nutnosti externího programátoru. Bez bootloaderu by sice Arduino stále fungovalo, ale přišli bychom o jeho hlavní výhodu – jednoduché programování přes USB.
V praxi se nám však může stát, že tato funkčnost přestane fungovat. Arduino přestane komunikovat s počítačem, nahrávání programu končí chybou a běžné kroky, jako je výměna kabelu nebo změna portu, nepomohou. Jednou z častých příčin takového chování je právě poškozený nebo smazaný bootloader.
K jeho poškození může dojít například při přímém programování mikrokontroleru pomocí ISP programátoru, při nesprávně zvoleném typu desky v Arduino IDE nebo při přerušení napájení během nahrávání programu. U některých levnějších klonů Arduino desek se můžeme setkat i s nekvalitně nahraným bootloaderem již z výroby.
V takovém případě musíme bootloader do mikrokontroleru nahrát znovu. To však nelze provést běžným způsobem přes USB, protože právě bootloader je ten, kdo tuto komunikaci zajišťuje. Musíme proto využít tzv. ISP programování (In-System Programming), které umožňuje přímý zápis do paměti mikrokontroleru.
V následující článku si ukážeme dvě základní možnosti, jak bootloader obnovit:
- buď použijeme specializovaný ISP programátor,
- nebo si vystačíme s druhou Arduino deskou, kterou dočasně naprogramujeme jako programátor.
1. Obnova bootloaderu pomocí ISP programátoru
Pokud máme k dispozici externí ISP programátor, jedná se o nejjednodušší a nejspolehlivější variantu. V našem případě můžeme použít například velmi rozšířený USBasp (viz obr. 2).
Výhodou této metody je především její stabilita a minimální nutnost další konfigurace, protože programátor je přímo určený k tomuto účelu.
Postup obnovy bootloaderu
Nejprve si připravíme hardware – připojíme ISP programátor k Arduino desce pomocí ICSP konektoru. Ten je standardně umístěn přímo na desce a slouží právě pro nízkoúrovňové programování mikrokontroleru. Najdeme ho na většině desek Arduino a jeho pinout popisuje obrázek č. 3.
Pokud náš programátor používá jiný typ konektoru, využijeme redukci, typicky z 10pin na 6pin. (viz obrázek č. 4). Rozdíl v zapojení konektoru 6pinového a 10pinového znázorňuje obrázek č. 5.
Jakmile máme vše zapojeno, přejdeme do Arduino IDE. Vybereme si typ desky, ve které budeme chtít obnovit bootloader, což je důležité, protože tím určujeme, jaký bootloader se nahraje – v naší ukázce na obrázku č. 6 jsme zvolili Arduino UNO.
V menu Nástroje nastavíme typ programátoru na ten, který používáme, například USBasp (viz obrázek č. 7). Pochopitelně pokud používáme jiný programátor, musíme použít jeho typ. Tato informace by měla být součástí dodaného programátoru, stejně jako informace, kde lze stáhnout ovladače pro tento programátor – takže pozor na „výhodné“ koupě od prodejců, kteří vám akorát pošlou něco v plastovém pytlíku.
Samotný proces nahrávání bootloaderu spustíme přes volbu Nástroje → Vypálit zavaděč. (viz obrázek č. 8)
Arduino IDE provede všechny potřebné kroky automaticky a během několika sekund by měl být bootloader obnoven. Jestliže vše proběhne v pořádku, máme hotovo. Můžeme odpojit ISP programátor a zkusit do modulu Arduino nahrát program již běžným způsobem přes USB.
Pokud by ani po úspěšném nahrání bootloaderu deska nefungovala, musíme počítat s tím, že problém je pravděpodobně hardwarového charakteru. V takovém případě může být poškozený samotný mikrokontroler nebo USB převodník a oprava bootloaderu nám nepomůže.
2. Obnova bootloaderu pomocí druhé Arduino desky
V případě, že nemáme k dispozici externí programátor, můžeme si pomoci jinou Arduino deskou. Tato metoda je sice o něco pracnější na zapojení, ale jinak je plně funkční a v praxi velmi často používaná.
Postup obnovy pomocí druhé desku Arduino
Nejprve si připravíme Arduino, které bude sloužit jako programátor. Do této desky nahrajeme speciální ukázkový program ArduinoISP, který najdeme přímo v Arduino IDE v sekci Soubor → Příklady → ArduinoISP. (obrázek č. 9)
Tento program není potřeba nijak upravovat, stačí jej standardně přeložit a nahrát do desky, která má sloužit jako programátor.
Po nahrání programu do modulu Arduino, který bude sloužit jako programátor, přejdeme k fyzickému propojení obou desek. Během propojování desek pochopitelně desku programátoru odpojíme od počítače a obě desky k USB nepřipojujeme ani je nijak nenapájíme.
Propojíme odpovídající SPI piny, tedy MOSI, MISO a SCK, a nezapomeneme ani na propojení napájení a země, jak ukazuje následující obrázek č. 10. Na tomto obrázku propojujeme dvě desky UNO pro vypalování bootloaderu pomocí „starého“ zapojení – horní deska je cílová a spodní deska je programátor. Všimněme si žlutého propojení pinu D10 programátoru s RESETem cíle.
„Nové“ propojení
Na novějších deskách řady MKR nelze pro reset použít pin D10, doporučuje se tedy „nově“ použít pin D6. Pochopitelně se musí změnit definice pinu na příslušném řádku v programu ArduinoISP
Makro RESET na řádku 73:
#define RESET 10 změníme na hodnotu 6:
#define RESET 6
| Arduino UNO (programátor) | Arduino UNO (pro zápis) |
|---|---|
| 13 | 13 |
| 12 | 12 |
| 11 | 11 |
| 10 | RESET |
| +5 V | +5 V |
| GND | GND |
Dále ještě uvádíme jiná možná zapojení, která jsme k tomuto tématu na internetu našli. Na obrázku č. 11 vidíme programování modulu Arduino NANO přes jeho ICSP konektor pomocí modulu Arduino UNO.
| Arduino MEGA (programátor) | Arduino NANO (pro zápis) |
|---|---|
| 13 | SCK |
| 12 | MISO |
| 11 | MOSI |
| 10 | RESET |
| +5 V | VCC/VTG |
| GND | GND |
D10–D13 desky programátoru UNO.Na obrázku č. 12 vidíme zapojení, ve kterém modul Arduino MEGA programuje Arduino UNO. Tento typ desky potřebuje elektrolytický kondenzátor 10 µF připojený k RESET a GND s kladným pólem připojeným k RESET. Kondenzátor musí být umístěn po nahrání programu ISP programátoru na programovací desku.
| Arduino MEGA (programátor) | Arduino UNO (pro zápis) |
|---|---|
| 52 | 13 |
| 50 | 12 |
| 51 | 11 |
| 10 | RESET |
| +5 V | +5 V |
| GND | GND |
Napěťové úrovně
Při vzájemném propojování desek Arduino musíme dávat pozor na napěťové úrovně. Rodina desek Arduino zahrnuje zařízení pracující nejen s napětím 5 V, ale i 3,3 V. Pokud nebudeme používat desky shodného typu, ale kupříkladu Arduino UNO s některou z 3,3V desek např. Arduino Mini (3,3V), Due, Zero…, zaděláme si problém. Tyto desky totiž pracují na 3,3 V a pokud bychom na ně přivedli 5 V z modulu UNO, poškodili bychom je. Proto si vždy musíme ověřit, jaké napětí používají obě naše použité desky – deska programátoru a cíle.
Drobný tuning…
Podíváme-li se do programu ISP programátoru, najdete řadu parametrů, které je třeba nastavit podle cílové desky. Tyto parametry jsou však nastaveny specifickým souborem dostupným pro každý bootloader/desku podporovanou softwarem Arduino IDE. Ostatní parametry jsou jasně vysvětleny v komentářích a měly by být měněny pouze tehdy, pokud víte, co děláte.
Program ISP programátoru ale také podporuje tři LED diody, které nám poskytují vizuální zpětnou vazbu o procesu programování. Takže pokud si chceme své zapojení modulu Arduino jako programátoru ještě trochu vylepšit, můžeme se inspirovat následujícím obrázkem č. 13, který ukazuje, jak k modulu Arduino připojit trojici stavových LED.
Zápis bootloaderu
Jakmile máme vše propojeno, nastavíme v Arduino IDE jako programátor možnost ArduinoISP. Pochopitelně předtím nezapomeneme zvolit typ cílové desky, do které chceme bootloader nahrát. To je opět důležité, zejména pokud používáme dvě typově různé desky.
Pro nahrání programu programátoru musíme nastavit typ desky, která bude sloužit jako programátor. Pak ale již nahráváme bootloader přes tento programátor, musí být tedy nastaven typ desky, ve které chceme bootloader přepsat/obnovit. A právě jaký typ bootloaderu se nahraje, se nastavuje také volbou desky.
Samotný proces pak spustíme stejně jako v předchozí variantě přes volbu „Vypálit zavaděč“ – viz obrázek č. 8
Nejčastější problémy a jejich řešení
Při obnově bootloaderu se můžeme setkat s různými chybami a komplikacemi. Nejčastěji se setkáváme se situací, kdy je problém ve špatném zapojení vodičů. Nejde tak ani o samotné propojení, jako o chybný kontakt dupont vodičů zastrčených do pinové lišty modulu Arduino. Stačí jediný špatně připojený pin a komunikace selže. Proto doporučujeme vždy hledat chybu zde a pečlivě zkontrolovat kontakty vzájemného spojení.
Setkáváme-li se s chybovou hláškou typu „invalid device signature“, která většinou znamená špatnou komunikaci mezi deskami nebo špatně zapojené SPI piny, doporučujeme vrátit se o krok zpět a zapojení znovu projít.
Dalším častým problémem je špatně vybraný typ desky v Arduino IDE. Pokud zvolíme jiný model, než odpovídá skutečnému hardware, může dojít k nahrání nesprávného bootloaderu nebo k úplnému selhání procesu. Podobně může problém způsobit zapomenutý program ArduinoISP v programátorové desce.
Praktické rady z praxe
Z vlastní zkušenosti můžeme doporučit používat co nejkratší vodiče, protože dlouhé kabely mohou způsobovat rušení a nestabilní přenos dat. Dále se nám osvědčilo vždy kontrolovat orientaci ICSP konektoru, protože jeho otočení je poměrně častou chybou. Vyplatí se také používat kvalitní USB kabely, protože levné nebo poškozené kabely mohou způsobovat problémy, které se na první pohled tváří jako chyba bootloaderu.
Pokud se rozhodnete pracovat s moduly Arduino často, je investice do jednoduchého ISP programátoru velmi rozumná, protože ušetří spoustu času i starostí.
Závěr
Obnova bootloaderu na Arduino desce není nijak složitá operace, pokud víme, jak na to. Ukázali jsme si dvě základní metody – použití externího ISP programátoru a využití druhé Arduino desky. Obě varianty jsou funkční a záleží především na tom, jaké vybavení máme k dispozici.
Pokud ani po úspěšném nahrání bootloaderu deska nefunguje, musíme počítat s tím, že problém bude pravděpodobně v hardwaru. V takovém případě už je často jednodušší, i s ohledem na dnešní ceny klonů modulů Arduino, zvážit výměnu celé desky.
