Leonardo e USB

Buonasera, ieri si è aggiunto alla mia collezione di schede un Arduino Leonardo, l'ho acquistato per iniziare un percorso di studio/sviluppo sul Atmega32U4(Visto che questo presenta solo packaging SMD quale miglior sistema di una bella scheda Arduino fatta e finita?!).
Il bisogno di passare ad un AVR come l'ATmega32U4 si può ritrovare nel suo asso nella manica, un controller USB integrato. Solitamente quando necessito di una comunicazione wire tra PC e AVR ripiego sul classico convertitore, come il Silabs CP2102, ma questo mi porta diverse limitazioni, in primis due integrati, non solo perché sono due circuiti da far incastrare su PCB ma anche per un fatto di costi(un ATmega32U4 si può trovare anche a 7€) Un altro problema, decisamente piu importante è che non possibile riconoscere il dispositivo connesso, in poche parole io quando uso un convertitore, provo ogni singola porta COM e faccio una richiesta per capire se è la porta giusta, questo comporta che vado ad influire con altri dispositivi che necessitano di porta seriale. Questa tecnica mi pare veramente poco ortodossa, quindi spero di risolvere il problema con la configurazione di un controller USB per distinguerlo dalle altre periferiche.
Intatto volevo modificare un mio progetto dove adoperavo un ATmega328P e un Silabs CP2102 per regolare delle strip led, avrei bisogno pero di uno spunto di partenza per poter capire come funziona questo maledetto controller USB su questo AVR, chiedo a voi perché come al solito il datasheet si rivela quasi del tutto inutile. Mi sapreste indicare una guida, un datasheet, una pagina che mi possano spiegare come adoperare questa periferica in C?

Vi ringrazio.

RobertoBochet:
avrei bisogno pero di uno spunto di partenza per poter capire come funziona questo maledetto controller USB su questo AVR, chiedo a voi perché come al solito il datasheet si rivela quasi del tutto inutile. Mi sapreste indicare una guida, un datasheet, una pagina che mi possano spiegare come adoperare questa periferica in C?

Trovi tutto su USB.org, ti ci vorranno circa 200 ore uomo per capire come funziona la USB ed essere in grado di scriverti del codice tuo, questo ammesso che uno è già un programmatore C molto esperto e che ha molta dimestichezza con la programmazione low level delle mcu.

Ok modifichiamo la domanda, mi potete consigliare qualche libreria valida che contempli solo la gestione del controller USB? (Scusa Astrobeed ma per un momento ho sperato ingenuamente che fosse una gestione alla TWI o USART degli ATmega) XD

RobertoBochet:
Ok modifichiamo la domanda, mi potete consigliare qualche libreria valida che contempli solo la gestione del controller USB? (Scusa Astrobeed ma per un momento ho sperato che fosse una gestione alla TWI e USART degli ATmega) XD

Sulla Leonardo hai già la Com virtuale per comunicare col pc, per giunta lavora alla massima velocità possibile, 12 Mbps perché non è vincolata dalla UART, altro non ti serve per scambiare dati col pc.

Ok ma questa com virtuale è integrata nel core Arduino? Mi permette di identificare il dispositivo da PC?

RobertoBochet:
Ok ma questa com virtuale è integrata nel core Arduino? Mi permette di identificare il dispositivo da PC?

Certo che è integrata nel core, la serial sulla Leonardo comunica con la USB, mentre la serial1 è la UART.
Sul PC la Leonardo la trovi identificata come COMx e il nome della scheda nell'elenco delle porte seriali, p.e. "COM8 Leonardo"

Ok ma non posso andare a impostarlo come un altro tipo di periferica, se no il vantaggio è nullo? E poi cerco un codice solo C, non CPP è già presente un file C per la Serial USB nel core cosi da poterlo estrarre?

RobertoBochet:
Ok ma non posso andare a impostarlo come un altro tipo di periferica, se no il vantaggio è nullo?

Credo che tu abbia le idee abbastanza confuse su come funziona la USB, se devi scambiare dei dati generici hai solo due possibilità, la seriale virtuale o un device HID dati, tra i due la più semplice da usare, parliamo del lato pc, è sicuramente la seriale virtuale e Arduino te la mette a disposizione di serie.

E poi cerco un codice solo C, non CPP è già presente un file C per la Serial USB nel core cosi da poterlo estrarre?

Anche qui hai le idee molto confuse, la gestione della USB sono almeno 500 righe di codice in C ANSI, non esiste il C++ per queste cose, se non sai perfettamente come funziona la USB ci fai ben poco col codice.

Si Astrobeed, hai ragione ho le idee molto confuse sul USB, mi sembrava chiaro, allora vada per la seriale virtuale, se si potesse solo modificare il nome della seriale non sarebbe male, permetterebbe di distinguerla dalle altre.

La serial è ben scritta in CPP vorrei evitare CPP, ho perso il vizio di usarlo nei progetti. Quindi vorrei poter usare semplicemente i file in C della gestione USB, dici che anche questa è una missione ostica?

Scaricati LUFA

Ci sono tutte le librerie pronte per USB per Atmel scritte in C , il driver CDC dentro l'atmegaU2 di arduino è stato copiato da quì

Per cambiare il riconoscimento devi modificare i parametri PID e VID della USB. Ma a qual punto non viene riconosciuto e installato automaticamente.
Per cambiare PID e VID devi ricompilare il bootloader del micro --> http://galvant.ca/how-to-compiling-arduino-caterina-with-new-vidpid/
La coppia VID/PID si può acquistare per identificare univocamente la tua periferica.
Io ne comprai una 8 anni fa, ma adesso qual negozio online ha chiuso.

icio:
Scaricati LUFA

http://www.fourwalledcubicle.com/LUFA.php

Ci sono tutte le librerie pronte per USB per Atmel scritte in C , il driver CDC dentro l'atmegaU2 di arduino è stato copiato da quì

Attento alla versione. Fino ad un pò di tempo fa l'ultima versione compatibile con il core di Arduino era la 100807.

ohh grazie, allora vediamo un po' di capire.

icio:
il driver CDC dentro l'atmegaU2 di arduino è stato copiato da quì

Scusa ma a cosa ti riferisci? è il codice che utilizza la Leonardo? Cercando CDC su google mi saltano fuori solo risultati legati a Samsung.
Scusate ma sono veramente ignorante in argomento.

PaoloP:
Per cambiare il riconoscimento devi modificare i parametri PID e VID della USB. Ma a qual punto non viene riconosciuto e installato automaticamente.
Per cambiare PID e VID devi ricompilare il bootloader del micro --> http://galvant.ca/how-to-compiling-arduino-caterina-with-new-vidpid/
La coppia VID/PID si può acquistare per identificare univocamente la tua periferica.
Io ne comprai una 8 anni fa, ma adesso qual negozio online ha chiuso.

Ommamma altro Arabo, allora pure se scelgo la configurazione seriale virtuale devo andare a modificare PID e VID? Se voglio solo modificare il nome identificativo devo per forza avvalermi di una copia univoca? o questi valgono solo se ci voglio abbinare dei driver specifici scritti da me?

leo72:
Attento alla versione. Fino ad un pò di tempo fa l'ultima versione compatibile con il core di Arduino era la 100807.

Leo non capisco l'affermazione, il core non presenta gia tutto il necessario per il controller USB? Se non uso il core Arduino capisco il dovermi avvalere del codice esterno ma in questo caso proprio non capisco.

Scusate ma mettiamo l'idea che qualcuno voglia creare un dispositivo che si possa interfacciare via USB per scambiare dati con un PC, a livello hardware e software di cosa si avrebbe bisogno? basterebbe un Atmega16U4 a livello hardware? O servono componenti piu particolari?

Grazie ancora a tutti.

RobertoBochet:
Scusate ma mettiamo l'idea che qualcuno voglia creare un dispositivo che si possa interfacciare via USB per scambiare dati con un PC, a livello hardware e software di cosa si avrebbe bisogno? basterebbe un Atmega16U4 a livello hardware? O servono componenti piu particolari?

Ancora ti ostini con questa storia ?
La USB permette solo due modalità per lo scambio generico dei dati, la prima è il device CDC, ovvero la seriale virtuale, il secondo è il device HID dati, tutte le altre modalità sono verticalizzate per periferiche specifiche come la tastiera, il mouse, il joystick , etc, e non ci fa nulla.
Arduino ti offre già la periferica CDC, ovvero una seriale virtuale che è identificata sul tuo pc con un nome univoco e il numero della porta, nel caso Leonardo è COMx (x = numero della porta) e "Leonardo", non esiste che non la trovi o non la identifichi.
Usare il device HID dati sulla Leonardo la vedo molto dura, il SIE degli AVR ha pochi endpoint, non hai nessuna libreria che lo supporta, nelle LuFa non è previsto, per scriverti da solo il device ti ci vogliono degli anni visto il tuo livello di conoscenza, inoltre non è semplice da gestire lato pc come la seriale.
Per farla breve, usa la seriale e vivi felice. :slight_smile:

astrobeed:
Ancora ti ostini con questa storia ?
La USB permette solo due modalità per lo scambio generico dei dati, la prima è il device CDC, ovvero la seriale virtuale, il secondo è il device HID dati, tutte le altre modalità sono verticalizzate per periferiche specifiche come la tastiera, il mouse, il joystick , etc, e non ci fa nulla.
Arduino ti offre già la periferica CDC, ovvero una seriale virtuale che è identificata sul tuo pc con un nome univoco e il numero della porta, nel caso Leonardo è COMx (x = numero della porta) e "Leonardo", non esiste che non la trovi o non la identifichi.
Usare il device HID dati sulla Leonardo la vedo molto dura, il SIE degli AVR ha pochi endpoint, non hai nessuna libreria che lo supporta, nelle LuFa non è previsto, per scriverti da solo il device ti ci vogliono degli anni visto il tuo livello di conoscenza, inoltre non è semplice da gestire lato pc come la seriale.
Per farla breve, usa la seriale e vivi felice. :slight_smile:

Astrobeed questa volta ho chiesto per un HW generico, ne per un Arduino, ne per un AtmegaU4, ok ora abbiamo capito che se voglio scambiare dati attraverso USB le uniche opzioni sono seriale virtuale o Device HID. In questo caso mi va benissimo la seriale virtuale. Ora ribadisco che lavoro senza core, solo C puro e AVR vuoto, quindi ho bisogno, visto che mi hai rammentato più volte di quanto sia complicata la stesura di un codice per il controllo USB, di una libreria che mi permetta di gestire la CDC, la LUFA fa questo? Sulla pagina del ATmega32U4 noto un bootloader che se non ho capito male permette la gestione dell'USB, questo puo gestire una CDC? Inoltre non ho ancora capito se il nome associato alla porta COM sia dettato da una configurazione del ATmega o dai driver installati sul PC.
Astrobeed sono il primo a dire che in argomento sono ignorante, due mesi fa non sapevo neanche come gestire la TWI dell'ATmega328P ma ora ne sono in grado, senza avvalermi del core Arduino, ci sto mettendo d'impegno per capire, e non pretendo di arrivare a compilare un codice per la gestione di questo bus perché come dici tu allo stato attuale non ne sarei in grado, quindi dovrò avvalermi di codice scritto da qualcun'altro ma vorrei evitare di reincludere il core di Arduino solo per la gestione del USB.

RobertoBochet:
Ora ribadisco che lavoro senza core, solo C puro e AVR vuoto, quindi ho bisogno, visto che mi hai rammentato più volte di quanto sia complicata la stesura di un codice per il controllo USB, di una libreria che mi permetta di gestire la CDC

Non esiste nessuna libreria che fa quello che chiedi, il codice te lo devi scrivere da solo, inoltre sei OT con questo argomento visto che su questo forum si parla di Arduino e non di codice generico per AVR.

Ok, ho chiesto, se siamo OT mi dispiace, chiudete pure.