Progettare rapidamente controller di gesti 3D personalizzati a basso costo

Di Jacob Beningo

Contributo di Editori nordamericani di DigiKey

In genere, per interagire con macchine e dispositivi embedded si utilizzano manopole, pulsanti, leve e touchscreen. I recenti miglioramenti nella tecnologia dei sensori stanno però dando agli sviluppatori la possibilità di aggiungere ai propri prodotti il controllo tridimensionale (3D) dei gesti.

A seconda della tecnologia utilizzata, l'acquisto e l'integrazione di un controller dei gesti può rivelarsi un'operazione costosa. Esistono però numerose tecnologie di sensori di gesti, da quelli a basso costo che per rilevare il movimento utilizzano LED agli infrarossi e fotodiodi, fino ad arrivare a costose fotocamere di riconoscimento gestuale. I sensori di gesti agli infrarossi sono dispositivi economici che possono essere interfacciati digitalmente con un microcontroller a basso costo e che, con pochissimo software, risultano sufficientemente accurati per numerose applicazioni.

Questo articolo prende in esame il controllo dei gesti utilizzando APDS-9960 di Broadcom, un sensore di controllo dei gesti agli infrarossi (IR) facilmente integrabile praticamente in qualsiasi sistema embedded.

Sensori di gesti basati su IR

La teoria alla base dei sensori di gesti basati su IR è relativamente semplice. Esistono diversi gesti della mano che gli sviluppatori potrebbero voler rilevare:

  • Movimento verso l'alto/il basso
  • Movimento verso sinistra/destra
  • Movimento in avanti/indietro

In ognuno di questi casi il sensore deve poter rilevare la direzione del movimento. Per farlo vengono usati due suoi componenti principali: un diodo luminescente (LED) e fotodiodi direzionali. Questi ultimi sono costituiti semplicemente da un gruppo di almeno quattro fotodiodi posizionati a una distanza predefinita dal LED IR. Ad esempio, i fotodiodi del sensore di gesti, luce ambiente e prossimità APDS-9960 di Broadcom sono disposti a rombo e ognuno di essi ha uno specificatore direzionale: su, giù, a sinistra e a destra (Figura 1).

Schema di APDS-9960 di BroadcomFigura 1: APDS-9960 di Broadcom ha un LED IR integrato e quattro fotodiodi direzionali che rilevano l'energia IR riflessa che può essere analizzata per determinare il profilo di un gesto. (Immagine per gentile concessione di Broadcom)

Quando il LED trasmette energia a infrarossi, l'energia verrà emessa in uno spazio vuoto, a meno che in tale spazio non vi sia un oggetto, ad esempio una mano, che la riflette. L'energia riflessa verrà rilevata dai fotodiodi a diverse intensità, a seconda della posizione occupata dall'oggetto. Ad esempio, un fotodiodo posto all'inizio del gesto riceverà inizialmente meno energia riflessa di un fotodiodo posto alla fine, per cui un fotodiodo avrà un conteggio più alto dell'altro. Effettuando misurazioni durante il gesto, i fotodiodi rilevano diverse intensità riflesse nei punti in cui si trovano i vari diodi. Quindi, per determinare il gesto si può analizzare questo flusso di informazioni direzionali.

Ad esempio, se un utente sposta la mano dall'alto del sensore verso il basso, all'inizio del gesto il fotodiodo del movimento verso il basso rileverà più luce riflessa incidente rispetto al fotodiodo del movimento verso l'alto. Durante il gesto, la mano si sposta in un punto in cui entrambi i diodi ricevono la stessa quantità di energia. Al termine del gesto, il fotodiodo del movimento verso il basso riceverà meno luce riflessa e quello del movimento verso l'alto ne riceverà di più, invertendo la curva e la fase per i fotodiodi (Figura 2).

Grafico delle curve dei fotodiodi APDS-9960 di BroadcomFigura 2: Un gesto verso il basso attraverso APDS-9960 di Broadcom genera queste curve dei fotodiodi, in cui la curva iniziale indica la direzione del gesto. (Immagine per gentile concessione di Broadcom)

Una volta compreso come vengono generati i dati per un gesto, il passo successivo consiste nel vedere come interfacciarsi con APDS-9960.

Interfacciarsi con il controller di gesti APDS-9960 di Broadcom

APDS-9960 viene fornito in un contenitore a montaggio superficiale a 8 pin (SMD-8) che occupa pochissimo spazio sulla scheda (Figura 3). Il sensore misura solo 3,94×2,36×1,35 mm. Il contenitore è provvisto dei normali pin di alimentazione e messa a terra, oltre che di un'interfaccia I2C per una connessione digitale con un microcontroller e di pin per personalizzare i circuiti di pilotaggio dei LED. Prevede inoltre un pin di interrupt per comunicare al microcontroller quando sono disponibili dati dei gesti da elaborare.

Immagine di APDS-9960 di Broadcom in un compatto contenitore SMD-8 a montaggio superficialeFigura 3: APDS-9960 è disponibile in un compatto contenitore SMD-8 a montaggio superficiale che riduce al minimo lo spazio occupato sulla scheda. (Immagine per gentile concessione di Broadcom)

Per realizzare un prototipo e interfacciarsi con APDS-9960 esistono numerose opzioni. Ad esempio, la scheda di valutazione APDS-9960 di SparkFun è una scheda di breakout relativamente piccola che comprende i circuiti di pilotaggio dei LED, per cui è pronta per essere utilizzata da subito (Figura 4). Lo sviluppatore non deve far altro che saldare una basetta per ponticellare alimentazione e terra, collegare il bus I2C e il pin di interrupt opzionale a un microcontroller, dopo di che può iniziare a sviluppare il proprio software embedded. La scheda SparkFun include anche dei fori di montaggio che permettono di inserirla in un progetto se l'applicazione accetta l'uso di una scheda esistente.

Immagine della scheda di valutazione APDS-9960 di SparkFunFigura 4: La scheda di valutazione APDS-9960 di SparkFun dispone già di tutti i circuiti necessari per iniziare a progettare il controllo dei gesti. (Immagine per gentile concessione di DigiKey)

In alternativa, gli sviluppatori possono usare un'altra soluzione "tutto in uno", la scheda di breakout APDS-9960 di Adafruit, (Figura 5). La scheda di breakout di Adafruit è interessante perché, oltre ad avere dimensioni molto ridotte, contiene anche un regolatore integrato a 3 volt che può essere utilizzato per alimentare altri circuiti, ad esempio un LED o anche un microcontroller a basso consumo. In più, Adafruit offre una guida utente completa sulla sua scheda di breakout APDS9960 e diverse librerie software per la connessione con schede Arduino o con schede di sviluppo che eseguono Python. L'esperienza con APDS-9960 risulta quindi estremamente appagante e può ridurre drasticamente il tempo speso da uno sviluppatore per realizzare il sensore.

Immagine della scheda di breakout APDS-9960 di AdafruitFigura 5: La scheda di breakout APDS-9960 di Adafruit include, oltre ad APDS-9960, un regolatore integrato a 3 volt e circuiti di conversione della tensione I2C per supportare bus a 3 o 5 V. (Immagine per gentile concessione di DigiKey)

Il modo più facile di interfacciare queste schede di breakout consiste nel saldarvi le basette di spunto 22-28-4255 di Molex. Per ottenere maggiori vantaggi, le basette devono essere rivolte verso il basso. Questo consente prima di tutto di inserire la scheda in una basetta sperimentale come quella del kit senza saldature 340-002-1 di Digilent (Figura 6). In secondo luogo, la superficie superiore della scheda rimane libera, lasciando ampio spazio per compiere i gesti con la mano senza impigliarsi accidentalmente nei fili che pendono dalle basette.

Immagine della scheda di breakout APDS-9960 di AdafruitFigura 6: Scheda di breakout APDS-9960 di Adafruit saldata e preparata su una basetta sperimentale senza saldature di Digilent. (Immagine per gentile concessione di Adafruit)

A questo punto occorre provvedere al collegamento dell'alimentazione, della terra e delle linee I2C alla scheda di sviluppo desiderata basata su microcontroller. Si può utilizzare qualsiasi scheda di sviluppo che abbia un microcontroller. È tuttavia preferibile scegliere il Kit Discovery IoT per nodo ioT STM32L475 B-L475E-IOT01A2 di STMicroelectronics (Figura 7). Questa scheda di sviluppo è provvista di basette Arduino ed è anche supportata da MicroPython, che può essere facilmente programmato sulla scheda. Fatto ciò, si possono usare gli script Python per interfacciarsi con il sensore di gesti, rendendo il controllo dei gesti non solo fattibile ma quasi un gioco da ragazzi.

Immagine del Kit Discovery per nodo IoT STM32L475 di STMicroelectronicsFigura 7: Il Kit Discovery per nodo IoT STM32L475 include basette Arduino che possono essere facilmente interfacciate con le schede di breakout APDS-9960. (Immagine per gentile concessione di STMicroelectronics)

Rilevamento di gesti con Python

Ottenere da APDS-9960 dati sui gesti non è complesso ma lo sviluppatore deve leggere attentamente la scheda tecnica. APDS-9960 è dotata di numerose funzionalità, fra cui:

  • Rilevamento dei gesti
  • Rilevamento luce ambiente
  • Rilevamento dei colori RGB
  • Rilevamento di prossimità

Tutte queste funzionalità sono controllate tramite una macchina a stati che viene eseguita in base alla configurazione dei registri per l'applicazione. Ad esempio, una tecnica eccellente per impedire che il motore dei gesti sia sempre in funzione consiste nell'utilizzare il motore di rilevamento di prossimità per rilevare la presenza di una mano. Quando l'energia IR riflessa raggiunge un conteggio prestabilito, il motore di prossimità passa allo stato dei gesti, che misurerà i fotodiodi direzionali e metterà il valore misurato in un buffer FIFO (first-in, first-out). Perché ciò avvenga, occorre impostare il registro di controllo affinché abiliti la prossimità e specificare la soglia dei conteggi.

A seconda dei gesti richiesti dall'applicazione, per rilevarne di specifici uno sviluppatore potrebbe dover scrivere degli algoritmi appositi. Per gesti comuni come il movimento su/giù/a sinistra/a destra, può però sfruttare la libreria CircuitPython APDS-9960 di Adafruit. Una volta copiata nel dispositivo Python, la libreria può essere importata utilizzando il codice mostrato nel Listato 1. Questo codice importa la libreria APDS-9960 e diverse altre librerie che supportano il bus I2C.

Copy
import board 
import busio 
import adafruit_apds9960.apds9960 
 
i2c = busio.I2C(board.SCL, board.SDA) 
sensor = adafruit_apds9960.apds9960.APDS9960(i2c)

Listato 1: Importazioni di CircuitPython e codice di inizializzazione della libreria con il controller di gesti APDS-9960. (Immagine per gentile concessione di Adafruit)

L'oggetto sensore è un'istanza della libreria APDS-9960. Vedremo fra un attimo che è molto facile da utilizzare. Per abilitare i gesti, è sufficiente che lo sviluppatore abiliti la relativa funzionalità tramite il codice seguente:

Copy
sensor.enable_gesture = True
The main program loop setup to read the gesture is itself just a few lines of code (Listato 2).
gesture = sensor.gesture()
while gesture == 0:
gesture = sensor.gesture()
print('Saw gesture: {0}'.format(gesture))

Listato 2: Rilevare un gesto è semplice come effettuare ripetutamente una chiamata di un singolo metodo della libreria. (Immagine per gentile concessione di Adafruit)

Come si potrà vedere leggendo questo codice, se viene rilevato, il gesto verrà visualizzato sullo schermo (Figura 8).

Immagine del risultato prodotto da un gesto di esempio tratto dalla libreria CircuitPython APDS-9960 di AdafruitFigura 8: Risultato prodotto da un gesto di esempio tratto dalla libreria CircuitPython APDS-9960 di Adafruit. (Immagine per gentile concessione di Adafruit)

Il risultato del gesto è dato da un numero, che può essere facilmente convertito tramite la seguente chiave:

0 = Nessun gesto rilevato

1 = Rilevato gesto verso l'alto

2 = Rilevato gesto verso il basso

3 = Rilevato gesto verso sinistra

4 = Rilevato gesto verso destra

Come mostrato, se si sfrutta una libreria che esiste già, il riconoscimento dei gesti di base può risultare semplice e richiede solo poche righe di codice. Gesti più complessi richiederebbero la modifica della libreria per analizzare i dati grezzi.

Suggerimenti e consigli per creare un controller di gesti

Costruire e integrare un sensore di controllo dei gesti in un prodotto comporta alcune sfide. Ecco una serie di "suggerimenti e consigli" di cui gli sviluppatori devono tener conto quando lavorano con i controller di gesti a infrarossi:

  • Utilizzare il rilevatore di prossimità interno del sensore di gesti per attivare il motore di controllo dei gesti al fine di ridurre al minimo l'avvio di quelli non validi.
  • Iniziare con una libreria di gesti esistenti e crearne altri in aggiunta alle funzionalità già presenti.
  • Regolare il guadagno dei fotodiodi sui valori più idonei per l'applicazione finale del gesto.
  • Regolare l'intensità di pilotaggio dell'uscita dei LED sui valori più idonei per l'applicazione. Per ottenere risultati ripetibili potrebbe essere necessario effettuare degli adattamenti.
  • Uno sviluppatore dovrebbe iniziare qualsiasi applicazione di gesti con uno sviluppo software di alto livello finché non capisce il sensore, e passare solo dopo al codice di livello inferiore.

Seguendo questi suggerimenti gli sviluppatori potranno ridurre al minimo il tempo speso per l'installazione e il funzionamento di un controller di gesti a infrarossi.

Conclusione

Vi è una richiesta costante di interazioni più naturali e intuitive con le macchine e una delle opzioni principali è l'uso della tecnologia di controllo dei gesti. Anche se esistono molti tipi di tecnologie di controllo dei gesti, il modo più economico e facile è un sensore di gesti a infrarossi. Come mostrato, l'integrazione di un sensore di gesti con un microcontroller non deve necessariamente essere un'attività che richiede tempo, a condizione che gli sviluppatori sfruttino le tecnologie hardware e software esistenti.

DigiKey logo

Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

Informazioni su questo autore

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo è un consulente software embedded e attualmente lavora con clienti in più di una decina di paesi per trasformare radicalmente le loro attività migliorando la qualità dei prodotti, i costi e il time-to-market. Ha pubblicato più di 200 articoli sulle tecniche di sviluppo di software embedded, è un relatore e un istruttore tecnico e ha conseguito tre lauree, tra cui un master in ingegneria presso University of Michigan. Risponde all'indirizzo jacob@beningo.com, ha un sito web personale www.beningo.com e produce una Newsletter mensile Embedded Bytes cui è possibile iscriversi.

Informazioni su questo editore

Editori nordamericani di DigiKey