Převodník USB-UART

Vývojová deska s ATMega8U2, verze 1.
Vývojová deska s ATMega8U2, verze 1.

Nedávno jsem se tady zabýval Arduinem a jeho USB částí. Popsal jsem postup, jak změnit firmware mikrokontroléru ATMega8U2 tak, aby se Arduino hlásilo jako jiné USB zařízení. Ve svých pokusech jsem se dostal až do stavu, kdy mě přestalo neustálé programování FW bavit. Navrhl jsem si proto desku, která se chová jako USB-UART převodník a lze spojit s Arduinem. Nakonec se ukázalo, že celé zapojení je mnohem užitečnější a univerzálnější, než jen UART převodník a může dobře posloužit i jako vývojová nebo výuková deska s ATMega mikrokontrolérem.

V následujícím článku bych chtěl tento obvod popsat a nabídnout zde jeho schéma, včetně příkladů použití.

Zapojení

Při návrhu tohoto obvodu jsem se inspiroval USB částí Arduina. Chtěl jsem totiž využít existující kódy, které jsou pro ATMega8U2 a Arduino volně dostupné. Zapojení je velmi jednoduché a obsahuje mikrokontrolér, krystal, resetovací tlačítko, několik diod a USB konektor typu B.

Zapojení USB-UART převodníku s mikrokontrolérem ATMega8U2.
Zapojení USB-UART převodníku s mikrokontrolérem ATMega8U2, verze 2.

Výsledná DPS je oboustranná o velikosti asi 45×45 mm. Pokud nemáte možnost vyrobit si oboustrannou desku včetně prokovů, lze navrhnout i jednostrannou variantu, která ale nemá patice JP1 a ISP1 na kraji a hezky zarovnané pod sebou.

Horní strana DPS.
Horní strana DPS.

Většina vývodů mikrokontroléru není kvůli jednoduchosti výsledné desky použita. Základní myšlenka, se kterou jsem zapojení navrhoval byla jednoduchost používání. Obvod připojím do USB, aplikaci kterou chci ovládat spojím s piny TX a RX na patici JP1 a pak již stačí na straně počítače odesílat data přes virtuální sériovou linku.

Programování

Externí programátor je potřeba pouze k prvnímu nahrání bootloaderu. Lze použít ten z Arduino Uno. Naprogramování  pomocí avrdude:

$ avrdude -p at90usb82 -F -P usb -c avrispmkii \
> -U flash:w:UNO-dfu_and_usbserial_combined.hex \
> -U lfuse:w:0xFF:m \
> -U hfuse:w:0xD9:m \
> -U efuse:w:0xF4:m \
> -U lock:w:0x0F:m

Poté už lze obvod přeprogramovat bez externího programátoru. Stačí zmáčknout resetovací tlačítko, které způsobí, že se obvod přepne do DFU módu a je možné jej přeprogramovat skrz USB. K tomu poslouží program FLIP (Windows) nebo dfu-programmer (Linux a Mac OS). Například na OS Linux připojím desku k USB, zmáčknu reset a v terminálu spustím:

$ dfu-programmer at90usb82 flash soubor-s-novym-firmware.hex
$ dfu-programmer at90usb82 reset
$ dfu-programmer at90usb82 start --quiet

Od tohoto okamžiku se spustí nový firmware.

Firmware si můžete napsat vlastní (použijte knihovnu LUFA) nebo použít existující zdrojové kódy pro Arduino Uno. Několik odkazů je v nedávném článku Arduino a USB v sekci Firmware pro Uno.

Až později mě napadlo, že lze zapojení použít jako plnohodnotnou vývojovou desku s ATMega8U2. V tom případě je její výhoda právě USB a DFU bootloader. Stačí si tak napsat a přeložit svůj kód a pomocí dfu-programmer jej do desky okamžitě nahrát. Nemusíte mít žádný externí programátor. Jednoduchý kód, který bliká LEDkami je např:

#include <avr/io.h>
#include <avr/intertupt.h>
#include <util/delay.h>

static uint8_t rxd = 0;

/**
 * Přerušení časovače Timer1 poslouží
 * k blikání LED RX na portu PD4.
 */
ISR(TIMER1_OVF_vect) {
    if(rxd)
        PORTD |= _BV(4);
    else
        PORTD &= ~(_BV(4));

    rxd = !rxd;
}

int init(void) {
    // Spustíme časovač o frekvenci
    // hodiny/256.
    TCCR1B |=  _BV(CS12); // Prescaler 256.

    // Povolíme přerušení při přetečení Timer1.
    TIMSK1 = _BV (TOIE1);
    sei ();
}

int main (void) {
    init();

    DDRD = 0xFF;
    // V hlavní smyčce budeme
    // blikat s TX LED na portu
    // PD5.
    for (;;) {
        PORTD |= _BV(5);
        _delay_ms(500);
        PORTD &= ~(_BV(5));
        _delay_ms(500);
    }
}

Tento kód přeložíme a nahrajeme na desku například takto (pro OS Linux nebo Mac):

$ avr-gcc -g -Os -mmcu=atmega8u2 -DF_CPU=16000000 -c blink.c
$ avr-gcc -g -mmcu=atmega8u2 -o blink.elf blink.o
$ objcopy -j .text -j .data -O ihex blink.elf blink.hex
$ dfu-programmer at90usb82 flash blink.hex
$ dfu-programmer at90usb82 reset

Nevýhody

První nevýhodou je samotný mikrokontrolér ATMega8U2. Vyrábí se pouze ve dvou variantách TQFP a QFN. Ani jedno pouzdro není zrovna přívětivé pro pájení v ruce. Jde to, ale je potřeba mít na mikropájce kvalitní a malý hrot a pevnou ruku.

Další nevýhodou (na jejíž nápravě momentálně pracuji) jsou výstupní piny. Z desky jsem vyvedl pouze dva pro UART a zbytek nechal nezapojený. V další verzi bych chtěl tuto vadu napravit a vyvést všechny piny mikrokontroléru do dutinkových lišt.

Výhody

Zapojení je kompatibilní s Arduinem, takže lze využít velké množství firmwaru, který je volně dostupný na internetu.

Obvod lze použít jako plnohodotnou vývojovou desku bez nutnosti vlastnit programátor. Můžete se na ní naučit programovat Atmely v jazyce C nebo se naučit pracovat s USB (podívejte se na knihovnu LUFA).

Místo mikrokontroléru ATMega8U2 lze použít i jeho další varianty s více pamětí — 16U2 a 32U2 — nez nutnosti jakkoliv měnit zapojení.

Výroba desky

V kusové výrobě se deska včetně součástek dost prodraží. I v případě, že si desku vyrobíte a osadíte doma (což je docela náročné, chce to pevnou ruku a hodně zkušeností s pájením), pak vás vyjde cca na 300 kč.

Sám bych si chtěl vyrobit ještě pár kusů (hlavně proto, že jsem na desce udělal několik změn a vyvedl více pinů), takže hledám možnost, jak celou výrobu cenově optimalizovat. Pokud by se našlo dostatek zájemců alespoň pro 15 kusů (čím více tím lépe), jsem ochotný udělat přesnou cenovou kalkulaci, objednat součástky a nechat vše vyrobit. Cenu za sériovou výrobu 15 kusů odhaduji (velmi zhruba) na 480kč.

Můj mail znáte, případně zanechte komentář.

Závěr

Schéma a DPS nabízím volně ke stažení (atmega8u2-eagle.zip, ZIP, 280 kB). Můžete se na mě obrátit s případnými dotazy nebo návrhy na zlepšení. Pokud si zapojení vyrobíte a použijete v nějakém projektu, napište mi, rád se podívám a inspiruji :)