引言
Arduino或ESP32 驱动小车作为一个经典应用,广泛被开源硬件爱好者改装。然而,其交互方式大部分依然是传统的按键交互。本次尝试改变Arduino 小车的交互方式,利用PAJ7620U2 Gesture Sensor 手势识别传感器识别,达到可以用手势直观控制小车的目的。 最终视频中,我们的小车可以接受手势指令:前进,后退,停止,转向,这些指令由手势转化 而来,并通过HC12远距离串口收发模块发送至Arduino,Arduino 控制电机达到作出相应动作。
视频很快奉上,设计思路和部分代码解释都显示在视频里
第一步:展示
手势从下到上,小车前进;手势从下到上,小车后退;手势往左,小车左转;手势往右,小车右转。手势从左往右。小车停止
第二步:无线模块的配置
两块无线模块之间要实现通信,我们把串口波特率设置为9600,我这里用的arduino 的硬串口。就是D0和D1两个口。
另外串口模块的供电我选用了3.3V。目的是省电。
第三步:硬件搭建
所需器材:<a class="decoration-color" href="https://buy.icxbk.com/index.php?ctl=Product&met=lists&key_type=1&keywords=Arduino+UNO" target="_blank">Arduino UNO</a>控制器(2);PAJ7620U2 Gesture Sensor 手势识别传感器(3);HC12-2只(4);12v锂电池;(5);USB数据线;USB Serial to 串口;(6);小车底盘 (7);L298N电机驱动模块
![](https://b03.ickimg.com/202007/0fc064b803eb821ead11cffaa5f47932.png)
根据测试,3.3v下工作良好。
这个无线模块的应用距离根据小范围测试,不少于200M。
第五步:
发一些硬件的图片。让人有个直观的认识
![](https://b04.ickimg.com/202007/c328b09e6338296d557cbd97dd16fd0c.png)
![](https://b02.ickimg.com/202007/aa409c6764006ed71274258725b8caa6.jpg)
![](https://b02.ickimg.com/202007/fa0bb2f88aec9ac6caa98c0c06d2e032.jpg)
第六步:总体介绍
手势控制小车运动的设计系统是由手势传感器,无线传输模块和遥控小车来完成的。手势传感是通过采集距离模块有30cm的方向采集信号
然后通过arduino做进一步的处理。arduino会对采集的信号发出手势指令集,并通过无线模块发送给遥控小车的。实现小车的前进,后退,
左转和右转。使用手势传感来控制小车,会比传统遥控器的人际互动更为自然。
第七部:连线图
连线图是有两部分,一个是发送端连线图,另一个是接收端的。
发送端
![](https://b05.ickimg.com/202007/9feafa4397196b705862aba33df542e6.jpg)
![](https://b05.ickimg.com/202007/4113a4b9871214f51a784350c3d5d3f0.jpg)
![](https://b03.ickimg.com/202007/00273e9fe2c4506f3b63107c5a1c1ca8.png)
![](https://b01.ickimg.com/202007/062ab7cd69540adb34f27ec528c999f5.jpg)
第八部:小车部分的设计
小车部分选用的市L298N电机驱动模块。这个模块的一个特色是可以连外部供电。因为arduino连接电机往往力不从心。需要外部电力支持。同时外部电力也同时为arduio
直接供电。
小车图
![](https://b01.ickimg.com/202007/145eecb17acb10ca4555a9661a7582bd.jpg)
![](https://b01.ickimg.com/202007/4633a3d5c8fbbb149020c16731cec6e3.jpg)
发送端的代码如下:
-
#include <dfrobot_paj7620u2.h>
DFRobot_PAJ7620U2 paj;
-
void setup(){
Serial.begin(9600);
-
while(paj.begin() != 0){
delay(500);
}
paj.setGestureHighRate(true);
}
-
void loop() {
DFRobot_PAJ7620U2::eGesture_t gesture = paj.getGesture();
-
if(gesture == paj.eGestureUp){
Serial.write(45);
delay(100);
}
else if(gesture == paj.eGestureDown){
Serial.write(46);
delay(100);
}
else if(gesture == paj.eGestureLeft){
Serial.write(47);
delay(100);
}
else if(gesture == paj.eGestureRight){
Serial.write(48);
delay(100);
}
else if(gesture == paj.eGestureClockwise){
Serial.write(49);
delay(100);
}
}
接收端的代码如下:
```c
/@@ /
int byteRead;
//Motor1 is controlled by A1 and A2
//Motor2 is controlled by B1 and B2
int ENA = 3;
int ENB = 9;
int MOTOR_A1 = 4;
int MOTOR_A2 = 5;
int MOTOR_B1 = 6;
int MOTOR_B2 = 7;
void setup() {
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(MOTOR_A1, OUTPUT);
pinMode(MOTOR_A2, OUTPUT);
pinMode(MOTOR_B1, OUTPUT);
pinMode(MOTOR_B2, OUTPUT);
//pinMode(RIGHT, INPUT);
//pinMode(LEFT, INPUT);
Serial.begin(9600); // start Serial
}
void loop() {
while(Serial.available()) { // If Serial module has data
byteRead = Serial.read();
Serial.print(byteRead); //data to Serial monitor
if (byteRead==45) { //received number 1
Forward();
delay(2000);
//Serial.println(“Forward”);
}
else if (byteRead==46) {
Backward();
delay(2000);
//Serial.println(“Backward”);
}
else if (byteRead==47) {
Left();
delay(2000);
//Serial.println(“Left”);
}
else if (byteRead==48) {
Right();
delay(2000);
//Serial.println(“Right”);
}
else if (byteRead==49) {
Stop();
//Serial.println(“STOP”);
}
}
}
void Right() {
analogWrite(ENA, 100);
analogWrite(ENB, 100);
digitalWrite(MOTOR_A1, LOW);
digitalWrite(MOTOR_A2, HIGH);
digitalWrite(MOTOR_B1, LOW);
digitalWrite(MOTOR_B2, HIGH);
}
void Left() {
analogWrite(ENA,100);
analogWrite(ENB, 100);
digitalWrite(MOTOR_A1, HIGH);
digitalWrite(MOTOR_A2, LOW);
digitalWrite(MOTOR_B1, HIGH);
digitalWrite(MOTOR_B2, LOW);
}
void Forward() {
analogWrite(ENA, 100);
analogWrite(ENB, 100);
digitalWrite(MOTOR_A1, LOW);
digitalWrite(MOTOR_A2, HIGH);
digitalWrite(MOTOR_B1, HIGH);
digitalWrite(MOTOR_B2, LOW);
}
void Backward() {
analogWrite(ENA, 100);
analogWrite(ENB, 100);
digitalWrite(MOTOR_A1, HIGH);
digitalWrite(MOTOR_A2, LOW);
digitalWrite(MOTOR_B1, LOW);
digitalWrite(MOTOR_B2, HIGH);
}
void Stop() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
digitalWrite(MOTOR_A1, LOW);
digitalWrite(MOTOR_A2, LOW);
digitalWrite(MOTOR_B1, LOW);
digitalWrite(MOTOR_B2, LOW);
}
```
|