APDS9960 Sensor de gestos, RGB y proximidad para Arduino
En este tutorial exploraremos cómo usar el módulo sensor APDS9960, que combina detección de gestos, detección de color RGB y capacidades de detección de proximidad. Este versátil sensor puede detectar movimientos en varias direcciones y puede integrarse en proyectos para controlar motores, luces u otros dispositivos basados en gestos de la mano. Al final de este tutorial comprenderás cómo conectar el sensor e implementar la detección básica de gestos en tus proyectos con Arduino.

El módulo APDS9960 es compacto y requiere un cableado mínimo, lo que lo convierte en una excelente opción para proyectos interactivos. Usaremos el Arduino IDE para programar el sensor y mostrar los gestos detectados en el monitor serie. Para una guía visual, consulta el vídeo (en el minuto :00).
Hardware explicado
El componente clave de este proyecto es el módulo sensor APDS9960. Este módulo es capaz de detectar gestos como deslizar hacia la izquierda, deslizar hacia la derecha, deslizar hacia arriba y deslizar hacia abajo. También mide valores de color RGB y la proximidad a objetos cercanos. El sensor se comunica con el Arduino mediante I2C, lo que simplifica el cableado y el proceso de programación.
El APDS9960 contiene varios sensores internos: un sensor de gestos, un sensor de color RGB y un sensor de luz ambiental. El sensor de gestos utiliza un LED infrarrojo y un fotodetector para detectar movimientos de la mano, mientras que el sensor RGB mide las intensidades de luz roja, verde y azul para identificar colores. El sensor de proximidad determina cuán cerca está un objeto del sensor, lo que puede ser útil en diversas aplicaciones.
Detalles de la ficha técnica
| Fabricante | Avago Technologies |
|---|---|
| Número de pieza | APDS-9960 |
| Voltaje de lógica/E/S | 1.8 V a 3.6 V |
| Tensión de alimentación | 3.3 V |
| Corriente de salida (por canal) | 20 mA máx. |
| Corriente de pico (por canal) | 100 mA |
| Guía de frecuencia PWM | No aplicable |
| Umbrales de entrada lógica | 0,3 V (bajo), 0,7 V (alto) |
| Caída de tensión / RDS(on)/ saturación | 0.5 V máx. |
| Límites térmicos | -40 a 85 °C |
| Paquete | LGA de 6 pines |
| Notas / variantes | Ninguno |
- Alimente siempre el APDS9960 con 3,3 V; voltajes más altos pueden dañar el sensor.
- Asegúrese de utilizar resistencias pull-up adecuadas en las líneas I2C si conecta varios dispositivos.
- Mantenga el sensor alejado de la luz solar directa para evitar interferencias.
- Utilice un condensador de desacoplo cerca de los pines de alimentación para la estabilidad.
- Tenga en cuenta el rango de detección de proximidad (típicamente alrededor de 20 cm).
Instrucciones de cableado

Para conectar el módulo sensor APDS9960 a tu Arduino, sigue estos pasos:
- Conectar el
VCCpin del APDS9960 al pin de 3.3V del Arduino. - Conecte el
GNDConecta el pin a uno de los pines GND del Arduino. - Conecte el
SDApin al ArduinoA4pin (línea de datos I2C). - Conectar el
SCLpin al ArduinoA5pin (línea de reloj I2C). - Conecte el
INTpin a pin digital2en el Arduino para el manejo de interrupciones.
Tenga en cuenta que si está utilizando un modelo diferente de Arduino, los pines SDA y SCL pueden variar (por ejemplo, en un Arduino Mega, utiliceSDAen el pin 20 ySCLen el pin 21). Asegúrate de comprobar las asignaciones de pines específicas para tu placa. Para diferentes configuraciones, consulta el video (en el minuto 02:30).
Ejemplos de código y guía paso a paso
En la función setup, inicializamos la comunicación serie y el sensor APDS9960. El pin de interrupción se configura para escuchar eventos de gestos. Aquí tienes un fragmento del código de setup:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
Serial.println(F("APDS-9960 initialization..."));
if (apds.init()) {
Serial.println(F("Initialization complete"));
} else {
Serial.println(F("Initialization failed"));
}
}Este código realiza las configuraciones necesarias para garantizar que el sensor esté listo para su uso y proporciona retroalimentación en el monitor serie.
A continuación, definimos cómo manejar los gestos detectados por el sensor. ElhandleGestureLa función usa una sentencia switch para determinar la dirección del gesto. Aquí tienes un fragmento enfocado:
void handleGesture() {
if (apds.isGestureAvailable()) {
switch (apds.readGesture()) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
// Additional cases for left, right, near, and far
}
}
}Esta función comprueba si hay un gesto disponible y lee su dirección, imprimiendo el resultado en el monitor serie como retroalimentación. Asegúrate de consultar el código completo cargado debajo del artículo para ver los detalles completos de la implementación.
Demostración / Qué esperar
Cuando ejecutes el programa, deberías ver los gestos detectados impresos en el monitor serial a medida que mueves la mano en diferentes direcciones. Por ejemplo, deslizar hacia arriba debería mostrar UP, mientras que deslizar hacia abajo muestra DOWN. Asegúrate de mantener la mano quieta durante un segundo al realizar los gestos de cerca y de lejos (en el video en 10:00).
Tenga cuidado con la detección de proximidad del sensor; si mueve la mano demasiado rápido o demasiado lejos del sensor, es posible que no registre el gesto con precisión. Este es un problema común que puede afectar el rendimiento.
Marcas de tiempo del vídeo
- 00:00- Introducción al sensor APDS9960
- 02:30- Instrucciones de cableado
- 05:15- Explicaciones de código
- 10:00- Demostración del reconocimiento de gestos
++
/*
This is code for an APDS9960 Gesture, RGB, Proximity sensor module (6 pin).
* Watch the video on how to use APDS9960: https://youtu.be/jjXx0V13rNs
*/
/*
* This code has been modified from the Arduino library.
* Explained by Ahmad S. on March 25, 2018 at 21:19
* in Ajax, Ontario, Canada
* for Robojax.com
*
*/
/****************************************************************
GestureTest.ino
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
Tests the gesture sensing abilities of the APDS-9960. Configures
APDS-9960 over I2C and waits for gesture events. Calculates the
direction of the swipe (up, down, left, right) and displays it
on a serial console.
To perform a NEAR gesture, hold your hand
far above the sensor and move it close to the sensor (within 2
inches). Hold your hand there for at least 1 second and move it
away.
To perform a FAR gesture, hold your hand within 2 inches of the
sensor for at least 1 second and then move it above (out of
range) of the sensor.
Hardware Connections:
IMPORTANT: The APDS-9960 can only accept 3.3V!
Arduino Pin APDS-9960 Board Function
3.3V VCC Power
GND GND Ground
A4 SDA I2C Data
A5 SCL I2C Clock
2 INT Interrupt
Resources:
Include Wire.h and SparkFun_APDS-9960.h
Development environment specifics:
Written in Arduino 1.0.5
Tested with SparkFun Arduino Pro Mini 3.3V
This code is beerware; if you see me (or any other SparkFun
employee) at the local, and you've found our code helpful, please
buy us a round!
Distributed as-is; no warranty is given.
****************************************************************/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
// Pins
#define APDS9960_INT 2 // Needs to be an interrupt pin
// Constants
// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// Set interrupt pin as input
// Robojax Video Tutorial
pinMode(APDS9960_INT, INPUT);
// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialize interrupt service routine
attachInterrupt(0, 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!"));
}
// Robojax Video Tutorial
// 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(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
// Robojax Video Tutorial
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
// Robojax Video Tutorial
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
// Robojax Video Tutorial
break;
case DIR_RIGHT:
Serial.println("RIGHT");
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
// Robojax Video Tutorial
}
}
}
Cosas que podrías necesitar
-
Amazonas
-
AliExpressCompra el sensor AM2302, DHT11 o DHT22 en AliExpress.s.click.aliexpress.com
Recursos y referencias
-
ExternoBiblioteca Adafruit APDS9960 (de GitHub)github.com
Archivos📁
Archivo de Fritzing
-
Sensor RGB y de gestos APDS 9960
apds_9960_rgb_and_gesture_sensor.fzpz0.01 MB
Otros archivos
-
Biblioteca de gestos APDS9960 de RobojaxEsta biblioteca se utiliza para el Sensor de Gestos APDS9960 para detectar el movimiento de tu mano y el color presente.
robojax-gesture-APDS9960-Library.zip