兩輪自走車是機電整合入門的經典專案,L298N加兩顆TT馬達幾乎是最經濟實惠的組合,這篇把接線邏輯跟常見的方向搞混問題一次講完。
L298N的接線邏輯
L298N可以同時控制兩顆直流馬達的方向跟速度,每顆馬達對應兩支方向控制腳(決定正轉或反轉)跟一支PWM速度控制腳(ENA/ENB)。供電部分要注意:馬達的電源(通常接電池,例如7.4V左右)跟邏輯控制電源(5V,可以從板子上的穩壓輸出或另外供電)是分開的兩組,不要搞混,不然馬達動作會不穩定甚至驅動晶片過熱。
車體組裝時最容易犯的錯
- 左右馬達接反是最常見的狀況——寫程式「前進」結果車子原地打轉,先別急著改程式碼,把兩顆馬達的接線對調試試看,通常就解決了
- TT馬達鎖上輪胎的時候確認左右兩邊鎖緊程度一致,鬆緊不同會導致直走時偏向某一邊,這是機構問題不是電控問題,先排除掉
- 電池供電線材如果太細,馬達啟動瞬間的大電流會造成壓降,車子偶爾會有「啟動遲緩」的現象,線材粗細要跟電流需求匹配
如果你想進一步升級,可以參考前面提到的HC-SR04避障文章,把超音波感測器裝上去做自動避障,或加裝MPU-6050讓轉彎角度更精準,這幾篇文章串起來剛好是一套完整的自走車學習路線。
材料清單(BOM)
| 品項 | 數量 | 備註 |
|---|---|---|
| Arduino UNO R3 開發板 | 1 | 本篇教學使用的開發板 |
| L298N 馬達驅動模組 | 1 | |
| 雙軸 TT馬達 直流減速馬達 | 2 | |
| 電池組 | 1 | 建議7.4V鋰電池或6顆3號電池,依馬達電壓需求自備 |
腳位接線對照表
| 開發板腳位 | 模組腳位 | 說明 |
|---|---|---|
| D5 (PWM) | ENA | 左馬達速度控制 |
| D2 | IN1 | 左馬達方向控制1 |
| D3 | IN2 | 左馬達方向控制2 |
| D6 (PWM) | ENB | 右馬達速度控制 |
| D4 | IN3 | 右馬達方向控制1 |
| D7 | IN4 | 右馬達方向控制2 |
| GND | GND | 共地(邏輯地與馬達電源地務必共地) |
馬達電源另外由電池直接接L298N的電源輸入端子,不要跟Arduino共用同一路電源輸出,避免馬達啟動瞬間大電流拖垮邏輯電壓造成板子重開機。
📷 〔照片預留位:請在這裡插入實際接線/組裝照片〕
完整程式碼
// L298N+TT馬達 兩輪自走車基本移動控制
#define ENA 5
#define IN1 2
#define IN2 3
#define IN3 4
#define IN4 7
#define ENB 6
void setup() {
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void goForward(int speed) {
analogWrite(ENA, speed);
analogWrite(ENB, speed);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void goBackward(int speed) {
analogWrite(ENA, speed);
analogWrite(ENB, speed);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void spinLeft(int speed) {
analogWrite(ENA, speed);
analogWrite(ENB, speed);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void stopCar() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void loop() {
// 如果車子原地打轉,先檢查左右馬達接線有沒有對調(文章提到的常見錯誤)
goForward(200);
delay(2000);
stopCar();
delay(500);
spinLeft(180);
delay(400);
stopCar();
delay(1000);
}
