The Blog

Detectar gestos con el APDS-9960
By febrero 25, 2020 0 Comment

Detectar gestos con el APDS-9960

En la enorme lista de sensores interesantes tenemos el APDS-9960. Es un sensor capaz de detectar gestos, reconocer colores y medir la luz ambiental.

Es bien conocido que este sensor fue utilizado en el Samsung Galaxy S5, por lo que estamos hablando de un sensor de alta calidad. También se ha producido en bastantes cantidades, esto hace que sea más accesible. Se suele vender ya montado en una PCB, esto ayuda a agilizar el montaje a las placas de desarrollo y demás proyectos.

El sensor en sí es bastante pequeño.


Según la hoja el sensor puede trabajar en ambientes de -30 a 85 °C.

El voltaje de operación recomendado (VDD según la hoja de datos) es de 3.6V, siendo 3.8 el caso más extremo y menos recomendado. Sin embargo, lo mínimo que acepta es 2.4V por lo que nuestro pin de 3.3V de Arduino lo puede alimentar sin problema.

En el caso de los puertos del I2C (SDA y SCL) su voltaje admitido está entre 1.26 y lo que llega el VDD. Eso quiere decir que hay muchas probabilidades de dañar el sensor si lo alimentamos o comunicamos conectando 5V. Puede que no un daño instantáneo, pero sí reduciría su vida útil.

Nota: El I2C va a 400 KHz y tienen la dirección 0x39.

En los casos en el que el sensor viene en un PCB se suelen poner resistencias que disminuyan el voltaje emitido por la placa de desarrollo, ya que suelen ser diseñadas para este propósito.

De todas maneras, lo mejor alimentar el módulo desde 3.3V.

En resúmen: 

Voltaje de operación (VDD) 2.4 - 3.6V (Recomendado 3.3V en Arduino)
Temperatura de operación -30 - 85°C
Dirección I2C 0x39
Frecuencia I2C 400KHz
Volatje I2C 1.26 - VDD
Tamaño 3.94 x 2.10 x 0.20

¿Cómo funciona el sensor de gestos?

El sensor tiene 4 fotodiodos que reaccionan a la luz infrarroja. Así se detecta la posición de un objeto sobre el sensor en base a la cantidad de luz que están recibiendo los fotodiodos. A su vez, esto nos permite reconocer gestos básicos como ARRIBA-ABAJO-IZQUIERDA-DERECHA.

El consumo de estos fotodiodos no es muy elevado y se pueden regular su funcionamiento.

Conexión

Te dejamos el esquema para conectar el módulo. Los pines A4 Y A5 están conectados con los pines SDA y SCL del Arduino, por lo que se pueden usar para el I2C.

Programación

Usaremos una librería desarrollada por Adafruit. Esta librería procesará la cadena de bytes enviada por I2C.

Para instalarla debemos abrir el editor de Arduino. Ir al menú “Herramientas” y entrar en “Administrar Bibliotecas”. O usar directamente el atajo de teclado Ctrl+Mayús+I.

Allí buscaremos “APDS”, nos mostrará varias librerías, pero por ahora usaremos la de Adafruit.

La librería tiene varios ejemplos de código, nosotros hemos publicado el que usamos en el vídeo con los leds. Puedes subir ese mismo a tu Arduino aunque no conectes leds ya que podrás verificar el funcionamiento a través del monitor serie (Ctrl+Mayús+M).

Aquí el código:

//Incluimos la librería y creamos el objeto "apds"
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

//Declaramos los pines que controlarán los leds
int LedIzquierda = 7;
int LedDerecha = 4;
int LedArriba = 5;
int LedAbajo = 6;

void setup() {
  //Iniciamos el puerto serial
  Serial.begin(115200);

  //Declaramos los pines de los leds como salida
  pinMode(LedIzquierda, OUTPUT);
  pinMode(LedDerecha, OUTPUT);
  pinMode(LedArriba, OUTPUT);
  pinMode(LedAbajo, OUTPUT);

  //Proceso para confirmar el estado del módulo
  if (!apds.begin()) Serial.println("Error al iniciar el dispositivo");
  apds.enableProximity(true);
  apds.enableGesture(true);
}

void loop() {
  //Se inicia la lectura del sensor
  uint8_t gesture = apds.readGesture();

  //Apagamos todos los leds, también nos servirá cuando se vuelva a repetir
  //el ciclo.
  ApagarLeds();

  //Ahora las condiciones
  //Si el sensor detecta un movimiento, por ejemplo hacia la derecha,
  //se imprimirá en monitor serie la dirección "Derecha"
  //y encenderá el led correspondiente mientras apaga los demás
  if (gesture == APDS9960_DOWN) {
    Serial.println("Abajo");
    EncenderAbajo();
  }
  if (gesture == APDS9960_UP) {
    Serial.println("Arriba");
    EncenderArriba();
  }
  if (gesture == APDS9960_LEFT) {
    Serial.println("Izquierda");
    EncenderIzquierda();
  }
  if (gesture == APDS9960_RIGHT) {
    Serial.println("Derecha");
    EncenderDerecha();
  }
}

//****************************************************************************
//Nota: Se ha dividido el código en "bloques", aunque en un programa pequeño
//como este no hace mucha diferencia, es una buena práctica para tener código
//más ordenado y legible en caso otra persona lo tenga que ver.
//****************************************************************************

//Función para apagar todos los leds
void ApagarLeds() {
  digitalWrite(LedIzquierda, LOW);
  digitalWrite(LedDerecha, LOW);
  digitalWrite(LedArriba, LOW);
  digitalWrite(LedAbajo, LOW);
}

void EncenderAbajo() {
  digitalWrite(LedIzquierda, LOW);
  digitalWrite(LedDerecha, LOW);
  digitalWrite(LedArriba, LOW);
  digitalWrite(LedAbajo, HIGH);
}

void EncenderArriba() {
  digitalWrite(LedIzquierda, LOW);
  digitalWrite(LedDerecha, LOW);
  digitalWrite(LedArriba, HIGH);
  digitalWrite(LedAbajo, LOW);
}
void EncenderIzquierda() {
  digitalWrite(LedIzquierda, HIGH);
  digitalWrite(LedDerecha, LOW);
  digitalWrite(LedArriba, LOW);
  digitalWrite(LedAbajo, LOW);
}
void EncenderDerecha() {
  digitalWrite(LedIzquierda, LOW);
  digitalWrite(LedDerecha, HIGH);
  digitalWrite(LedArriba, LOW);
  digitalWrite(LedAbajo, LOW);
}

//Puedes borrar las funciones y variables que se relacionen con los leds,
//podrás seguir viendo a través del monitor serie.

Una vez que hayas subido el código a tu Arduino espera unos segundos y prueba mover tu mano sobre el sensor. En el monitor serie podrás ver el texto indicando en qué dirección se está moviendo tu mano.

Conectando siguiendo los pines indicados en el código puedes hacer algo como esto:

Es una de las funciones que tiene este sensor. Próximamete exploraremos las demás funciones como el reconocimiento de colores.

Comparte si te gustado, no ayuda mucho. Y comenta si tienes alguna duda. O contáctanos directamente, te podemos ayudar en tus proyectos.

Leave a comment

X

WELCOME TO OUR WONDERFUL WORLD

Did you know that we ship to over 24 different countries

Login with Facebook
X

WELCOME TO OUR WONDERFUL WORLD

Did you know that we ship to over 24 different countries

Register with Facebook
X

WELCOME TO OUR WONDERFUL WORLD

Did you know that we ship to over 24 different countries

Please enter the email address you used to register. You will receive a temporary link to reset your password.