原理:红外传感器检测到黑线,红外光被吸收,其对于的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");
}
}