Economica stand alone programmabile USB

Buongiorno a tutti,

Tempo fà ho avuto la necessità di creare una piccola board per atmega328 capace di poter essere collegata ad una porta usb per emulare il funzionamento di una tastiera USB.

Ho dato una bella guardata in giro su internet e scopiazzando quà è là ho messo insieme una scheda che escludendo i connettori arriva si e no a 10 componenti, ha la porta usb direttamente connessa all'atmega328 , e con un apposito firmware caricato nel bootloader, è capace di essere programmata senza l'aggiunta di programmatore esterno, anche direttamente all'interno dell IDE di Arduino.

Allego anche uno zip contenente vario materiale , tra cui i file di Eagle , il firmware già compilato per il bootloader, i driver per windows e un file di supporto per agevolare la configurazione della board sull'ambiente Arduino.

Dettaglio del file MUCCAS.ZIP

  • usbasp-windriver.2011-05-28.zip - Archivio contenente i driver di sistema per alcune versioni di windows
  • boards_entry.txt - file con le linee da aggiungere al file boards.txt di arduino
  • bootloader_license.txt - file di condizioni di licenza di Objective Development per il firmware del bootloader
  • mega328p_12mhz.hex - file hex del bootloader usbasploader
  • usb_stick.sch - file dello schema elettrico della scheda
  • usb_stick.brd - file del circuito stampato della scheda

nota: MUCCAS (Multipurpose Usb Compatible Compact Atmega Stick)

P.S. - Per un acronimo migliorato ci vorrebbe l'aiuto di leo...

Il firmware in oggetto è USBaspLoader , basato sulla pluricriticata libreria V-USB della Objective Development .
In allegato c'è la versione giusta per poter essere caricata nel chip atmega328p per un clock di 12mhz (in futuro mi riprometto di provare anche a 16mhz, dicono che funzioni ugualmente ma non l'ho provato personalmente), e il file bootloader_License.txt che spiega esattamente le condizioni per l'utilizzo del software .

Colgo l'occasione per specificare che :

DECLINO OGNI RESPONSABILITA' PER UN UTILIZZO INAPPROPRIATO DI QUESTO SOFTWARE O DAL MANCATO RISPETTO DELLE NORME STABILITE DAL PRODUTTORE DELLO STESSO IN MATERIA ILLUSTRATE NEL CONTRATTO DI LICENZA.

Per la costruzione della scheda in oggetto , il passo principale consiste nella creazione del circuito stampato.
Prima di procedere all'assemblaggio , qualora non utilizziate lo zoccolo per l'atmega, è opportuno che procediate alla programmazione del bootloader col firmware fornito, altrimenti poi non avete modo di programmarlo se non dissaldandolo dalla scheda!
Una volta assemblato il tutto e verificate le connessioni si può procedere ad un veloce collaudo di massima in questo modo:

Verifica funzionale (Windows xp):

  • Applicare il jumper jp6 (modalità programmazione abilitata)
  • Connettere il cavo usb alla scheda e conseguentemente al pc.(non preoccupatevi se già dopo l'inserimento del cavo vi viene notificato un errore di 'Periferica Usb non riconosciuta')
  • Premere il pulsante di reset a bordo della scheda.(a questo punto invece se vi viene notificato un errore di 'Periferica Usb non riconosciuta' potete preoccuparvi :grin:)
  • Il pc a questo punto dovrebbe chiedervi i driver per il dispositivo (li trovate in allegato nello zip)
    Installateli, se tutto è andato a buon fine in questo momento la vostra scheda verrà riconosciuta come un UsbAsp (potete controllare su gestione periferiche di windows xp , troverete una voce dell'albero principale denominata LibUSB-Win32 Devices con all'interno un nodo USBAsp)

  • Fatto ciò possiamo dire che la scheda è pronta per essere programmata.

Nota: Mi scuso con gli utenti linux ma non ho potuto provare su questo sistema, ho effettuato prove solo su windows xp e windows7, di cui però non ho l'immagine.

Per rendere questa scheda visibile e programmabile dall'ambiente di Arduino si rende necessario aggiungere alcune righe all'interno del file di configurazione delle schede (boards.txt) affinchè l'ambiente sappia cosa e come programmarla.

Creazione entry nel file boards.txt di Arduino:

  • Aprire il file boards.txt situato nella cartella ARDUINOFOLDER\hardware\arduino
  • Con l'ausilio di un editor di testo e prestando attenzione a non commettere errori incollare il contenuto presente nel file boards_entry.txt (presente all'interno del file zip) alla fine del file e salvate.
    Nota: Non è obbligatorio incollare le righe alla fine del file, basta che il contenuto venga incollato alla fine di un blocco già esistente, in maniera tale da avere in tutti i casi l'insieme di righe raccolto tra le due linee di cancelletti (#####) senza aver sputt...to tutto il resto!
  • Se avete l'IDE di Arduino aperto chiudetelo e riavviatelo, altrimenti non vedrete le modifiche appena effettuate
  • Andate sul menu Tools/Boards e vedete se è presente la entry appena creata, se è visibile selezionatela e siete pronti per inviare sketch alla nuova scheda!!

A questo punto non rimane che testare la programmazione, munitevi di breadboard o collegate direttamente un led con resistenza al pin 6 del connettore jp2 (equivalente del pin 13 digitale di arduino, quello dove in genere si trova il led)

Programmazione della scheda:

  • Inserire il jumper jp6 nella scheda
  • Premere il pulsante reset
  • Se non lo avete fatto prima andate su Tools/Boards e selezionate la vostra scheda
  • Caricate lo sketch blink e premente il tasto Upload
  • Se alla fine dell'upload non ci sono errori ed il led lampeggia avete eseguito tutto con successo!

Nota bene:

Non è necessario rimuovere il jumper a fine programmazione, il bootloader passerà automaticamente al programma caricato alla fine dell'upload.
Se si sconnette la USB, o semplicemente se si resetta la scheda , qualora vi sia il jumper inserito quest'ultima partirà sempre in modalità programmazione.
Quando non serve più programmare rimuovere il jumper jp6, la scheda ripartirà sempre puntando direttamente al programma caricato.
Se ci sono problemi fatemi sapere e proverò ad aiutarvi fin dove mi è possibile.
Saluti.

muccas.zip (410 KB)

bello, appena mi ritorna la 2009 programmo l'atmega col nuovo firmware e butto tutto si breadboard, però vorrei la versione a 16MHz prima :disappointed_relieved:
se non chiedo troppo non sarebbe possibile anche un bootloader per 8MHz se la vusb regge? sarebbe comodo per piccole applicazioni in cui non si voglia troppo "sbatti"...

Se non ricordo male, o Leo o Lesto ci hanno sbattuto la testa più volte e poi hanno abbandonato il progetto.
A questo punto meglio una Leonardo minimale che contiene già la gestione della USB. Purtroppo il chip è solo SMD. :frowning:

superlol:
bello, appena mi ritorna la 2009 programmo l'atmega col nuovo firmware e butto tutto si breadboard, però vorrei la versione a 16MHz prima :disappointed_relieved:
se non chiedo troppo non sarebbe possibile anche un bootloader per 8MHz se la vusb regge? sarebbe comodo per piccole applicazioni in cui non si voglia troppo "sbatti"...

Purtroppo ad 8mhz non penso si riesca a farla funzionare... troppo poco.
Il fw si trova compilato anche a 16 e 20mhz, se vuoi provarlo ci fai sapere come va, ma prima di addentrarti a fare esperimenti penso che sia utile avere una base di partenza a 12 che funziona, dopodichè cambi il quarzo e riprogrammi il bootloader con la versione adeguata. :wink:

PaoloP:
Se non ricordo male, o Leo o Lesto ci hanno sbattuto la testa più volte e poi hanno abbandonato il progetto.
A questo punto meglio una Leonardo minimale che contiene già la gestione della USB. Purtroppo il chip è solo SMD. :frowning:

Io ci ho sbattuto la testa. Ma usavo un chip intermedio programmato con il firmware Avr-cdc.
Non ho mai provato l'USBaspLoader.

PaoloP:
Se non ricordo male, o Leo o Lesto ci hanno sbattuto la testa più volte e poi hanno abbandonato il progetto.
A questo punto meglio una Leonardo minimale che contiene già la gestione della USB. Purtroppo il chip è solo SMD. :frowning:

Vabbè ci sono gli adattatori per gli smd , smd to dip.

Release 2009-08-22
Fixed a bug in the 12.8 MHz module: End Of Packet detection was made in the center between bit 0 and 1 of each byte. This is where the data lines are expected to change and the sampled data may therefore be unstable. We therefore check EOP only if bits 0 and 1 have both been read as 0 on D-.
Fixed a bit-stuffing problem in the 16 MHz module: If bit 6 was stuffed, the unstuffing code in the receiver routine was ca. 1 cycle too long. If multiple bytes had the unstuffing in bit 6, the error summed up until the receiver was out of sync.
Updated bits in Configuration Descriptor’s bmAttributes according to USB 1.1 (in particular bit 7, it is a must-be-set bit now).
Included option for faster CRC routine (thanks to S?awomir Fra? for the code).
Improved documentation about USB-IDs.

a quanto pare i bug per il 16mhz sono stati risolti dal 2009 almeno cosi vedo dal sito "ufficioso"

niki77:

superlol:
bello, appena mi ritorna la 2009 programmo l'atmega col nuovo firmware e butto tutto si breadboard, però vorrei la versione a 16MHz prima :disappointed_relieved:
se non chiedo troppo non sarebbe possibile anche un bootloader per 8MHz se la vusb regge? sarebbe comodo per piccole applicazioni in cui non si voglia troppo "sbatti"...

Purtroppo ad 8mhz non penso si riesca a farla funzionare... troppo poco.
Il fw si trova compilato anche a 16 e 20mhz, se vuoi provarlo ci fai sapere come va, ma prima di addentrarti a fare esperimenti penso che sia utile avere una base di partenza a 12 che funziona, dopodichè cambi il quarzo e riprogrammi il bootloader con la versione adeguata. :wink:

riesci a postare il firmware anche per 16MHz? (più che altro è perchè non ho quarzi da 12MHz a casa XD )
a 8MHz sarebbe comunque carino tentare, ci sarebbe un buon risparmio energetico, si tradurrebbe nell'avere una scheda davvero piccola (se poi in smd sarebbe grande quanto una moneta da 2€)...
invece trovo scomodo il fatto che il bootloader faccia partire il firmware dopo la programmazione: se io ho ancora il jumper che porta a massa il pin ed io il pin lo ho in uscita come segnale alto creo un corto....

Il firmware in formato sorgente è scaricabile dal sito del progetto USBaspLoader:

leo72:
Il firmware in formato sorgente è scaricabile dal sito del progetto USBaspLoader:
http://www.obdev.at/products/vusb/usbasploader.html

...E già compilato per varie frequenze sul sito della Objective Development.

leo72:
Il firmware in formato sorgente è scaricabile dal sito del progetto USBaspLoader:
V-USB - A Firmware-Only USB Driver for Atmel AVR Microcontrollers

lo avevo postato anche io ma nessuno mi pensa :disappointed_relieved:

grazie niki77, molto interessante!

Madwriter:

leo72:
Il firmware in formato sorgente è scaricabile dal sito del progetto USBaspLoader:
http://www.obdev.at/products/vusb/usbasploader.html

lo avevo postato anche io ma nessuno mi pensa :disappointed_relieved:

scusa non avevo visto :disappointed_relieved:

beh allora aspetto l'arduino e vedo se va...

in caso come è possibile integrare poi la comunicazione seriale? (o è meglio apra un nuovo topic?)

Madwriter:
lo avevo postato anche io ma nessuno mi pensa :disappointed_relieved:

Non l'avevo notato. Hai messo il link dopo 50 righe di quote, si è perso un po' :stuck_out_tongue:

leo72:

Madwriter:
lo avevo postato anche io ma nessuno mi pensa :disappointed_relieved:

Non l'avevo notato. Hai messo il link dopo 50 righe di quote, si è perso un po' :stuck_out_tongue:

hahaha scherzavo , domani provo a realizzarlo anche io su bread e vediamo come va :grin:

ma la metaboard no vi piaceva? infondo cos'ha in più, solo lo stadio di alimentazione...

BrainBooster:
ma la metaboard no vi piaceva? infondo cos'ha in più, solo lo stadio di alimentazione...

Totalmente d'accordo e poi secondo me soffre degl stessi problemi anche se è un mio modesto parere...

@superlol non credo si possa integrare la seriale ma un emulazione di essa forse si ma a mio avviso carichi il processore di lavoro inutile, come hanno detto poco sopra, meglio puntare sulla leonardo stand alone se si vuole l'usb integrata...

ratto93:

BrainBooster:
ma la metaboard no vi piaceva? infondo cos'ha in più, solo lo stadio di alimentazione...

Totalmente d'accordo e poi secondo me soffre degl stessi problemi anche se è un mio modesto parere...

@superlol non credo si possa integrare la seriale ma un emulazione di essa forse si ma a mio avviso carichi il processore di lavoro inutile, come hanno detto poco sopra, meglio puntare sulla leonardo stand alone se si vuole l'usb integrata...

l'idea era di creare un chip standalone con usb messo su millefori che facesse da programmatore ISP :wink:

quindi con 5€ avere un programmatore definibile tale :stuck_out_tongue:

siccome lo vede come un programmatore ICSP con target se stesso credo che sia possibile con questo software poter creare un ICSP esterno...

EDIT:

la logica non mi tradisce XD

qualcuno potrebbe mandarmi il pcb in formato pdf visto che non riesco ad aprore eagle sul mac? :0
email: cesare@stakorr.it

superlol:
l'idea era di creare un chip standalone con usb messo su millefori che facesse da programmatore ISP :wink:

Allora costruisciti l'USBasp direttamente, no? :stuck_out_tongue:
http://www.fischl.de/usbasp/

ratto93:

BrainBooster:
ma la metaboard no vi piaceva? infondo cos'ha in più, solo lo stadio di alimentazione...

Totalmente d'accordo e poi secondo me soffre degl stessi problemi anche se è un mio modesto parere...

@superlol non credo si possa integrare la seriale ma un emulazione di essa forse si ma a mio avviso carichi il processore di lavoro inutile, come hanno detto poco sopra, meglio puntare sulla leonardo stand alone se si vuole l'usb integrata...

E' a tutti gli effetti una metaboard , ridotta all'osso per essere utilizzata per fare applicazioni simil-futil
Non nasce per avere chissà quali pretese, c'è pure scritto.
Non è farina del mio sacco, c'è scritto anche questo sul primo post.

Se hai bisogno di implementare una piccola periferica usb HID(come serviva a me) è l'ideale.
A me non interessava nemmeno che fosse anche riprogrammabile da USB, ma visto che c'era la possibilità .. perchè no.
Tanti mi hanno detto che non sono riusciti a farla funzionare una cosa del genere, ho messo una guida passo passo, con materiale 'certo' allegato, magari a qualcuno serve.