Controle cosas usando sus manos con el APDS-9960 Deja un comentario

VISIÓN DE CONJUNTO

¡Alguna vez compras cosas y te olvidas de ellas! Este es el caso cuando se trata de este pequeño módulo.

El APDS-9960 es como 3 módulos en uno. Es compatible con el reconocimiento de color, la proximidad y la detección de gestos.

En este tutorial nos concentraremos en el motor Gesture.

Puede detectar 6 gestos: IZQUIERDA, DERECHA, ARRIBA, ABAJO, LEJOS y CERCA

Lo usaremos para controlar la velocidad y la dirección de un motor paso a paso NEMA 17.

El gesto ‘Lejos’ comenzará la rotación, ‘Izquierda’ y ‘Derecha’ la dirección, ‘Arriba’ y ‘Abajo’ la velocidad, y el gesto ‘Cercano’ detendrá la rotación.

Una cosa que descubrí de mi prueba, es que el módulo debe ser lo más perpendicular posible (90 grados) de su mano para detectar el gesto correcto.

Además, usar una hoja de papel blanco en lugar de la mano da como resultado una mejor detección, así que eso es lo que estoy usando en el video tutorial.

El rango de detección del módulo es de aproximadamente 4 a 8 pulgadas.

CONEXIONES

El módulo APDS-9960 está clasificado para 3.3V, no solo para el voltaje de entrada, sino también para las líneas de control.

Es por eso que estamos usando un convertidor de nivel lógico I2C para pasar de 5V a 3.3V del MEGA2560 al módulo.

Las conexiones son las siguientes:

5V y GND del MEGA2560 van a HV y GND del convertidor de nivel

el LV y el GND del convertidor de nivel van al VCC y al GND del APDS-9960.

El Pin 20 (SDA) y el 21 (SCL) están conectados al convertidor de nivel y los pines correspondientes opuestos en el convertidor de nivel están conectados al APDS-9960.

El pin 2 del MEGA2560 está conectado directamente al pin de interrupción del APDS-9960, no es necesario pasar por el convertidor de nivel para este, ya que la corriente para la interrupción solo fluye en un sentido y el MEGA2560 puede detectar los 3.3V para disparar la interrupción.

Para Easy Driver conectamos los pin 5 y 6 al STEP y al pin DIR.

También conectamos GND del MEGA2560 al Easy Driver como referencia.

EL CÓDIGO

El código usa la biblioteca AccelStepper y una biblioteca especialmente creada para este módulo. (Consulte a continuación los enlaces de descarga)

——————

Existe un problema con la biblioteca APDS-9960 si está utilizando algo que no sea Arduino UNO, lo que hace que el motor de gestos no registre ningún valor.

Para solucionar este problema, debe editar el archivo de la biblioteca () y encontrar esta línea:

if (! setLedBoost (LED_BOOST_300))}

y cambie el valor de 300 a 100 de esta manera:

if (! setLedBoost (LED_BOOST_100))}

Después de ese cambio, el Arduino MEGA2560 comenzó a funcionar. Mi sugerencia es probarlo sin modificaciones y, si no funciona, seguir adelante y realizar el cambio.

Repaso esto en el video tutorial a continuación si quieres más información.

——————

Cuando el APDS-9960 detecta algo que bloquea el emisor IR, activará una interrupción y luego esperará a leer el gesto. Cuando se lee el gesto, verificamos cuál y controlamos el motor paso a paso de acuerdo.

Hacemos un seguimiento de la velocidad y la dirección del stepper, para que podamos ajustarnos adecuadamente según el gesto.

Los movimientos Arriba y Abajo controlan la velocidad del paso a paso en incrementos de 200 (o -200) sin superar los 1000 (o menos de -1000). Los gestos izquierdo y derecho controlan la dirección. Lejos y Cercanos Comience y pare la rotación del motor paso a paso.

Como siempre, para obtener más información sobre el tutorial y la explicación del código, mire nuestro video tutorial.

/ * Arduino Gesture Control Motor paso a paso 
* Uso de ADPS-9960 RGB y módulo de sensor de gestos 
 
Creado por Yvan / https://Brainy-Bits.com 

Este código es de dominio público ... 

Puedes: copiarlo, usarlo, modificarlo, compartirlo o simplemente ignorarlo. 
¡Gracias! 

* / 

#incluir 
#incluir 
// Biblioteca creada por Sparkfun en: 
// https://github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library 

#include "AccelStepper.h" 
// Biblioteca creada por Mike McCauley en 
// http://www.airspayce.com/mikem/arduino/AccelStepper/ 

// Configuración de AccelStepper AccelStepper paso a paso ( 1 , 5 , 6 ); // 1 = Interfaz de controlador fácil 
// MEGA Pin 5 conectado al pin STEP de Easy Driver 
// MEGA Pin 6 conectado al pin DIR de Easy Driver 

#define gesture_interrupt 2 
// Usando interrupción cero (Pin 2 en Mega2560) 

// Init del módulo SparkFun_APDS9960 apds9960 = SparkFun_APDS9960 (); volátil int interrupt_flag =  0 ; // Para mantener un registro de la activación de la interrupción 
En t step_direction =  0 ; // para realizar un seguimiento de la rotación del motor paso a paso cero para la izquierda - uno para la derecha 
En t step_speed =  0 ; // para hacer un seguimiento de la velocidad actual del motor paso a paso 

vacío  preparar () {
   stepper.setMaxSpeed ​​( 1000 ); // Establecer la velocidad máxima de paso a paso stepper.setSpeed ​​(step_speed); // Establezca la velocidad de paso a cero al inicio pinMode (gesture_interrupt, INPUT); // Establecer el pin de interrupción como entrada 

  // Inicializar el puerto serie Serial.begin ( 9600 ); // Inicia la rutina del servicio de interrupción attachInterrupt ( 0 , interruptRoutine, FALLING); // Inicia el APDS-9960 
  Si (apds9960.init ()) { // Si init es bueno Serial.println ( "¡Encontré el módulo APDS-9960!" );
   } más { // si no Serial.println ( "No se puede encontrar el Módulo APDS-9960 ..." );
   } // Activa el sensor de gestos 
  Si (apds9960.enableGestureSensor ( cierto )) { // si init es bueno Serial.println ( "¡El sensor de gestos está habilitado!" );
   } más { // si no Serial.println ( "No se puede iniciar el sensor de Gestos ..." );
   }
 } vacío  lazo () { Si (interrupt_flag ==  1 ) { // es igual a 1 si se detecta un gesto detachInterrupt ( 0 ); // Deja de escuchar para la interrupción handleGesture (); // gesto de agarre interrupt_flag =  0 ; // restablecer el indicador de interrupción a cero attachInterrupt ( 0 , interruptRoutine, FALLING); // Comienza a escuchar de nuevo }
     stepper.runSpeed ​​(); // Mover el motor paso a paso } vacío  interruptRoutine () {
   interrupt_flag =  1 ; // Cambiar el indicador a 1 para indicar que se detectó un gesto } vacío  handleGesture () { // Verifica qué tipo de gesto se detectó 
    Si (apds9960.isGestureAvailable ()) { // Asegúrate de que se grabó un gesto 
    
    cambiar (apds9960.readGesture ()) { // Leer el gesto 
    
      caso DIR_UP: // gesto UP detectado Serial.print ( "ACELERAR: " ); Si (step_direction ==  0 ) { // La dirección actual del paso a paso es IZQUIERDA 
          Si (step_speed  700 ) { // verificar para que la velocidad no supere 1000 stepper.setSpeed ​​(step_speed + 200 );
             step_speed = step_speed + 200 ;
           }
         } más { // La dirección de la corriente de paso es DERECHA 
          Si (step_speed > =  - 700 ) {
             stepper.setSpeed ​​(step_speed - 200 );
             step_speed = step_speed - 200 ;
           }
         }
         Serial.println (step_speed);
         retrasar( 500 ); descanso ; caso DIR_DOWN: // gesto DOWN detectado Serial.print ( "REDUCE LA VELOCIDAD: " ); Si (step_direction ==  0 ) { // La dirección actual del paso a paso es IZQUIERDA 
          Si (step_speed > =  300 ) { // verifica que la velocidad no pase por debajo de cero stepper.setSpeed ​​(step_speed - 200 );
             step_speed = step_speed - 200 ;
           }
         } más { // La dirección de la corriente de paso es DERECHA 
          Si (step_speed  - 300 ) {
             stepper.setSpeed ​​(step_speed + 200 );
             step_speed = step_speed + 200 ;
           }
         }
         Serial.println (step_speed);
         retrasar( 500 ); descanso ; caso DIR_LEFT: // gesto IZQUIERDO detectado Serial.println ( "ROTACIÓN IZQUIERDA" ); Si (step_direction ==  1  && (step_speed >  0  || step_speed  0 )) { // Si la dirección actual es correcta y la velocidad no es cero stepper.setSpeed ​​(abs (step_speed)); // Invertir la dirección de paso a paso step_direction = 0 ; // Establecer dirección a la izquierda step_speed = abs (step_speed); // hace que la velocidad sea un número positivo }
         retrasar( 500 ); descanso ; caso DIR_RIGHT: // gesto DERECHO detectado Serial.println ( "DERECHO DE ROTACIÓN" ); Si (step_direction ==  0  && (step_speed >  0  || step_speed  0 )) { // Si la dirección actual es izquierda y la velocidad no es cero stepper.setSpeed ​​( - 1 * step_speed); // Invertir la dirección de paso a paso step_speed = - 1 * step_speed; // Haz que la velocidad sea un número menos step_direction = 1 ; // Establecer la dirección a la derecha }
         retrasar( 500 ); descanso ; caso DIR_NEAR: // NEAR gesto detectado Serial.println ( "DETENER" );
         stepper.setSpeed ​​( 0 ); // Detener la rotación por pasos step_speed = 0 ; // Establecer la velocidad a cero retrasar( 500 ); descanso ; caso DIR_FAR: // gesto FAR detectado Serial.println ( "COMIENZO" );
         Serial.print ( "Velocidad actual: " );
         stepper.setSpeed ​​( 500 ); // Inicia la rotación por pasos step_speed = 500 ; // Establecer la velocidad a 500 Serial.println (step_speed);
         retrasar( 500 ); descanso ;
     }
   }
 }

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?