L298N入門-以傑森創工的智慧車套件為例
購買智慧車套件:
https://www.jmaker.com.tw/products/arduino-car
這個系列的範例主要是針對我們銷售的智慧車套件,當然你也可以用在自行搭配的套件上,但可能在電池盒的接線要注意一下。
Arduino無法直接控制馬達的運作,要讓車子乖乖依照指令前進後退轉彎,最重要就是必須了解馬達驅動板的應用,而馬達驅動板有很多選擇,但最受歡迎的就是L298N。
對初學者來說,L298N的接線還蠻多的,而且控制馬達的正反轉有一定的規則,傑森建議慢慢來,一條條接,只要照接線圖,問題也是不大的。
先來講講L298N如何控制馬達正反轉的,板子上有IN1、IN2、IN3、IN4,4個PIN腳,就是經由這4個PIN的調整來決定2顆馬達的正反轉。
這4個PIN的訊號規則如表:
而在這5個PIN的兩側的兩個PIN,則是控制兩個馬達的速度。
ENA:以PWM控制A馬達的速度
ENB:以PWM控制B馬達的速度
要注意的是這兩個PIN出廠時上面有插了Jumper,要把它拔掉才能插杜邦線哦!
透過這6個PIN,我們就可以控制馬達的正反轉、還有它的速度了!
接著我們就把線都接好吧,因為要供電給馬達,所以勢必要加外部電源,以智慧車來說,大多是用電池盒。這裡以傑森創工的智慧車套件為例,我們提供的是6節的3號電池的電池盒,可以提供約9V的電,而且我們的電池盒除了紅黑線,還有DC接頭,所以可以同時供電給L298N和UNO板,這樣會讓接線變得簡單!
以下是所有PIN腳的接線:
IN1 >> PIN8
IN2 >> PIN9
INA >> PIN10
IN3 >> PIN7
IN4 >> PIN6
電池盒紅線 >> +12V PIN
電池盒黑線 >> GND
電池盒DC接頭 >> 接UNO的DC座
然後兩顆馬達也一併接上。
請注意:如果你用的是4節的電池盒,這時就要從L298N供電給UNO哦,會多兩條線要接:L298N的5V接到UNO的5V,L298N的GND接到UNO板的GND。
接下來就可以寫程式囉!
這個範例我們先進行各PIN腳的設定,接著寫出5個副程式:前進forward()、後退backward()、左轉turnLeft()、右轉turnReft(),以及停止stopMotor()。
然後在loop裡重複前進2秒、後退2秒、右轉2秒、左轉2秒,然後停住2秒。
程式不難,主要是對於IN1~IN4的控制,只要弄懂了其實很簡單的!
//本範例適合初學L298N的人
//在小車裝好後,可用本程式先測試所有線路是否都接正確
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() {
forward();
delay(2000); //前進2秒
backward();
delay(2000); //後退2秒
turnRight();
delay(2000); //右轉2秒
turnLeft();
delay(2000); //左轉2秒
stopMotor();
delay(2000); //停止2秒
}