编程语言应用

首页 » 常识 » 诊断 » arduino智能小车实验
TUhjnbcbe - 2023/7/9 3:05:00

智能小车控制实验测试

一、设计主题

综合课程所学、所掌握的软硬件知识,简介自己制作的Arduino智能控制装置,项目所解决的现实问

题与实现的功能。

二、基本内容

项目设计方案:阐述清楚设计思路,软、硬件条件与设计目标实现的可行性。

硬件设计:硬件功能与结构概述、主要模块功能描述、硬件设计电路图、电路功能说明

软件设计:软件功能设计概述、程序流程图、流程图功能描述、主程序与程序模块源代码

调试过程:电路搭建、实验调试、功能测试、结果说明

总结与反思:设计任务目标的实现程度,实验中的问题与解决办法,反思与改进

三.硬件模块

主要包括:智能小车底盘、红外遥控传感器、PS/3双轴摇杆、LN双电机驱动模块、直流电机、电

池组、超声波传感器、红外循迹传感器、红外避障传感器、防撞开关、……

红外循迹传感器

红外循迹传感器由一对红外线发射与接收管构成,发射管发射出一定频率的红外线,当检测方向遇到障碍物时,红外线反射回来被接收管接收,经过比较器电路处理后,信号输出口输出数字信号,可通过电位器旋钮调节检测距离,有效距离范围2-30cm,工作电压3.3-5V。利用红外线在不同颜色物体表面具有不同反射强度的特点,红外循迹传感器根据红外接受头接收到红外反射信号强弱来判断小车是否运行在黑色(或白色)轨迹上,来判断小车运行位置状态。

红外循迹传感器电路原理图

巡线小车红外循迹原理

小车循迹,是小车在白色地板上循黑线前进,通常采用红外探测法。在小车行驶过程中不断地向地面发射红外光,当遇到白色质地地面发生强的漫反射反射光被红外接收管接收;如果遇到黑色质地地面则被强吸收,红外接收头接收不到红外光或被弱接收。Arduino主控板根据接收到反射回来的红外光为依据来确定黑线的位置与小车前进的路线。

红外避障传感器

红外避障感器由一对红外线发射与接收管构成,发射管主动发射出一定频率的红外线,当检测方向遇到障碍物时,红外线反射回来被接收管接收,经过比较器电路处理后,信号输出口输出数字信号。当检测到障碍物时,信号输出端口持续输出低电平信号,可通过电位器旋钮调节检测距离,有效距离范围2-30cm,工作电压3.3-5V。

巡线小车红外循迹原理小车循迹,是小车在白色地板上循黑线前进,通常采用红外探测法。在小车行驶过程中不断地向地面发射红外光,当遇到白色质地地面发生强的漫反射反射光被红外接收管接收;如果遇到黑色质地地面则被强吸收,红外接收头接收不到红外光或被弱接收。Arduino主控板根据接收到反射回来的红外光为依据来确定黑线的位置与小车前进的路线。

A/B两路循迹传感器的循迹巡线小车控制逻辑:

红外避障传感器

红外避障感器由一对红外线发射与接收管构成,发射管主动发射出一定频率的红外线,当检测方向遇到障碍物时,红外线反射回来被接收管接收,经过比较器电路处理后,信号输出口输出数字信号。当检测到障碍物时,信号输出端口持续输出低电平信号,可通过电位器旋钮调节检测距离,有效距离范围2-30cm,工作电压3.3-5V。

接触式碰撞开关传感器

接触式碰撞开关传感器依靠内部的机械结构来完成电路的导通和断开。当外部的碰撞臂收到碰撞挤压,

探测臂受力下压开关内部的拨动簧片,使电路开关状态发生改变,输出端口信号状态发生改变。

4.H桥电路控制

H桥电路名称的由来是因为控制电路的形状向字母H。晶体管H桥控制电路如图所示,当左侧为高电平、右侧为低电平,电流从左向右流过直流电机,如果左侧为低电平、右侧为高电平,电流方向则相反。

LN为双H桥电机驱动模块,其芯片内部包含了两组H桥式电路,可以驱动并控制两个直流电机的正反转,其中ENA/ENA使能端可以控制电机的启停和转速。

LN驱动模块控制直流电机

使能端ENA和ENB可输入PWM脉宽调制信号对直流电机转速进行调节控制。ENA、ENA接上跳线帽,电机工作电压为5V,电机处于最高速状态,取下跳线帽,电机,电机停止转动。

直流电机的正反转控制。信号输入端IN1=HIGH,,IN2=LOW,电机MA正转;信号输入端N1=LOW,IN2=HIGH,电机MA反转。电机MB同理。

5.红外遥控

红外遥控器、红外遥控库函数、红外遥控的按键编码的发射与接收

红外遥控小车

红外遥控器的使用,参考红外遥控实验。

6.PS/3三轴遥控传感器

PS/3双轴遥控器传感器,具有X、Y轴analog输出,Z轴1路按钮digital输出,3路信号分别通过杜邦线线接到Arduino传感器扩展板,需占用2个模拟输入端口、1个数字输入端口实现3路信号控制。

PS/3摇杆传感器PS/3摇杆传感器原理图

PS/3摇杆工作原理

摇杆实是由接X、Y的两个电位器与一个按键开关构成。X、Y接Arduino模拟输入接口,输入值范围0~

。操纵杆保持垂直状态的中心位置时,电位器X/Y轴的值为左右。以左右的值为中心,摇动操纵杆X轴,低于的值时可使电机向一个方向旋转,高于的值时可控制电机旋转方向反向;将X轴的读取值0-映射为-0,X轴的读取值-映射为0-,转换为PWM值控制电机的速度。

PS/3摇杆Z轴等效于按键开关,当垂直按下摇杆时,为闭合状态,松开时为断开状态。

智能小车PS/3摇杆控制功能设置参考表

7.反馈型移动机器人

反馈型移动机器人概念

反馈型智能移动机器人,可以简单地定义为一种实时感知环境信号并进行反馈处理,最终实现智能控制方式将感知和执行动作连接在一起的可自动移动设备,具有在一个位置环境中独立完成某些工作的能力。

本课程的智能小车是通过传感器感知外界变化的信息,通过主控程序进行分析判断,并通过执行器做出自动反应。

感知

机器人由装置的传感器实时收集环境信息,并将信息变化转换为电信号,机器人感知到外部环境的改变。传感器是由主程序控制并不断重复扫描,读取传感器转化来的电信号值及其变化,由编程判断机器人所处的环境状况。

不同类型的传感器感知特定的环境信息,如超声波传感器获取前方物体的距离,热敏传感器感知环境热源,温度传感器感知环境的温度等。

动作与执行机器人的动作与执行是对外界变化做出的反应。将主程序的指令或传感器获得的电信号通过执行机构完成向声、光、电、位置变化等的转换。如发声、显示、通过电机执行动作等。

机器智能

机器人的设计,是将机器人硬件系统、机器人控制程序、机器人所在环境感知与执行结合在一起的智

能设备系统。反馈型机器人处在一个动态的环境,对环境的改变能实时做出反应。机器人的智能设计,是基于尽可能全面、精确的传感器感知信号,合理灵活的系统结构设计加上完整、逻辑性强的程序设计共同完成。

开环控制

开环控制是当控制系统接收一个输入量后,不对输出量进行检测和反馈,输出与输出之间没有形成反馈环路的控制系统。

开环控制示意图

闭环控制

闭环控制是当控制系统接收到一个输入量后,对输出量进行检测,计算实际输出结果和目标输出结果之间的偏差,并将计算偏差通过某种途径变换后反馈回输入端,以抑制内部或外部扰动对输出量的影响。

闭环控制会持续一定的时间,以修正输入端的控制。

反馈型机器人的控制一般都采用闭环控制,以适应不断变化的环境。如智能巡线智能小车,智能跟随智能小车,自动防撞小车等。

智能跟随

智能跟随是机器人预设一个合理的反应距离范围,通过传感器实时测定机器人距离,当在合理距离范围内随着距离的增大并超过设定距离,机器人前进直到距离缩小到反应距离范围内;当机器人距离小于设定合理的反应距离时,机器人后退增到距离直到达到合理距离范围。

智能跟随机器人距离传感器可用超声波传感器、红外测距传感器、红外避障传感器等。

8.差分技术

在智能移动机器人应用中,采用两个以上传感器检测环境信息,在运动过程中各个传感器检测到的信息一定有先后、大小、强弱的区别,依靠不同传感器之间、或同一传感器先后接收到的信号之间的差分信号来控制机器人运动方向的技术。

实现差分信号的传感器在机器人上安装方式必须确保:当机器人方向改变使一个传感器信号逐渐增强时,另一个传感器的输出信号应随着方向改变而逐渐减弱。如红外循迹小车、寻光归航小车、智能跟随小车、红外避障小车、超声波避障小车等都是利用差分技术实现智能控制移动功能。

差分技术的两驱智能巡线小车姿态表

,小车从静止启动的转矩不为0,启动时PWM值n,启动的n值需要通过调试确定。通电时由于电机受到阻力输入PWM值产生的动力,电机不能转动并会发出“嗡嗡”的噪音,电能全部转化为热能,时间过长发热会烧坏电机,因此需要及时停止电机的驱动。

特别注意,给Arduino开发板上传程序之前,需要将小车车体架起,使车轮悬空,避免启动时车轮运

转致小车摔落损坏。

循迹归航小车

在智能小车前两侧安装至少2个红外循迹模块,分别位于黑线两侧。更具红外循迹模块检测到的返回值来控制小车的状态。

小车循迹归航示意图:

运动方向控制程序模块流程图示意图

寻光归航小车

在小车前的两侧安装两个光敏电阻模块,根据光敏电阻模块获取前方灯光照明的返回值来控制小车的状态。寻光归航小车示意图:

运动方向控制程序模块流程图示意图

差分避障小车

避障行为能够使机器人避开障碍物,以免发生危险。机器人避障行为常采用超声波传感器、红外测距传感器、红外接近开关传感器,通过两个传感器获取返回信号值得强弱来控制小车的状态,编程实现避开障碍物的运动控制。

差分避障小车示意图:

9.小车底盘

9.1Arduino小车机器人组件

智能小车机器人效果图

ArduinoUNOR3主控板

机器组件安装位置示意图

机器人小车底盘实物效果图

铜柱及螺丝

9.2小车机器人装配

直流电机的安装固定

电池盒的安装

配件的固定与安装

小车正面安装固定铜柱,车头使用中铜柱,中部使用长铜柱,车尾使用根短铜柱,并在小车底板背面

用圆头螺丝固定。

万向轮的安装

主控板的安装

超声传感器或防撞传感器的安装

9.3电池使用说明

要先用专用充电器给锂电池充电,充电器指示灯为红灯,指示灯为*灯(绿灯)表示已充满电。充电时必须有人值守,避免发生意外。

当不用小车的时候要把开关关掉或拔下跳线断电,这样电池不会再放电。

⑶小车运行约10-20分钟可能需要充电。小车长期不用时要取下电池,电池长期闲置时候充满电。

9.4电机上电调试

上电测试前,必须认真、仔细地确认各模块电源端、接地端连接无误!

对小车机器人上电测试,遵循先分别测试各独立模块,再进行系统功能调试。

电机模块上电调试

将电机驱动模块LN的EN1/EN2/EN3/EN4接到5V电源、GND,检查确认电机转向正常,否则交换接口方向。

9.5传感器上电调试

黑白线循迹模块调试

黑白线识别模块调试由SW3、SW4电位器,L3、L2指示灯以及P3、P2光电传感器组成。

P3、P2光电传感器检测到黑色时,L3、L2指示灯不亮(输出高电平1)。

P3、P2光电传感器检测到白色时,L3、L2指示灯亮起(输出高电平0)

SW3左光电信号强度调节—顺时针调节电位器是增加检测距离,反时针调节电位器时减少检测距离。

SW4右光电信号强度调节—顺时针调节电位器是增加检测距离,反时针调节电位器时减少检测距离

(同SW3一样)。

注意事项:调试时不要对着强光,建议在室内调节,环境光线对检测距离有比较大的影响,此为红外线本身原因。

避障模块调试

避障模块由SW1(SW2)电位器,L4(L5)指示灯以及LEAS1、RC1(及LEAS2、RC2)红外发射接收对管组成。

①当LEAS1、RC1(及LEAS2、RC2)红外发射接收模块没有检测到障碍物时,L4(L5)指示灯不亮(输出高电平);反之检测到障碍物,L4(L5)指示灯亮起(输出低电平)。

②SW1左光电信号强度调节—顺时针调节电位器是增加检测距离,反时针调节电位器时减少检测距离。

③SW2右光电信号强度调节—顺时针调节电位器是增加检测距离,反时针调节电位器时减少检测距离

(同SW1一样)。

注意事项:调试时不要对着强光,建议在室内调节,环境光线对检测距离有比较大的影响,此为红外线本身原因。

超声测距模块的调试

10.两轮小车驱动程序示例(参考)智能小车机器人只有两个驱动轮,一个万向轮,控制两个驱动轮电机的方向、速度就可以实现小车运动动作的控制。

小车LN驱动模块电机控制接口IN1/IN2/IN3/IN4,ENA/ENB使能端接口2个,典型运动模式驱动程序示例如下:

五、实验内容

流程图:

代码:

六、实验结果

#includeIRremote.h

intrecvPin=11;//红外接收器连接11号引脚

IRrecvmyIRrecv(recvPin);//实例化一个红外接收对象

decode_resultsresults;

#definedwqPinA0//电位器输入引脚

#definedjPin3//PWM输出引脚-控制电机转速

intsensorValue=0;

intdjSpeed=0;//直流电机转速0-void

intleftmotorpin_IN1=9;

intleftmotorpin_IN2=10;

intENA=5;

intrightmotorpin_IN3=11;

intrightmotorpin_IN4=12;

intENB=6;

voidsetup(){

myIRrecv.enableIRIn();

Serial.begin();

pinMode(3,OUTPUT);

digitalWrite(3,LOW);

pinMode(leftmotorpin_IN1,OUTPUT);

pinMode(leftmotorpin_IN2,OUTPUT);

pinMode(rightmotorpin_IN3,OUTPUT);

pinMode(rightmotorpin_IN4,OUTPUT);

pinMode(ENA,OUTPUT);

pinMode(ENB,OUTPUT);

digitalWrite(leftmotorpin_IN1,LOW);

digitalWrite(leftmotorpin_IN2,LOW);

digitalWrite(rightmotorpin_IN3,LOW);

digitalWrite(rightmotorpin_IN4,LOW);

analogWrite(ENA,0);

analogWrite(ENB,0);

}

voidloop(){

sensorValue=analogRead(dwqPin);//读电位器电压,量值0-

djSpeed=map(sensorValue,0,,0,);//sensorValue值转换为0-

Serial.print("sensorValue=:");

Serial.println(djSpeed);

if(myIRrecv.decode(results)){//检查是否收到编码信息

Serial.print("thekeycodeis:");

Serial.println(results.value,HEX);//串口输出16进制编码

myIRrecv.resume();//接收下一个编码

}

delay();

if(results.value){

if(results.value==0xFFA25D)//CH-键

{

forward();//向前进2秒

delay();

stop();

results.value=0;

}

if(results.value==0xFFE21D)//CH+键

{

backward();//向后退2秒

delay();

stop();

results.value=0;

}

if(results.value==0xFF30CF)//1键向左转2秒

{

turnleft();//向左转2秒

delay();

stop();

results.value=0;

}

if(results.value==0xFF18E7)//2键向右转2秒

{

turnright();//向右转2秒

delay();

stop();

results.value=0;

}

if(results.value==0xFF42BD)//7键原地左转2秒

{

rotateleft();//向左转2秒

delay();

stop();

results.value=0;

}

if(results.value==0xFF4AB5)//8键

{

rotateright();//向右转2秒

delay();

stop();

results.value=0;

}

if(results.value==0XFF)//8键

{

rotate1();//原地右转2秒

delay();

stop();

results.value=0;

}

if(results.value==0XFF5AA5)//6键

{

rotate2();//向右转2秒

delay();

stop();

results.value=0;

}

}

}

voidforward(){

digitalWrite(leftmotorpin_IN1,HIGH);//左电机前进

digitalWrite(leftmotorpin_IN2,LOW);

digitalWrite(rightmotorpin_IN3,HIGH);//右电机前进

digitalWrite(rightmotorpin_IN4,LOW);

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidbackward(){

digitalWrite(leftmotorpin_IN1,LOW);

digitalWrite(leftmotorpin_IN2,HIGH);//左电机后退

digitalWrite(rightmotorpin_IN3,LOW);

digitalWrite(rightmotorpin_IN4,HIGH);//右电机后退

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidturnleft(){

digitalWrite(leftmotorpin_IN1,LOW);

digitalWrite(leftmotorpin_IN2,HIGH);//左电机后退

digitalWrite(rightmotorpin_IN3,LOW);//右电机前进

digitalWrite(rightmotorpin_IN4,HIGH);

//设定左电机速度值小于右电机,向左转

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidturnright(){

digitalWrite(leftmotorpin_IN1,HIGH);//左电机前进

digitalWrite(leftmotorpin_IN2,LOW);

digitalWrite(rightmotorpin_IN3,HIGH);//右电机前进

digitalWrite(rightmotorpin_IN4,LOW);

//设定右电机速度值小于左电机,向右转

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidrotateleft(){

digitalWrite(leftmotorpin_IN1,LOW);

digitalWrite(leftmotorpin_IN2,HIGH);//左电机后退

digitalWrite(rightmotorpin_IN3,HIGH);//右电机前进

digitalWrite(rightmotorpin_IN4,LOW);

//设定左右电机速度相等,原地转

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidrotateright(){

digitalWrite(leftmotorpin_IN1,HIGH);//左电机前进

digitalWrite(leftmotorpin_IN2,LOW);

digitalWrite(rightmotorpin_IN3,LOW);

digitalWrite(rightmotorpin_IN4,HIGH);//右电机后退

//设定左右电机速度相等,原地转

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidrotate1(){

digitalWrite(leftmotorpin_IN1,LOW);

digitalWrite(leftmotorpin_IN2,HIGH);//左电机后退

digitalWrite(rightmotorpin_IN3,LOW//右电机前进

digitalWrite(rightmotorpin_IN4,HIGH);

//设定左右电机速度相等,原地转

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidrotate2(){

digitalWrite(leftmotorpin_IN1,HIGH);

digitalWrite(leftmotorpin_IN2,LOW//左电机后退

digitalWrite(rightmotorpin_IN3,LOW//右电机前进

digitalWrite(rightmotorpin_IN4,HIGH);

//设定左右电机速度相等,原地转

analogWrite(ENA,);//设定左电机PWM调速值

analogWrite(ENB,);//设定左电机PWM调速值

}

voidstop(){

digitalWrite(leftmotorpin_IN1,LOW);

digitalWrite(leftmotorpin_IN2,LOW);

digitalWrite(rightmotorpin_IN3,LOW);//右电机后退

digitalWrite(rightmotorpin_IN4,LOW);

//设定左右电机速度相等,原地转

analogWrite(ENA,0);//设定左电机PWM值为0

analogWrite(ENB,0);//设定左电机PWM值为0

}

1.实验现象:

2实验现象解释:连接好小车后,按CH小车向前进,按下CH-小车后退,按下1键向左转,按下2键向右转,按下7键原地左转,按键8键原地右转,按住6键小车向右原地转,按住9键小车向左原地转。

1
查看完整版本: arduino智能小车实验