手势控制机器人
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
关于这个项目
手势控制机器人是业余爱好者和学生在物理和实践项目中理解和实现微控制器知识的最常见的项目类型之一。其背后的概念很简单:手掌的方向控制机器人汽车的运动。你问它是怎么做到的?让我们分解一下。
为了更好地理解,我们将通过了解每个组件的作用和功能,然后将它们组合起来以实现所需的性能。
1. ADXL335(加速度计)
加速度计的功能很简单:感知手腕的方向。加速度计测量加速度,包括重力加速度“g”。因此,我们可以使用加速度计通过测量 ADXL335 任何特定轴上的 'g' 分量来感知手腕的方向,如下图所示:
由于手的倾斜,X 和/或 Y 轴的角度会随着垂直方向的变化而变化,因此“g”加速度的分量也作用在它们上,该分量可以被测量,从而指示手的方向。
ADXL335 可以测量高达 3g 的加速度,并通过将其轴引脚连接到 Arduino 的模拟引脚来与 Arduino 接口。加速度计输出与加速度成正比的电压值。
在这个项目中,加速度计连接到 Arduino Nano 并附着在手掌上。 ADXL335 输出电压范围为 0 到 Vcc(施加电压通常为 3.3V),并由 Arduino 的模拟引脚读取。因此对于用户,我们得到一个范围从 0 到 1024(10 位 ADC)的值。不同的方向为每个轴产生不同的模拟值,然后映射到不同的机器人运动。
加速度计的电路图是:
了解ADXL335工作的测试代码如下:
void setup(){ pinMode(A0,INPUT); //x轴接A0 pinMode(A1,INPUT); //y轴接A1 pinMode(A2,INPUT); //z轴连接到A2Serial.begin(9600); //打印数据到串口监视器}void loop(){ Serial.print(" X="); Serial.println(analogRead(A0)); Serial.print(" Y="); Serial.println(analogRead(A1)); Serial.print(" Z="); Serial.println(analogRead(A2));延迟(1000);}
你可以运行这个程序,看看你的手掌和手腕向前、向后、向左和向右倾斜得到了什么值,这些值最终将用于控制机器人。
2. RF-433发射机和接收机
RF模块的功能很简单:将腕部Arduino Nano的指令数据传输到控制Arduino Uno的电机。 RF 模块使用频率为 433hz 的无线电波,因此名称为 RF-433。它们使用幅度调制来发送数据,但没有涉及太多技术细节并保持简单,它们将用于向机器人传输命令,即:向前、向后、向右或向左移动。如果没有数据,请保持静止。它们在 10 米范围内都能很好地工作。
现在了解如何在我们的项目中实现射频模块,让我们依次研究发射器和接收器电路。
发射电路
发射器电路由两部分组成:发射器 RF 和编码器 HT12E。发射器由一根数据引脚、一根天线、一根地线和电源组成。 HT12E 编码器的工作是向发送器提供数据。编码器由 4 个可发送数据的数据引脚组成。我们将使用这 4 个数据引脚来表示四个运动,这些引脚上的高电平分别代表四个运动之一,低电平代表静止。
电路图如图所示:
左边的引脚 (A0-A7) 是地址引脚,定义了交换数据的对(具有相同地址的发送器和接收器将只共享数据)。我们将 A0-A7 设置为 LOW(接地)。
数据输入引脚连接到 Arduino 数字引脚(在本项目 6 到 9 中),它们将输出命令数据为:
数字引脚命令(高电平时)
9 前进
10 反转
11左
12 对
我们将根据 ADXL335 的输入将数字引脚写为高电平,以执行所需的运动。
接收电路
接收器电路与如图所示的发送器电路完全相似,但不是数据引脚作为 Arduino 的输出,在这种情况下,它们将被读取为输入以接收 Arduino Uno 的命令并根据需要运行电机:>
为简化起见,您可以在引脚 17 上串联一个 1K 电阻的 LED,而不是如图所示的复杂电路,以指示与发射器的正确连接。
3. 电机屏蔽
由于 Adafruit 库 AFMotor 的可用性,电机防护罩是最容易处理的部分,链接:- https://github.com/adafruit/Adafruit-Motor-Shield-library
下载并复制Arduino库文件夹中的库,以便能够将其包含在程序草图中。
AFMotor 库的示例如下所示:
#include AF_DCMotor motor(4);//将电机线连接到Shieldvoid setup() { Serial.begin(9600); // 以 9600 bps 的速度设置串行库 Serial.println("Motor test!"); // 打开电机 motor.setSpeed(200); motor.run(RELEASE);}void loop() { uint8_t i; Serial.print("tick");电机运行(前进); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10);} for (i=255; i!=0; i--) { motor.setSpeed(i);延迟(10);} Serial.print(“tock”);电机运行(向后); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10);} for (i=255; i!=0; i--) { motor.setSpeed(i);延迟(10);} Serial.print(“技术”);电机运行(释放);延迟(1000);
4. 结合一切
最后一部分是将上述所有部分组合在一起,形成一个完全遵循手部指令的机器人!
由于电机屏蔽几乎使用所有数字引脚,我们将使用 Arduino Uno 的模拟引脚来读取接收器数据。最终电路图如下所示:
电机屏蔽处理与电机的连接。将 9V 电池连接到屏蔽的电源输入端。
注意:我个人更喜欢将 2V 甚至 3.9V 电池与屏蔽电源输入并联,以提供足够的电源来运行所有四个电机。我已将 2 个一组的四个电机连接在一起(同侧电机并联在一起,因此只需要电机点 3 和 4 运行)。
最终代码
对于 Arduino Nano:
int x_axis =0;int y_axis =0;int forward =9;int back =10;int right =11;int left =12;void setup(){ pinMode(A0, INPUT); //X 轴 pinMode(A3, OUTPUT); //Y 轴 pinMode(forward, OUTPUT); //HIGH 向前移动 pinMode(backward, OUTPUT); //HIGH 向后移动 pinMode(right, OUTPUT); //HIGH 向右移动 pinMode(left, OUTPUT); //HIGH 向左移动 Serial.begin(9600);}void loop(){ x_axis =analogRead(A0); y_axis =模拟读取(A3); Serial.print(" X ="); Serial.println(x_axis); Serial.print(" Y ="); Serial.println(y_axis); if (y_axis>=390) { Serial.println("Forward");数字写入(向前,高); } else { if (y_axis <=310) { Serial.println("BACK");数字写入(向后,高); } else { if (x_axis>=380) { Serial.println("RIGHT");数字写入(右,高); } else { if (x_axis <=320) { Serial.println("LEFT");数字写入(左,高); Serial.println(" "); } } } 延迟(200); if (x_axis> 320 &&x_axis <380 &&y_axis> 310 &&y_axis <390) { digitalWrite(forward, LOW);数字写入(向后,低);数字写入(右,低);数字写入(左,低); }}
对于 Arduino Uno:
#includeAF_DCMotor motor_right(3);AF_DCMotor motor_left(4);int forward=0;int back=0;int right=0;int left=0;void setup() { pinMode(A2,INPUT); pinMode(A3,INPUT); pinMode(A4,INPUT);引脚模式(A5,输入); Serial.begin(9600); motor_right.setSpeed(255); motor_left.setSpeed(255); motor_right.run(RELEASE); motor_left.run(RELEASE);}void loop() { forward=digitalRead(A0);向后=数字读取(A1);右=数字读取(A2); left=digitalRead(A3); if(forward==HIGH) { motor_right.run(FORWARD); motor_left.run(前进); Serial.println("转发"); } if(backward==HIGH) { motor_right.run(BACKWARD); motor_left.run(向后); Serial.println("反向"); } if(right==HIGH) { motor_right.run(FORWARD); motor_left.run(RELEASE); Serial.println("正确"); } if(left==HIGH) { motor_right.run(RELEASE); motor_left.run(前进); Serial.println("左"); } if(left==LOW&&right==LOW&&forward==LOW&&backward==LOW) { motor_right.run(RELEASE); motor_left.run(RELEASE); } 延迟(100);}
照片和视频在这里:
制造工艺