搜索代码

通过手势控制Arduino的伺服位置

通过手势控制Arduino的伺服位置

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

APDS-9960 gesture sensor module -1

我们将使用的核心组件包括伺服电机和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 wiring of APDS9960 to control Servo motor using hand gesture

要连接组件,首先从伺服电机开始。将红线连接到Arduino的5V引脚,将黑线连接到地(GND),将橙色信号线连接到引脚。9这将使Arduino能够控制伺服电机的位置。

接下来,连接APDS-9960手势传感器。连接V_N连接到Arduino的3.3V,和GND接地。该INT引脚应连接到引脚2在Arduino上,当SDASCL引脚连接到引脚A4A5,分别。此配置允许传感器与Arduino有效通信。

代码示例与演练

在设置函数中,我们初始化伺服电机和手势传感器。myservo.attach(9);将伺服电机绑定到我们之前连接的9号引脚。这使得伺服电机能够接收来自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);
}

接下来,我们定义系统在循环函数中如何处理手势。该方法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

图像

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
语言: C++
++
/*
 * 由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");
    }
  }
}

资源与参考

尚无可用资源。

文件📁

没有可用的文件。