Código de búsqueda

Sensor de gestos APDS-9960 con Arduino

Sensor de gestos APDS-9960 con Arduino

El sensor de gestos APDS-9960 permite la detección de gestos de la mano, como deslizamientos y proximidad. En este tutorial, demostraremos cómo conectar el APDS-9960 a un Arduino y programarlo para reconocer gestos. El resultado será una configuración sencilla que puede detectar movimientos y reportarlos a través del monitor serie. Esta guía te ayudará a entender el cableado y el código necesarios para comenzar con el sensor de gestos. (en el video a 00:30)

APDS-9960 gesture sensor module -1

Hardware explicado

El APDS-9960 es un sensor versátil que combina detección de color RGB, detección de luz ambiental, detección de proximidad y capacidades de detección de gestos. Se comunica con el Arduino mediante I2C, lo que permite una fácil integración con un cableado mínimo. El sensor solo funciona a 3.3V, por lo que es esencial asegurar niveles de voltaje adecuados para evitar dañar el dispositivo. En este montaje, usaremos el Arduino para leer los datos de los gestos. El sensor emite información de gestos mediante interrupciones, lo que permite que el Arduino responda con rapidez a los movimientos de la mano. La integración del APDS-9960 con el Arduino abre muchas posibilidades para proyectos interactivos, incluidos dispositivos controlados por gestos.

Detalles de la hoja de datos

FabricanteBroadcom
Número de piezaAPDS-9960
Voltaje de lógica/E/S2.7 - 3.6 V
Tensión de alimentación3.3 V
Corriente de salida (por canal)1 mA
Corriente de pico (por canal)10 mA
Guía de frecuencia PWM100 Hz
Umbrales lógicos de entrada0.3 × VDD(bajo), 0.7 x VDD(alto)
Caída de tensión / RDS(encendido)/ saturación0.5 V máx.
Límites térmicos-40 a +85 °C
PaqueteLGA de 6 pines
Notas / variantesAdmite comunicación I2C

  • Asegúrese de que la tensión de alimentación no supere 3.6 V para evitar daños.
  • Utilice resistencias pull-up en las líneas I2C para una comunicación fiable.
  • Mantenga el sensor alejado de la luz solar directa para obtener lecturas precisas.
  • Asegúrate de inicializar correctamente el sensor en el código.
  • Compruebe las conexiones del cableado para evitar entradas flotantes.

Instrucciones de cableado

Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor

Para cablear el APDS-9960 al Arduino, comience conectando la alimentación. Use un cable rojo para conectar el pin VCC del APDS-9960 al pin de 3.3V del Arduino. A continuación, conecte el pin GND del sensor a un pin de tierra del Arduino usando un cable negro. Ahora, para la comunicación I2C, conecte el pin SDA del APDS-9960 al pin A4 del Arduino. De manera similar, conecte el pin SCL al pin A5 del Arduino. Por último, conecte el pin INT del sensor al pin 2 del Arduino. Esto permitirá que el Arduino responda a las interrupciones generadas por el sensor.

Ejemplos de código y guía paso a paso

El código proporcionado inicializa el sensor APDS-9960 y configura el Arduino para leer gestos. Aquí hay un breve extracto de la función setup:

void setup() {
  pinMode(APDS9960_INT, INPUT);
  Serial.begin(9600);
  attachInterrupt(0, interruptRoutine, FALLING);
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  }
}

En este fragmento, inicializamos el monitor serie y configuramos el pin de interrupción. Se inicializa el sensor y se imprime un mensaje de confirmación en la consola. A continuación, comprobamos los gestos en la función loop:

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

Aquí, el bucle comprueba continuamente si hay gestos. Cuando se detecta un gesto, se desactiva la interrupción y se llama a la función `handleGesture` para procesar el gesto. Finalmente, la función `handleGesture` procesa los gestos detectados:

void handleGesture() {
  if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      // Additional cases...
    }
  }
}

En esta función se lee el gesto y se realiza la acción correspondiente según la dirección detectada. Esto permite un control interactivo basado en los movimientos de la mano. Para una comprensión completa del código, por favor consulte el programa completo cargado debajo del artículo.

APDS-9960 gesture sensor -3

Demostración / Qué esperar

Cuando la configuración esté completa, puedes esperar que el Arduino lea gestos y muestre la dirección detectada en el monitor serie. Pruebas simples incluyen mover la mano hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha frente al sensor. Si todo está cableado correctamente, deberías ver la salida correspondiente en el monitor serie, lo que confirma el reconocimiento de gestos. Ten cuidado con las entradas flotantes, ya que pueden provocar lecturas inconsistentes (en el vídeo en 05:20).

Marcas de tiempo del vídeo

  • 00:00- Introducción
  • 01:15- Descripción general del hardware
  • 03:00- Instrucciones de cableado
  • 04:30- Recorrido por el código
  • 06:15- Demostración

Imágenes

APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor -3
APDS-9960 gesture sensor -3
Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor
1-Code for an APDS-9960 gesture sensor for Arduino
Idioma: C++
/*
 * Código para el sensor de gestos APDS-9960 para Arduino
 * Este código detecta los gestos de la mano, ya sea moviéndola hacia arriba, abajo, izquierda o derecha. Otros gestos pueden detectarse y usarse para controlar otras funciones.
 * 
 * Vea el video del sensor de gestos APDS-9960: https://youtu.be/qzSgZV_fbxI
 * Obtenga este código en https://robojax.com
 * 
 * Código usado en el video por Ahmad Shamshiri para Robojax.com
 * el 31 de diciembre de 2016 a las 6:53 a. m. en Ajax, Ontario, Canadá
 * Se concede permiso para compartir este código, dado que esta nota se conserva junto con el código.
 * Aviso legal: Este código se proporciona "tal cual" y solo tiene fines educativos.
 * 
 * GestureTest.ino
 * Sensor de gestos y RGB APDS-9960
 * Shawn Hymel @ SparkFun Electronics
 * 30 de mayo de 2014
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * 
 * Prueba la capacidad de detección de gestos del APDS-9960. Configura el APDS-9960 mediante I²C y espera eventos de gestos. Calcula la dirección del deslizamiento (arriba, abajo, izquierda, derecha) y la muestra en una consola serie.
 * 
 * Para realizar un gesto de CERCA, mantenga la mano muy por encima del sensor y acérquela a él (a menos de 5 cm). Mantenga la mano allí durante al menos 1 segundo y luego aléjela.
 * 
 * Para realizar un gesto de LEJANO, mantenga la mano a menos de 5 cm del sensor durante al menos 1 segundo y luego aléjela (fuera del alcance).
 * 
 * Conexiones de hardware:
 * 
 * IMPORTANTE: El APDS-9960 solo acepta 3.3 V.
 * 
 * Pin Arduino: Función de la placa APDS-9960
 * 
 * Alimentación VCC de 3.3 V
 * GND: Tierra
 * A4: Datos I²C SDA
 * A5: Reloj I²C SCL
 * 2: Interrupción INT
 * 
 * Recursos:
 * Incluye Wire.h y SparkFun_APDS-9960.h
 * 
 * Especificaciones del entorno de desarrollo:
 * Escrito en Arduino 1.0.5
 * Probado con SparkFun Arduino Pro Mini de 3.3 V
 * 
 * Este código es una estafa; si me encuentras (o a cualquier otro empleado de SparkFun) en el local y te ha resultado útil, ¡invítanos a una ronda!
 * 
 * Distribuido tal cual; sin garantía.
 */
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // crear un objeto servo para controlar un servo

 // Patas
#define APDS9960_INT    2 // Necesita ser un pin de interrupción

 // Constantes

 // Variables globales
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {

 // Establecer el pin de interrupción como entrada
  pinMode(APDS9960_INT, INPUT);

 // Inicializar el puerto serie
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Inicializar la rutina de servicio de interrupción
  attachInterrupt(0, interruptRoutine, FALLING);

 // Inicializar APDS-9960 (configurar I2C y valores iniciales)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Comience a ejecutar el motor del sensor de gestos APDS-9960
  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);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        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");
    }
  }
}
2-Source code for controlling a servo with your hand
Idioma: C++
/*
 * Modificado para RoboJax por A.B.S. el 09 de mayo de 2017 en Ajax, Ontario, Canadá. www.RoboJax.com
 * 
 * Fuente original:
 * Sensor RGB y de gestos APDS-9960
 * Shawn Hymel @ SparkFun Electronics
 * 30 de mayo de 2014
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * 
 * Distribuido tal cual; no se da garantía.
 */
#include <Wire.h>

 // añadido por RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo; // crear objeto servo para controlar un servo // añadido por RoboJax

 // Clavijas
#define APDS9960_INT    2 // Debe ser un pin de interrupción

 // Constantes

 // Variables Globales
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
 myservo.attach(9); // conecta el servo en el pin 9 al objeto servo
 // Configura el pin de interrupción como entrada
  pinMode(APDS9960_INT, INPUT);

 // Inicializar el puerto serie
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Inicializar la rutina de servicio de interrupción
  attachInterrupt(0, interruptRoutine, FALLING);

 // Inicializar APDS-9960 (configurar I2C y valores iniciales)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Inicie el motor del sensor de gestos APDS-9960.
  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);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        myservo.write(180); // añadido por RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0); // añadido por RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Recursos y referencias

Aún no hay recursos.

Archivos📁

Otros archivos