Sensor de Gestos con APDS9960

 

          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
****************************************************************/

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins en wemos D1 mini
#define APDS9960_INT      D6  //AKA GPIO12 -- Interrupt pin
#define APDS9960_SDA    D3  //AKA GPIO0
#define APDS9960_SCL     D1  //AKA GPIO5


// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
volatile bool isr_flag = 0;

void setup() {

  //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 loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(APDS9960_INT);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(APDS9960_INT, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

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.





Menu