
¿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.
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.
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.
Descarga el código
Todo el código de esta entrada está disponible para su descarga en Github.
Anuncio:
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.
No, lo que pone es lo contrario, que puede dañarse si no usamos un adaptador de nivel.
A mí no se me ha dañado por usar el I2C a 5V (por alimentarlo a 5V si, se fríe seguro). Pero supongo que al sensor a la larga no le irá muy bien
Muchas gracias. ¿Seguro que la librería que has puesto es la correcta, y la que usa el script que muestras?
Cierto, los ejemplos que he puesto son con la de Adafruit, y la referencia a la de Sparkfun. He cambiado el enlace por la de Adafruit. Gracias por el aviso!
Que adaptador de nivel logico recomiendas para la conexión del bus I2C?
Gracias!
¿Es posible conectar mas de un sensor? Necesitaria detectar en 4 puntos distintos con lo que necesitaria 4 sensores.
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.
Lo que buscas es un multiplexor específico, llamado I2C Expander. Sirven precisamente para lo que quieres
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!!!
Hola..ak se habla del la característica gestual… y la de gestión de color…?