iot

Magari proprio riconoscimento dei gesti no. Diciamo che mettiamo le basi per poterlo fare attraverso due sensori laser del tipo  VL53L0X.

Con solo due sensori il numero di movimenti che si possono riconoscere sono piuttosto limitati, io ho scelto l'oscillazione della mano con la rotazione del polso in modo da muovere di conseguenza una striscia di led e realizzare un gioco ottico. L'effetto è visibile nel video in fondo al post.

Per poter utilizzare due sensori laser i collegamenti elettrici sono come da schema esposto di seguito. Per il collegamento dei led rimando al post "Un altro modo per far lampeggiare un LED". L'alimentazione può essere ottenuta con due batterie in serie tipo AA.

post7 

Il progetto si appoggia alla libreria VL53L0X.c che ho costruito seguendo la falsa riga dell'omonima libreria Arduino. Attenzione che questa è una prima stesura e, soprattutto per la poca documentazione disponibile in internet, ci sono molti punti non spiegati, di conseguenza non consiglio l'utilizzo di questa libreria per progetti professionali.

L'intero progetto è scaricabile da github, per la completa comprensione è necessario sapere che prima di poter utilizzare la libreria sopra citata sono necessarie delle predisposizioni del microcontrollore che io ho effettuato usando il tool MCC. Queste sono:

  1. Ho impostato il clock di sistema a 64MHz (si veda post "Un altro modo per far lampeggiare un LED").
  2. Ho impostato le porte per poter gestire i LED (si veda post "Un altro modo per far lampeggiare un LED").
  3. Ho impostato il timer0 con un periodo di 1msec e ho abilitato l'IRQ (si veda post "Un altro modo per far lampeggiare un LED").
  4. Ho impostato il bus seriale I2C a 400KHz (si veda post "I2C Detect").

Questa è la premessa, vediamo i punti più significativi per capire la libreria.

struct

Siccome si fa uso di due laser, e siccome ognuno di questi laser ha impostazioni proprie, è necessario creare una struttura in cui riporre i rispettivi valori. Questa è la struttura VL53L0XDEV. Successivamente viene creato un array che possa contenere le strutture sopra definite per un numero arbitrario di sensori.

La prima istruzione relativa ai laser eseguita nella sezione main() è VL53L0X_InitDevices(). Riporto di seguito il contenuto di questa funzione.

init devices

E' importante osservare che all'accensione i laser hanno lo stesso indirizzo I2C, di conseguenza andrebbero in conflitto essendo collegati allo stesso bus. Utilizzando i pin di abilitazione (LASER0 e LASER1 collegati ai pin XSHUT dei sensori) vengono spenti entrambi; poi si carica nelle rispettive strutture i valori di indirizzo voluti (ho definito questi valori nel file header); quindi si può accendere un laser alla volta per attribuirgli l'opportuno indirizzo I2C.

Per permettere alla libreria di agire sui dati dei rispettivi sensori, le funzioni vengono chiamate passando come parametro l'indirizzo della struttura dei sensori (come ad esempio la funzione Init).

Volendosi innoltrare a scoprire la funzione Init si troverebbe una sequenza piuttosto lunga di scritture nei registri del sensore. Questa sequenza è necessaria per la calibrazione del sensore e per la selezione del tipo di funzionamento. E' importante ricordare che tutte le volte che il sensore viene disabilitato tramite il pin XSHUT è necessario ripetere la procedura.

Una volta inizializzati i sensori non resta che scegliere se fare misurazioni singole o incaricare il sensore di fare misurazioni ripetute alla massima velocità. Queste impostazioni sono presenti nel file main.c.

defineCome indicato nel commento per i dettagli fare riferimento al file readme, qui mi limito a segnalare che le prime quattro opzioni sono complementari a quella selezionata (CONTINUOUS), nel caso delle singole letture (SINGLE_SHOT) è invece possibile selezionare il tipo di funzionamento che si vuole: accurata o veloce.

Ancora una precisazione riguardo alle differenze tra CONTINUOUS e SINGLE_SHOT. Con la seconda opzione è comunque possibile continuare ad interrogare il sensore in modo "continuo" tramite il loop while, ma non si otterrà mai la stessa velocità che si può ottenere impostando il modo CONTINUOUS. In questa modalità è il sensore che si prende l'impegno di effettuare letture alla massima velocità, al programma non resta che interrogare il registro di lettura per verificare se è stato aggiornato. E' quello che viene eseguito nel codice che segue.

continuous

Il secondo parametro della funzione ContinuousReading è un numero arbitrario di millisecondi da inserire tra una lettura e la successiva. La parte successiva del loop while (di cui riporto solo la prima sezione) riguarda l'accensione dei led.

 

ifelseScarto tutte le misurazioni superiori a 60cm, poi confrontando le misurazioni dei due laser accendo di conseguenza un led e spengo i rimanenti. Per ottenere l'effetto mostrato nel video ho disposto i due laser sullo stesso asse a una distanza di circa 7cm.

breadboard 

download project