本教程是的一部分: 伺服电机
这里列出了所有与伺服电机相关的视频。其他视频的链接在本文下方。
通过手势控制Arduino的伺服位置
在本教程中,我们将学习如何使用手势控制伺服电机。通过将手向左或向右移动,您可以使伺服电机做出相应的反应。该项目利用APDS-9960手势传感器来检测手部动作并将其转换为伺服位置。有关详细的视觉说明,请务必查看视频(视频在00:30)。

我们将使用的核心组件包括伺服电机和APDS-9960手势传感器。伺服电机将根据检测到的手势旋转到特定角度,而APDS-9960传感器将解读手部动作。这个设置允许以直观的方式控制伺服电机,而无需物理接触。
硬件解析
伺服电机是一种小型设备,可以旋转到特定角度,非常适合需要精确定位的应用。它通常有三根线:电源(红色)、接地(黑色)和信号(橙色)。信号线接收命令以将伺服电机移动到指定角度。
APDS-9960 是一种多功能传感器,可以检测手势、环境光和颜色。它通过 I2C 与 Arduino 进行通信,并需要几个引脚用于电源和数据传输。该传感器可以检测上下左右的运动,我们将利用这些运动来控制伺服电机。
数据表详细信息
| 制造商 | 博通 |
|---|---|
| 零件编号 | APDS-9960 |
| 逻辑/IO电压 | 2.4 - 3.6 伏 |
| 供电电压 | 2.4 - 3.6 伏 |
| 每个通道的输出电流 | 最大20毫安 |
| PWM频率指导 | 不适用 |
| 输入逻辑阈值 | 0.3 伏 (低), 0.7 伏 (高) |
| 电压降 / RDS(开)/ 饱和度 | 不适用 |
| 热限制 | -40 到 85 °C |
| 包裹 | 6.0 x 3.0 毫米 |
| 备注 / 变体 | 手势感应,RGB光感应 |
- 确保伺服电机的电源电压足够(通常为5V)。
- 将APDS-9960通过I2C通信连接到Arduino。
- 请注意手势传感器的中断引脚。
- 如有必要,请使用上拉电阻以确保信号检测稳定。
- 确保在不同的光照条件下校准传感器,以提高准确性。

要连接组件,首先从伺服电机开始。将红线连接到Arduino的5V引脚,将黑线连接到地(GND),将橙色信号线连接到引脚。9这将使Arduino能够控制伺服电机的位置。
接下来,连接APDS-9960手势传感器。连接V_N连接到Arduino的3.3V,和GND接地。该INT引脚应连接到引脚2在Arduino上,当SDA和SCL引脚连接到引脚A4和A5,分别。此配置允许传感器与Arduino有效通信。
代码示例与演练
在设置函数中,我们初始化伺服电机和手势传感器。myservo.attach(9);将伺服电机绑定到我们之前连接的9号引脚。这使得伺服电机能够接收来自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);
}接下来,我们定义系统在循环函数中如何处理手势。该方法handleGesture();检查可用的手势并执行相应的动作。例如,如果检测到的手势是左侧,伺服电机将移动到180度。
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;
}
}
}最后,循环不断检查手势,并根据检测到的手势更新伺服位置。确保在不同的光照条件下测试设置,以获得准确的手势识别。
演示 / 期待什么
一旦所有连接完成并且代码上传,您应该能够通过向左或向右移动手来控制伺服电机。伺服电机会在左侧手势时旋转到180度,并在右侧手势时返回到0度。如果未检测到手势,请检查传感器的位置和周围的光照条件(视频中在05:30)。
章节
- 介绍 - 00:00
- 硬件概述 - 01:30
- 接线说明 - 03:00
- 代码说明 - 04:30
- 演示 - 06:00
本教程是……的一部分: 伺服电机
- Controlling a Servo with Push Buttons Using 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)
- Controlling a Servo with a Potentiometer Using Arduino
- Controlling a Servo with Potentiometer and LCD1602 using Arduino
- 使用红外遥控器和Arduino控制伺服电机
- 使用电位器控制Arduino伺服电机
- 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
- PCA9685 16通道12位伺服控制器V1的Arduino代码和视频
- Build an Arduino Servo Toggle Switch with a Push Button
++
/*
* 由A.B.S.于2017年5月9日在加拿大安大略省Ajax为RoboJax修改。www.RoboJax.com
*
* 原始来源:
* APDS-9960 RGB和手势传感器
* Shawn Hymel @ SparkFun Electronics
* 2014年5月30日
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* 按原样分发;不提供任何保证。
*/
#include <Wire.h>
// 由RoboJax添加
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // 创建伺服对象以控制伺服 // 由RoboJax添加
// 针
#define APDS9960_INT 2 // 需要是一个中断引脚
// 常量
// 全局变量
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // 将9号引脚上的伺服器连接到伺服器对象。
// 将中断引脚设置为输入
pinMode(APDS9960_INT, INPUT);
// 初始化串口
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// 初始化中断服务程序
attachInterrupt(0, interruptRoutine, FALLING);
// 初始化 APDS-9960(配置 I2C 和初始值)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// 开始运行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); // 由RoboJax添加
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // 由RoboJax添加
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
资源与参考
尚无可用资源。
文件📁
没有可用的文件。