在前一篇文章中,我們看到了使用 ULN2003A 來驅動直流馬達時比起使用 BJT 或 MOSFET 時的接線簡化許多,而且可以同時驅動多組馬達。不過 ULN2003A 無法改變馬達旋轉的方向,所以在某些應用上會依舊會變得不是那麼適合。在這篇文章中,我將介紹如何利用 L293D 來驅動直流馬達,並達到前後兩個相反方向的轉動。此外,同樣也將示範如何利用 PWM 機制來控制直流馬達的轉速。

所需元件

在這個範例中,我將使用到一個 L293D 驅動 IC 以及一個減速比為 1:48 的 TT 減速馬達。

有關 TT 減速馬達的介紹,請參考之前的文章

L293D 驅動 IC

L293D 與 ULN2003A 一樣內部都使用了達靈頓電路,因此適合直接使用 GPIO 控制腳位來進行控制。 L293D 具備四組靈頓電路的輸入/輸出,不過兩兩成對,所以通常是用來驅動兩個直流馬達或一個步進馬達。每一個輸出的最高電流為 600mA,可以滿足 TT 減速馬達的需求。

其外觀如下圖所示。同樣屬於 DIP 的包裝方式,可以直接跨在麵包板中間的溝槽上。

L293D

L293D

L293D 兩側各有 8 支接腳,合計 16 支接腳,線路圖如下 (此圖半圓形凹槽的蜈蚣頭朝上,與外觀圖中凹槽朝下方向相反):

L293D 接腳圖

L293D 接腳圖

將 L293D 分為左右兩側,兩側接腳的功能幾乎一樣,可以各自用來控制一個直流馬達。其中四組達靈頓電路輸入/輸出分別為 In1 /Out1 (編號 2 與 3)、In2/Out2 (編號7 與 6)、In3/Out3 (編號 10 與 11)、以及 In4/Out4 (編號 15 與 14)。而編號 4、5、12、13 都為接地之用。其實這四支接腳內部是接在一起的,所以我們只要把其中任何一支接腳接地即可。不過如果擔心有電流過大與過熱的問題,可以同時使用四支接腳並透過焊接點或散熱裝置來增加散熱的效果。

Enable 1 (編號 1) 則是用來開啟左側兩組輸入/輸出的控制訊號。當 Enable 1 為高電位時,In1/Out1 與 In2/Out2 才會有作用。而當 Enable 1 為低電位時,則 In1/Out1 與  In2/Out2 將不會有任何的作用。Enable 2 (編號 9) 的功能一樣,只不過控制的是右側兩組輸入/輸出,也就是 In3/Out3 與 In4/Out4。有些資料將 Enable 1 標示為 1,2EN,Enable 2 標示為 3,4EN,這只是標示上的不同,實際上功能是完全一樣的。

剩下的兩支接腳,分別標示為 +Vmotor (編號 8) 與 +V (編號 16)。其中 +Vmotor 用來提供馬達所需的電源,所以需連結至馬達電源的正極。而 +V 則用來提供  L293D 本身所需的電源,通常連結至 Raspberry Pi (或其他微控制板) 的 +5V 電源即可。

L239D 同樣具備保護用的二極體,所以不需另行準備。要特別注意的是 L293D 系列另有 L293 這個型號,可以提供到 1A 的電流,但是卻沒有內建保護用的二極體,所以必須另行準備保護用的二極體以策安全。

換句話說,使用 L293D 來驅動直流馬達跟使用 ULN2003A 一樣具有簡化線路的好處,我們不再需要另外連結保護用的二極體、電阻等元件,大幅簡化接線的複雜度。

Python 虛擬環境安裝

因為這個範例第二部分一樣需要支援硬體 PWM 功能的 pigpio 模組,所以準備工作與 在 Raspberry Pi 3 Model B 利用硬體 PWM 控制 LED 亮度 一致。如果你還沒有完成相關的準備,請務必先行完成再繼續進行後面的工作。

線路圖

Raspberry Pi 利用 L293D 驅動直流馬達

Raspberry Pi 利用 L293D 驅動直流馬達

Raspberry Pi 利用 L293D 驅動直流馬達電路圖

Raspberry Pi 利用 L293D 驅動直流馬達電路圖

說明如下:

  1. 在這個範例的第二部分中我們將使用硬體式的 PWM 功能,所以兩支控制接腳都必須連結至支援硬體 PWM 功能的腳位,這個範例中我們使用實體編號 12  (其 BCM 編號為 18) 以及實體編號 32 (其 BCM 編號為 12) 的兩個控制腳位。
  2. 使用外接的四節 AAA 電池盒提供直流馬達所需電壓與電流,可提供約 6V 的電壓。
  3. 圖中 L293D 驅動 IC 的半圓形凹槽在圖片左方,此範例共使用九支接腳:
    L293D 接腳編號L293D 接腳名稱對應關係
    編號 1Enable 1連結至 Raspberry Pi GPIO 實體編號 4 的腳位 (+5V)
    編號 2In 1連結至 Raspberry Pi GPIO 實體編號 12 的腳位 (BCM 編號 18)
    編號 3Out 1連結至馬達的一端接腳
    編號 40V連結至 Raspberry Pi GPIO 實體編號 6 的腳位 (接地)
    編號 50V連結至 Raspberry Pi GPIO 實體編號 6 的腳位 (接地)
    編號 6Out 2連結至馬達的另一端接腳
    編號 7In 2連結至 Raspberry Pi GPIO 實體編號 32 的腳位 (BCM 編號 12)
    編號 8+Vmotor連結至電池盒的正極
    編號 16+V連結至 Raspberry Pi GPIO 實體編號 4 的腳位 (+5V)
  4. 我們使用左側的接腳來控制 TT 減速馬達,如果需要驅動第二顆直流馬達時可使用右側的接腳。
  5. 馬達的一支接腳連結 L293D 編號 3 的接腳,另外一支接腳連結至 L293D 編號 6 的接腳。兩支接腳的電位與馬達旋轉狀態關係如下:
    Out 1 電位Out 2 電位馬達狀態
    馬達靜止不動
    馬達轉動
    馬達靜止不動
    馬達以反方向轉動

    換句話說,只有當 Out 1 與 Out 2 兩支接腳電位不同時馬達才會轉動,而轉動的方向則與哪支接腳處於高電位有關。如果兩支接腳處於同一種電位,馬達就會靜止不動。

  6. 在這個範例中我將 Enable 1 接至 +5V 的輸出,表示 In1/Out1 與 In2/Out2 將一直處於有效的狀態。而當我們想要控制馬達的轉速時,直接使用控制接腳送出合適的 PWM 訊號即可。舉例來說,當我們將 Out 2 固定在低電位並對 Out 1 送出 PWM 訊號時,則當工作週期越高,表示 Out 1 高電位的時間比例就越多,馬達的轉速就越高。同樣的,將 Out 1 固定在低電位並對 Out 2 送出 PWM 訊號時也是一樣的情形,只是馬達會改變旋轉的方向。
  7. 除了這種接法之外,我們也可以把 Enable 1 接至控制接腳,然後對 Enable 1 送出 PWM 訊號以達到控制轉速的目的。如果是後面這種接法,In 1 與 In 2 就不需要 PWM 訊號了。僅管將 Enable 1 調整為低電位也可以使得馬達停止轉動,不過跟將 In 1 / In 2 設定為同一種電位時的停止轉動仍有些微的差距,L293D 的文件上提到後面這種停止方式會比較快速。
  8. Raspberry Pi 的實體編號 6 的腳位 (GND) 拉出與電池盒的負極接在一起,形成共地。

程式代碼

利用文字編輯器 (如 nano) 新增 Python 程式 dc_motor_l293d.py

內容如下

程式說明如下:

  1. 第 1 行引入 GPIO 套件。
  2. 第 4~5 行定義控制接腳所連結之 Raspberry Pi 腳位,兩支控制接腳連結的是實體編號 12 (其 BCM 編號為 18) 以及實體編號 32 (其 BCM 編號為 12) 的腳位。
  3. 第 7 行宣告使用 BCM 編號方式。
  4. 第 9~10 行宣告控制腳位為輸出模式。
  5. 第 15~30 行依序讓馬達運轉三秒、暫停三秒、反向運轉三秒、暫停三秒。當我們將兩支控制腳位分別設定為高/低電位時 (第 16、17 行),馬達因通電而開始運轉。而當兩支控制腳位都設定為低電位時 (第 20、21 行),馬達則因為沒有任何電流流經而停止。此外,當我們將兩支控制腳位分別設定為低/高電位時 (第 24、25 行),馬達通電並反向運轉。而當兩支控制腳位都設定為高電位時 (第 28、29 行),馬達則同樣因為沒有任何電流流經而停止。
  6. 第 34 行確定程式結束後程式中所使用的腳位會回到預設狀態。

程式完成後,輸入下列指令執行程式

順利的話,就可以看到馬達不斷重複運轉三秒、暫停三秒、反向運轉三秒、暫停三秒的動作,直到我們按下 Ctrl-C 中斷程式。

程式代碼2

利用文字編輯器 (如 nano) 新增 Python 程式 hardware_pwm_dc_motor_l293d.py

內容如下

程式說明如下:

  1. 第 1 行引入 pigpio 套件,在這個範例中我們將透過這個套件使用 Raspberry Pi 的硬體 PWM 功能。
  2. 第 4~5 行定義控制接腳所連結之 Raspberry Pi 腳位,兩支控制接腳連結的是實體編號 12 (其 BCM 編號為 18) 以及實體編號 32 (其 BCM 編號為 12) 的腳位。
  3. 第 6 行定義 PWM 所使用的頻率。
  4. 第 7 行定義每次改變的工作週期。
  5. 第 9 行宣告 pigpio 控制物件。
  6. 第 14~33 行透過四個 for 迴圈輪流將馬達的兩個控制訊號的工作週期由 0 度逐次增加至 1000000,之後再逐次減少至 0。前面提到,當我們將 Out 2 固定在低電位時 (第 15 行),Out 1 接腳的 PWM 訊號工作週期越大則馬達的轉速就越快 (第 16~23 行)。同樣地,當我們將 Out 1 固定在低電位時 (第 25 行),Out 2 接腳的 PWM 訊號工作週期越大則馬達的轉速也越快 (第 26~33 行)。
  7. 第 37~38 行確定程式結束後程式中所使用的腳位會回到輸入狀態。

程式完成後,輸入下列指令執行程式

順利的話,就可以看到馬達開始轉動,並且不斷地加速、減速,然後反向加速、減速。不過實際觀察時我們將發現並不是所有的工作週期都可以使得馬達運作,當工作週期過低時就無法順利驅動馬達。

在連續幾篇的文章中,我們分別看到如何利用 BJT、MOSFET、ULN2003A 或 L293D 來驅動直流馬達。每種驅動方式都有其優缺點,需要注意的地方也各有不同。有關直流馬達的驅動在此將先告一段落,在下一篇的文章中,我將介紹如何使用 ULN2003A  來驅動步進馬達,敬請期待。

如果對文章的內容有任何疑問或建議,歡迎與我聯絡。

Facebook 留言
Print Friendly, PDF & Email
Summary
Raspberry Pi 3 Model B 利用 L293D 驅動直流馬達
Article Name
Raspberry Pi 3 Model B 利用 L293D 驅動直流馬達
Description
在這篇文章中,我將介紹如何利用 L293D 來驅動直流馬達,並達到前後兩個相反方向的轉動。此外,同樣也將示範如何利用 PWM 機制來控制直流馬達的轉速。
Author
Publisher Name
Everlearn Studio
Publisher Logo