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.

Anuncio:

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.

¿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.

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.

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

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 conectais 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.

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


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. 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

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.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino

Descarga el código

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



4.5 2 votes
Article Rating

Anuncio:

Previous Como instalar un servidor Web con XAMPP
Next Digispark, placa con Attiny85 compatible con Arduino
10 Comments
oldest
newest
Inline Feedbacks
View all comments
Jbc
5 years ago

Por qué puede dañarse el dispositivo al utilizar un conversor de nivel para i2c? En teoría el dispositivo no debería no enterarse de que existe un conversor de nivel si está bien hecho.

Joseba
5 years ago

Muchas gracias. ¿Seguro que la librería que has puesto es la correcta, y la que usa el script que muestras?

dani
5 years ago

Que adaptador de nivel logico recomiendas para la conexión del bus I2C?

Gracias!

Santiago Rubio-Felix
3 years ago

¿Es posible conectar mas de un sensor? Necesitaria detectar en 4 puntos distintos con lo que necesitaria 4 sensores.

Santiago Rubio-Felix
3 years ago

Me respondo a mi mismo, no es posible, los sensores no permiten cambiar su dirección por lo que no se pueden conectar directamente, habría que utilizar un multiplexor si no me equivoco.

Lorenzo
2 years ago

Hola, quisiera saber si me podrían ayudar, el programa de prueba corre de maravilla, pero para que corra, hay que activar el modo detector de gestos colocando la mano sobre el sensor a escasos centímetros, Me gustaría modificar este hecho, supongo que hay que modificar la librería (el archivo.h). Cual es el valor que hay que cambiar, para que el sensor empiece a detectar gestos directamente. Les agradezco mucho, si alguien responde!!!

Jesus
2 years ago

Hola..ak se habla del la característica gestual… y la de gestión de color…?