Una tastiera USB con controlli per i Media Players con Arduino Leonardo
Mi ritrovo, come sempre, in mezzo ad eventi organizzati da amici, per dare un aiuto di tipo tecnologico. Quest’anno è toccato alle recite di Natale e devo occuparmi, tra le altre cose, di gestire l’impianto audio (non mi piace proprio dire Deejay). Il mio laptop, a cui sono affezionato, è un po’ vecchiotto e non ha i pulsanti play/stop ecc per gestire i vari player multimediali: mi sono sempre trovato molto più comodo coi pulsanti piuttosto che col mouse per cui, quando possibile, cerco sempre di evitare l’utilizzo del mouse e uso molto pulsanti e scorciatoie da tastiera.
Ho pensato così di realizzarmi una tastiera aggiuntiva, USB, che avesse solo i pulsanti necessari a far partire e fermare le canzoni o selezionare le musiche successive. Dal momento che in un cassetto avevo un Olimexino 32U4 (un clone di Arduino Leonardo) a prendere la polvere e dei pulsantoni arcade a microswitch inutilizzati, forte delle capacità del Leonardo di emulare tastiera e mouse in maniera rapida, non ci ho pensato due volte.
Più in basso ho lasciato dei link dove poter acquistare il materiale. Dato che l’olimexino costa tanto, ho linkato un Arduino Leonardo formato “Mini”, compatibile
Sorgono però le prime difficoltà: Arduino Leonardo può, si, emulare la tastiera, ma non ci sono funzionalità per il supporto dei pulsanti multimediali. Ho cercato quindi un po’ in giro e mi è venuto subito in aiuto un certo NicoHood che ha realizzato una libreria aggiuntiva per Arduino IDE molto semplice da utilizzare che include anche la gestione dei pulsanti che a me servivano.
Da Arduino IDE andare in Sketch -> #include libreria -> Gestione librerie e nella casella di ricerca cercare “HID-Project”, tra i risultati deve comparire “HID-Project by Nicohood”:
Premete il pulsante installa. Questa libreria, tra l’altro, consente anche di realizzare applicazioni con versioni di Arduino che utilizzano l’ATmega 32U4 esclusivamente come bridge seriale e non come chip principale (ovvero Arduino UNO e Arduino Mega) previa riprogrammazione del bootloader originale con uno realizzato dallo stesso autore e che si chiama HoodLoader2. Ad ogni modo io sto utilizzando un clone Arduino Leonardo per cui la questione del cambio bootloader non mi interessa.
La libreria consente l’utilizzo dei pulsanti che a me servivano per questa applicazione: play/pause, stop, prossima canzone e canzone precedente. Avendo la libreria anche la gestione del volume mediante dei metodi Volume UP e DOWN, ho pensato anche di utilizzare un encoder rotativo per regolare il volume.
La gestione dei pulsanti è molto semplice: pull-up sul GPIO e pulsante che chiude verso massa. C’è un però: Arduino Leonardo (e non solo) ha la possibilità di includere le resistenze di pull-up integrate specificando INPUT_PULLUP al posto del semplice INPUT nella funzione PinMode, ma su alcuni pin mi accadeva una cosa strana: il pin in questione oscillava tra livello e alto e basso con la resistenza di pullup integrata e senza premere il pulsante relativo! Per cui il media player triggerava di continuo tra play e pause. Ho risolto il problema evitando di utilizzare le resistenze di pull-up integrate e mettendo resistenze esterne da 10K verso la 3.3V: non ho idea se si tratti di un problema solo mio, di un problema della scheda utilizzata o forse di qualche disturbo sulla linea di alimentazione USB, ma dato che ho risolto subito con la resistenza esterna e avendo poco tempo a disposizione, non ho indagato ulteriormente. Questo è solo per spiegare il motivo dell’utilizzo di resistenze esterne che vedrete nello schema:
L’encoder rotativo va collegato a pin che supportano l’interrupt relativamente al cambio di stato (da alto a basso o viceversa). Sebbene in una vecchia lezione sui PIC riguardo agli encoder abbia detto che era possibile collegare l’encoder ad un solo pin con interrupt, e quindi gestire un solo interrupt, si è rivelata una scelta migliore gestire invece due interrupt dal momento che gli encoder cinesi che utilizzo io, super-economici, generano molti disturbi e rimbalzi. Per cui tutta la teoria di quella lezione è perfettamente valida, ma anzichè gestire un solo interrupt sul pin che io indico come “Pulse”, gestisco anche l’interrupt generato dall’altro pin, indicato come “Direction” (niente paura: sono equivalenti sul componente fisico, quindi anche se scambiate i due pin non accade nulla! Sono due semplici pulsanti!).
In questo caso sul pin indicato come “Pulse” rilevo la rotazione oraria quando entrambi i segnali sono allo stesso livello ma in precedenza erano a livello differente, mentre se mi viene generato l’interrupt sul pin “Direction”, la rotazione oraria c’è quando i due pin, al momento dell’interrupt, si trovano in stati logici differenti mentre in precedenza erano allo stesso livello: tutte queste considerazioni (tener conto dello stato precedente e rilevare l’interrupt anche sull’altro pin) eliminano la possibilità di errore e quindi rendono ininfluenti i disturbi e la rotazione dell’encoder si traduce in uno scorrimento pulito della barra del volume.
C’è da dire che, da quanto leggo tra le info della libreria, questa dovrebbe essere compatibile anche con MacOS e con le varie distribuzioni di Linux, ma personalmente non ho provato.
Il sorgente si trova sul mio repo Github. Nelle foto che seguono potete vedere la realizzazione: la scatola è un recupero dal lavoro che faccio, era il contenitore di alcuni reagenti per l’analisi delle acque, le etichette le ho realizzate con una Dymo. Ho fatto un foro su una parete della scatola per infilare il cavo USB che così entra dritto nel connettore sulla scheda. I pulsantoni non li ho saldati ma collegati con Fast-On e le resistenze di pull-up le ho saldate direttamente sui pulsanti. I cavetti sono saldati direttamente su scheda dato che l’Olimexino 32U4 ha una doppia serie di pin: quelli con gli header secondo lo standard Arduino e affianco ha i pad replicati, senza header saldati, che seguono il passo standard da 2.54mm (motivo per il quale scelgo le schede Olimex al posto di altre, dato che mi permettono di mettere sopra anche millefori con passo standard).
Il player che utilizzo è Foobar2000 che è diventato la mia scelta da quando nel 2013 è scomparso Winamp, nonostante di recente sia stato acquisito da AOL e ci stiano lavorando di nuovo sopra e funziona perfettamente con questo accrocco. Segnalo solo che la regolazione del volume agisce sul volume di sistema e non su quello del player.
Questo articolo è stato riportato anche da Hackaday
Immagini
Links
- Acquisto Arduino Leonardo (formato mini) su Amazon
- Acquisto encoder rotativo con pulsante, montato su Breakout board, su Amazon
- Acquisto pulsantoni arcade a microswitch (formato lungo – stile americano)
- Acquisto pulsantoni arcade a microswitch (formato corto – stile giapponese)