Série Arduino základy
Pokud jste někdy pracovali s Arduinem, určitě víte, že se tato deska programuje přes USB rozhraní a počítači se hlásí jako standardní sériová linka. Díky tomu se na straně počítače (přesněji řečeno na straně USB Host) dá s Arduinem jednoduše komunikovat oběma směry. Na straně Arduina pak komunikace probíhá skrz třídu Serial
.
V tomto článku bych se chtěl podrobněji podívat na možnosti Arduina jako USB device. Vysvětlím, jak přesně komunikace probíhá a také ukážu, jak změnit Arduino na téměř libovolné USB zařízení (tedy nejenom na sériovou linku, ale třeba na MIDI nebo HID).
Zapojení Arduina
Na schématu níže je vidět zapojení obou mikrokontrolérů Arduina. Ten vpravo je ATMega328, který tvoří srdce desky a který se běžně programuje pomocí Arduino IDE. V levé části schématu je pak vidět ATMega8U2, který obstarává USB komunikaci a hlásí se jako USB device. Oba tyto mikrokontroléry jsou spojeny přes UART rozhraní.
Dále jsou ve schématu ještě ICSP konektory, které mohou být užitečné, pokud chcete některý mikrokontrolér programovat externím programátorem (například pokud chcete změnit bootloader). Fyzické umístění ICSP konektorů na Unu verze 2 je následující:
Pokud máte doma starší Uno (revize 1), pravděpodobně nemáte konektor ICSP1 osazený.
ATMega328 se dá jednoduše přeprogramovat jediným tlačítkem pomocí Arduino IDE. Pro začátečníky je to naprosto vyhovující a dostačující a víc ani vědět nemusí. Občas se ale může stát, že potřebujete přeprogramovat i ATMega8U2 — například chcete aby se Arduino hlásilo počítači jako MIDI zařízení. Nebo chcete aktualizovat stávající firmware tak, aby LED označené RX a TX během komunikace neblikaly, ale svítily (to mě zrovna teď napadlo, nezkoušel jsem to :)). K tomuto je už potřeba více úsilí a nelze to provést z Arduino IDE.
DFU mód
Mikrokontrolér ATMega8U2 (případně 16U2, pokud máte Uno verze 3) má bootloader, který lze přepnout do tzv. DFU módu (Device Firmware Upgrade). Pokud Arduino připojíte k počítači a přepnete jej do DFU módu, je možné přeprogramovat 8U2 přímo skrz USB sběrnici a nepotřebujete k tomu žádný externí programátor.
Postup, jak přepnout Uno do DFU, se maličko liší v revizi 1 a revizi 2 a 3.
Arduino UNO revize 2 a 3
Tyto verze mají osazen ICSP konektor u 8U2 a mají i potřebný rezistor, který spojuje pin HWB (PD7) se zemí. Takže stačí připojit Arduino k počítači a krátce spojit pin RESET se zemí.
Arduino UNO revize 1
Úplně první verze Una ještě nemá osazený ICSP konektor a nemá osazený ani HWB rezistor, takže zde je postup o maličko složitější. Nejdříve je potřeba na zadní stranu připájet HWB rezistor, poté připojit Arduino k počítači a potom krátce spojit RESET se zemí.
V tomto okamžiku by mělo být Arduino v DFU módu. To poznáte například v systémových informacích. V normálním režimu se deska hlásí jako Arduino Uno, v DFU módu se pak hlásí jako Arduino Uno DFU.
Nahrání firmwaru
Jakmile máme Arduino v DFU režimu, nic nám již nebrání nahrát do ATMega8U2 nový firmware. Na operačním systému Windows budete k tomuto kroku potřebovat program FLIP vyvíjený firmou Atmel. Na systémech Linux nebo Mac OS je potřebný program dfu-programmer (v Linuxových distribucích by mohl být v systémových repozitářích).
Na Windows pak již stačí spustit FLIP a nahrát hex soubor s novým firmware. Program dfu-programmer se používá z terminálu následovně:
dfu-programmer at90usb82 flash soubor-s-firmware.hex dfu-programmer at90usb82 reset
Poté již stačí odpojit a znovu připojit USB kabel. V tomto okamžiku už by se Arduino mělo hlásit novým firmware.
Firmware pro Uno
- Originální firmware Una — sériový port.
- HIDUINO — MIDI zařízení.
- Uno Keyboard — HID zařízení (USB klávesnice).
Případně si můžete napsat vlastní firmware s pomocí knihovny LUFA.
Závěr
Na závěr ještě jedno upozornění: jakmile změníte firmware ATMega8U2, již nelze Arduino programovat skrz Arduino IDE. Je tedy nutné nejdříve desku naprogramovat a potom změnit firmware. Při jakékoliv další změně programu je nutné nejdříve nahrát původní firmware a teprve potom programovat. Celý tento postup je dost nešikovný a zdlouhavý.
Jedným možným řešením je vyrobit si desku s ATMega8U2, která bude mít vyveden UART. Ten pak připojíme k pinům 0 a 1 na Arduinu.
Druhou možností je mít externí programátor, kterým se bude Arduino programovat. K tomu může posloužit třeba druhé Arduino.