用Arduino制作红外线循迹自动机器人

功能说明:
让红外线循迹自动机器人能够自动行进在预先规划的黑色轨道上。请按购实际情况调整自动机器人的行进速度,以免车速过快而冲出轨道。般地面负色都不是与黑色轨道对比强烈的白色,会降低红外线的反射率,使低基准电位输出电压过高。可以利用调整比较电压值来提高感应的灵敏度,以免产生误动作。
如果使用三线式红外线模块或四线式红外线模块的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);        
    }  
} 
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值