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