Ciao!
Questa è la mia guida per utilizzare il sensore APDS-9960, nello specifico affronterò la modalità "rilevamento gesture".
Questo componente infatti permette di rilevare la prossimità, il colore e le gesture fatte muovendo una mano sopra di esso ("UP", "DOWN", "RIGHT", "LEFT", "NEAR" e "FAR").
Il sensore viene montato su moduli da vari produttori,
Sparkfun e Adafruit quelli più noti, ma si trovano (su eBay ad esempio) vari moduli più economici.
Io ho acquistato su eBay un modulo simile a questo.
Vediamo subito come utilizzare il modulo con il nostro Arduino.
Per prima cosa collegate il modulo come mostrato in questo schema:
La libreria più popolare per utilizzare questi moduli è quella fornita da Sparkfun (la trovate qui), ovviamente questa libreria è sviluppata per i moduli forniti dallo stesso produttore dove ne garantisce la compatibilità.
Nel mio caso, con il modulo preso su eBay, ho avuto problemi ad utilizzare le gesture.
Infatti ho notato che caricando l'esempio "GestureTest" dalla libreria di Sparkfun, non appariva nessuna gesture.
Cercando un po' su internet non ho trovato granchè, quindi ho deciso di provare a capire quale fosse il problema.
Ho fatto alcune modifiche alla libreria di Sparkfun, ho abilitato il debug, ridotto la potenza del led ed ho aggiunto alcune funzioni.
Per procedere scaricate ed installate la libreria modificata che trovate qui.
Avendo abilitato il debug, ora sul serial monitor appariranno delle informazioni simile a quelle che vedete qui sotto
Il sensore, per capire il movimento della mano, necessita che i suoi 4 fotodiodi si comportino nello stesso modo.
Per provare il comportamento dei fotodiodi, ho messo un pezzo di cartoncino fermo davanti al modulo, in modo da far leggere ai 4 fotodiodi lo stesso valore.
Come potete vedere dai dati cerchiati il valore non è simile a tutti e 4, ma il Left è molto diverso dal Right, questo comporta degli errori nell'analisi della gesture.
Per correggere questo squilibrio, decommentate una delle righe dalla 90 alla 93 del codice qui sotto in base ad i valori letti sul vostro serial monitor, il valore tra parentesi è l'offset, il valore che inserite andrà a ridurre il valore letto.
Quindi se volete che il valore di Left sia simile a Right, dovete scrivere apds.setGestureOffset_R(5); Dove "5" è un valore con cui andrete a ridurre il valore di R. Purtroppo non andrete a togliere esattamente "5" ad "R" quindi dovete procedere per tentativi prima di trovare il valore corretto.
A questo punto, il modulo "funziona", ma devo dire che pensavo fosse più rapido nel rilevamento delle gesture, la mano deve fare un movimento molto lento per permettere una corretta interpretazione della gesture.
Questa è la mia guida per utilizzare il sensore APDS-9960, nello specifico affronterò la modalità "rilevamento gesture".
Questo componente infatti permette di rilevare la prossimità, il colore e le gesture fatte muovendo una mano sopra di esso ("UP", "DOWN", "RIGHT", "LEFT", "NEAR" e "FAR").
Il sensore viene montato su moduli da vari produttori,
Sparkfun e Adafruit quelli più noti, ma si trovano (su eBay ad esempio) vari moduli più economici.
Io ho acquistato su eBay un modulo simile a questo.
Vediamo subito come utilizzare il modulo con il nostro Arduino.
Per prima cosa collegate il modulo come mostrato in questo schema:
La libreria più popolare per utilizzare questi moduli è quella fornita da Sparkfun (la trovate qui), ovviamente questa libreria è sviluppata per i moduli forniti dallo stesso produttore dove ne garantisce la compatibilità.
Nel mio caso, con il modulo preso su eBay, ho avuto problemi ad utilizzare le gesture.
Infatti ho notato che caricando l'esempio "GestureTest" dalla libreria di Sparkfun, non appariva nessuna gesture.
Cercando un po' su internet non ho trovato granchè, quindi ho deciso di provare a capire quale fosse il problema.
Ho fatto alcune modifiche alla libreria di Sparkfun, ho abilitato il debug, ridotto la potenza del led ed ho aggiunto alcune funzioni.
Per procedere scaricate ed installate la libreria modificata che trovate qui.
Avendo abilitato il debug, ora sul serial monitor appariranno delle informazioni simile a quelle che vedete qui sotto
Il sensore, per capire il movimento della mano, necessita che i suoi 4 fotodiodi si comportino nello stesso modo.
Per provare il comportamento dei fotodiodi, ho messo un pezzo di cartoncino fermo davanti al modulo, in modo da far leggere ai 4 fotodiodi lo stesso valore.
Come potete vedere dai dati cerchiati il valore non è simile a tutti e 4, ma il Left è molto diverso dal Right, questo comporta degli errori nell'analisi della gesture.
Per correggere questo squilibrio, decommentate una delle righe dalla 90 alla 93 del codice qui sotto in base ad i valori letti sul vostro serial monitor, il valore tra parentesi è l'offset, il valore che inserite andrà a ridurre il valore letto.
Quindi se volete che il valore di Left sia simile a Right, dovete scrivere apds.setGestureOffset_R(5); Dove "5" è un valore con cui andrete a ridurre il valore di R. Purtroppo non andrete a togliere esattamente "5" ad "R" quindi dovete procedere per tentativi prima di trovare il valore corretto.
- /****************************************************************
- GestureTest.ino
- APDS-9960 RGB and Gesture Sensor
- Shawn Hymel @ SparkFun Electronics
- May 30, 2014
- https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
- Tests the gesture sensing abilities of the APDS-9960. Configures
- APDS-9960 over I2C and waits for gesture events. Calculates the
- direction of the swipe (up, down, left, right) and displays it
- on a serial console.
- To perform a NEAR gesture, hold your hand
- far above the sensor and move it close to the sensor (within 2
- inches). Hold your hand there for at least 1 second and move it
- away.
- To perform a FAR gesture, hold your hand within 2 inches of the
- sensor for at least 1 second and then move it above (out of
- range) of the sensor.
- Hardware Connections:
- IMPORTANT: The APDS-9960 can only accept 3.3V!
- Arduino Pin APDS-9960 Board Function
- 3.3V VCC Power
- GND GND Ground
- A4 SDA I2C Data
- A5 SCL I2C Clock
- 2 INT Interrupt
- Resources:
- Include Wire.h and SparkFun_APDS-9960.h
- Development environment specifics:
- Written in Arduino 1.0.5
- Tested with SparkFun Arduino Pro Mini 3.3V
- This code is beerware; if you see me (or any other SparkFun
- employee) at the local, and you've found our code helpful, please
- buy us a round!
- Distributed as-is; no warranty is given.
- ****************************************************************/
- #include <Wire.h>
- #include <SparkFun_APDS9960.h>
- // Pins
- #define APDS9960_INT 2 // Needs to be an interrupt pin
- // Constants
- // Global Variables
- SparkFun_APDS9960 apds = SparkFun_APDS9960();
- int isr_flag = 0;
- void setup() {
- // Set interrupt pin as input
- pinMode(APDS9960_INT, INPUT);
- // Initialize Serial port
- Serial.begin(9600);
- Serial.println();
- Serial.println(F("--------------------------------"));
- Serial.println(F("SparkFun APDS-9960 - GestureTest"));
- Serial.println(F("--------------------------------"));
- // Initialize interrupt service routine
- attachInterrupt(0, interruptRoutine, FALLING);
- // Initialize APDS-9960 (configure I2C and initial values)
- if ( apds.init() ) {
- Serial.println(F("APDS-9960 initialization complete"));
- } else {
- Serial.println(F("Something went wrong during APDS-9960 init!"));
- }
- // Start running the APDS-9960 gesture sensor engine
- if ( apds.enableGestureSensor(true) ) {
- Serial.println(F("Gesture sensor is now running"));
- } else {
- Serial.println(F("Something went wrong during gesture sensor init!"));
- }
- //Correzione dell'offset dei sensori. aumentando l'offset il valore letto si riduce
- //apds.setGestureOffset_U(0);
- //apds.setGestureOffset_D(0);
- //apds.setGestureOffset_L(0);
- //apds.setGestureOffset_R(0);
- }
- void loop() {
- if( isr_flag == 1 ) {
- detachInterrupt(0);
- handleGesture();
- isr_flag = 0;
- attachInterrupt(0, interruptRoutine, FALLING);
- }
- }
- void interruptRoutine() {
- isr_flag = 1;
- }
- void handleGesture() {
- if ( apds.isGestureAvailable() ) {
- switch ( apds.readGesture() ) {
- case DIR_UP:
- Serial.println("UP");
- break;
- case DIR_DOWN:
- Serial.println("DOWN");
- break;
- case DIR_LEFT:
- Serial.println("LEFT");
- break;
- case DIR_RIGHT:
- Serial.println("RIGHT");
- break;
- case DIR_NEAR:
- Serial.println("NEAR");
- break;
- case DIR_FAR:
- Serial.println("FAR");
- break;
- default:
- Serial.println("NONE");
- }
- }
- }
Questo è tutto!
Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!
Nessun commento:
Posta un commento
Lascia un commento qui sotto, ti risponderò il prima possibile!