原理:红外传感器检测到黑线,红外光被吸收,其对于的led将不亮。反之无黑线,红外光被反射接收,点亮led。

源代码是我借鉴他人加以修改的,代码也很简单,缺点就是跑不快,一旦快了容易冲出巡线轨迹。

#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4

const int L298pin1 = 5; // 控制左右两个电机
const int L298pin2 = 6;
const int L298pin3 = 9;
const int L298pin4 = 10;

const int ENA = 3;//控制PWM
const int ENB = 11;

const int sensor1 = 4;//四路传感器
const int sensor2 = 7;
const int sensor3 = 8;

//
int sl;
int sm;
int sr;


void setup() 
{ 
    Serial.begin(9600); 
    pinMode(L298pin1,OUTPUT);
    pinMode(L298pin2,OUTPUT);
    pinMode(L298pin3,OUTPUT);
    pinMode(L298pin4,OUTPUT);
    
    pinMode(ENA,OUTPUT);
    pinMode(ENB,OUTPUT);
    
    pinMode(sensor1,INPUT);
    pinMode(sensor2,INPUT);
    pinMode(sensor3,INPUT);
   
} 

void loop()
{
  tracing();
  //motorRun(FORWARD,40);    
}
void motorRun(int cmd,int value)//定义函,两个形。cmd控制方,value是速度值
{
analogWrite(ENA, value); //设置PWM输出,即设置速度
analogWrite(ENB, value);
switch(cmd){
case FORWARD:
  digitalWrite(L298pin1,HIGH);
  digitalWrite(L298pin2,LOW);
  digitalWrite(L298pin3,HIGH);
  digitalWrite(L298pin4,LOW);
break;
case BACKWARD:
  digitalWrite(L298pin1,LOW);
  digitalWrite(L298pin2,HIGH);
  digitalWrite(L298pin3,LOW);
  digitalWrite(L298pin4,HIGH);
break;
case TURNLEFT:
  digitalWrite(L298pin1,LOW);
  digitalWrite(L298pin2,HIGH);
  digitalWrite(L298pin3,HIGH);
  digitalWrite(L298pin4,LOW);
break;
case TURNRIGHT:
  digitalWrite(L298pin1,HIGH);
  digitalWrite(L298pin2,LOW);
  digitalWrite(L298pin3,LOW);
  digitalWrite(L298pin4,HIGH);
break;
default:
  digitalWrite(L298pin1,LOW);
  digitalWrite(L298pin2,LOW);
  digitalWrite(L298pin3,LOW);
  digitalWrite(L298pin4,LOW);
}
}

void tracing()
{

    sl = digitalRead(sensor1);//读取传感器值,黑线不亮,值为1。
    sm = digitalRead(sensor2);//
    sr = digitalRead(sensor3);


    if(sl==0 && sr==0 && sm==1) //左右无,直行
    {
      motorRun(FORWARD,60);
      Serial.println("F1");
    }
    else if(sl==0 && sr==1 && sm==1) //左无,中右间有
    {
      motorRun(FORWARD,60);
      Serial.println("F2");
    }
    else if(sl==1 && sr==0 && sm==1) //右无,中左间有
    {
      motorRun(FORWARD,60);
      Serial.println("F3");
    }

    else if(sl==0 && sr==1 &&sm==0) //右边检测到黑线,右转
    {
      motorRun(TURNRIGHT,80);
      Serial.println("R");
        
    }

    else if(sl==1 && sr==0 && sm==0) //左边检测到黑线,左转
    {
      motorRun(TURNLEFT,80);
      Serial.println("L");
    
    }
    else if(sl==0 && sr==0 && sm==0) //没有检测到,直行
    {
      motorRun(FORWARD,50);
      Serial.println("f1");  
    }
    else if(sl==1 && sr==1 && sm==1) //都检测到,直行
    {
      motorRun(FORWARD,50);
      Serial.println("f2");  
    }

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐