前一篇實作Arduino筆記(54):L293D驅動馬達 利用 L293D 來控制風扇馬達,使用線性電阻來控制轉速,這僅是L293D小小的功能之一。要完全控制直流電機,就是控制其速度和旋轉方向。這可以透過以下這兩種技術來完成:
當開關S1和S4 (下圖左方) 閉合且S2和S3是打開的,正電壓將依照電流方向使馬達正轉。當S1和S4的開關打開且S2和S3的開關閉合 (下圖右方) ,此電壓是相反的,會使馬達轉向相反。使用這個電路時,開關S1和S2不應該在同一時間被封閉,因為這將導致輸入電壓短路,電流就會從正極穿過兩個電晶體直接回到負極,同樣的S3和S4也不能同時閉合,這種情況被稱為直通 (shoot-through),是有可能燒壞電晶體的。在實際驅動電路中通常要用硬體電路方便地控制電晶體的開關。
L293D的接腳 2跟7是控制電流方向,會影響接腳3、6(馬達的接線)的輸出,亦即控制馬達的轉動方向。下表是2,7兩個Input電位高低時,馬達的作動情況。
• Arduino UNO R3 x 1
• 直流 5V 馬達 x 2
• L293D IC x 1
• 外接電源變壓器 x 1
• 18650 電池 x 2
• 連接線 x N條
註:外接電源的負極,與 Arduino GND 及 L293D 的 4, 12 一起接地。
● Lastminuteengineers:Interface L298N DC Motor Driver Module with Arduino
- 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 1 | Input 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條
[線路連接與電路圖]
Arduino | L293D IC接腳 | 馬達一 | 馬達二 |
---|---|---|---|
Pin 3 | 1 | - | - |
Pin 4 | 2 | - | - |
- | 3 | - | 一端 |
GND | 4 | - | - |
- | 6 | - | 另一端 |
Pin 5 | 7 | - | - |
- | 8(外接電源+) | - | - |
Pin 11 | 9 | - | - |
Pin 10 | 10 | - | - |
- | 11 | 一端 | - |
GND | 12 | - | - |
- | 14 | 另一端 | - |
Pin 9 | 15 | - | - |
5V | 16 | - | - |
[程式碼]
//馬達一 #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
如果要把L293D IC改成按鈕,要如何做電路,求解
回覆刪除請問可以讓它i遞減的速度更快嗎
回覆刪除張貼留言