關於小車的轉動部分,已完成所有的接線,並已撰寫好轉動的測試程式。測試的程序需要包括 前進/後退、左轉/右轉等行進的方向;同時也需要測試轉速部分,可以調整輪胎轉動的速度。
可以先觀賞下我在 Youtube 發佈的影片:
控制小車馬達的行進方向是透過 L298N IN1~IN4 接腳的電位控制;而控制轉速則是將脈衝訊號輸入至 L298N 的 ENA/ENB。
(IN1/IN2/ENA 為馬達A的控制;IN3/IN4/ENB 為馬達B 的控制,一般 L298N 可控制兩顆馬達。)
可以參考如下圖馬達 A 的接腳說明。
所以兩顆馬達共需六條接線 (電源線不算在內),從 L298N 再連接到 Arduino UNO 的數位腳位。
大概注意下,一般 UNO 的腳位 1與2 會保留著,作為序列埠的傳輸 (RX/TX);然後腳位前有標示 ~ 符號 (3,5,6,9,10,11) 的可以為 PWM (pulse width modulation),也就是說可以利用脈衝訊號來模擬如類別訊號的電位區段的高低。
所以,考量到電源線與連接的位置,我把 右輪馬達A 的 IN1/IN2/ENA 接腳連接到 UNO 的 3,4,5 腳位 (接腳5 可以控制PWM);左輪馬達B 的 IN3/IN4/ENB 接腳連接到 UNO 的 7,8,6 (接腳6 可以控制PWM)。
我的測試程序很簡單,就是讓兩顆輪胎可以往前、往後、左轉、右轉每個方向都轉動一次;然後暫停個6秒時間再加速重新再跑過一次;當轉速超過限制值 (最大可以為 255)則重新再回到預設值。
參考底下的 Arduino 測試程式 (主要的說明都已直接寫在程式的註解內):
/* 這個範例讓小車每5秒換一次方向 (前進/後退;左轉/右轉,每次換方向就加速)。 */ // 右輪馬達-A const byte IN1 = 3; // 馬達A 的正反轉接腳編號 const byte IN2 = 4; const byte ENA = 5; // 馬達A 的 PWM 轉速控制 // 左輪馬達-B const byte IN3 = 7; // 馬達B 的正反轉接腳編號 const byte IN4 = 8; const byte ENB = 6; // 馬達B 的 PWM 轉速控制 int speed; // 定義速度變數,PWM 輸出範圍為 0~255 void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENA, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(ENB, OUTPUT); speed = 100; //初始化速度 } void forward() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void backward() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void turnLeft() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } void turnRight() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void stop() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } void loop() { analogWrite(ENA, speed); //輸出 PWM 脈衝到 ENA analogWrite(ENB, speed); //輸出 PWM 脈衝到 ENB forward(); // 前進 delay(5000); // 延時5秒 backward(); // 後退 delay(5000); // 延時5秒 turnLeft(); // 左轉 delay(5000); // 延時5秒 turnRight(); // 右轉 delay(5000); // 延時5秒 stop(); delay(6000); // 延時6秒 speed += 40; // 加速 if (speed >= 240) { // 速度超過 240 則回到預設值(100) speed = 100; } } |
程式可以正常執行並運轉。不過其實有個小問題:兩顆馬達的實際的轉動速度並不一定相同,雖然給的是相同的脈衝數值。所以這可能需要經過微調,讓實際行進時 (前進/後退),都能維持在一直線的方向。
下一步:繼續把兩個舵機 (伺服馬達)給完全搞定!
請問你ena 與 enb是如何接的呢?
謝謝回覆
請查 Google~
我只有在我那時組裝的時候才會記得。
就是馬達囉~
想請問一下你輪子的部分(包括那個黃色的東西)是什麼呢?