Arduino筆記(55):L293D 控制兩個馬達轉向及轉速

前一篇實作Arduino筆記(54):L293D驅動馬達 利用 L293D 來控制風扇馬達,使用線性電阻來控制轉速,這僅是L293D小小的功能之一。要完全控制直流電機,就是控制其速度和旋轉方向。這可以透過以下這兩種技術來完成:
  • PWM :用於控制速度
  • H-Bridge :用於控制旋轉方向

[PWM]

使用PWM(Pulse Width Modulation, 脈衝寬度調製)可以透過改變其輸入電壓來控制直流電機的速度。PWM是一種利用發送一系列ON-OFF的脈衝來調節輸入電壓平均值的技術。以容易懂的言語來說,就是頻繁變更電壓的開關,在固定時間內程式高速切換,電壓被開關很多次,當開的時間長一點時,馬達的速度就會比較快;如果時間內,關的時間長一點,馬達的速度就會比較慢。我們將給予電壓的時間比例稱為佔空比(Duty Cycle)。佔空比越高,施加到直流電動機的平均電壓越高(高速),佔空比越低,施加到直流電動機的平均電壓越低(低速)。例如:燈光的亮度控制、馬達轉速控制、螢幕亮度控制、喇叭大小聲/聲音頻率高低控制等。

[H-Bridge]

H-Bridge,根據維基百科的解釋H-Bridge是一種電子電路,可使其連接的負載或輸出端兩端電壓反相/電流逆向。相信看過上面這句話的解釋,很多人還是不懂什麼是H-Bridge,先用以下的例子來說明,可能比較容易懂些。H-Bridge 以4個開關跟一個馬達為例,連接的方式如下圖:
圖片來源:Wikipedia

當開關S1和S4 (下圖左方) 閉合且S2和S3是打開的,正電壓將依照電流方向使馬達正轉。當S1和S4的開關打開且S2和S3的開關閉合 (下圖右方) ,此電壓是相反的,會使馬達轉向相反。使用這個電路時,開關S1和S2不應該在同一時間被封閉,因為這將導致輸入電壓短路,電流就會從正極穿過兩個電晶體直接回到負極,同樣的S3和S4也不能同時閉合,這種情況被稱為直通 (shoot-through),是有可能燒壞電晶體的。在實際驅動電路中通常要用硬體電路方便地控制電晶體的開關。
 圖片來源:Wikipedia

L293D的接腳 2跟7是控制電流方向,會影響接腳3、6(馬達的接線)的輸出,亦即控制馬達的轉動方向。下表是2,7兩個Input電位高低時,馬達的作動情況。
Input 1Input 1旋轉方向
Low (0)Low (0)馬達停止
High(1)Low (0)正轉
High(0)Low (1)反轉
Low (1)Low (1)馬達停止


[材料]

• 麵包板 x 1
• Arduino UNO R3  x 1
• 直流 5V 馬達 x 2
• L293D IC x 1
• 外接電源變壓器 x 1
• 18650 電池 x 2
• 連接線 x N條

[線路連接與電路圖]

ArduinoL293D IC接腳馬達一馬達二
Pin 31--
Pin 42--
-3-一端
GND4--
-6-另一端
Pin 57--
-8(外接電源+)--
Pin 119--
Pin 1010--
-11一端-
GND12--
-14另一端-
Pin 915--
5V16--
註:外接電源的負極,與 Arduino GND 及 L293D 的 4, 12 一起接地。



[程式碼]

//馬達一
#define M1Pin1 10
#define M1Pin2 9
#define E1Pin 11

//馬達二
#define M2Pin1 5
#define M2Pin2 4
#define E2Pin 3

void setup() {
  pinMode(M1Pin1,OUTPUT);
  pinMode(M1Pin2,OUTPUT);
  pinMode(E1Pin,OUTPUT);

  pinMode(M2Pin1,OUTPUT);
  pinMode(M2Pin2,OUTPUT);
  pinMode(E2Pin,OUTPUT);

  motorstop();
}

void loop() {
  directionControl();
  motorstop();
  delay(2000);
  speedControl();
  motorstop();
  delay(3000);
}

void motorstop()
{
  // 馬達停止
  digitalWrite(M1Pin1, LOW);
  digitalWrite(M1Pin2, LOW);
  digitalWrite(M2Pin1, LOW);
  digitalWrite(M2Pin2, LOW);
}

void directionControl()
{
  // 設定馬達為最大速度,可設定範圍為 0 to 255
  analogWrite(E1Pin, 255);
  analogWrite(E2Pin, 255);

  // 啟動馬達
  digitalWrite(M1Pin1, HIGH);
  digitalWrite(M1Pin2, LOW);
  digitalWrite(M2Pin1, HIGH);
  digitalWrite(M2Pin2, LOW);
  delay(2000);
  
  // 改變轉動方向
  digitalWrite(M1Pin1, LOW);
  digitalWrite(M1Pin2, HIGH);
  digitalWrite(M2Pin1, LOW);
  digitalWrite(M2Pin2, HIGH);
  delay(2000);
}

// 控制馬達速度
void speedControl()
{
  // 啟動馬達
  digitalWrite(M1Pin1, LOW);
  digitalWrite(M1Pin2, HIGH);
  digitalWrite(M2Pin1, LOW);
  digitalWrite(M2Pin2, HIGH);
  
  // 加速 從最小到最大
  for (int i = 0; i < 256; i++)
  {
    analogWrite(E1Pin, i);
    analogWrite(E2Pin, i);
    delay(20);
  }
  
  // 減速 從最大到最小
  for (int i = 255; i >= 0; --i)
  {
    analogWrite(E1Pin, i);
    analogWrite(E2Pin, i);
    delay(20);
  }
}

[實作結果]


[參考資料]

● Wikipedia:H-Bridge
● Lastminuteengineers:Interface L298N DC Motor Driver Module with Arduino

2 留言

  1. 如果要把L293D IC改成按鈕,要如何做電路,求解

    回覆刪除
  2. 請問可以讓它i遞減的速度更快嗎

    回覆刪除

張貼留言

較新的 較舊