AVR-CDC, ossia un convertitore USB/seriale software

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

Ho letto tre volte il post e adesso cerco di capirlo... =(

Grande Leo!!!! sei riuscito a sfatare il tabù della V-USB anche se c'è da dire che quanto hai realizzato non ha niente a che vedere con gli accrocchi maledetti che avevamo provato finora e che spesso non davano segni di vita; chiarisco che i ringraziamenti sono eccessivi, il mio banale apporto ti ha fatto risparmiare i 5 minuti che avresti perso per arrivarci da solo al piccolo suggerimento dato. :slight_smile:
Critiche? assolutamente no! Alcune considerazioni:
Siamo partiti, cercando di realizzare soluzioni full-service per i nostri stand-alone, con l'idea che gli integrati NOTI di Arduino, FT232RL e ATmega8u2, non erano alla portata di ogni saldatore, anzi solo di qualcuno, per cui abbiamo cercato soluzioni alternative; dopo aver scartato tutti i vari accrocchi personalmente ho realizzato con successo due tecniche: il cavo Nokia col PL2303, perfettamente funzionante, e lo schema con l'MCP2200 (suggeritomi da Astrobeed), che in realtà è un PIC preprogrammato, con la piccola pecca della mancanza del segnale DTR ma che comunque con l'RTS funziona ugualmente.
Entrambi però hanno due difficoltà oggettive: il cavo Nokia è una realizzazioe fattibile SOLO se si trova quello originale (ormai introvabile) che si apre con grande facilità e permette di manipolare facilmente fili e segnali, quello che ho lavorato io era immerso nel silicone ed in più il PL2303 era in contenitore TSSOP, una mezza giornata solo eprché sono ben attrezzato; l'MCP2200, al di là della problematica del DTR è in contenitore SOIC, più facilmente lavorabile, ma che comunque obbliga alla realizzazione di PCB con struttura parziale in SMT (surface mount technology), come ho dovuto fare io per il progetto della barriera IR pubblicato su Elettronica IN.
Quindi ciò che vedo di realmente eccellente non è l'operazione in sé (al di là delle necessarie lodi per la buona riuscita!), perché alla fine un ATmega168 (ma penso che anche l'88 e probabilmente l'8) costa più di un MCP2200, bensì il fatto che d'ora in poi possiamo realizzare una connessione USB-seriale anche su millefori oppure su un PCB monofaccia di facilissima realizzazione.
A Leo, AD MAJIORA!!!

Grandissimo Leo :grin:

Proprio questa mattina stavo cercando di capire cosa potevo usare in economia per realizzare una comunicazione usb/seriale, ho trovato solo schede tipo sparkfun ecc. oppure ic come FT232RL e ATmega8u2, ora vedo di approfondire di più questo progetto...

Grazie

@Federico:
probabilmente la colpa è mia perché sull'onda dell'entusiasmo ho spiegato in maniera spicciola alcune cose, omettendone altre.

@Mike:
il punto è quello, trovare una soluzione hobbistica, cioè alla portata di tutti. Scartato l'Atmega8U2 per evidenti difficoltà nonché eventuali schedine breakout preconfezionate per il costo, l'FT232 non è ancora alla portata di molti, men che meno di me che ho una mano tremula che per fare una riga diritta devo usare un righello :sweat_smile:
L'MCP2200 lo avevo preso in considerazione perché un SOIC si salda benino... si "salda", ecco il problema. Devi farti un PCB, non puoi infilarlo in una breadboard.

Il V-USB è stato per molto la "chimera", ossia quella cosa che sapevi dovesse essere possibile realizzare perché in tanti (compreso Massimo) ne hanno parlato bene e perché sembra impossibile che una cosa non realizzabile abbia tutto questo seguito da tanto.

Secondo me il problema di fondo della V-USB, che deriva poi dall'Avr-Cdc, è che tutti bene o male hanno (secondo il mio modestissimo parere non di elettronico né di elettrotecnico) commesso 2 sbagli fondamentali:

  1. hanno seguito lo schema proposto sul loro sito
  2. hanno realizzato lo schema su breadboard

Lo schema è elettronicamente errato, tempo fa lo disse anche Astrobeed. Al posto quindi di soluzioni economiche ma di scarso successo come l'uso del led per abbassare la tensione, ho preferito usare degli zener. Un altro grosso errore è l'uso del risonatore ceramico su una breadboard: per tutta una serie di disturbi elettrici che la stessa breadboard inserisce sul segnale di clock, la sincronizzazione del segnale USB va a farsi friggere. Siccome il progettista dell'Avr-Cdc suggerisce diversi clock, ho scelto quello da 16 MHz fornito da un buon cristallo, segnale molto più pulito e stabile. L'uso di Linux mi ha facilitato sulla ricompilazione del firmware: mi è bastato modificare il Makefile per avere il firmware compilato per l'168 a 16 MHz.
Sì, si può usare benissimo anche un Atmega48 o 88, d'altra parte lo sketch occupa (se non mi ricordo male) sui 2700 byte. Non ho voluto usare i micro più piccoli proprio perché il Tiny2313 non mi forniva il segnale DTR, che viene usato dall'IDE di Arduino per resettare la scheda.

Quello che più mi ha fatto dannare sono proprio i segnali RTS/DTR. La "precarietà" della breadboard mi ha fatto ad esempio impazzire anche stamattina: siamo troppo al limite circa la precisione del segnale e l'USB sotto questo punto di vista è molto sensibile, basta poco per mandare tutto fuori sincronizzazione col risultato che il sistema non vede il circuito.

Il passo successivo è riportare tutto su 1000fori, per eliminare anche i disturbi della breadboard. Se tutto funziona, siamo a posto: abbiamo un convertitore USB/seriale da pochi euro.

Il circuito vale comunque il tempo che ho perso. La seriale creata è completa quindi come avete visto posso dialogare da e per il computer senza limiti e senza reset: questo grazie anche alla gestione dei segnali RTS/DTR.

Ma hai lo schema elettrico? Codice?
Come faccio a replicarlo - testarlo ? :slight_smile:
Bella li Leo sei un figo

Bel lavoro Leo! Comunque tu dici neanche provare su gli ATtiny45/85, vero? Passi l' assenza dell' autoreset ma troppo imprecisa la frequenza senza un oscillatore esterno, giusto?

Federico:
Ma hai lo schema elettrico? Codice?
Come faccio a replicarlo - testarlo ? :slight_smile:
Bella li Leo sei un figo

Mi associo.
E possibile avere lo sketch e lo schematics?

Paolo.
p.s. Dopo la Mano di DanielaES in foto, abbiamo nel video il Dito di Leo. :grin:
Vi sto conoscendo a pezzi!!

Come dice Mike, nelle prove che abbiamo eseguito all'epoca, infatti anche io avevo provato, i micro non davano alcun segno di vita... Detto questo BRAVO LEO :slight_smile:
Al prossimo incontro porta tutto :wink:

Schema elettrico ancora no. Prima volevo provarlo su 1000fori perché, come ho detto, alle volte questo schema fa ancora dannare. Ma spero che sia come un altro circuito di collegamento USB che ho provato qualche settimana fa: su breadboard non funzionava, su 1000fori va alla prima.

Vedo se riesco a tirar giù uno schemino di massima, pazienta un pochino :stuck_out_tongue:

@tutti quelli che vogliono lo schemino:
vedo se riesco a tirar giù qualcosa, non sono a casa quindi non ho molta libertà d'azione.

@tutti quelli che chiedono il codice:
il codice lo potete scaricare dal link del progetto Avr-cdc che ho messo nel primo post. Modificate il file Makefile che trovate dentro e ricompilate per la vostra MCU e la frequenza usata e poi flashatelo sul micro con la tecnica ISP.

@Devon e Ratto:
escludete a priori gli Attinyx5: a parte le problematiche legate al reset, l'oscillatore interno secondo non è il massimo. Inoltre, come ho detto, non potete gestire i segnali RTS/DTR, che servono per programmare un chip senza dover star lì ad impazzire con eventuali pulsantini di reset.

Dettagli maggiori arriveranno se vedo reale interesse e se il circuito funziona perfettamente anche su 1000fori, nel caso posso scrivere anche una guida.

Ottimo leo :wink:
Però voglio dire che quando Gbm tirò fuori l'argomento con riferimento allo stesso sito, in tanti se lo mangiarono quasi...

Probabilmente anche io... :sweat_smile:
Ma come ho scritto più sopra, l'errore è stato forse di seguire fedelmente quello schema e provare a realizzarlo solo su breadboard.

A risistemarlo un po' per renderlo un po' più "corretto" circa le tensioni in gioco ed a mettere un quarzo come si deve, forse anche lui avrebbe avuto più successo.

PS:
lo schema lo pubblico stasera, mi è venuta in mente una cosa che devo ricontrollare a casa, non sono sicuro di un paio di R che ho messo.

leo72:
Sì, si può usare benissimo anche un Atmega48 o 88, d'altra parte lo sketch occupa (se non mi ricordo male) sui 2700 byte. Non ho voluto usare i micro più piccoli proprio perché il Tiny2313 non mi forniva il segnale DTR, che viene usato dall'IDE di Arduino per resettare la scheda.

Sul primo link riportato dice anche che è possibile usare l'Atmega8, proverò al quanto prima visto che ce li ho a disposizione.
Grazie Leo!!

Pelletta:

leo72:
Sì, si può usare benissimo anche un Atmega48 o 88, d'altra parte lo sketch occupa (se non mi ricordo male) sui 2700 byte. Non ho voluto usare i micro più piccoli proprio perché il Tiny2313 non mi forniva il segnale DTR, che viene usato dall'IDE di Arduino per resettare la scheda.

Sul primo link riportato dice anche che è possibile usare l'Atmega8, proverò al quanto prima visto che ce li ho a disposizione.
Grazie Leo!!

Sì è quello che sostengo io, sono molto simili con l'88, io e te ne sappiamo qualcosa... :wink: Ciao BUD!! XD

Complimenti, a discapito delle solite pernacchie dei vari, ero sicuro che un utente con una marcia in piu' e un po' di passione ce l'avrebbe fatta e avrebbe dimostrato la fattibilità di cdc. Vi ho rotto le scatole due anni e ci siete riusciti :grin:. Spero di poter da questi primi importanti passi fatti da Leo di riuscire a realizzare un usb - i/o, che stampi in serial monitor alcuni input con i Pico85 SMD.

Come potete vedere niente è impossibile :grin:
Leo sei un grande

Sì, vanno bene anche gli Atmega8.
Download:
http://www.recursion.jp/avrcdc/download.html

Scaricate il file CDC-232. Nella cartella /mega48/default ci sono gli hex già precompilati, che dovrebbero essere per clock di 12 MHz. Il Makefile che trovate in quella cartella è il file da modificare per ricompilare per altri micro/clock.
Ah, su Windows dovete scaricarvi anche il driver, che invece su Linux/Mac non serve perché il kernel ce l'ha già di suo.

Qui sotto c'è lo schema che ho usato. L'ho buttato giù "a memoria", perché il circuito non ce l'ho sotto mano, ma dovrebbe essere giusto.
I segnali sono solo 3: reset, Rx e Tx.

gbm:
Complimenti, a discapito delle solite pernacchie dei vari, ero sicuro che un utente con una marcia in piu' e un po' di passione ce l'avrebbe fatta e avrebbe dimostrato la fattibilità di cdc. Vi ho rotto le scatole due anni e ci siete riusciti :grin:. Spero di poter da questi primi importanti passi fatti da Leo di riuscire a realizzare un usb - i/o, che stampi in serial monitor alcuni input con i Pico85 SMD.

Come potete vedere niente è impossibile :grin:
Leo sei un grande

Ciao Gio, grazie dei complimenti. In teoria si potrebbe provare, il rischio è briccare un micro, poi serve un programmatore ad alta tensione. Cmq una cosa è certa: per risultati "certi" (scusa il gioco di parole) meglio usare il mio circuito invece che quello che hanno pubblicato loro. Più componenti ma più possibilità di successo.

gbm:
Complimenti, a discapito delle solite pernacchie dei vari, ero sicuro che un utente con una marcia in piu' e un po' di passione ce l'avrebbe fatta e avrebbe dimostrato la fattibilità di cdc. Vi ho rotto le scatole due anni e ci siete riusciti :grin:. Spero di poter da questi primi importanti passi fatti da Leo di riuscire a realizzare un usb - i/o, che stampi in serial monitor alcuni input con i Pico85 SMD.

Come potete vedere niente è impossibile :grin:
Leo sei un grande

Giovanni, uno dei vari che ha molto pernacchiato sono stato io, ma il circuito di cui tu parlavi all'epoca e molti altri che sono apparsi sul Forum, non funzionano e non funzioneranno mai, se non per una serie di interminabili coincidenze, altrimenti definite culo (pardon). C'ho speso intere giornate di prove e ti assicuro che se una cosa può funzionare io la faccio funzionare (ti invito pertanto a comprare un cavo Nokia cinese, come ho fatto io, e farmi sapere com'è andata).
Quando Leo mi ha parlato di questo circuito e mi ha fatto vedere lo schema originale, può confermartelo lui, ho detto che questa era una cosa seria, ciò nonostante Leo conferma che finché non gli crei un PCB, o almeno non lo monti sui millefori, i problemi ci stanno eccome, e questo tira in ballo le pernacchie di un altro "vario", tale Astrobeed, che ha sempre predicato che questo tipo di sistema era inaffidabile a causa delle criticità dei sincronismi, tant'è vero che avevo manifestato a Leo il dubbio che convenisse lavorare a 12MHz, che è la frequenza universalmente usata per le conversioni USB-seriale. E tutto è talmente vero che Leo stesso si sta tenendo la riserva di terminare il collaudo su millefori; personalmente sono convinto che andrà tutto bene, e rimango dell'idea che i 12MHz siano indispensabili.
Ora mi raccomando non interpretare questo post come polemica personale, solo che tu spalanchi la porta e spari nel mucchio, meglio forse separare i pernacchiatori solo-parlanti da quelli anche-facenti :wink:

Menniti, ma la cosa non era proprio in quei termini, io mi ricordo bocciature solennissime sia riguardo l'utilità sia sulla funzionalità. (ma forse ricordo male :grin: )
Comunque leo adesso ne ha uno funzionante.