El sensor APDS9960 normalmente se incluye en un módulo preparado para conectarse por I2C (Dirección: 0x39) que permite la comunicación con cualquier microprocesador. Este sensor es usado en este ejemplo como sensor de gestos, pero también sirve como detector de luz ambiente y puede discriminar colores dando información de la proporción RGB de la muestra. Es el mismo sensor que utiliza el teléfono Samsung Galaxy S5.
Dispone de filtro UV e IR así como cuatro diodos que le permiten detectar la dirección del movimiento que hagamos por ejemplo con la mano. Detecta movimiento a izquierda, derecha, arriba, abajo, cerca y lejos (LEFT, RIGHT, DOWN, UP, NEAR Y FAR. Si no lo tiene claro responde NONE. Debe esta iluminado para detectar la sombra de la mano.
Para que reconozca el gesto Cerca (NEAR), mantener la mano lejos del sensor y acercarla a unos 5cm y mantenerla allí al menos un segundo y luego quitarla. Para Lejos (FAR), mantener la mano a unos 5cm durante al menos un segundo y luego retirarla lejos del rango de detección.
El módulo tiene un pin de interrupción (INT) para generar eventos de detección y evitar que este mandando datos inútiles continuamente. Funciona a corta distancia, unos 10 a 20cm. Su voltaje es para 3,3 voltios, por cuya razón he preferido usar un módulo ESP8266 Nodemcu que se alimenta a 5v, pero con salida de 3,3v y sobre todo la comunicación I2C también es a ese voltaje a diferencia de un Arduino a 5v que pueden dañar el módulo.
/* IMPORTANTE: ¡¡El módulo del APDS-9960 solo funciona a 3,3V!!
Wemos esp8266 ----- APDS-9960 Board Function
3.3V VCC Power GND GND Ground D3 SDA I2C Data D1 SCL I2C Clock D6 INT Interrupt
Librería modificada para ESP8266 por Jon Ulmer Nov 2016 ****************************************************************/
//Start I2C with pins defined above Wire.begin(APDS9960_SDA,APDS9960_SCL);
// Set interrupt pin as input pinMode(APDS9960_INT, INPUT);
// Initialize Serial port Serial.begin(9600);
// Initialize interrupt service routine attachInterrupt(APDS9960_INT, 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!")); } }
void handleGesture() { if ( apds.isGestureAvailable() ) { switch ( apds.readGesture() ) { case DIR_LEFT: Serial.print("{LEFT}"); //LEFT Pasa página break; case DIR_RIGHT: Serial.print("{RIGHT}"); //RIGHT retrocede pagina break; // case DIR_NEAR: // Serial.print("NEAR"); // break; // case DIR_FAR: // Serial.print("FAR"); // break; default: Serial.println("NONE"); } }
El montaje y el programa (cogido de los ejemplos) no pueden ser mas sencillos.
Las conexiones entre el módulo y el Wemos esp8266 son las de cabecera del programa.
La idea es usarlo para pasar las páginas de una revista en pdf en el ordenador, por ello solo usa los gestos izquierda y derecha para avanzar y retroceder.
Como el usb del Wemos (ni del Arduino Uno) pueden emular un teclado, he usado el sistema que describo en esta otra página Serial2SendKeys
Cargado el Sketch en el Webmos, arrancamos Serial2SendKeys y seleccionamos puerto y baudios y conectamos. Los comandos LEFT y RIGHT actuaran en el PC sobre cualquier ventana activa emulando las correspondientes acciones de los cursores izquierdo. y derecho.