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);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章