detectar-gestos-con-arduino-y-sensor-apds-9960

Detectar gestos con Arduino y sensor APDS-9960

¿Qué es un APDS-9960?

El APDS-9960 es un sensor de gestos, sensor de proximidad, sensor de color y sensor de luz ambiental, que podemos usar junto con un procesador como Arduino.

Esta pequeña joya tecnológica era un componente del ya retirado Samsung Galaxy S5. La gran producción de este móvil ha permitido que este sensor se fabrique en grandes cantidades, lo que permite su estupenda relación calidad/precio.

El APDS-9960 permite medir el color, medir la luz ambiental y detección de gestos. La detección de gestos sin contacto permite detectar un objeto moviéndose a 5-20cm, detectando gestos de izquierda, derecha, arriba, abajo, cerca y lejos.

Incorpora filtros de IR y UV. Dispone de ganancia y tiempo de integración controlado por software. Su alta sensibilidad hace que pueda funcionar incluso detrás de un cristal oscuro.

La comunicación se realiza a través de I2C, por lo que es muy sencillo realizar su lectura con un procesador como Arduino. Adicionalmente, dispone de un pin de interrupción con umbrales configurables, evitando tener que preguntar constantemente el estado del sensor.

Precio

El APDS-9960 es un sensor muy barato para la gran cantidad de funciones que realiza. Podemos encontrar un módulo con APDS-9960 por 1.70€ en vendedores internacionales de eBay y AliExpress.

arduino-apds-9960-componente

¿Cómo funciona un APDS-9960?

El APDS-9960 integra un emisor de infrarrojos, cuatro fotodiodos direccionales y cuatro fotodiodos para la medición de color. Además, incorpora la electrónica necesaria para la medición, con rechazo de luz ambiental y compensación de offset.

arduino-apds-9960-interior

Para la detección de movimientos, el APDS-9960 compara las variaciones de luz registrada en cada uno de los fotodiodos, lo que le permite estimar el movimiento frente al sensor a una distancia de entre 5-20cm.

Para la detección de proximidad, el APDS-9960 mide la cantidad total de luz infrarroja registrada, lo que permite estimar la distancia a la que está un objeto frente al sensor.

arduino-apds-9960-funcionamiento

Adicionalmente, los sensores RGB del dispositivo permiten que el APDS-9960 pueda actuar como colorímetro y como luxómetro.

arduino-apds-9960-curvas

Esquema de montaje

La conexión de los módulos que integran el APDS-9960 es sencilla, ya que la comunicación se realiza a través de I2C. Sin embargo, la tensión de alimentación del de alimentación del APDS-9960 es de 3.3V.

Si conectáis el APDS-9960 a 5V lo dañareis inmediata y permanentemente.

Por tanto, para alimentar el módulo conectaremos los pines del módulo GND y Vin, respectivamente, y GND y 3.3V en Arduino.

Por otro lado, para la comunicación por I2C deberemos conectar los pines SCK y SDA con los pines correspondientes de nuestro modelo de Arduino. Los pines de comunicación deberían funcionar igualmente a 3.3V.

Si nuestro modelo de Arduino es de 5V, deberemos usar un adaptador de nivel lógico para realizar la conexión del bus I2C. No obstante, en los experimentos con comunicación a 5V el APDS-9960 funcionaba correctamente, pero nos arriesgamos a dañar el módulo o reducir su vida útil.

arduino-apds-9960-esquema

La conexión, vista desde Arduino, sería la siguiente.

arduino-apds-9960-conexion

No usar un adaptador de nivel en los pines de comunicación SDA y SCK puede acortar la vida útil del dispositivo, o incluso dañarlo.

Ejemplos de código

Para realizar la lectura del sensor usaremos la librería desarrollada por Adafruit, disponible en [este enlace].(https://github.com/adafruit/Adafruit_APDS9960) La librería incorpora varios ejemplos de uso que conviene revisar

A continuación vamos a ver algunos ejemplos de uso del sensor APDS-9960.

Mostrar por puerto de serie

En este primer ejemplo, leemos los gestos y mostramos por puerto serie el resultado. Para probarlo, pasar la mano por encima del sensor a unos 4-20cm de distancia.

#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

void setup() {
  Serial.begin(115200);

  if(!apds.begin()) Serial.println("failed to initialize device! Please check your wiring.");
  apds.enableProximity(true);
  apds.enableGesture(true);
}

void loop() {
    uint8_t gesture = apds.readGesture();
    if(gesture == APDS9960_DOWN) Serial.println("DOWN");
    if(gesture == APDS9960_UP) Serial.println("UP");
    if(gesture == APDS9960_LEFT) Serial.println("LEFT");
    if(gesture == APDS9960_RIGHT) Serial.println("RIGHT");
}

Este es el resultado de ejecutar este ejemplo

arduino-apds-9960-resultado

Mostrar por Led integrado

En este ejemplo, hacemos parpadear el LED integrado en la placa un número de veces, en función del gesto detectado. Esto nos permite comprobar el correcto funcionamiento del sensor sin necesidad de un ordenador para visualizar la salida.

#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

void setup() 
{
  Serial.begin(115200);

  pinMode(LED_BUILTIN, OUTPUT);
  
  if(!apds.begin()) Serial.println("failed to initialize device! Please check your wiring.");
  apds.enableProximity(true);
  apds.enableGesture(true);
}

void loop() 
{
    uint8_t gesture = apds.readGesture();
    if(gesture == APDS9960_DOWN) blink(1);
    if(gesture == APDS9960_UP) blink(2);
    if(gesture == APDS9960_LEFT) blink(3);
    if(gesture == APDS9960_RIGHT) blink(4);
}

void blink(int count)
{
  for(int i = 0; i < count; i++)
  {
    digitalWrite(LED_BUILTIN, HIGH);   
  delay(100);                     
  digitalWrite(LED_BUILTIN, LOW);   
  delay(100);     
  }
}

Aquí tenéis un video con el resultado.

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full