arduino循迹小车实践(多路红传感器)

一、先上图:
在这里插入图片描述
在这里插入图片描述
二、再看视频:
arduino循迹小车实践
三、接线(忽略)
四、代码

#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 = 2;//四路传感器
const int sensor2 = 4;
const int sensor3 = 7;
const int sensor4 = 8;


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);
    pinMode(sensor4,INPUT);
} 

void loop()
{
  tracing();
}
void motorRun(int cmd,int value)//定义函数,两个形参分别:cmd控制方向,value是速度值
{
analogWrite(ENA, value); //设置PWM输出,value设置速度
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()
{
int data[4];
data[0] = digitalRead(sensor1);//读取四个传感器值
data[1] = digitalRead(sensor2);
data[2] = digitalRead(sensor3);
data[3] = digitalRead(sensor4);

if(!data[0] && !data[1] && !data[2] && !data[3]) //左右都没有检测到
{
  motorRun(FORWARD,120);
}

if(data[0] || data[1]) //右边检测到黑线
{
  motorRun(TURNRIGHT,90);
}

if(data[2] || data[3]) //左边检测到黑线
{
  motorRun(TURNLEFT,90);
}

if(data[0] && data[3]) //左右都检测到黑线是停止
{
  motorRun(STOP, 0);
}
}

五、失败经验
传感器距离地面不能太近,20mm比较合适,见下图:
在这里插入图片描述
六、拓展延伸(使用六路传感器)
1、传感器分布图
在这里插入图片描述
2、代码

#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 = 2;//四路传感器
const int sensor2 = 4;
const int sensor3 = 7;
const int sensor4 = 8;
const int sensor5 = 12;
const int sensor6 = 13;

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);
    pinMode(sensor4,INPUT);
    pinMode(sensor5,INPUT);
    pinMode(sensor6,INPUT);
} 

void loop()
{
  tracing();
}
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()
{
int data[6];
data[0] = digitalRead(sensor1);//读取四个传感器值
data[1] = digitalRead(sensor2);
data[2] = digitalRead(sensor3);
data[3] = digitalRead(sensor4);
data[4] = digitalRead(sensor5);
data[5] = digitalRead(sensor6);

if(!data[0] && !data[1] && !data[2] && !data[3] && !data[4] && !data[5]) //左右都没有检测到
{
  motorRun(FORWARD,120);
}

if(data[1] || data[0] || data[4]) //右边检测到黑线
{
  motorRun(TURNRIGHT,90);
}

if(data[2] || data[3] || data[5]) //左边检测到黑线
{
  motorRun(TURNLEFT,90);
}

if(data[4] && data[5]) //左右都检测到黑线是停止
{
  motorRun(STOP, 0);
}
}
  • 34
    点赞
  • 299
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值