接續上一個L298N的入門範例,現在我們把SR04超音波感測器加上去,讓車子有避障的功能,你的車子就可以在客廳裡自己到處跑起來囉!同樣的是以傑森創工的智慧車套件為例。
購買智慧車套件:
https://www.jmaker.com.tw/products/arduino-car
若對L298N還不了解的人,建議先看看上一篇的教學哦!
L298N入門:
https://blog.jmaker.com.tw/arduino-car-l298n/
SR04超音波模組我們也有教學哦,若想更清楚了解的人,也可以去看看哦!
超音波測距模組HC-SR04快速上手:
https://blog.jmaker.com.tw/sr04/
我們的套件裡有感測器擴展板,可以簡化接線,先把它插到UNO板上,然後接上SR04超音波模組。
HC-SR04有4個腳,除了VCC和GND以外,Trig就是發送訊號,Echo就是接收返回的訊號。然後我們就能利用一發一收,去算出中間的距離了。
VCC接5V,GND接地,Trig接到pin 12,Echo接到pin 13。
L298N的接線就請參考前一篇L298N的教學囉,接線的PIN完全相同,只是這次是接在感測器擴展板上而已。
接著安裝函式庫,這裡用的是最簡單的ErickSimoes/Ultrasonic。
再來就是寫程式囉!程式非常簡單,除了建立Ultrasonic物件,其它L298N的程式和前篇L298N入門完全相同,然後在loop裡我們寫了一段小程式:只要前方障礙物距離在15cm以下,就右轉,不然就一直直走,超簡單的是吧!
當然你也可以做一些自己設計的變化哦!
//本範例用在傑森創工的智慧車套件上。
//讓車子可以利用SR04擁有避障的功能。
//套件購買網址:https://www.jmaker.com.tw/products/arduino-car
//請參考教學內容,要先安裝Ultrasonic函式庫
#include <Ultrasonic.h>
Ultrasonic ultrasonic(12, 13);
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);
}
void loop() {
int dis = ultrasonic.read();
if (dis<15) {
turnRight();
delay(200);
stopMotor();
}else{
forward();
}
}