Arduino a USB

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

Arduino Uno
Tento text popisuje pouze Arduino Uno, které jako první Arduino používá k USB komunikaci ATMega8U2 (případně novější verze ATMega16U2). Starší desky (Duemilanove, Diecimila, …) k tomuto účelu používají FTDI čip, který se přeprogramovat nedá a hlásí se pouze jako sériová linka.

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í.

V pravé části schématu je ATMega328, který je přes UART připojen k ATMega8U2. Ten pak slouží jako UART-USB převodník.
V pravé části schématu je ATMega328, který je přes UART připojen k ATMega8U2. Ten pak slouží jako UART<->USB převodník. Pomocí pinů ICSP1 je možné tento mikrokontrolér libovolně přeprogramovat.

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í:

ICSP konektory a ATMega8U2 na Arduino Uno rev 2.
ICSP konektory a ATMega8U2 na Arduino Uno rev 2. Pozor: V obrázku jsem udělal chybu, čísla ICSP jsou naopak. Vlevo nahoře je ICSP1.

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í.

Uno revize 2 nebo 3 lze přepnout do DFU módu krátkým spojením dvou pinů vlevo na ICSP konektoru.
Uno revize 2 nebo 3 lze přepnout do DFU módu krátkým spojením dvou pinů vlevo na ICSP konektoru.

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í.

Na zadní straně Arduina jsou připravené plošky, na které je potřeba připájet rezistor o hodnotě alespoň 1 kOhm.
Na zadní straně Arduina jsou připravené plošky, na které je potřeba připájet rezistor o hodnotě alespoň 1 kΩ.
Poté co připájíte HWB rezistor stačí krátce spojit RESET se zemí.
Poté co připájíte HWB rezistor stačí 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.

V systémových informacích jednoduše zjistíme, že se Arduino nachází v DFU módu.

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

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.

Články v sérii