雖然 BJT 與 MOSFET 都可以用來驅動直流馬達,但是使用 BJT 需要較大的電流才能順利驅動,對電流輸出能力較弱的 Raspberry Pi 來說在很多時候並不是那麼方便與適合。此外, BJT 與 MOSFET 僅能驅動一個直流馬達,當需要驅動兩個以上的馬達時線路會變得複雜很多。在這篇文章中,我將介紹如何利用 ULN2003A 來驅動直流馬達。此外,同樣也將示範如何利用 PWM 機制來控制直流馬達的轉速。

所需元件

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

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

ULN2003A 驅動 IC

ULN2003A 驅動 IC 支援七組達靈頓電路的輸入/輸出,可同時驅動多組直流馬達,也可以用來驅動步進馬達。每一個輸出的最高電流為 500mA,剛好可以滿足 TT減速馬達的需求。

其外觀如下圖所示。這種包裝方式我們之前在利用 MCP3008 作類比數位轉換時已經遇過了,稱為 DIP,可以直接跨在麵包板中間的溝槽上。

ULN2003A

ULN2003A

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

ULN2003A 接腳圖

ULN2003A 接腳圖

上方七對接腳正是七組輸入/輸出用接腳,左方為輸入,右方為輸出。也就是編號 1 (輸入) 對編號 16 (輸出)、編號 2 (輸入) 對編號 15 (輸出)…一直到編號 7 (輸入) 對上編號 10 (輸出)。剩餘兩支接腳,其中編號 8 通常為接地用。而編號 9 稱為共用端,如果用於驅動馬達時應連結馬達電力來源的正極。

還記得嗎?之前在使用 BJT 或 MOSFET 驅動直流馬達時,我們使用了一個反接的二極體 1N4004 以作為保護之用。而這個反接的二極體,正是接在電源正極與輸出訊號之間。ULN2003A 透過這個共用端的接腳,提供內建的保護用二極體,所以在此範例中我們不需要另行使用 1N4004 或類似的二極體。不過因為 ULN2003A 只有一個共用端,所以如果有多個馬達需要驅動,就都必須使用同樣的驅動電壓。

此外,每一組達靈頓電路其實就是將兩個 BJT 串在一起,所以輸入接腳與 Raspberry Pi GPIO 控制腳位之間其實也是需要使用限流電阻的。不過同樣因為 ULN2003A 已經在每個輸入接腳內建了限流電阻,所以我們也不需要另外串接其他的電阻。事實上除了限流電阻外,每一個輸入接腳還有下拉電阻以避免雜訊的影響。

換句話說,使用 ULN2003A 來驅動直流馬達,我們就不再需要另外連結保護用的二極體、限流電阻、下拉電阻等元件,大幅簡化接線的複雜度。

Python 虛擬環境安裝

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

線路圖

Rapsberry Pi 利用 ULN2003A 驅動直流馬達

Rapsberry Pi 利用 ULN2003A 驅動直流馬達

Rapsberry Pi 利用 ULN2003A 驅動直流馬達電路圖

Rapsberry Pi 利用 ULN2003A 驅動直流馬達電路圖

說明如下:

  1. 在這個範例的第二部分中我們將使用硬體式的 PWM 功能,所以控制接腳必須連結至支援硬體 PWM 功能的腳位,這個範例中我們使用實體編號 12 的腳位 (其 BCM 編號為 18)。
  2. 使用外接的四節 AAA 電池盒提供直流馬達所需電壓與電流,可提供約 6V 的電壓。
  3. 圖中 ULN2003A 驅動 IC 的半圓形凹槽在圖片左方,此範例共使用四支接腳:
    ULN2003A 接腳對應關係
    編號 1連結至 Raspberry Pi GPIO 實體編號 12 的腳位
    編號 8接地
    編號 9連結至電池盒的正極
    編號 16連結至馬達的一支接腳
  4. 馬達的一支接腳連結 ULN2003A 編號 16 的接腳,另外一支接腳連結至電池盒的正極。
  5. Raspberry Pi 的實體編號 6 的腳位 (GND) 拉出與電池盒的負極接在一起,形成共地。
  6. 後面的程式代碼與 BJTMOSFET 的範例完全一樣。

程式代碼

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

內容如下

程式說明如下:

  1. 第 1 行引入 GPIO 套件。
  2. 第 4 行定義控制接腳所連結之 Raspberry Pi 腳位,我們連結的是實體編號 12 的腳位,其 BCM 編號為 18。
  3. 第 6 行宣告使用 BCM 編號方式。
  4. 第 8 行宣告控制腳位為輸出模式。
  5. 第 13~18 行依序讓馬達運轉三秒後並暫停三秒。當我們將控制腳位設定為高電位時 (第 14 行),BJT 開關呈現關閉而通電,馬達開始運轉。而當控制腳位設定為低電位時 (第 17 行),BJT 開關呈現開啟的狀態,馬達因為沒有任何電流流經而停止。
  6. 第 22 行確定程式結束後程式中所使用的腳位會回到預設狀態。

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

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

程式代碼2

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

內容如下

程式說明如下:

  1. 第 1 行引入 pigpio 套件,在這個範例中我們將透過這個套件使用 Raspberry Pi 的硬體 PWM 功能。
  2. 第 4 行定義控制接腳所連結之 Raspberry Pi 腳位,我們連結的是實體編號 12 的腳位,其 BCM 編號為 18。
  3. 第 5 行定義 PWM 所使用的頻率。
  4. 第 6 行定義每次改變的工作週期。
  5. 第 8 行宣告 pigpio 控制物件。
  6. 第 13~20 行透過兩個 for 迴圈將馬達控制訊號的工作週期由 0 度逐次增加至 1000000,之後再逐次減少至 0。當工作週期越大時,馬達的轉速也就越高。
  7. 第 24 行確定程式結束後程式中所使用的腳位會回到預設狀態。

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

順利的話,就可以看到馬達開始開始轉動,並且不停地加速、減速。不過實際觀察時我們將發現並不是所有的工作週期都可以使得馬達運作,當工作週期低於 300000 (也就是 30%,hardware_PWM 函式的工作週期參數範圍為 0~1000000) 時就無法順利驅動馬達。

在連續三篇的文章中,我們分別看到如何利用 BJT、MOSFET 或 ULN2003A 驅動 IC 來驅動直流馬達。雖然接線方式各有不同,但是所能達成的功能都是一樣的,程式方面也無所差別。在這幾種方式中,我們可以控制馬達的轉動與否,也可以使用 PWM  機制來控制馬達的轉速。不過很可惜的是,這些接線方式都無法讓直流馬達反轉。在下一篇的文章中,我們將利用 L293D 驅動 IC 來控制直流馬達的轉動方向與速度,敬請期待。

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

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