- Componentes requeridos
- Introducción al sensor de gestos y RGB de proximidad digital APDS-9960
- Diagrama de circuito
- Programación de Arduino para detección de color y gestos
Hoy en día, la mayoría de los teléfonos vienen con la función de control de gestos para abrir o cerrar cualquier aplicación, iniciar música, atender llamadas, etc. Esta es una función muy útil para ahorrar tiempo y también se ve genial para controlar cualquier dispositivo con gestos. Anteriormente usamos el acelerómetro para construir un robot controlado por gestos y un mouse Air controlado por gestos. Pero hoy aprendemos a conectar un sensor de gestos APDS9960 con Arduino. Este sensor también tiene un sensor RGB para detectar colores, que también se utilizará en este tutorial. Por lo tanto, no necesita usar sensores separados para la detección de gestos y colores, aunque está disponible un sensor dedicado para la detección de colores: el sensor de color TCS3200 que ya hemos usado con Arduino para construir una máquina clasificadora de colores.
Componentes requeridos
- Arduino UNO
- APDS9960 RGB y sensor de gestos
- LCD de 16x2
- Interruptor DPDT
- Olla de 100K y resistencia de 10K
- Cables de salto
Introducción al sensor de gestos y RGB de proximidad digital APDS-9960
APDS9960 es un sensor multifunción. Puede detectar gestos, luz ambiental y valores RGB en luz. Este sensor también se puede usar como sensor de proximidad y se usa principalmente en teléfonos inteligentes, para desactivar la pantalla táctil mientras atiende una llamada.
Este sensor consta de cuatro fotodiodos. Estos fotodiodos detectan la energía infrarroja reflejada que es transmitida por un LED integrado. Entonces, cada vez que se realiza un gesto, esta energía IR se obstruye y se refleja de nuevo en el sensor, ahora el sensor detecta la información (dirección, velocidad) sobre el gesto y la convierte en información digital. Este sensor se puede utilizar para medir la distancia del obstáculo detectando la luz infrarroja reflejada. Tiene filtros de bloqueo UV e IR para detectar colores RGB y produce datos de 16 bits para cada color.
El pin-out del sensor APDS-9960 se muestra a continuación. Este sensor funciona con el protocolo de comunicación I 2 C. Consume 1µA de corriente y funciona con 3.3V, así que tenga cuidado y no lo conecte con un pin de 5V. El pin INT aquí es el pin de interrupción, que se utiliza para impulsar la comunicación I 2 C. Y el pin VL es un pin de alimentación opcional para el LED integrado si el puente PS no está conectado. Si el puente PS está cerrado, solo necesita alimentar el pin VCC, proporcionará energía a ambos: el módulo y el LED IR.
Diagrama de circuito
Las conexiones para APDS960 con Arduino son muy simples. Usaremos un botón DPDT para cambiar entre los dos modos de detección RGB y detección de gestos. En primer lugar, los pines de comunicación I2C SDA y SCL de APDS9960 están conectados a los pines A4 y A5 de Arduino respectivamente. Como se indicó anteriormente, el voltaje de funcionamiento para el sensor es de 3.3v, por lo que VCC y GND de APDS9960 están conectados a 3.3V y GND de Arduino. El pin de interrupción (INT) de APDS9960 está conectado al pin D2 de Arduino.
Para LCD, los pines de datos (D4-D7) están conectados a los pines digitales D6-D3 de Arduino y los pines RS y EN están conectados a D6 y D7 de Arduino. V0 de LCD está conectado a la olla y se utiliza una olla de 100K para controlar el brillo de la pantalla LCD. Para los botones DPDT hemos utilizado solo 3 pines. El segundo pin está conectado al pin D7 de Arduino para la entrada y los otros dos están conectados a GND y VCC seguido de una resistencia de 10K.
Programación de Arduino para detección de color y gestos
La parte de programación es simple y fácil y el programa completo con un video de demostración se da al final de este tutorial.
Primero necesitamos instalar una biblioteca creada por Sparkfun. Para instalar esta biblioteca, vaya a Sketch-> Incluir biblioteca-> Administrar bibliotecas.
Ahora, en la barra de búsqueda, escriba "Sparkfun APDS9960" y haga clic en el botón de instalación cuando vea la biblioteca.
Y estamos listos para partir. Empecemos.
Primero, debemos incluir todos los archivos de encabezado requeridos. El primer archivo de encabezado LiquidCrystal.h se usa para funciones LCD. El segundo archivo de encabezado Wire.h se usa para la comunicación I 2 C y el último SparkFun_APDS996.h se usa para el sensor APDS9960.
#incluir
Ahora, en las siguientes líneas, hemos definido los pines para el botón y la pantalla LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
En la siguiente parte, hemos definido una macro para el pin de interrupción que está conectado en el pin digital 2 y una variable buttonState para el estado actual de button e isr_flag para la rutina de servicio de interrupción.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
A continuación, se crea un objeto para SparkFun_APDS9960, de modo que podamos acceder a los movimientos de los gestos y obtener los valores RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t luz_ambiente = 0; uint16_t luz_ roja = 0; uint16_t luz_verde = 0; uint16_t blue_light = 0;
En la función de configuración , la primera línea es buscar el valor del botón (bajo / alto) y la segunda y tercera línea define la interrupción y el pin del botón como entrada. apds.init () inicializa el sensor APDS9960 y lcd.begin (16,2) inicializa la pantalla LCD.
configuración vacía () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd. comienzo (16, 2); }
En la función de bucle , la primera línea obtiene los valores de button y los almacena en la variable buttonState definida anteriormente. Ahora, en las siguientes líneas, estamos verificando los valores del botón, si es alto, habilitamos el sensor de luz y si está bajo, inicializamos el sensor de gestos.
El attachInterrupt () es una función que se utiliza para interrupción externa que en este caso es de interrupción del sensor. El primer argumento de esta función es el número de interrupción. En Arduino UNO, hay dos pines digitales de interrupción: 2 y 3 indicados por INT.0 e INT.1. Y lo hemos conectado al pin 2, por lo que hemos escrito 0 allí. El segundo argumento llama a la función interruptRoutine () que se define más adelante. El último argumento es FALLING, por lo que activará la interrupción cuando el pin pase de alto a bajo. Obtenga más información sobre las interrupciones de Arduino aquí.
bucle vacío () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
En la siguiente parte, verificamos el pin de botón. Si es alto, inicie el proceso para el sensor RGB. Luego, verifique si el sensor de luz está leyendo valores o no. Si no puede leer los valores, en ese caso, imprima " Error al leer valores de luz". Y si puede leer valores, compare los valores de los tres colores y el que sea más alto, imprima ese color en la pantalla LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Error al leer valores de luz"); } else { if (luz_roja> luz_verde) { if (luz_roja> luz_azul) { lcd.print ("Rojo"); retraso (1000); lcd.clear (); } ……. ………..
En las siguientes líneas, vuelva a comprobar el pin del botón y, si está bajo, procese el sensor de gestos. Luego verifique isr_flag y si es 1, se llama a la función detachInterrupt () . Esta función se utiliza para apagar la interrupción. La siguiente línea llama a handleGesture (), que es la función definida más adelante. En las siguientes líneas, defina isr_flag a cero y adjunte la interrupción.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
La siguiente es la función interruptRoutine () . Esta función se utiliza para convertir la variable isr_flag en 1, de modo que se pueda inicializar el servicio de interrupción.
void interruptRoutine (). { isr_flag = 1; }
La función handleGesture () se define en la siguiente parte. Esta función comprueba en primer lugar la disponibilidad del sensor de gestos. Si está disponible, lee los valores de los gestos y comprueba cuál es el gesto (ARRIBA, ABAJO, DERECHA, IZQUIERDA, LEJOS, CERCA) e imprime los valores correspondientes en la pantalla LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("ARRIBA"); retraso (1000); lcd.clear (); romper; case DIR_DOWN: lcd.print ("DOWN"); retraso (1000); lcd.clear (); romper; case DIR_LEFT: lcd.print ("LEFT"); retraso (1000); lcd.clear (); romper; case DIR_RIGHT: lcd.print ("DERECHA"); retraso (1000); lcd.clear (); romper; case DIR_NEAR: lcd.print ("CERCA"); retraso (1000); lcd.clear (); romper; caso DIR_FAR: lcd.print ("LEJOS"); retraso (1000); lcd.clear (); romper; predeterminado: lcd.print ("NINGUNO"); retraso (1000); lcd.clear (); } } }
Finalmente, cargue el código en Arduino y espere a que el sensor se inicialice. Ahora, mientras el botón está APAGADO significa que está en modo gesto. Así que intente mover las manos hacia la izquierda, derecha, arriba y abajo. Para un gesto lejano , mantenga la mano a una distancia de 2-4 pulgadas del sensor durante 2-3 segundos y retírela. Y para un gesto cercano, mantenga su mano lejos del sensor, luego acérquelo y retírelo.
Ahora encienda el botón para ponerlo en modo de detección de color y acerque los objetos rojos, azules y verdes uno por uno al sensor. Imprimirá el color del objeto.