關於小車的轉動部分,已完成所有的接線,並已撰寫好轉動的測試程式。測試的程序需要包括 前進/後退、左轉/右轉等行進的方向;同時也需要測試轉速部分,可以調整輪胎轉動的速度。

可以先觀賞下我在 Youtube 發佈的影片:

控制小車馬達的行進方向是透過 L298N IN1~IN4 接腳的電位控制;而控制轉速則是將脈衝訊號輸入至 L298N 的 ENA/ENB。
(IN1/IN2/ENA 為馬達A的控制;IN3/IN4/ENB 為馬達B 的控制,一般 L298N 可控制兩顆馬達。)

可以參考如下圖馬達 A 的接腳說明。
L298N EN/IN 接腳說明


所以兩顆馬達共需六條接線 (電源線不算在內),從 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;
  }
}

程式可以正常執行並運轉。不過其實有個小問題:兩顆馬達的實際的轉動速度並不一定相同,雖然給的是相同的脈衝數值。所以這可能需要經過微調,讓實際行進時 (前進/後退),都能維持在一直線的方向。

下一步:繼續把兩個舵機 (伺服馬達)給完全搞定!