功能说明:
让红外线循迹自动机器人能够自动行进在预先规划的黑色轨道上。请按购实际情况调整自动机器人的行进速度,以免车速过快而冲出轨道。般地面负色都不是与黑色轨道对比强烈的白色,会降低红外线的反射率,使低基准电位输出电压过高。可以利用调整比较电压值来提高感应的灵敏度,以免产生误动作。
如果使用三线式红外线模块或四线式红外线模块的DO输出,必须连接到Arduino板的数字输入引脚,并且调整红外线模块上的可变电阻改变比较器电压,以提高红外线循迹自动机器人对轨道的感应灵敏度。如果使用四线式红外线模块的AO输出,必须连接Arduino板的模拟输入引脚,并且调整analogRead0)函数所读取转换的比较值,以提高红外线循迹自动机器人对轨道的感应灵敏度。
const int negR=4;//右轮马达负极
const int posR=5;//右轮马达正极
const int negL=6;//左轮马达负极
const int posL=7;//左轮马达正极
const int pwmR=9;//右轮马达转速控制
const int pwmL=10;//左轮马达转速控制
const int irD1=A1;//左红外 --两个红外间距最好在1.5-2cm
const int irD2=A2;//中
const int irD3=A3;//右
const int Rspeed=200;//转速初值
const int Lspeed=200;
byte IRstatus=0;//红外线循迹模块感应值
void setup()
{
pinMode(posR,OUTPUT);
pinMode(negR,OUTPUT);
pinMode(posL,OUTPUT);
pinMode(negL,OUTPUT);
pinMode(irD1,INPUT_PULLUP); //设置模拟引脚A1为含提升电阻的输入引脚
pinMode(irD2,INPUT_PULLUP);
pinMode(irD3,INPUT_PULLUP);
}
void loop()
{
int val; //输入模拟信号值
IRstatus=0; //清除红外线循迹模块感应值
val=analogRead(irD1);//读取“左L”红外线循迹模块感应值
if(val>=150)//感应到黑色轨道?
IRstatus=(IRstatus+4); //设置感应值位2为1
val=analogRead(irD2);//读取中
if(val>=150)//感应到黑色轨道?
IRstatus=(IRstatus+2); //设置感应值位1为1
val=analogRead(irD3); //读取右
if(val>=150)//感应到黑色轨道?
IRstatus=(IRstatus+1); //设置感应值位0为1
driveMotor(IRstatus); //按IRstatus值设置马达转向及转速
}
//马达转向控制函数
void driveMotor(byte IRstatus)
{
switch(IRstatus)
{
case 0: //LCR=000,白白白
forward(Rspeed,Lspeed);
break;
case 1://001,白白黑
right(1,Rspeed,Lspeed);
break;
case 2:
forward(Rspeed,Lspeed);
break;
case 3:
right(0,Rspeed,Lspeed);
break;
case 4:
left(1,Rspeed,Lspeed);
break;
case 5:
pause(0,0);
break;
case 6:
left(0,Rspeed,Lspeed);
break;
case 7:
pause(0,0);
break;
}
}
//前进
void forward(byte RmotorSpeed, byte LmotorSpeed)
{
analogWrite(pwmR,RmotorSpeed);
analogWrite(pwmL,LmotorSpeed);
digitalWrite(posR,HIGH);
digitalWrite(negR,LOW);
digitalWrite(posL,LOW);
digitalWrite(negL,HIGH);
}
//后退
void back(byte RmotorSpeed, byte LmotorSpeed)
{
analogWrite(pwmR,RmotorSpeed);
analogWrite(pwmL,LmotorSpeed);
digitalWrite(posR,LOW);
digitalWrite(negR,HIGH);
digitalWrite(posL,HIGH);
digitalWrite(negL,LOW);
}
//停止
void pause(byte RmotorSpeed, byte LmotorSpeed)
{
analogWrite(pwmR,RmotorSpeed);
analogWrite(pwmL,LmotorSpeed);
digitalWrite(posR,LOW);
digitalWrite(negR,LOW);
digitalWrite(posL,LOW);
digitalWrite(negL,LOW);
}
//右转
void right(byte flag, byte RmotorSpeed, byte LmotorSpeed)
{
analogWrite(pwmR,RmotorSpeed);
analogWrite(pwmL,LmotorSpeed);
if(flag==1) //fast
{
digitalWrite(posR,LOW);
digitalWrite(negR,HIGH);
digitalWrite(posL,LOW);
digitalWrite(negL,HIGH);
}
else //slow
{
digitalWrite(posR,LOW);
digitalWrite(negR,LOW);
digitalWrite(posL,LOW);
digitalWrite(negL,HIGH);
}
}
左转
void left(byte flag, byte RmotorSpeed, byte LmotorSpeed)
{
analogWrite(pwmR,RmotorSpeed);
analogWrite(pwmL,LmotorSpeed);
if(flag==1) //fast
{
digitalWrite(posR,HIGH);
digitalWrite(negR,LOW);
digitalWrite(posL,HIGH);
digitalWrite(negL,LOW);
}
else //slow
{
digitalWrite(posR,HIGH);
digitalWrite(negR,LOW);
digitalWrite(posL,LOW);
digitalWrite(negL,LOW);
}
}