Ciao a tutti, come promesso nell'articolo "Come inviare dati da accelerometro e giroscopio via WiFi con Arduino", oggi vi presentiamo il WicRoller!
Il progetto è nato dalla possibilità di implementare e realizzare un dispositivo da presentare per il corso di Human Computer Interaction tenuto dal Professor Andrew Bagdanov alla scuola di Ingegneria dell'Università degli Studi di Firenze.
Cos'è WicRoller
Il WicRoller è un dispositivo in grado di modificare il volume su un computer con sistema operativo Linux attraverso delle semplici rotazioni... come una manopola di uno stereo!
Per quanto riguarda la parte hardware sono sufficienti i componenti introdotti nell'articolo precedente (ESP8266 (NodeMCU 1.0), MPU6050, Batteria da 9V) con l'aggiunta di un interruttore per l'accensione. Tutto questo viene inserito in un involucro la cui forma ricordi quella di una manopola come ad esempio un vasetto di yogurt 🙂
Per quanto riguarda invece la parte software abbiamo utilizzato il linguaggio Python e la libreria Kivy per la realizzazione dell'interfaccia.
Riconoscimento delle rotazioni
La prima cosa da fare è implementare un algoritmo che riesca ad interpretare i dati provenienti dall'accelerometro e dal giroscopio per riconoscere le rotazioni del dispositivo.
Per fare questo, noi abbiamo considerato solo i dati relativi alla velocità angolare intorno all'asse z perpendicolare al piano, il cui andamento tipico è quello mostrato nella figura sottostante.
Di seguito è riportato il semplice algoritmo che abbiamo utilizzato per la rilevazione delle rotazioni:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
while True: x,y,z,gX,gY,gZ = stream.getValues() if(rotating and CONTINUOUS_INCREMENT): if(mov == 1): print("Rotating clockwise") if(mov == -1): print("Rotating anticlockwise") if(mov<=0 and stream.gZ<-threshold): if(not CONTINUOUS_INCREMENT): print("Clockwise rotation") mov = 1 rotating = True elif(mov>=0 and stream.gZ>threshold): if(not CONTINUOUS_INCREMENT): print("Antilockwise rotation") mov = -1 rotating = True elif((mov>0 and stream.gZ>-second_threshold) or (mov<0 and stream.gZ<second_threshold)): mov = 0 rotating = False |
L'algoritmo si basa sull'utilizzo di due soglie: un movimento di rotazione si considera iniziato al superamento della più alta tra le due soglie e si considera concluso una volta che si scende sotto la seconda. Una intuizione grafica di questo meccanismo è mostrata in figura
Si può notare inotre che l'algoritmo implementa due modalità che differiscono per il tipo di azione che segue una rotazione: con la modalità continua il volume varia con continuità per tutta la durata della rotazione, mentre nella modalità discreta il volume viene modificato una sola volta di una certa quantità prefissata.
L'applicazione
Successivamente abbiamo realizzato un'interfaccia grafica per avviare l'applicazione, connettere il dispositivo al computer e cambiare la modalità di utilizzo.
L'interfaccia è stata sviluppata con Kivy e tra le altre cose mostra un feedback sulla variazione di volume del sistema tramite uno slider.
Dato che Kivy è un framework che mantiene il controllo del programma per aggiornare l'interfaccia, l'algoritmo di riconoscimento delle rotazioni viene eseguito in un thread parallelo all'interfaccia.
Per modificare il volume di un sistema Linux abbiamo utilizzato del codice bash che viene chiamato all'interno del programma python.
Conclusioni
Una volta completata l'applicazione è stata provata da alcuni utenti che hanno testato le diverse modalità tramite l'interfaccia ed è risultato che le rotazioni vengono rilevate correttamente e le modifiche del volume vengono effettuate in modo naturale.
Abbiamo inoltre implementato la possibilità di disattivare immediatamente l'audio del computer capovolgendo il dispositivo fin quando non viene riportato nella posizione originaria. Per fare questo si sfrutta il verso dell'accelerazione di gravità percepita dal sensore sull'asse z.
Il codice sorgente del progetto WicRoller è disponibile su GitHub all'indirizzo:
https://github.com/ilvitto/WicRoller