ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:1,015.52KB ,
资源ID:17613920      下载积分:6 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17613920.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Arduino智能小车实验报告解读.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

Arduino智能小车实验报告解读.docx

1、Arduino智能小车实验报告解读“蓝牙手柄避障小车”设计设计者:严梓桓(34%),汤楷宸(33%),梁德棋(33%)1. 项目背景本作品为基于Arduino控制的智能小车。智能小车在技术上和移动机器人有着密切相关的联系,有着关于自动控制、传感器技术、电子电路上的重要实践意义。通过对基本功能进行不同方向,多种多样的扩展,可以为我们的生活提供各种各样的便利。这类设备可以应用于复杂多样的工作环境,在民用和军用上都可以有各种各样颇有意义的用途。一般来说,红外避障实现方便、技术要求相对简单、易于做到实时控制。并且,一般的红外避障装置在测量精度方面能达到实用的要求,因此成为常用的避障方法。利用红外传感器

2、来实现小车的智能避障时,通过测量小车与障碍物的距离,实现小车多角度检测障碍物,从而加以判断转向、后退和前进,使小车能成功的躲避障碍物,并按照控制者的意愿前进 。受到现有的产品和技术的启发,我们小组制作简易的智能小车。这款简易的智能小车,可以通过操作人的遥控进行操控,进行各种运动,当遇到障碍物时,可以灵活地进行自动避障。而小车的舵机转向,更加的贴合我们的现实汽车的模型,对实现智能无人汽车的出现有一定的借鉴优势。我们还计划为它加装通过Wi-Fi连接的摄像头模块,将拍到的图像数据传输到电脑上。除此之外,我们还希望将来可以通过手机App来对小车进行操控,让小车使用更为方便,功能更加强大。2. 创意描述

3、这款简易的智能小车,可以通过操作手柄进行遥控操控,进行各种前进、后退、转弯、变速等运动。切换模式后,当遇到障碍物时,它可以通过红外避障模块,探测到障碍物,灵活地进行自动避障。创新点:使用手柄操作,操纵方便,具有很大的娱乐性。3. 功能及总体设计该作品主要可以分为两个部分:小车的运动、转向部分和红外避障部分。对于运动和转向部分,经由Arduino UNO板,再用PM-R3多功能扩展板连接电机和舵机,实现小车运动。操作时,通过蓝牙和遥控手柄连接主板,达到操纵的目的;红外避障部分,分布在小车各侧的多个红外小板通过红外传感器模块感应到障碍物,进而控制舵机的转动,避开障碍物。1)功能介绍这款简易的智能小

4、车,通过操作手柄进行遥控操控,进行各种前进、后退、转弯、变速等运动。切换模式后,当遇到障碍物时,它可以通过红外避障模块,探测到障碍物,灵活地进行自动避障。2)总体设计该小车主要由运动和转向部分和红外避障部分两个部分组成。(1)整体框架图项目整体框架图如图1所示。图1 整体框架图PM-R3多功能扩展板连接到Arduino UNO板上,通过PM-R3多功能扩展板连接并驱动步进电机和转向舵机;另外,PM-R3多功能扩展板连接了红外避障模块,四个红外避障小板接收到的障碍物的信号通过它处理,控制电机的工作和舵机的转向。(2)系统流程图 系统流程图(遥控模式略)如图2所示。图2 系统流程图避障模式下,在小

5、车运动过程中,如果遇到障碍物,被红外小板探测到后,让舵机转动,从而达到转向的目的;如果前方各个方向都有障碍物,小车则后退。(3)总电路图 系统总电路图如图3所示图三 系统总电路图 Arduino UNO板上连接了有PM-R3多功能扩展板。驱动步进电机和转向舵机也通过PM-R3多功能扩展板连接;另外,PM-R3多功能扩展板连接到红外避障模块,四个红外避障小板接收到的障碍物的信号通过它传回扩展板,控制电机的工作和舵机的转向。3)模块介绍本项目主要包括以下几个模块:运动与转向模块、红外避障模块,下面分别给出各部分的功能、元件、电路图和相关代码。(1)运动与转向模块功能介绍:小车通过操作手柄进行遥控操

6、控,进行各种前进、后退、转弯、变速等运动元器件清单:S3003舵机,17mm联轴器 D-3mm,0.5模50齿齿轮,0.5模34齿齿轮,传动连杆,后轮连杆,电机固定支架,25mm金属减速电机,开关,PM-R3多功能扩展板,PS2手,11.1V-2400mAH锂电池组,杜邦线。电路图:电机模块接线图如图4所示;电机模块电路原理图如图5所示;PM-R3扩展电路板电路示意图如图6所示。图4 电机模块接线图图5 电机模块电路示意图图6 PM-R3扩展电路板电路示意图相关代码:#include /舵机库文件#include /蓝牙PS2X手柄库文件PS2X ps2x; /声明手柄ps2xServo my

7、servo; /声明舵机myservo/ps2引脚#define PS2_DAT A0 /14 #define PS2_CMD A1 /15#define PS2_SEL A2 /16#define PS2_CLK A3 /17/红外传感器引脚#define Q 7 /7#define QR 8 /8#define QL 10 /10#define H 9 /9/电机驱动引脚定义#define PWMB1 5 #define PWMB2 6 #define SERVOPIN 2 /舵机驱动引脚定义#define SERVOMIN -20 /舵机转动角度#define SERVOMID 45 /

8、舵机转动角度#define SERVOMAX 120 /舵机转动角度#define TURNLEFT myservo.write(SERVOMIN) /向左转#define TURNMID myservo.write(SERVOMID) /向中转#define TURNRIGHT myservo.write(SERVOMAX) /向右转#define MOTORFOWARD1 setMotorA(155) /遥控向前移动#define MOTORFOWARD2 setMotorA(55) /避障向前移动#define MOTORBACK1 setMotorA(-155) /遥控向后移动#def

9、ine MOTORBACK2 setMotorA(-55) /避障向后移动#define MOTORSTOP setMotorA(0) /刹车bool EnableRockerR = 1; /右边摇杆操控控制变量bool EnableRockerL = 1; /左边摇杆操控控制变量int RMid = 0 ; /小车向中转控制变量int LStop = 0 ; /刹车控制变量int error = 0; /控制信号判断变量byte type = 0; /信号种类判断void setup() Serial.begin(57600); /设置串口波57600 /电机驱动 pinMode(PWMB1

10、, 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手柄的控制信号是否

11、接收 error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT); if (error = 0) Serial.print(Found Controller, configured successful ); Serial.println(Try out all the buttons, X will vibrate the controller, faster as you press harder;); Serial.println(holding L1 or R1 will print out the analog st

12、ick values.); Serial.println(Note: Go to www.billporter.info for updates and to report bugs.); else if (error = 1) Serial.println(No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips); else if (error = 2) Serial.println(Controller foun

13、d but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips); else if (error = 3) Serial.println(Controller refusing to enter Pressures mode, may not support it. ); type = ps2x.readType(); /判断ps2信号类,我们所用的是DualShock Controller信号 switch (type) case

14、0: Serial.print(Unknown Controller type found ); break; case 1: Serial.print(DualShock Controller found ); break; case 2: Serial.print(GuitarHero Controller found ); break; case 3: Serial.print(Wireless Sony DualShock Controller found ); break; void(* resetFunc) (void) = 0; /重置void loop() int i = 0;

15、 /避障与蓝牙遥控切换变量 /红外传感器数字信号读取 int Q0=digitalRead(Q); int Q1=digitalRead(QR); int Q2=digitalRead(QL); int H0=digitalRead(H); /信号判断 if (error = 1) resetFunc(); /没有控制信号则跳出循环 ps2x.read_gamepad(); /读取控制信号 if (ps2x.Button(PSB_START) Serial.println(Start is being held); /按下start按钮时串口监视器显示Start is being held i

16、f (ps2x.NewButtonState(PSB_SELECT) /避障和蓝牙遥控切换 Serial.println(Select is being held); i = (i + 1)% 2; /蓝牙遥控 if(i = 0) /按钮控制电机 if (ps2x.ButtonPressed(PSB_PAD_UP) /前进 Serial.println(PAD_UP just pressed); MOTORFOWARD1; EnableRockerL = 0; else if(ps2x.ButtonReleased(PSB_PAD_UP) /刹车 Serial.println( PAD_UP

17、just released); MOTORSTOP; EnableRockerL = 1; LStop = 0; if (ps2x.ButtonPressed(PSB_PAD_DOWN) /后退 Serial.println(PAD_DOWN just pressed); MOTORBACK1; EnableRockerL = 0; else if(ps2x.ButtonReleased(PSB_PAD_DOWN) /刹车 Serial.println( PAD_DOWN just released); MOTORSTOP; EnableRockerL = 1; LStop = 0; /摇杆控

18、制电机 if (EnableRockerL) if (0 = ps2x.Analog(PSS_LY) & ps2x.Analog(PSS_LY) = 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(Circle ju

19、st pressed); TURNRIGHT; EnableRockerR = 0; else if (ps2x.ButtonReleased(PSB_CIRCLE) /转回中间 Serial.println(Circle just released); TURNMID; EnableRockerR = 1; RMid = 0; if (ps2x.ButtonPressed(PSB_SQUARE) /左转 Serial.println(Square just pressed); TURNLEFT; EnableRockerR = 0; else if (ps2x.ButtonReleased(

20、PSB_SQUARE) /转回中间 Serial.println(Square just released); TURNMID; EnableRockerR = 1; RMid = 0; /摇杆控制舵机 if (EnableRockerR) if (0 = ps2x.Analog(PSS_RX)&ps2x.Analog(PSS_RX) =ps2x.Analog(PSS_RX)&ps2x.Analog(PSS_RX) 160) /右转 TURNRIGHT; Serial.println( r); RMid = 0; else if(RMid = 0) /转回中间 TURNMID; Serial.

21、println(mid); RMid +; (2)红外避障模块功能介绍:八路红外避障模块是智能小车红外线探测系统的工具。它使用红外线发射和接收管等分立元器件组成探头,并使用LM339 电压比较器获得输出信号。电源从模块VCC,GND 输入,VCC,SIG1,GND 对应接到红外小板上,对应的通道LED 显示灯灭(常态下无遮挡输出高电平),若通电后LED 常亮,则对应调节电位器一顺时针旋转,使感应距离变小,逆时针旋转使感应距离变大。此时用手或者白纸遮挡红外小板,则对应通道显示灯会亮,表示输出一个低电平信号。单片机只要对OUT1-OUT4 的电平信号进行判断。常态下无遮挡为高电平,有遮挡时输出为低

22、电平。元器件清单:8路红外主板,避障小板,杜邦线。电路图:红外避障模块电路原理图如图7所示。图7 红外避障模块电路原理图相关代码:红外避障部分,代码如下 if(Q0=HIGH) /输出高电平,正前方无障碍物 if(Q1=HIGH&Q2=HIGH) /输出高电平,前方左右无障碍物,前进 TURNMID; MOTORFOWARD2; else if(Q1=LOW&Q2=HIGH) /右前方输出低电平,左前方输出高电平,右前方有障物,向左转 MOTORFOWARD2; TURNLEFT; else if(Q1=HIGH&Q2=LOW) /左前方输出低电平,右前方输出高电平,左前方有障碍物,向右转 M

23、OTORFOWARD2; TURNRIGHT; else /前方左右均有障碍物,后退 TURNMID; MOTORBACK; else /输出低电平,正前方有障碍物 if(Q1=HIGH&Q2=HIGH) /前方左右输出高电平,无障碍物,默认后退至左后方 MOTORBACK2; TURNLEFT; delay(100); MOTORBACK2; TURNRIGHT; delay(100); else if(Q1=LOW&Q2=HIGH) /右前方输出低电平,左前方输出高电平,右前方有障物,后退至左后方 MOTORBACK2; TURNLEFT; delay(100); MOTORBACK2;

24、TURNRIGHT; delay(100); else if(Q1=HIGH&Q2=LOW) /左前方输出低电平,右前方输出高电平,左前方有障碍物,后退至右后方 MOTORBACK2; TURNRIGHT; delay(100); MOTORBACK2; TURNLEFT; delay(100); else /前方左右均输出低电平,前方左右有障碍物 if(H0=HIGH) /后方输出高电平,无障碍物,向后退 TURNMID; MOTORBACK2; else if(H0=LOW) /后方输出低电平,有障碍物,刹车 MOTORSTOP; if (ps2x.NewButtonState(PSB_C

25、ROSS) /强制刹车 Serial.println(X just changed); MOTORSTOP; delay(50);void setMotorA(int m1Speed) /电机驱动函数 if (m1Speed = 0) digitalWrite(PWMB2, HIGH); analogWrite(PWMB1, 255 - m1Speed); else digitalWrite(PWMB1, HIGH); analogWrite(PWMB2, m1Speed + 255); 4. 产品展示整体外观图如图9所示。图8 整体外观图图9 最终演示结果图5. 故障及问题分析(1)问题:组

26、装小车很顺利,但是烧入Arduino代码之后,舵机的角度不对,原计划是在Arduino代码里直接修改舵机角度,但是紧接着发现,修改完后小车的舵机有时候会卡死。解决方案:经过多次尝试,我们决定拆下舵机查看,查了许多资料,最终得知是未进行安装前舵机的调节。之后,我们对舵机进行了多次调整,终于是舵机正常运行。(2)问题:在进行小车避障功能的实现时,发现连上数据线小车正常工作,断开数据线,用小车电源驱动,发现不可运行。 解决方案:刚开始,我们分开检查了各部分主板,发现并没有问题,于是询问老师,认为是小车的电源电压不足,于是将7.4V的电源换成了9.1V的电源,结果把Arduino UNO R3烧了,于

27、是重买了一块Arduino发现可用。(3)问题:对红外传感器的测距进行调整时并没有什么问题,但是进行测试的时候发现传感器总是误测。解决方案:光线问题,最后决定用纸制的障碍物进行测试,发现可行。(4)问题:本来设定ps2蓝牙遥控器的“select”键为手动控制与避障切换的按键,但是必须旧按才可实现切换。解决方案:在代码中使用变量i进行模式切换的关键变量。(5)问题:代码可行性问题,即小车在某些特定的情况下,现有代码无法让小车运行状态或者方案最佳,例如:遇到死角,小车的自动避障失灵。解决方案:多次修改代码,原代码是小车遇到死角自动后退,直到检测不到死角(前、左前、右前的红外传感器探测到障碍物)再前

28、进,此时就出现了前面所说的,失灵。最终修改代码,让小车根据情况向右后方或者左后方后退,即可避免上述问题。6. 附录:元器件清单完成本项目所用到的元器件及其数量如下表所示元器件/测试仪表数量小车框架亚克力底板(7块/套)165mm轮子4Arduino UNO主板1轴承若干螺丝,螺母,铜柱若干舵机和电机S3003舵机117mm联轴器 D-3mm20.5模50齿齿轮10.5模34齿齿轮1传动连杆2后轮连杆1电机固定支架125mm金属减速电机1开关1PM-R3多功能扩展板1PS2手柄17.4V-2400mAH锂电池组1杜邦线若干避障模块8路红外主板1避障小板87. 参考文献【1】李永华. Arduino软硬件协同设计实战指南M. 第1版. 北京:清华大学出版社,2015.【2】John Boxall. 动手玩转ArduinoM. 翁恺 译. 第1版. 北京:人民邮电出版社,2014.

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2