Este tutorial es parte de: Servomotores
Todos los videos relacionados con servomotores se listan aquí. Los enlaces a otros videos se encuentran debajo de este artículo.
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).

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
| Fabricante | Broadcom |
|---|---|
| Número de parte | APDS-9960 |
| Voltaje de lógica/entrada/salida | 2.4 - 3.6 V |
| Tensión de alimentación | 2.4 - 3.6 V |
| Corriente de salida (por canal) | 20 mA máx |
| Guía de frecuencia PWM | No aplicable |
| Umbrales de lógica de entrada | 0.3 V (bajo), 0.7 V (alto) |
| Caída de tensión / RDS(on)/ saturación | No aplicable |
| Límites térmicos | -40 a 85 °C |
| Paquete | 6.0 x 3.0 mm |
| Notas / variantes | Detecció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.

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.

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
Este tutorial es parte de: Servomotores
- Controlar un servomotor con pulsadores usando Arduino
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Controlar un servomotor con un potenciómetro usando Arduino
- Controlar un servomotor con potenciómetro y LCD1602 usando Arduino
- Controlando motores servo utilizando un control remoto por infrarrojos con Arduino
- Control de motor servo Arduino usando un potenciómetro
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- How to Use Continuous 360° Servo with Arduino
- Código y vídeo de Arduino para el controlador de servos PCA9685 de 16 canales y 12 bits V1
- Build an Arduino Servo Toggle Switch with a Push Button
++
/*
* 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.