紅外線循線車-以傑森創工智慧車套件為例
Arduino智慧車課程經過L298N入門、超音波避障,這堂課要跟大家聊的是利用紅外線模組,循地上的黑線行進,這個例子要用到的是2個紅外線感測器,來偵測車子是不是跑到黑線外了。
購買智慧車套件:
https://www.jmaker.com.tw/products/arduino-car
先來接線吧!我們的套件裡有感測器擴展板,可以簡化接線,先把它插到UNO板上,然後接2個紅外線模組。
L298N部份的接法和之前一樣,剩下的就是2個紅外線模組了,每個只有3個PIN,分別是VCC、GND和OUT,VCC接5V,GND接GND,OUT就是訊息輸出的PIN,右邊的接到UNO板上的D12,左邊那個接到D13,就搞定了。
若對L298N還不熟的人,建議可以先看入門的教學哦!
L298N入門:
https://blog.jmaker.com.tw/arduino-car-l298n/
接下來就寫程式囉。L298N部份和之前一樣,就不用多說。循線主要是靠左右的紅外線模組,它們會去偵測是不是有黑線,偵測到黑線會傳回HIGH,不然就是傳回LOW。
程式很簡單,在setup()裡設定D12和D13是輸出訊號的PIN腳。在loop()裡寫了一個判斷,當D13偵測到0,也就是LOW,就表示車子跑到黑線外的左側了,這時讓車子右轉,利用delay()去控制轉向的時間,這個可以自行再去調整。
再接著判斷,如果D12偵測到0,就是車子跑到黑線外的右側了,那就讓車子向左邊轉。然後不斷重複即可,程式就完成囉!
//本範例用在傑森創工的智慧車套件上。
//讓車子可以利用左右兩個紅外線感測器讓車子可以循著地上的黑線前進。
//套件購買網址:https://www.jmaker.com.tw/products/arduino-car
//左馬達控制設定
const byte LEFT1 = 8; //IN1
const byte LEFT2 = 9; //IN2
const byte LEFT_PWM = 10;
//右馬達控制設定
const byte RIGHT1 = 7; //IN3
const byte RIGHT2 = 6; //IN4
const byte RIGHT_PWM = 5;
//設定PWM輸出值(代表的是車子的速度)
byte motorspeed = 130;
void forward(){
digitalWrite(LEFT1, HIGH);
digitalWrite(LEFT2, LOW);
analogWrite(LEFT_PWM, motorspeed);
//右輪·因在小車上馬達安装方向左右兩個是相
digitalWrite(RIGHT1, LOW);
digitalWrite (RIGHT2, HIGH);
analogWrite(RIGHT_PWM, motorspeed);
}
void backward(){ //後退
digitalWrite(LEFT1, LOW);
digitalWrite (LEFT2, HIGH);
analogWrite(LEFT_PWM, motorspeed);
digitalWrite(RIGHT1, HIGH);
digitalWrite(RIGHT2, LOW);
analogWrite(RIGHT_PWM, motorspeed);
}
void turnLeft(){//左轉
//左輪不動,右輪動(速度為0)
analogWrite(LEFT_PWM, 0);
digitalWrite(RIGHT1, LOW);
digitalWrite (RIGHT2, HIGH);
analogWrite(RIGHT_PWM, motorspeed);
}
void turnRight(){//右轉
//右輪不動,左輪動(速度為0)
digitalWrite(LEFT1, HIGH);
digitalWrite(LEFT2, LOW);
analogWrite(LEFT_PWM, motorspeed);
analogWrite(RIGHT_PWM, 0);
}
void stopMotor() {
analogWrite(LEFT_PWM, 0);
analogWrite(RIGHT_PWM, 0);
}
void setup(){
//設定每一個PIN的模式
pinMode(LEFT1, OUTPUT);
pinMode(LEFT2, OUTPUT);
pinMode(LEFT_PWM, OUTPUT);
pinMode(RIGHT1, OUTPUT);
pinMode(RIGHT2, OUTPUT);
pinMode(RIGHT_PWM, OUTPUT);
pinMode(12,INPUT); //右側红外線威測器
pinMode(13,INPUT);//左側红外線威測器
}
void loop() {
if (digitalRead(13)==0){
turnRight();
delay(80);
}else if(digitalRead(12)==0){
turnLeft();
delay(80);
}else{
forward();
}
}