Controllare un ventilatore con il deep learning
Qualche settimana fa abbiamo acquistato un Dyson AM07, un ventilatore che potremmo definire di design perché in fin dei conti non fa molto di più di un ventilatore normale: gira la testa come tutti i ventilatori dai 10 euro in su, ha qualche velocità in più e… non ha alcuna parte visibile in movimento il che lo rende più sicuro, soprattutto con un mini-pappagallo in casa, ma in fin dei conti la particolarità finisce li. In maniera del tutto inattesa l’oggetto si è presentato con un telecomando ad infrarossi (il modello superiore, un po’ diverso, avrebbe anche il supporto WiFi ma in una modalità di scarso interesse) che ha stuzzicato la mia curiosità.Avendo a disposizione un impianto di domotica completo, perché non integrarlo? Ci vuole in effetti poco, basta un trasmettitore IR (già nelle mie disponibilità) per inviare comandi come se non ci fosse un domani, ma a quel punto vien voglia di fare di più. Oltre a regolare la velocità, anche in maniera assoluta (il suo telecomando ha solo il + ed il -, ma potendo partire da una situazione nota costa poco gestire le dieci velocità), perché non controllare la rotazione?
Più precisamente l’interesse diventa quello di poter dire: orientati verso la TV, orientati verso il tavolo da pranzo oppure fai quel che ti pare. La terza possibilità è abbastanza facile da gestire, ma le altre due richiedono un po’ più di ingegno e quindi – contrariamente ad ogni regola già scritta in questo blog – ho impugnato il mio Raspberry Pi ed ho deciso implementare qualcosa che mi permetta il controllo più accurato del ventilatore.
La prima possibilità che mi è venuta in mente è quella di installare tre sensori magnetici (contatti reed) sul retro della parte fissa, un magnete sul quella mobile e rilevare la posizione tramite raspberry in modo da bloccare il ventilatore sulla posizione voluta. Per il comando ovviamente sarebbe servito un trasmettitore (un led) che dal retro andasse sulla parte frontale davanti al pulsante di accensione.
La soluzione, per quanto di sicuro successo, non mi ha allettato perché sarebbe stata decisamente invasiva nei confronti del dispositivo, rovinandone l’estetica che rappresenta probabilmente un terzo del valore del ventilante gingillo. Dopo qualche giorno ho realizzato che avrei potuto andare oltre la classica soluzione “elettrica” e utilizzare un po’ di più le capacità del Raspberry Pi a mia disposizione: perché quindi non montare una fotocamera e fare in modo che il Raspberry, guardando il ventilatore, sia in grado di determinarne la posizione. Mi sono un po’ documentato ed alla fine, tramite OpenCV, ho provato uno script in grado di riconoscere – con una certa calma – la presenza di uno o più visi all’interno di una immagine catturata.
Ho quindi impugnato cacciavite e saldatore (alternativamente) ed ho cominciato a lavorare sulla prima parte della realizzazione, quella hardware. In una giornata mi sono ritrovato con un Rpi (Zero WiFi) in grado di emettere i codici IrDA necessari a controllare il Dyson (https://github.com/rys/dyson-cool-ir-lirc/blob/master/lircd.conf), a poter comandare la cosa via web (https://github.com/alexbain/lirc_web) e poter delegare la cosa a Vantage e quindi al telecomando di casa (foto di copertina). Primo obiettivo raggiunto, si può buttare il telecomando originale. Ho montato lo scatolo sotto il divano (in modo tale da “vedere” il ventilatore, sia con i trasmettirori IrDA che con la fotocamera) ed ora abbiamo un divano WiFi 802.11g.
Il secondo obiettivo, legato al primo, è stato quello di poter configurare una automazione che – quando sono assente e l’antifurto è quindi armato – accenda a bassa velocità il ventilatore quando fa più caldo (nel pomeriggio) in modo da allietare le giornate di Cecilia (il pappagallo) perché sembra soffrire un po’ in questi giorni.
Ora la parte complessa (attualmente work in progress), quello della posizione assoluta: ho scaricato OpenCV per Rpi, ho provato la fotocamera con Raspistill e tutto funziona; ho scattato un po’ di foto del soggetto (il Dyson) nelle varie posizioni ed ora – sta girando da circa un giorno su una macchina esterna – OpenCV sta creando il modello che mi dovrebbe permettere di riconoscere le varie posizioni del ventilatore.
Vista la velocità di elaborazione dell’RPi credo che non si potrà pensare di cattuare e riconoscere una posizione in tempo reale e quindi, in attesa della compilazione del modello, sto ben pensando che potrei ristrutturare il progetto come segue:
- avviare la rotazione del ventilatore
- fare una fotografia con Rpi, salvandomi i ms in cui è stata elaborata
- inviare i dati ad un server (la NAS di casa) più potente via web service ed attendere risposta
- avviare il riconoscimento della posizione ed in caso di successo elaborare dopo quando, dal momento memorizzato, inviare il comando di stop della rotazione
- inviare il comando al momento esatto oppure fare una nuova fotografia
In questa maniera non è necessario fare in modo che tutto avvenga in meno di 500ms, ma l’elaborazione può richiedere anche qualche secondo per poi, dopo magari uno o due cicli di rotazione, ottenere la posizione richiesta.