今天继续我们的2WD小车之旅,寻线是程控小车应该可以实现的最基本功能,也是各大机器人比赛中最基本的考核项目,2WD小车基本功能测试已经完成,自然该让我们的智能小车完成寻线功能啦!
我们要准备的东东有:2WD小车(注意:小车一定要是根据上篇博文装配完成的哦!还有装配不明白的好朋友们就麻烦去参考前一篇博文啦!Arduino机器人应用1—2WD小车基本功能测试)、三个Mini红外巡线传感器、三条传感器连接线、传感器支架、当然要有Arduino和Arduino传感器扩展板、杜邦线若干。
基本设施安装完毕的2WD小车
Mini红外巡线传感器
传感器支架
传感器连接线
这里我用三个红外Mini寻线传感器,好朋友们当然也可以选用五个或五个以上,传感器的数量自然是多多益善喽,传感器个数越多采集回的数据就会越多,随之而来的我们就需要处理更多的数据,通过这些数据我们就可以编写各种算法,让我们的智能小车对环境的判断更精准,走出更perfect路线,就像“飞思卡尔”智能车比赛,比的就是这些算法啦!今天我只介绍最简单的控制算法,更高明的控制算法就期待大家开动脑筋自己编写了。
有关于Mini红寻线外传感器的使用方法“Arduino控制红外寻线传感器”博文中也有介绍,这里就不再重复了。
我将三个Mini红外巡线传感器接到Arduino3、4、5三个数字接口上,接线图如下:
接线实物图
整体图
下面是我编写好的程序,供大家参考。
int pinI1=8;//定义I1接口
int pinI2=9;//定义I2接口
int speedpin=11;//定义EA(PWM调速)接口
int pinI3=6;//定义I3接口
int pinI4=7;//定义I4接口
int speedpin1=10;//定义EB(PWM调速)接口
int IRR=3;//定义右侧寻线传感器接口
int IRM=4;//定义中间寻线传感器接口
int IRL=5;//定义左侧寻线传感器接口
void setup()
{
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);
}
void advance()//前进
{
analogWrite(speedpin,100);//输入模拟值进行设定速度
analogWrite(speedpin1,100);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
void right()//右转
{
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
void left()//左转
{
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
}
void stop()//停止
{
digitalWrite(pinI4,HIGH);//使直流电机(右)制动
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)制动
digitalWrite(pinI2,HIGH);
}
void loop()
{
int r,m,l;
r=digitalRead(IRR);
m=digitalRead(IRM);
l=digitalRead(IRL);
if(l==HIGH &&m==LOW && r==HIGH)
advance();
else if(l==LOW && m==HIGH && r==HIGH)
left();
else if(l==HIGH && m==HIGH && r==LOW)
right();
else stop();
}
再来简单介绍一下Mini避障传感器吧,下面是功能图解。
通过配合调节调频和调距两个电位计,我们可以调到适合我们的检测距离。有障碍物位低电平,无障碍物位高电平。我个人认为完成寻线功能后再来完成避障功能就很简单了,有些原理是极为相似的,传感器的使用也是如此相似。使能跳线帽插上就是一直让传感器工作,拔下则可以通过控制使能端让传感器是否工作。
我这次编写的程序就是在寻线的基础上修改的所以很多都是与寻线的相同,相同的接口定义、相同的子函数,之前也说过寻线与避障有很多相同之处,在程序上也能体现出来。有前一篇的基础再来看这个程序就应该没什么障碍了,这里就不逐句解释了
,直接附上程序了。
int pinI1=8;//定义I1接口
int pinI2=9;//定义I2接口
int speedpin=11;//定义EA(PWM调速)接口
int pinI3=6;//定义I3接口
int pinI4=7;//定义I4接口
int speedpin1=10;//定义EB(PWM调速)接口
int IRR=3;//定义右侧避障传感器接口
int IRM=4;//定义中间避障传感器接口
int IRL=5;//定义左侧避障传感器接口
void setup()
{
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);
}
void advance(int a)//前进
{
analogWrite(speedpin,a);//输入模拟值进行设定速度
analogWrite(speedpin1,a);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
void right(int b)//右转
{
analogWrite(speedpin,b);//输入模拟值进行设定速度
analogWrite(speedpin1,b);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
digitalWrite(pinI2,HIGH);
}
void left(int c)//左转
{
analogWrite(speedpin,c);//输入模拟值进行设定速度
analogWrite(speedpin1,c);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
}
void stop()//停止
{
digitalWrite(pinI4,HIGH);//使直流电机(右)制动
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)制动
digitalWrite(pinI2,HIGH);
}
void back(int d)//后退
{
analogWrite(speedpin,d);//输入模拟值进行设定速度
analogWrite(speedpin1,d);
digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
digitalWrite(pinI2,LOW);
}
void loop()
{
int r,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);
}
程序写到这里就结束了,有点长,呵呵,希望能给大家一点借鉴。
发表评论: