红外避障小车.docx
- 文档编号:8741684
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:40
- 大小:622.89KB
红外避障小车.docx
《红外避障小车.docx》由会员分享,可在线阅读,更多相关《红外避障小车.docx(40页珍藏版)》请在冰豆网上搜索。
红外避障小车
红外避障小车
2010年04月28日星期三22:
45
今天就用Arduino简单的控制一下小车的前进及转弯。
要准备的有:
机器人基地2WD小车、Arduino控制器、Arduino传感器扩展板(这里我为了接线方便使用)、双H桥直流电机驱动板、电池、杜邦线若干。
双H桥直流电机驱动板的接线方式及使用方法以前博文Arduino控制直流电机曾介绍过,这里做一下详细说明。
首先VMS驱动部分取电可接+5V-+46V,逻辑部分可板内取电,即端子可悬空,也可接入+5V-+7V。
端子左右两排三个插针分别用来控制两路直流电机。
EA、EB接入ArduinoPWM接口用于电机调速,I1、I2、I3、I4接口,分别用来控制两路直流电机前进、后退、转向以及刹车,只需接入Arduino的数字接口即可。
散热片后有单排四个插针用来接步进电机,但是我们也可以用他们接入两路直流电机,这样首先可以解决电机线不够长的问题,其次就是用杜邦线做电机引线方便插接问题了,不过用这个方式接线我们一定要注意一点,就是板子左右上角的电流反馈接口跳线帽一定要像下图一样接好,左右对称。
电流反馈功能以后再研究,且电机插针左边两插针与左路电机对应,右边两插针与右路电机对应,杜邦线插接即可。
下面附几幅我的接线完成图,仅供大家参考。
传感器接线图,红黑线为电源线,我是从双H桥直流电机驱动板取电,其他为电机控制线。
驱动板接线细节图
直流电机接线细节图
到此准备工作基本完成,可以编写程序了,这里我把2WD小车直走、后退、左转、右转、刹车的功能都编写进程序供大家参考。
程序如下:
intpinI1=8;//定义I1接口
intpinI2=9;//定义I2接口
intspeedpin=11;//定义EA(PWM调速)接口
intpinI3=6;//定义I3接口
intpinI4=7;//定义I4接口
intspeedpin1=10;//定义EB(PWM调速)接口
voidsetup()
{
pinMode(pinI1,OUTPUT);
pinMode(pinI2,OUTPUT);
pinMode(speedpin,OUTPUT);
pinMode(pinI3,OUTPUT);
pinMode(pinI4,OUTPUT);
pinMode(speedpin1,OUTPUT);
}
voidloop()
{
//直走
analogWrite(speedpin,100);//输入模拟值进行设定速度
analogWrite(speedpin1,100);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
delay(2000);
//后退
analogWrite(speedpin,100);//输入模拟值进行设定速度
analogWrite(speedpin1,100);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
delay(2000);
//左转
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
delay(2000);
//右转
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
delay(2000);
//刹车
digitalWrite(pinI4,HIGH);//使直流电机(右)刹车
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)刹车
digitalWrite(pinI2,HIGH);
delay(2000);
}
注:
程序里我所用的左转和右转只是转弯的一种控制方式,其他方式就不一一列举了,大家可以自己尝试。
将三个Mini红外巡线传感器接到Arduino3、4、5三个数字接口上,接线图如下:
接线实物图
整体图
下面是我编写好的程序,供大家参考。
intpinI1=8;//定义I1接口
intpinI2=9;//定义I2接口
intspeedpin=11;//定义EA(PWM调速)接口
intpinI3=6;//定义I3接口
intpinI4=7;//定义I4接口
intspeedpin1=10;//定义EB(PWM调速)接口
intIRR=3;//定义右侧寻线传感器接口
intIRM=4;//定义中间寻线传感器接口
intIRL=5;//定义左侧寻线传感器接口
voidsetup()
{
pinMode(pinI1,OUTPUT);
pinMode(pinI2,OUTPUT);
pinMode(speedpin,OUTPUT);
pinMode(pinI3,OUTPUT);
pinMode(pinI4,OUTPUT);
pinMode(speedpin1,OUTPUT);
pinMode(IRR,INPUT);
pinMode(IRM,INPUT);
pinMode(IRL,INPUT);
}
voidadvance()//前进
{
analogWrite(speedpin,100);//输入模拟值进行设定速度
analogWrite(speedpin1,100);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
voidright()//右转
{
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
voidleft()//左转
{
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
}
voidstop()//停止
{
digitalWrite(pinI4,HIGH);//使直流电机(右)制动
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)制动
digitalWrite(pinI2,HIGH);
}
voidloop()
{
intr,m,l;
r=digitalRead(IRR);
m=digitalRead(IRM);
l=digitalRead(IRL);
if(l==HIGH&&m==LOW&&r==HIGH)
advance();
elseif(l==LOW&&m==HIGH&&r==HIGH)
left();
elseif(l==HIGH&&m==HIGH&&r==LOW)
right();
elsestop();
}
将三个Mini红外巡线传感器接到Arduino3、4、5三个数字接口上,接线图如下:
再来简单介绍一下Mini避障传感器吧,下面是功能图解。
通过配合调节调频和调距两个电位计,我们可以调到适合我们的检测距离。
有障碍物位低电平,无障碍物位高电平。
我个人认为完成寻线功能后再来完成避障功能就很简单了,有些原理是极为相似的,传感器的使用也是如此相似。
使能跳线帽插上就是一直让传感器工作,拔下则可以通过控制使能端让传感器是否工作。
我这次编写的程序就是在寻线的基础上修改的所以很多都是与寻线的相同,相同的接口定义、相同的子函数,之前也说过寻线与避障有很多相同之处,在程序上也能体现出来。
有前一篇的基础再来看这个程序就应该没什么障碍了,这里就不逐句解释了
,直接附上程序了。
intpinI1=8;//定义I1接口
intpinI2=9;//定义I2接口
intspeedpin=11;//定义EA(PWM调速)接口
intpinI3=6;//定义I3接口
intpinI4=7;//定义I4接口
intspeedpin1=10;//定义EB(PWM调速)接口
intIRR=3;//定义右侧避障传感器接口
intIRM=4;//定义中间避障传感器接口
intIRL=5;//定义左侧避障传感器接口
voidsetup()
{
pinMode(pinI1,OUTPUT);
pinMode(pinI2,OUTPUT);
pinMode(speedpin,OUTPUT);
pinMode(pinI3,OUTPUT);
pinMode(pinI4,OUTPUT);
pinMode(speedpin1,OUTPUT);
pinMode(IRR,INPUT);
pinMode(IRM,INPUT);
pinMode(IRL,INPUT);
}
voidadvance(inta)//前进
{
analogWrite(speedpin,a);//输入模拟值进行设定速度
analogWrite(speedpin1,a);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
voidright(intb)//右转
{
analogWrite(speedpin,b);//输入模拟值进行设定速度
analogWrite(speedpin1,b);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
voidleft(intc)//左转
{
analogWrite(speedpin,c);//输入模拟值进行设定速度
analogWrite(speedpin1,c);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
}
voidstop()//停止
{
digitalWrite(pinI4,HIGH);//使直流电机(右)制动
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)制动
digitalWrite(pinI2,HIGH);
}
voidback(intd)//后退
{
analogWrite(speedpin,d);//输入模拟值进行设定速度
analogWrite(speedpin1,d);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
}
voidloop()
{
intr,m,l;
r=digitalRead(IRR);
m=digitalRead(IRM);
l=digitalRead(IRL);
if(l==HIGH&&m==HIGH&&r==HIGH)
advance(120);
if(l==LOW&&m==LOW&&r==LOW)
{
back(120);
delay(300);
right(100);
delay(100);
}
if(l==LOW&&m==HIGH&&r==LOW)
{
back(120);
delay(300);
right(100);
delay(100);
}
if(l==HIGH&&m==LOW&&r==HIGH)
{
back(120);
delay(300);
right(100);
delay(100);
}
if(l==LOW&&m==LOW&&r==HIGH)
right(100);
if(l==LOW&&m==HIGH&&r==HIGH)
right(80);
if(l==HIGH&&m==LOW&&r==LOW)
left(100);
if(l==HIGH&&m==HIGH&&r==LOW)
left(80);
蔽障程序
#include
bitRandomFactor=0;
bitRandomFactorBuf=0;
#include
#defineFLeftMotorP0_2=1;P0_3=0
#defineBLeftMotorP0_2=0;P0_3=1
#defineFRightMotorP0_5=1;P0_4=0
#defineBRightMotorP0_5=0;P0_4=1
#defineLeftStop P0_2=0;P0_3=0
#defineRightStop P0_4=0;P0_5=0
#defineCarStopP0_2=0;P0_3=0;P0_4=0;P0_5=0
#defineRightSenserP0_0
#defineLeftSenserP0_1
//********************************************************
//左转
//********************************************************
voidTurnLeft_1()
{
LeftStop;
FRightMotor;
}
//********************************************************
//快速左转
//********************************************************
voidTurnLeft_Fast()
{
BLeftMotor;
FRightMotor;
}
//********************************************************
//右转
//********************************************************
voidTurnRight_1()
{
RightStop;
FLeftMotor;
}
//********************************************************
//快速右转
//********************************************************
voidTurnRight_Fast()
{
BRightMotor;
FLeftMotor;
}
//********************************************************
//用倒退的方式进行车头右转
//********************************************************
voidBTurnRight_1()
{
LeftStop;
BRightMotor;
}
//********************************************************
//用倒退的方式进行车头左转
//********************************************************
voidBTurnLeft_1()
{RightStop;
BLeftMotor;
}
//********************************************************
//前进
//********************************************************
voidFCar()
{
FLeftMotor;
FRightMotor;
}
//********************************************************
//后退
//********************************************************
voidBCar()
{
BLeftMotor;
BRightMotor;
}
//********************************************************
//壁障程序
//********************************************************
voidObstacle_Avoid(void)
{
if(RightSenser&&LeftSenser&&PWM)
{
FCar();
}
if((!
RightSenser)&&LeftSenser&&PWM)
{
BTurnLeft_1();
}
if(RightSenser&&(!
LeftSenser)&&PWM)
{
BTurnRight_1();
}
if(!
(RightSenser||LeftSenser))
{
RandomFactorBuf=RandomFactor;
while(!
(RightSenser||LeftSenser))
{
if(RandomFactorBuf)
{
BTurnLeft_1();
delay(300);
}
if(!
RandomFactorBuf)
{
BTurnRight_1();
delay(300);
}
}
}
if(!
PWM)
{
LeftStop;
RightStop;
}
}
//********************************************************
//跟随程序
//********************************************************
voidFollow(void)
{
if(RightSenser&&LeftSenser&&PWM)
{
LeftStop;
RightStop;
}
if((!
RightSenser)&&LeftSenser&&PWM)
{
TurnRight_1();
}
if(RightSenser&&(!
LeftSenser)&&PWM)
{
TurnLeft_1();
}
if(!
(RightSenser||LeftSenser))
{
FCar();
}
}
//*******************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红外 小车