Ieri mi sono messo a giocare con l'AVR-CDC, per chi non lo sapesse è un progetto per emulare via software un convertitore USB/seriale.
Il firmware, scritto in un microcontrollore, crea una porta seriale virtuale sul computer, che può essere usata per comunicare con un altro dispositivo a monte del convertitore.
Il sito di riferimento è questo:
http://www.recursion.jp/avrcdc/cdc-232.html
Chi frequenta da un po' questo sito si ricorderà del progetto Metaboard, un Atmega con un bootloader che includeva quella tecnologia per poter sostituire il convertitore esterno (FT232, Atmega8U2, MCP2200) e le critiche mosse al progetto dal punto di vista elettronico. Se vede infatti lo schema dell'Avr-cdc sul sito che vi ho linkato, l'autore usa un modo un po' "barbaro" per adattare i livelli di tensione, sfruttando la caduta di tensione di un led per portare il segnale dei 5V al livello di 3,3V a cui operano le linee D+/D- della porta USB.
Io ho seguito l'approccio usato da Adafruit per il suo programmatore USBtinyISP, usando dei diodi zener da 3,6V con alcune resistenze per limitare la corrente.
Il progetto Avr-cdc è implementabile su diversi microcontrollori, tra cui l'Attiny45/85, l'Attiny2313 e l'Atmega48/88. Ho scartato i primi 2 perché c'erano alcuni problemi di fondo: disattivazione del pin di reset sull'Attiny45/85, impossibilità di gestire le linee DTR/RTS, ecc.. Ho usato invece un Atmega168P che avevo in casa e che stava facendo la polvere perché con questo micro potevo gestire anche le linee DTR/RTS, creando così dispositivo che fosse anche in grado di resettarmi il microcontrollore, operazione necessaria per avviare la programmazione dello stesso via seriale.
Ecco il video dimostrativo:
A sinistra vedete la porta USB montata su 1000fori con i ponticelli che portano i segnali sulla breadboard.
Il primo micro a sinistra è l'Atmega168P. Vedete gli zener e le resistenze di limitazione nonché la R da 1,5K che serve per il pull-up della linea D-. Ho usato un quarzo esterno da 16 MHz perché il risonatore ceramico da 12 MHz sulla breadboard non dà un segnale preciso. Per usare i 16 MHz ho ricompilato il firmware dell'Avr-cdc adattandolo al nuovo micro ed alla nuova frequenza e poi flashandolo sull'168 usando l'Arduino come ISP.
Tra i 2 chip vedete i segnali DTR/RTS collegati in parallelo alla linea che va al pin di reset del microcontrollore da programmare. In serie al segnale DTR c'è un C da 0.1uF, sulla linea RTS una R da 100 ohm: in pratica, la stessa configurazione che c'è anche sull'Arduino 2009, ripresa pari pari dallo schema della scheda (e confermatami anche da Menniti, al quale ho chiesto un piccolo aiuto per via delle sue passate esperienze con la V-usb e l'MCP-2200: grazie Mike!).
Il 328 sulla destra è stato preparato con il bootloader Optiboot 4.4 ed impostato con il suo quarzo esterno. Sul pin 9 ho messo un led di test per verificare che potessi programmare il micro.
Nel video vedete infatti che vario la durata del lampeggio, caricando un nuovo sketch. Per capire che l'emulazione della porta seriale è completa, ho dimostrato nel video anche l'uso bidirezionale della stessa: sul 328 ho caricato Bitlash, un linguaggio interpretato il cui interprete è flashato sul micro e che può essere interrogato anche a runtime. Dopo il flash l'interprete risponde con il suo splash screen iniziale (dimostrazione della direzione micro->PC) ma riceve anche correttamente un comando impartito da terminale (direzione PC->micro).
Attendo commenti e critiche