Código de búsqueda

Controlando la posición del servo con gestos de la mano para Arduino

Controlando la posición del servo con gestos de la mano para Arduino

En este tutorial, aprenderemos cómo controlar un motor servo utilizando gestos de la mano. Al mover tu mano hacia la izquierda o hacia la derecha, puedes hacer que el motor servo responda en consecuencia. Este proyecto utiliza el sensor de gestos APDS-9960 para detectar los movimientos de la mano y traducirlos en posiciones del servo. Para una explicación visual detallada, asegúrate de revisar el video en (en el video a :30).

APDS-9960 gesture sensor module -1

Los componentes principales que utilizaremos incluyen un motor servo y el sensor de gestos APDS-9960. El motor servo rotará a ángulos específicos según los gestos detectados, mientras que el sensor APDS-9960 interpretará los movimientos de la mano. Esta configuración permite una forma intuitiva de controlar el servo sin contacto físico.

Hardware Explicado

El servomotor es un pequeño dispositivo que puede girar a ángulos específicos, lo que lo hace ideal para aplicaciones que requieren un posicionamiento preciso. Típicamente tiene tres cables: alimentación (rojo), tierra (negro) y señal (naranja). El cable de señal recibe comandos para mover el servomotor a un ángulo especificado.

El APDS-9960 es un sensor versátil que puede detectar gestos, luz ambiental y color. Se comunica con el Arduino a través de I2C y requiere algunos pines para la alimentación y la transferencia de datos. El sensor puede detectar movimientos como arriba, abajo, izquierda y derecha, que utilizaremos para controlar el servo.

Detalles de la hoja de datos

FabricanteBroadcom
Número de parteAPDS-9960
Voltaje de lógica/entrada/salida2.4 - 3.6 V
Tensión de alimentación2.4 - 3.6 V
Corriente de salida (por canal)20 mA máx
Guía de frecuencia PWMNo aplicable
Umbrales de lógica de entrada0.3 V (bajo), 0.7 V (alto)
Caída de tensión / RDS(on)/ saturaciónNo aplicable
Límites térmicos-40 a 85 °C
Paquete6.0 x 3.0 mm
Notas / variantesDetección de gestos, detección de luz RGB
  • Asegúrate de que el servo esté alimentado con un voltaje adecuado (típicamente 5V).
  • Conecta el APDS-9960 al Arduino utilizando comunicación I2C.
  • Presta atención al pin de interrupción del sensor de gestos.
  • Utiliza resistencias pull-up si es necesario para una detección de señal estable.
  • Asegúrate de calibrar el sensor en diferentes condiciones de iluminación para una mejor precisión.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Para cablear los componentes, comienza con el servomotor. Conecta el cable rojo al pin de 5V del Arduino, el cable negro a la tierra (GND) y el cable de señal naranja al pin.9Esto permitirá que el Arduino controle la posición del servo.

A continuación, conecta el sensor de gestos APDS-9960. Conecta elV_Nconéctalo al 3.3V del Arduino, y elGNDfije a tierra. ElINTel pin debe estar conectado al pin2en el Arduino, mientras elSDAySCLlos pines van a los pinesA4yA5, respectivamente. Esta configuración permite que el sensor se comunique de manera efectiva con el Arduino.

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

En la función de configuración, inicializamos el servo y el sensor de gestos. La líneamyservo.attach(9);vincula el servo al pin 9, que conectamos previamente. Esto permite que el servo reciba comandos del Arduino.

APDS-9960 gesture sensor -3
void setup() {
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 // Set interrupt pin as input
 pinMode(APDS9960_INT, INPUT);
 // Initialize Serial port
 Serial.begin(9600);
}

A continuación, definimos cómo el sistema maneja los gestos en la función de bucle. El métodohandleGesture();verifica los gestos disponibles y ejecuta las acciones correspondientes. Por ejemplo, si el gesto detectado es hacia la izquierda, el servo se moverá a 180 grados.

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_LEFT:
        myservo.write(180);  // added by RoboJax
        break;
      case DIR_RIGHT:
        myservo.write(0);   // added by RoboJax
        break;
    }
  }
}

Finalmente, el bucle verifica continuamente los gestos y actualiza la posición del servo según el gesto detectado. Asegúrate de probar la configuración en diversas condiciones de iluminación para obtener un reconocimiento de gestos preciso.

Demostración / Qué Esperar

Una vez que todo esté cableado y el código esté cargado, deberías poder controlar el servo moviendo tu mano hacia la izquierda o hacia la derecha. El servo rotará 180 grados para un gesto a la izquierda y volverá a 0 grados para un gesto a la derecha. Si no se detectan los gestos, verifica la posición del sensor y las condiciones de luz circundante (en el video a las 05:30).

Capítulos

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

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
Arduino wiring of APDS9960 to control Servo motor using hand gesture
Arduino wiring of APDS9960 to control Servo motor using hand gesture
APDS-9960 gesture sensor -3
APDS-9960 gesture sensor -3
12-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 ofrece garantía.
 */

#include <Wire.h>

 // agregado por RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


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

 // Clips
#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); // adjunta el servo en el pin 9 al objeto servo
 // Configurar 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!"));
  }

 // Comienza 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");
        myservo.write(180); // agregado por RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0); // agregado 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📁

No hay archivos disponibles.