这是大三上传感器大作业做的一个主从机控制小车。期间参考了网上的一些博客,涉及主从机通信、蓝牙配置、传感器的使用等。
一、实物图片

二、系统架构
本次实验涉及较多外设,我们在IDE中编写相关代码,控制小车的前进后退等运动状态。我们使用了两块Arduino UNO,通过蓝牙模块,以短距离低成本的方式进行数据传输来实现主从机的通信。主机采集手势传感器数据并通过I2C传输到从机,当从机接收到主机发来的信号时会进行判断,驱动电机的转动,来确定小车下一步的运动状态。

图3 系统改造架构图
三、主要外设
(1)PAJ7620手势传感器

图4 手势传感器
PAJ7260手势传感器将手势识别功能与通用的I²C接口转换成单片机构成图像分析系统,它可以识别上、下、左、右、前、后、顺时针、逆时针、挥手9种手势,同时它还内置了近距离检测,这款传感器在节电上也有很大的灵活性。
(2)HC01蓝牙模块

图5 蓝牙模块
HC01模块是一款高性能主机一体化蓝牙串口模块,集成蓝牙功能的PCBA板,用于短距离低成本的通信。
(3)L298N电机驱动模块

图6 L298N电机驱动模块
L298N电机驱动模块通过ENA,IN1,IN2,IN3,IN4,ENB六个pin脚的输入,来控制两个电机的转动及转动速度,同时承担Arduino UNO的供电。电机的转速,通过输出PWM来控制,以此完成小车速度的改变,及转弯的实现,大大提高了小车的灵活性。
四、手势控制对应关系

五、应用场景与待改进
我们最初设计此项目用于水下远程遥控作业,比如通过加装摄像头进行水底的探查和搜救,通过岸上操纵主机对从机的运动进行控制,但考虑到实际情况我们选择了陆上的小车来模拟对应功能。本次实验我们仅通过远程遥控进行小车的控制,实际上我们最初规划的还有几种自动运动模式,如循迹模式、超声波避障模式,通过不同手势触发对应的工作模式,可以随时进行模式切换,实现多功能集成。
六、参考文章
【蓝牙配置】
https://blog.youkuaiyun.com/Marilynmontu/article/details/81532503
【毕业设计 —— 基于STM32手势控制显示系统的设计】
https://blog.youkuaiyun.com/fightingboom/article/details/102990024
【PAJ7620U2+蓝牙主从机实现远程手势控制】
https://blog.youkuaiyun.com/qqliuzhitong/article/details/118893516
七、代码实现
【传感器端 】发出控制信号,通过蓝牙传输到从机控制车辆运行。
#include <Wire.h>
#include "paj7620.h"
#include<SoftwareSerial.h>
//新建一个Serial_p对象,rx:6,tx:5
//连接蓝牙的master
SoftwareSerial Serial_p(6,5);
#define GES_REACTION_TIME 500 // You can adjust the reaction time according to the actual circumstance.
#define GES_ENTRY_TIME 800 // When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s).
#define GES_QUIT_TIME 1000
//上:a 下:b 左:c 右:d 前:e
char command_char='e';
void setup()
{
uint8_t error = 0;
Serial.begin(9600);
Serial_p.begin(9600);
Serial.println("Serial baud:9600");
Serial_p.println("Serial baud:9600");
Serial.println("Underwater fish master program!");
error = paj7620Init(); // initialize Paj7620 registers
if (error)
{
Serial.print("INIT ERROR,CODE:");
Serial.println(error);
}
else
{
Serial.println("INIT OK");
}
Serial.println("Please input your gestures:\n");
}
void loop()
{
uint8_t data = 0, data1 = 0, error;
error = paj7620ReadReg(0x43, 1, &data); // Read Bank_0_Reg_0x43/0x44 for gesture result.
if (!error)
{
switch (data) // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data).
{
case GES_RIGHT_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if(data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
Serial_p.print('e');
delay(GES_QUIT_TIME);
}
else if(data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Right");
Serial_p.print('d');
}
break;
case GES_LEFT_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43,

最低0.47元/天 解锁文章
2405

被折叠的 条评论
为什么被折叠?



