Dispositivi USB sulla punta di un dito: il Digispark

Il Digispark ha fatto la sua comparsa su Kickstarter nel 2017. Da allora il prezzo è sceso tantissimo e si è rivelato un sistema di sviluppo che torna utile in una miriade di occasioni proprio grazie al fatto che è piccolissimo. Ma cosa è? Si tratta di una schedina con a bordo un ATtiny85 in formato SOIJ (sarebbe il normale SOIC), con il PCB che da un lato è sagomato per formare un connettore USB tipo A maschio. Lo produce una ditta che si chiama Digistump.

L’ATtiny85

L’ATtiny85 è un microcontrollore AVR ad 8 bit, con 8 pin, un po’ un equivalente dei nostri PIC12F. A differenza dell’architettura PIC 8 bit, però, quella AVR esegue le principali istruzioni in 1 singolo ciclo di clock, per cui un AVR con clock a 20MHz avrà una velocità, espressa in MIPS, pari a 20, mentre un PIC12F, con lo stesso clock avrà una velocità pari a 5MIPS dato che i PIC 8 bit eseguono le istruzioni in 4 cicli di clock.

L’ATtiny85 ha 8KB di memoria Flash, 512B di memoria RAM e 512B di memoria EEprom e numerose periferiche. La sagomatura per permettere di collegare la scheda ad una porta USB di un PC non è utilizzata soltanto per l’alimentazione del dispositivo ma anche per funzionalità quali emulare una porta seriale, emulare una tastiera/mouse/joystick.

Anatomia

Come dicevo, da un lato il PCB è sagomato per entrare in una porta USB del PC. Tenendo questo connettore verso il basso, sul lato destro ci sono 3 pad utilizzabili per l’alimentazione: 5V (messa in parallelo alla 5V proveniente dall’USB), GND e Vin la quale entra nel regolatore di tensione e per la quale consiglio, eventualmente, di fornire massimo 9/12V.

Nella parte superiore ci sono quindi i 6 pin utilizzabili come IO numerati da 0 a 5: questo numero va utilizzato tal quale con le istruzioni digital di Arduino IDE. 4 di questi pin sono usabili come ingressi analogici (la numerazione per usare analogRead è indicata in una tabella che vedremo dopo) e 3 come uscite PWM. Abbiamo a disposizione anche l’I2C e l’SPI ma non l’UART.

Connettività USB

Osservando bene la scheda a bordo non ci sono convertitori USB/Seriale: gli unici 2 chip a bordo sono l’ATtiny85 e il regolatore di tensione 7805 che, tra l’altro, viene usato soltanto se si alimenta la scheda dal terminale Vin piuttosto che dall’USB. L’ATtiny85, per giunta, non ha nemmeno una periferica USB a bordo come ce l’ha invece, ad esempio, l’ATmega32u4 che usiamo sull’Arduino Leonardo. Vedendo la schedina vengono quindi spontanee domande come:

  • Come si programma?
  • Come fa ad emulare la porta seriale su USB se non c’è un bridge?
  • Come diavolo fa ad emulare tastiera/mouse/joystick?

La risposta è piuttosto banale: il Digispark utilizza un porting della libreria V-USB della Objective Development Software GmbH , più precisamente, dato che la schedina in oggetto è compatibile con Arduino IDE, utilizza un derivato del porting per Arduino IDE.

La libreria in oggetto, quindi, permette di emulare una porta USB via software, ovvero, in assenza di una periferica USB dedicata, si sfruttano due pin del microcontrollore per operare in modalità bit-banging. Chiaramente questo comporta delle limitazioni:

  • La compatibilità USB è limitata alla versione 1.1
  • I dispositivi necessitano l’installazione di drivers in quanto non vengono riconosciuti in automatico

Queste non sono limitazioni eccessive dal momento che non abbiamo bisogno di velocità sulla porta USB per realizzare, ad esempio, una tastiera e in aggiunta nel momento in cui il PC è il nostro o si dispone di privilegi di amministratore, è possibile installare i drivers senza problemi.

La programmazione avviene grazie ad un bootloader come su tutti gli Arduino, in questo caso anch’esso emula la porta seriale sui due pin utilizzati per l’USB mediante la libreria V-USB. Il bootloader utilizzato è il micronucleus, scritto originariamente da Bluebie.

Differenze con Arduino

E’ possibile utilizzare il Digispark proprio come se si stesse utilizzando Arduino UNO ma con alcune limitazioni:

  • I pin digitali 3 e 4 sono utilizzati per la comunicazione USB. Nel caso in cui sia necessario utilizzare questi pin nella propria applicazione, bisogna per forza di cose disconnettere la parte che utilizza quei pin durante la programmazione.
  • Tenendo conto della nota precedente, il pin 3 ha anche una resistenza di pull-up da 1.5kΩ
  • A bordo c’è un ATtiny85 anzichè un ATmega328, per cui alcune librerie potrebbero non funzionare correttamente. Questo porta chiaramente anche a limitazioni di memoria (il Digispark ha disponibili circa 6kB di memoria Flash contro i circa 32kB di Arduino UNO, 512B di RAM contro 2k).
  • Per l’utilizzo di periferiche I2C è consigliato l’utilizzo della libreria TinyWireM che è specifica per il modulo I2C degli ATtiny.
  • L’ATtiny non ha una periferica UART per cui i programmi che fanno uso di essa non funzionano (e non funziona nemmeno il Serial Monitor), ma ci sono degli esempi per dare l’output seriale utilizzando la libreria digispark e in più per il collegamento a dispositivi possiamo usare softwareSerial.
  • I Pin analogici si trovano sui pin digitali (beh, anche su Arduino è così: i pin analogici possono essere usati come digitali) ma in maniera diversa. Ad esempio se diamo l’istruzione AnalogRead(1), il sistema si aspetta di fare la lettura analogica sul pin digitale 2, dato che A1 è posizionato li. C’è un documento che elenca le funzioni associate ad ogni pin.
  • Il programma caricato non parte subito ma ha un ritardo di alcuni secondi: in questo tempo il bootloader cerca di capire se si sta tentando di programmarlo.

Ulteriori informazioni sono riportate nel paragrafo Links. In particolare il Digispark a bordo ha anche un led pilotabile che potrebbe essere collegato al pin 0 oppure all’1 a seconda della revisione della board. Vedi il link identificazione modello.

Precauzioni

Digispark non ha nessun tipo di protezione a bordo: se date l’alimentazione al contrario, il chip si brucerà sicuramente. Quando la si collega al pc direttamente, sarebbe bene utilizzare un HUB USB, in maniera tale che, se ci sono i pin dell’USB in corto, si limitano i danni.

Utilizzo Digispark

Bisogna prima di tutto installare i drivers sul PC. Possono essere scaricati dall’ultima release del repository ufficiale Github: andando al paragrafo Assets c’è il link Digistump.Drivers.zip. Penso non sia necessario spiegarvi come installano i drivers.

Sul mio computer, se collego il Digispark ad una porta USB (sempre dopo aver installato i drivers), non viene riconosciuto, se lo collego ad un’altra, si, eppure le due porte sono perfettamente equivalenti. Se dovessero capitarvi dei problemi strani come questi, c’è una guida sul troubleshooting sul sito ufficiale.

Quando andate a collegare il Digispark ad una porta USB, se va tutto bene, il sistema rileva la connessione di un nuovo dispositivo. Se siete abbastanza rapidi, noterete che nel sistema compare un gruppo Microchip Tools sotto al quale c’è Digispark Bootloader

Questa cosa dura una manciata di secondi, dopodichè il sistema fa il classico suono di quando un dispositivo USB viene disconnesso: è normale perchè appena il microcontrollore riceve tensione fa partire il bootloader giusto per capire se deve essere programmato, dopodichè parte l’applicazione vera e propria che potrebbe far uso della porta USB: se è così a questo punto si sente di nuovo il suono di dispositivo connesso.

Bisogna quindi installare il supporto al Digispark per Arduino IDE. Come sempre andate nel menù FileImpostazioni > URL aggiuntive per il gestore schede e cliccate il tastino in fondo alla casella di testo:

Nella finestra che si presenta, su una nuova riga, incollate il seguente testo:

http://digistump.com/package_digistump_index.json

Premete OK, e ancora OK. Adesso in Strumenti > SchedaGestore Schede digitate Digistump

Cliccate il pulsante Installa nel riquadro che ha per titolo Digistump AVR Boards e attendete la fine dell’installazione. In Arduino IDE dalla versione 1.8.13 comparirà un nuovo gruppo di schede chiamato Digistump AVR Boards:

In questo gruppo la scheda da selezionare è la prima: Digispark (Default – 16.5MHz).

Gli esempi da provare sono una marea e li trovate nel menù FileEsempi alla voce Esempi per Digispark (Default – 16.5MHz). Per me i più interessanti sono appunto quelli che permettono di emulare una tastiera (DigisparkKeyboard), mouse e joystick.

La programmazione, poi, avviene in maniera diversa dagli altri Arduino e in maniera simile a come avviene col Teensy: non bisogna tenere il Digispark collegato. Col dispositivo scollegato bisogna premere il tasto di upload (la freccia a destra su Arduino IDE): ad un certo punto nella finestra terminale compare questo messaggio:

Solo ora possiamo collegare il Digispark ad una porta USB e la programmazione prosegue con l’upload.

Links

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)