在前面幾篇文章中,我們看到了驅動與控制直流馬達的各種方式。在接下來的幾篇文章中,我們要將目標放在步進馬達上。首先介紹的是 ULN2003A 驅動板,並了解如何利用 Raspberry Pi 以及 Python 程式來控制步進馬達的轉動角度、方向以及速度。

所需元件

在這個範例中,我將使用到一個 28BYJ-48 步進馬達以及一個 ULN2003A 驅動板。

28BYJ-48 步進馬達

步進馬達介於直流馬達與伺服馬達之間,可以控制轉動的角度,同時也可以前後連續轉動。步進馬達又可分為單極性 (Unipolar) 與雙極性 (Bipolar) 兩種,驅動時的主要差別在於單極性步進馬達不需要改變電流的方向,但是雙極性步進馬達則需要改變電流的方向。還記得嗎?在驅動直流馬達時我們提到 ULN2003A 跟 L293D 驅動 IC 的主要差別,正是 L293D 具備 H 橋式電路所以可以改變電流的方向,而 ULN2003A 則否。也就是說,ULN2003A 適合用來驅動單極性步進馬達,而 L293D 則適合用來驅動雙極性步進馬達。

單極性步進馬達有 5 支接腳、6 支接腳與 8 支接腳的形式,而範例中使用的 28BYJ-48 步進馬達為 5 支接腳,其中四支接腳用來輸入驅動的電流,而第五支接腳則用來接地,如下圖所示:

28BYJ-48 5V 電壓步進馬達

28BYJ-48 5V 電壓步進馬達

雖然市面上的 28BYJ-48 都是 5 支接腳,但是其實實際的規格仍有很大的差異。其中電壓部分,算是最重要也是最容易辨識的差異。28BYJ-48 包含 5V 與 12V 兩種規格,這次我們使用的是 5V 的 28BYJ-48。

28BYJ-48 與我們之前使用的 TT 減速馬達及 SG-90 伺服馬達一樣都具有減速箱,而減速比則是另一項 28BYJ-48 規格上的差異,一般常見的減速比為 64 或 16。

此外,步進馬達還有所謂的步距角度 (英文是 Stride Angle),也就是步進馬達每移動一步所轉動的角度。舉例來說,如果步距角度是 5.625 度,表示馬達每前進 (或後退) 一步時的轉動角度為  5.625 度。換句話說,馬達轉為一圈需要 360/5.625 = 64 步。不過這是未減速前的數字,如果考慮減速比,以減速比為 1:64 為例,實際轉一圈就需要 64*64 = 4096 步了。

前面提到市面上 28BYJ-48 的實際規格存在著很大的差異,所以以上的數字 (尤其是減速比與步距角度) 並不是全體適用,在實際使用前應該先確認清楚。即使是原本購買時的規格描述,也別全然盡信,因為可能連店家自己都沒搞清楚。如果你需要能夠精準地控制步進馬達,可以考慮改用其他比較高價的步進馬達,減少因為規格差異而造成的問題。

單極性步進馬達驅動方式

前面提到單極性步進馬達有 5 支接腳、6 支接腳、8 支接腳的形式,而 5 支接腳可使用的驅動方式最為單純。簡單來說,就是將 4 支輸入用的接腳輪流由低電位變成高電位進而推動馬達的轉動,如下表所示:

輸入接腳順序一順序二順序三順序四順序五
1高電位低電位低電位低電位高電位
2低電位高電位低電位低電位低電位
3低電位低電位高電位低電位低電位
4低電位低電位低電位高電位低電位

除了一次改變一組輸入接腳的電位外,我們也可以一次同時改變相鄰兩組的電位狀態,如下表所示:

輸入接腳順序一順序二順序三順序四順序五
1高電位低電位低電位高電位高電位
2高電位高電位低電位低電位高電位
3低電位高電位高電位低電位低電位
4低電位低電位高電位高電位低電位

這兩種驅動方式雖然有所不同,但是電位模式都是四個一組不斷地重複,也就是順序五跟順序一一樣、順序六跟順序二一樣…以此類推,所以又被稱為 4 步模式 (4-Step Sequence)。

既然有 4 步模式,是不是還有其他模式?有的,那就是 8 步模式,也就是電位模式是以八個一組進行重複,如下表所示:

輸入接腳順序一順序二順序三順序四順序五順序六順序七順序八順序九
1高電位高電位低電位低電位低電位低電位低電位高電位高電位
2低電位高電位高電位高電位低電位低電位低電位低電位低電位
3低電位低電位低電位高電位高電位高電位低電位低電位低電位
4低電位低電位低電位低電位低電位高電位高電位高電位低電位

如果對轉速或出力沒有特別的要求,這幾種模式其實都是可以正常驅動 28BYJ-48 的。不過有兩點要特別注意:

  • 8 步模式與 4 步模式的每一步移動角度 (也就是步距角度) 是不一樣的 ,而 4 步模式是 8 步模式時的兩倍。舉例來說,如果步距角度為 5.625 度,那麼使用 4 步模式時步距角度就會變成 11.25 度,也就是說轉完一圈僅需 32 步。
  • 如果使用現成的套件來控制步進馬達,需要注意套件使用的是 8 步模式或 4 步模式,以免在控制角度時出現錯誤。

對了,如果想要步進馬達變換轉動的方向,只要把輸入接腳的電位變化順序倒過來就可以了,例如下表即為 4 步模式下反向轉動時的順序

輸入接腳順序一順序二順序三順序四順序五
1高電位低電位低電位低電位高電位
2低電位低電位低電位高電位低電位
3低電位低電位高電位低電位低電位
4低電位高電位低電位低電位低電位

ULN2003A 驅動板

單極性步進馬達需要同時使用四個輸入訊號,所以不適合直接使用 BJT 或 MOSFET 來驅動,而最好使用如 ULN2003A 之類的驅動 IC。ULN2003A 雖然具有七組輸入/輸出,但是一個步進馬達就需要四組,所以每個 ULN2003A 通常用來控制一個步進馬達。儘管如此,將 28BYJ-48 步進馬達與 ULN2003A 進行連結時仍需要花費不少心力,原因在於確認四支接腳的順序並正確接線。如果因為接線錯誤而造成電位變化與預期有所不同,將造成馬達無法正常運作。

市面上有專用的 ULN2003A 驅動板,如下圖所示,可以減少接線錯誤的發生。驅動板上右方的白色插槽剛好與 28BYJ-48 的接腳完全吻合,而且因為有卡榫的設計,所以絕不會插反。IN1~IN4 依序對應四個輸入用的接腳,所以我們只要將控制板的接腳連結至 IN1~IN4 即可。而電源的部分,則連結至下方的 -/+ 兩支接腳即可。這個驅動板另外配置了 4 個 LED 燈,會分別根據 4 支接腳的電位狀態發亮或熄滅,用來確認程式控制輸出訊號是否正常時相當方便。如果我們用 4 步模式進行驅動,控制一次只有一組輸入為高電位,就會看到 LED 燈泡由上而下 (或由下而上) 依序點亮。

ULN2003A 擴展電路板

ULN2003A 擴展電路板

Python 虛擬環境安裝

因為這個範例僅使用 RPi.GPIO 套件,所以準備工作與 在 Raspberry Pi 3 Model B 建立 Python 3.6 環境 一致。如果你還沒有完成相關的準備,請務必先行完成再繼續進行後面的工作。

線路圖

Raspberry Pi 利用 ULN2003A 驅動板控制步進馬達

Raspberry Pi 利用 ULN2003A 驅動板控制步進馬達

Raspberry Pi 利用 ULN2003A 驅動板控制步進馬達

Raspberry Pi 利用 ULN2003A 驅動板控制步進馬達

說明如下:

  1. 28BYJ-48 步進馬達與 ULN2003A 驅動板之間的連接線不需一一確認,直接接在驅動板上的白色插槽即可。
  2. 這個範例直接使用 Raspberry Pi 的 +5V 當作步進馬達的電源。如果擔心驅動能力不足,可以使用外部電源,不過要記得與 Raspberry Pi 仍需共接地線。
  3. ULN2003A  驅動板與 Raspberry Pi 之間共有 6 條接線,連接關係如下:
    ULN2003A 驅動板Raspberry Pi 腳位
    IN1連接至實體編號 11 的腳位 (BCM 編號 17)
    IN2連接至實體編號 12 的腳位 (BCM 編號 18)
    IN3連接至實體編號 13 的腳位 (BCM 編號 27)
    IN4連接至實體編號 15 的腳位 (BCM 編號 22)
    +連接至實體編號 4 的腳位 (+5V)
    連接至實體編號 6 的腳位 (接地)

程式代碼

利用文字編輯器 (如 nano) 新增 Python 程式 28byj48-8steps.py

內容如下

程式說明如下:

  1. 第 3 行引入 GPIO 套件。
  2. 第 5 行宣告使用 BCM 編號方式。
  3. 第 7 行定義每一圈所需的步數。對 28BYJ-48 而言,在 8 步模式下每轉動一圈的步數為 64 x 64 步。
  4. 第 8~15 定義每一個順序的各個控制腳位電位狀態,其中 1 表示為高電位,0 則為低電位。這裡使用兩層的串列 (List),內層的每一個串列  (如 [1, 0, 0, 0]) 表示某個順序下四個控制腳位的狀態,而外層則表示共有 8 個順序的狀態,也就是 8 步模式。
  5. 第 17 行定義由四個控制腳位 BCM 編號組成的串列。使用串列除了可以減少使用的變數,也可以利用迴圈來簡化後續的指令。
  6. 第 18~20 行利用迴圈的方式將四個控制腳位宣告為輸出模式,並設定為低電位。
  7. 第 22 行定義每一個循環由多少的步驟 (順序) 組成。
  8. 第 23 行定義總共有幾個控制用的腳位。
  9. 第 25 行宣告用來記錄目前進行到哪個步驟的變數 – sequence_index。
  10. 第 26 行宣告用來記錄轉動方向的變數 – direction。當 direction 為 1 時表示正向轉動,而 direction 為 -1 時表示反向轉動。
  11. 第 27 行宣告用來記錄目前已移動步數的變數。
  12. 第 29~32 行用來判斷在呼叫程式時是否另外提供參數,可用來控制每一個步驟中間的暫停時間。程式透過這個方式來改變馬達的轉動速度。此參數預設值為 100,表示暫停 100 毫秒,也就是 0.1 秒。
  13. 第 37~38 行利用迴圈將四個控制腳位設定為合適的電位,電位的設定值可由兩層串列中直接取得,也就是 SEQUENCE[sequence_index][pin]。前面提到,SEQUENCE 是一個兩層的串列,第一層表示第幾個順序步驟,所以使用代表步驟的變數 sequnece_index。而第二層則為該步驟中各腳位的電位狀態,所以使用代表腳位的變數 pin。
  14. 第 40~44 行重新計算已經前進的步數。如果往前進而且已經達到一圈所需的步數,則開始往後走,直到回到 0 (也就是回到出發點) 後再次前進。
  15. 第 46~47 行計算下一個應該執行的順序。當正向轉動時, sequence_index 加 1,而反向轉動時則減 1。另外使用取餘數的方式 (%=),以避免 sequence_index 的數值因為不斷增加或減少而超過 0~7 的範圍 (在 8 步模式下總共只有 8 個順序步驟)。
  16. 第 54 行確定程式結束後程式中所使用的腳位會回到預設狀態。

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

順利的話,就可以看到步進馬達以固定速度進行轉動,然後每轉動一圈就變換方向。如果我們執行指令時加上控制暫停時間的參數,如

就可以看到步進馬達使用不同的速度進行轉動。此數字為程式暫停的時間,所以數字越小表示轉動的越快。以上面的例子而言,轉動速度就會比原本還快 (預設為 100)。需要注意的是,當這個數字設定為 0 時 (也就是程式完全沒有暫停) 步進馬達將不會運轉,因為控制接腳的電位變化速度已經超過步進馬達能夠反應的速度了。

程式代碼2

利用文字編輯器 (如 nano) 新增 Python 程式 28byj48-4steps.py

內容如下

程式說明如下:

  1. 這個範例與前一個範例幾乎完全一樣,只是由 8 步模式改為 4 步模式。
  2. 旋轉一圈的所需步數由 64 x 64 變成 32 x 64 (第 7 行)。
  3. 腳位的模式由八個變成四個,每次控制兩個相鄰的腳位成為高電位 (第 8~11 行)。

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

順利的話,可以看到與前一個程式同樣的執行結果,也就是步進馬達以固定速度進行轉動,然後每轉動一圈就變換方向。

在這篇文章中,我們介紹了步進馬達的特性與分類,並且了解到單極性步進馬達的驅動方式與控制模式 (4 步模式或 8 步模式)。而透過現成的 ULN2003A 驅動板,可以大幅簡化 Raspberry Pi 與 28BYJ-48 步進馬達之間的接線與控制方式。在下一篇文章中,我們將利用 L293 來控制雙極性步進馬達,敬請期待。

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

Facebook 留言
Print Friendly, PDF & Email
Summary
Raspberry Pi 3 Model B 利用 ULN2003A 驅動板控制 28BYJ-48 步進馬達
Article Name
Raspberry Pi 3 Model B 利用 ULN2003A 驅動板控制 28BYJ-48 步進馬達
Description
本篇文章將介紹如何利用 Raspberry Pi 以及 Python 程式來控制步進馬達的轉動角度、方向以及速度。
Author
Publisher Name
Everlearn Studio
Publisher Logo