Arduino智能小车实验报告解读.docx
- 文档编号:17613920
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:23
- 大小:1,015.52KB
Arduino智能小车实验报告解读.docx
《Arduino智能小车实验报告解读.docx》由会员分享,可在线阅读,更多相关《Arduino智能小车实验报告解读.docx(23页珍藏版)》请在冰点文库上搜索。
Arduino智能小车实验报告解读
“蓝牙手柄避障小车”设计
设计者:
严梓桓(34%),汤楷宸(33%),梁德棋(33%)
1.项目背景
本作品为基于Arduino控制的智能小车。
智能小车在技术上和移动机器人有着密切相关的联系,有着关于自动控制、传感器技术、电子电路上的重要实践意义。
通过对基本功能进行不同方向,多种多样的扩展,可以为我们的生活提供各种各样的便利。
这类设备可以应用于复杂多样的工作环境,在民用和军用上都可以有各种各样颇有意义的用途。
一般来说,红外避障实现方便、技术要求相对简单、易于做到实时控制。
并且,一般的红外避障装置在测量精度方面能达到实用的要求,因此成为常用的避障方法。
利用红外传感器来实现小车的智能避障时,通过测量小车与障碍物的距离,实现小车多角度检测障碍物,从而加以判断转向、后退和前进,使小车能成功的躲避障碍物,并按照控制者的意愿前进。
受到现有的产品和技术的启发,我们小组制作简易的智能小车。
这款简易的智能小车,可以通过操作人的遥控进行操控,进行各种运动,当遇到障碍物时,可以灵活地进行自动避障。
而小车的舵机转向,更加的贴合我们的现实汽车的模型,对实现智能无人汽车的出现有一定的借鉴优势。
我们还计划为它加装通过Wi-Fi连接的摄像头模块,将拍到的图像数据传输到电脑上。
除此之外,我们还希望将来可以通过手机App来对小车进行操控,让小车使用更为方便,功能更加强大。
2.创意描述
这款简易的智能小车,可以通过操作手柄进行遥控操控,进行各种前进、后退、转弯、变速等运动。
切换模式后,当遇到障碍物时,它可以通过红外避障模块,探测到障碍物,灵活地进行自动避障。
创新点:
使用手柄操作,操纵方便,具有很大的娱乐性。
3.功能及总体设计
该作品主要可以分为两个部分:
小车的运动、转向部分和红外避障部分。
对于运动和转向部分,经由ArduinoUNO板,再用PM-R3多功能扩展板连接电机和舵机,实现小车运动。
操作时,通过蓝牙和遥控手柄连接主板,达到操纵的目的;红外避障部分,分布在小车各侧的多个红外小板通过红外传感器模块感应到障碍物,进而控制舵机的转动,避开障碍物。
1)功能介绍
这款简易的智能小车,通过操作手柄进行遥控操控,进行各种前进、后退、转弯、变速等运动。
切换模式后,当遇到障碍物时,它可以通过红外避障模块,探测到障碍物,灵活地进行自动避障。
2)总体设计
该小车主要由运动和转向部分和红外避障部分两个部分组成。
(1)整体框架图
项目整体框架图如图1所示。
图1整体框架图
PM-R3多功能扩展板连接到ArduinoUNO板上,通过PM-R3多功能扩展板连接并驱动步进电机和转向舵机;另外,PM-R3多功能扩展板连接了红外避障模块,四个红外避障小板接收到的障碍物的信号通过它处理,控制电机的工作和舵机的转向。
(2)系统流程图
系统流程图(遥控模式略)如图2所示。
图2系统流程图
避障模式下,在小车运动过程中,如果遇到障碍物,被红外小板探测到后,让舵机转动,从而达到转向的目的;如果前方各个方向都有障碍物,小车则后退。
(3)总电路图
系统总电路图如图3所示
图三系统总电路图
ArduinoUNO板上连接了有PM-R3多功能扩展板。
驱动步进电机和转向舵机也通过PM-R3多功能扩展板连接;另外,PM-R3多功能扩展板连接到红外避障模块,四个红外避障小板接收到的障碍物的信号通过它传回扩展板,控制电机的工作和舵机的转向。
3)模块介绍
本项目主要包括以下几个模块:
运动与转向模块、红外避障模块,下面分别给出各部分的功能、元件、电路图和相关代码。
(1)运动与转向模块
功能介绍:
小车通过操作手柄进行遥控操控,进行各种前进、后退、转弯、变速等运动
元器件清单:
S3003舵机,17mm联轴器D-3mm,0.5模50齿齿轮,0.5模34齿齿轮,传动连杆,后轮连杆,电机固定支架,25mm金属减速电机,开关,PM-R3多功能扩展板,PS2手,11.1V-2400mAH锂电池组,杜邦线。
电路图:
电机模块接线图如图4所示;电机模块电路原理图如图5所示;PM-R3扩展电路板电路示意图如图6所示。
图4电机模块接线图
图5电机模块电路示意图
图6PM-R3扩展电路板电路示意图
相关代码:
#include
#include
PS2Xps2x;//声明手柄ps2x
Servomyservo;//声明舵机myservo
//ps2引脚
#definePS2_DATA0//14
#definePS2_CMDA1//15
#definePS2_SELA2//16
#definePS2_CLKA3//17
//红外传感器引脚
#defineQ7//7
#defineQR8//8
#defineQL10//10
#defineH9//9
//电机驱动引脚定义
#definePWMB15
#definePWMB26
#defineSERVOPIN2//舵机驱动引脚定义
#defineSERVOMIN-20//舵机转动角度
#defineSERVOMID45//舵机转动角度
#defineSERVOMAX120//舵机转动角度
#defineTURNLEFTmyservo.write(SERVOMIN)//向左转
#defineTURNMIDmyservo.write(SERVOMID)//向中转
#defineTURNRIGHTmyservo.write(SERVOMAX)//向右转
#defineMOTORFOWARD1setMotorA(155)//遥控向前移动
#defineMOTORFOWARD2setMotorA(55)//避障向前移动
#defineMOTORBACK1setMotorA(-155)//遥控向后移动
#defineMOTORBACK2setMotorA(-55)//避障向后移动
#defineMOTORSTOPsetMotorA(0)//刹车
boolEnableRockerR=1;//右边摇杆操控控制变量
boolEnableRockerL=1;//左边摇杆操控控制变量
intRMid=0;//小车向中转控制变量
intLStop=0;//刹车控制变量
interror=0;//控制信号判断变量
bytetype=0;//信号种类判断
voidsetup()
{
Serial.begin(57600);//设置串口波57600
//电机驱动
pinMode(PWMB1,OUTPUT);//配置引脚,PWM1为输出
pinMode(PWMB2,OUTPUT);//配置引脚,PWM2为输出
//避障信号收集
pinMode(Q,INPUT);//Q对应前面中间的红外传感器
pinMode(QR,INPUT);//QR对应前面右边的红外传感器
pinMode(QL,INPUT);//QL对应前面左边的红外传感器
pinMode(H,INPUT);//H对应后边的红外传感器
//舵机库函数中的引脚链接函数
myservo.attach(SERVOPIN);
//初始状态
MOTORSTOP;
SERVOMID;
delay(300);
//判断ps手柄的控制信号是否接收
error=ps2x.config_gamepad(PS2_CLK,PS2_CMD,PS2_SEL,PS2_DAT);
if(error==0)
{
Serial.print("FoundController,configuredsuccessful");
Serial.println("Tryoutallthebuttons,Xwillvibratethecontroller,fasterasyoupressharder;");
Serial.println("holdingL1orR1willprintouttheanalogstickvalues.");
Serial.println("Note:
Gotowww.billporter.infoforupdatesandtoreportbugs.");
}
elseif(error==1)
Serial.println("Nocontrollerfound,checkwiring,seereadme.txttoenabledebug.visitwww.billporter.infofortroubleshootingtips");
elseif(error==2)
Serial.println("Controllerfoundbutnotacceptingcommands.seereadme.txttoenabledebug.Visitwww.billporter.infofortroubleshootingtips");
elseif(error==3)
Serial.println("ControllerrefusingtoenterPressuresmode,maynotsupportit.");
type=ps2x.readType();
//判断ps2信号类,我们所用的是"DualShockController"信号
switch(type)
{
case0:
Serial.print("UnknownControllertypefound");
break;
case1:
Serial.print("DualShockControllerfound");
break;
case2:
Serial.print("GuitarHeroControllerfound");
break;
case3:
Serial.print("WirelessSonyDualShockControllerfound");
break;
}
}
void(*resetFunc)(void)=0;//重置
voidloop()
{
inti=0;//避障与蓝牙遥控切换变量
//红外传感器数字信号读取
intQ0=digitalRead(Q);
intQ1=digitalRead(QR);
intQ2=digitalRead(QL);
intH0=digitalRead(H);
//信号判断
if(error==1)resetFunc();//没有控制信号则跳出循环
ps2x.read_gamepad();//读取控制信号
if(ps2x.Button(PSB_START))
Serial.println("Startisbeingheld");
//按下start按钮时串口监视器显示"Startisbeingheld"
if(ps2x.NewButtonState(PSB_SELECT))//避障和蓝牙遥控切换
{
Serial.println("Selectisbeingheld");
i=(i+1)%2;
}
//蓝牙遥控
if(i==0)
{
//按钮控制电机
if(ps2x.ButtonPressed(PSB_PAD_UP))//前进
{
Serial.println("PAD_UPjustpressed");
MOTORFOWARD1;
EnableRockerL=0;
}
elseif(ps2x.ButtonReleased(PSB_PAD_UP))//刹车
{
Serial.println("PAD_UPjustreleased");
MOTORSTOP;
EnableRockerL=1;
LStop=0;
}
if(ps2x.ButtonPressed(PSB_PAD_DOWN))//后退
{
Serial.println("PAD_DOWNjustpressed");
MOTORBACK1;
EnableRockerL=0;
}
elseif(ps2x.ButtonReleased(PSB_PAD_DOWN))//刹车
{
Serial.println("PAD_DOWNjustreleased");
MOTORSTOP;
EnableRockerL=1;
LStop=0;
}
//摇杆控制电机
if(EnableRockerL)
{
if(0<=ps2x.Analog(PSS_LY)&&ps2x.Analog(PSS_LY)<100)//前进
{
Serial.println("f");
MOTORFOWARD1;
LStop=0;
}
elseif(255>=ps2x.Analog(PSS_LY)&&ps2x.Analog(PSS_LY)>170)
//后退
{
MOTORBACK1;
Serial.println("b");
LStop=0;
}
else
{
if(LStop==0)//刹车
{
MOTORSTOP;
Serial.println("s");
LStop++;
}
}
}
//按钮控制舵机
if(ps2x.ButtonPressed(PSB_CIRCLE))//右转
{
Serial.println("Circlejustpressed");
TURNRIGHT;
EnableRockerR=0;
}
elseif(ps2x.ButtonReleased(PSB_CIRCLE))//转回中间
{
Serial.println("Circlejustreleased");
TURNMID;
EnableRockerR=1;
RMid=0;
}
if(ps2x.ButtonPressed(PSB_SQUARE))//左转
{
Serial.println("Squarejustpressed");
TURNLEFT;
EnableRockerR=0;
}
elseif(ps2x.ButtonReleased(PSB_SQUARE))//转回中间
{
Serial.println("Squarejustreleased");
TURNMID;
EnableRockerR=1;
RMid=0;
}
//摇杆控制舵机
if(EnableRockerR)
{
if(0<=ps2x.Analog(PSS_RX)&ps2x.Analog(PSS_RX)<100)//左转
{
TURNLEFT;
Serial.println("l");
RMid=0;
}
elseif(255>=ps2x.Analog(PSS_RX)&ps2x.Analog(PSS_RX)>160)
//右转
{
TURNRIGHT;
Serial.println("r");
RMid=0;
}
else
{
if(RMid==0)//转回中间
{
TURNMID;
Serial.println("mid");
RMid++;
}
}
}
}
(2)红外避障模块
功能介绍:
八路红外避障模块是智能小车红外线探测系统的工具。
它使用红外线发射和接收管等分立元器件组成探头,并使用LM339电压比较器获得输出信号。
电源从模块VCC,GND输入,VCC,SIG1,GND对应接到红外小板上,对应的通道LED显示灯灭(常态下无遮挡输出高电平),若通电后LED常亮,则对应调节电位器一顺时针旋转,使感应距离变小,逆时针旋转使感应距离变大。
此时用手或者白纸遮挡红外小板,则对应通道显示灯会亮,表示输出一个低电平信号。
单片机只要对OUT1-OUT4的电平信号进行判断。
常态下无遮挡为高电平,有遮挡时输出为低电平。
元器件清单:
8路红外主板,避障小板,杜邦线。
电路图:
红外避障模块电路原理图如图7所示。
图7红外避障模块电路原理图
相关代码:
红外避障部分,代码如下
if(Q0==HIGH)
//输出高电平,正前方无障碍物
{
if(Q1==HIGH&Q2==HIGH)
//输出高电平,前方左右无障碍物,前进
{
TURNMID;
MOTORFOWARD2;
}
elseif(Q1==LOW&Q2==HIGH)
//右前方输出低电平,左前方输出高电平,右前方有障物,向左转
{
MOTORFOWARD2;
TURNLEFT;
}
elseif(Q1==HIGH&Q2==LOW)
//左前方输出低电平,右前方输出高电平,左前方有障碍物,向右转
{
MOTORFOWARD2;
TURNRIGHT;
}
else
//前方左右均有障碍物,后退
{
TURNMID;
MOTORBACK;
}
}
else
//输出低电平,正前方有障碍物
{
if(Q1==HIGH&Q2==HIGH)
//前方左右输出高电平,无障碍物,默认后退至左后方
{
MOTORBACK2;
TURNLEFT;
delay(100);
MOTORBACK2;
TURNRIGHT;
delay(100);
}
elseif(Q1==LOW&Q2==HIGH)
//右前方输出低电平,左前方输出高电平,右前方有障物,后退至左后方
{
MOTORBACK2;
TURNLEFT;
delay(100);
MOTORBACK2;
TURNRIGHT;
delay(100);
}
elseif(Q1==HIGH&Q2==LOW)
//左前方输出低电平,右前方输出高电平,左前方有障碍物,后退至右后方
{
MOTORBACK2;
TURNRIGHT;
delay(100);
MOTORBACK2;
TURNLEFT;
delay(100);
}
else
//前方左右均输出低电平,前方左右有障碍物
{
if(H0==HIGH)
//后方输出高电平,无障碍物,向后退
{
TURNMID;
MOTORBACK2;
}
elseif(H0==LOW)
//后方输出低电平,有障碍物,刹车
{
MOTORSTOP;
}
}
}
if(ps2x.NewButtonState(PSB_CROSS))//强制刹车
{
Serial.println("Xjustchanged");
MOTORSTOP;
}
delay(50);
}
voidsetMotorA(intm1Speed)//电机驱动函数
{
if(m1Speed>=0)
{
digitalWrite(PWMB2,HIGH);
analogWrite(PWMB1,255-m1Speed);
}
else
{
digitalWrite(PWMB1,HIGH);
analogWrite(PWMB2,m1Speed+255);
}
}
4.产品展示
整体外观图如图9所示。
图8整体外观图
图9最终演示结果图
5.故障及问题分析
(1)问题:
组装小车很顺利,但是烧入Arduino代码之后,舵机的角度不对,原计划是在Arduino代码里直接修改舵机角度,但是紧接着发现,修改完后小车的舵机有时候会卡死。
解决方案:
经过多次尝试,我们决定拆下舵机查看,查了许多资料,最终得知是未进行安装前舵机的调节。
之后,我们对舵机进行了多次调整,终于是舵机正常运行。
(2)问题:
在进行小车避障功能的实现时,发现连上数据线小车正常工作,断开数据线,用小车电源驱动,发现不可运行。
解决方案:
刚开始,我们分开检查了各部分主板,发现并没有问题,于是询问老师,认为是小车的电源电压不足,于是将7.4V的电源换成了9.1V的电源,结果把ArduinoUNOR3烧了,于是重买了一块Arduino发现可用。
(3)问题:
对红外传感器的测距进行调整时并没有什么问题,但是进行测试的时候发现传感器总是误测。
解决方案:
光线问题,最后决定用纸制的障碍物进行测试,发现可行。
(4)问题:
本来设定ps2蓝牙遥控器的“select”键为手动控制与避障切换的按键,但是必须旧按才可实现切换。
解决方案:
在代码中使用变量i进行模式切换的关键变量。
(5)问题:
代码可行性问题,即小车在某些特定的情况下,现有代码无法让小车运行状态或者方案最佳,例如:
遇到死角,小车的自动避障失灵。
解决方案:
多次修改代码,原代码是小车遇到死角自动后退,直到检测不到死角(前、左前、右前的红外传感器探测到障碍物)再前进,此时就出现了前面所说的,失灵。
最终修改代码,让小车根据情况向右后方或者左后方后退,即可避免上述问题。
6.附录:
元器件清单
完成本项目所用到的元器件及其数量如下表所示
元器件/测试仪表
数量
小车框架
亚克力底板(7块/套)
1
65mm轮子
4
ArduinoUNO主板
1
轴承
若干
螺丝,螺母,铜柱
若干
舵机和电机
S3003舵机
1
17mm联轴器D-3mm
2
0.5模50齿齿轮
1
0.5模34齿齿轮
1
传动连杆
2
后轮连杆
1
电机固定支架
1
25mm金属减速电机
1
开关
1
PM-R3多功能扩展板
1
PS2手柄
1
7.4V-2400mAH锂电池组
1
杜邦线
若干
避障模块
8路红外主板
1
避障小板
8
7.参考文献
【1】李永华.Arduino软硬件协同设计实战指南[M].第1版.北京:
清华大学出版社,2015.
【2】JohnBoxall.动手玩转Arduino[M].翁恺译.第1版.北京:
人民邮电出版社,2014.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Arduino 智能 小车 实验 报告 解读