gpiozero 函式庫簡化了 Raspberry Pi GPIO 埠的控制,讓 Python 開發者更容易操作硬體。本文將著重於使用 gpiozero 控制直流電機和步進電機,包含程式碼範例和電路圖解說。對於直流電機,我們可以直接使用 Motor 類別控制方向和速度。而步進電機則需要結合 ULN2803 驅動器晶片,透過控制多個線圈來實作精確的步進控制。我們也會探討步進電機的工作原理,包含如何設定步進序列以及控制線圈的極性。此外,文章還會介紹 L293D H-Bridge 驅動晶片的使用方法,及其在控制雙極性步進電機方面的優缺點,提供更全面的電機控制方案。
使用 gpiozero 控制直流電機和步進電機
在本文中,我們將探討如何使用 gpiozero 函式庫來控制直流電機和步進電機。gpiozero 是一個 Python 函式庫,提供了一個簡單的方式來控制 Raspberry Pi 的 GPIO 埠。
控制直流電機
要控制直流電機,我們可以使用 gpiozero 的 Motor
類別。這個類別提供了一個簡單的方式來控制電機的方向和速度。
from gpiozero import Motor
motor = Motor(forward=18, backward=23, pwm=False)
在這個範例中,我們建立了一個 Motor
物件,指定了前進和後退的 GPIO 埠。pwm
引數設定為 False
,表示我們不使用 PWM(脈寬調變)來控制電機的速度。
控制步進電機
要控制步進電機,我們可以使用 gpiozero 的 Motor
類別,結合 ULN2803 Darlington 驅動器晶片。
from gpiozero import Motor
coil1 = Motor(forward=18, backward=23, pwm=False)
coil2 = Motor(forward=24, backward=17, pwm=False)
在這個範例中,我們建立了兩個 Motor
物件,指定了前進和後退的 GPIO 埠。pwm
引數設定為 False
,表示我們不使用 PWM 來控制電機的速度。
使用 ULN2803 驅動器晶片
ULN2803 是一個 Darlington 驅動器晶片,可以用來控制步進電機。這個晶片可以提供高電流的驅動能力,適合用於控制大型步進電機。
flowchart TD A[GPIO 埠] --> B[ULN2803 驅動器晶片] B --> C[步進電機]
在這個範例中,我們使用 ULN2803 驅動器晶片來控制步進電機。GPIO 埠的訊號被送到 ULN2803 驅動器晶片,然後驅動器晶片控制步進電機的方向和速度。
圖表翻譯:
此圖表展示了使用 ULN2803 驅動器晶片來控制步進電機的流程。GPIO 埠的訊號被送到 ULN2803 驅動器晶片,然後驅動器晶片控制步進電機的方向和速度。
程式碼解說
以下是使用 gpiozero 函式庫來控制直流電機和步進電機的程式碼:
from gpiozero import Motor
import time
motor = Motor(forward=18, backward=23, pwm=False)
while True:
motor.forward()
time.sleep(1)
motor.backward()
time.sleep(1)
在這個範例中,我們建立了一個 Motor
物件,指定了前進和後退的 GPIO 埠。然後,我們使用 while
迴圈來控制電機的方向和速度。
內容解密:
此程式碼使用 gpiozero 函式庫來控制直流電機和步進電機。Motor
類別提供了一個簡單的方式來控制電機的方向和速度。forward
和 backward
方法用來控制電機的方向,而 time.sleep
函式用來控制電機的速度。
步進馬達控制:向前和向後移動
在控制步進馬達的移動方向時,我們需要根據馬達的結構和驅動邏輯來設計相應的序列。下面,我們將實作向前和向後移動的功能。
向前移動序列
向前移動的序列通常是按照一個特定的順序啟動馬達的各個繞組。這個順序決定了馬達的旋轉方向。假設我們有一個步進馬達,其向前移動的序列為 ['FF', 'BF', 'BB', 'FB']
,這代表著不同繞組的啟動順序。
向後移動序列
要實作向後移動,只需將向前移動的序列反轉即可。因此,向後移動的序列為 ['FB', 'BB', 'BF', 'FF']
。
實作向前和向後移動的函式
以下是實作向前和向後移動的Python函式示例:
import time
# 定義向前和向後移動的序列
forward_seq = ['FF', 'BF', 'BB', 'FB']
reverse_seq = forward_seq[::-1] # 反轉列表以得到向後移動的序列
def set_step(step):
"""
設定馬達的步進狀態。
:param step: 步進狀態,例如 'FF'、'BF' 等。
"""
if step == 'S':
# 停止馬達
coil1.stop()
coil2.stop()
else:
# 根據步進狀態啟動相應的繞組
# 這裡需要根據實際的硬體連線情況進行修改
pass
def forward(delay, steps):
"""
向前移動。
:param delay: 每一步之間的延遲時間。
:param steps: 移動的步數。
"""
for _ in range(steps):
for step in forward_seq:
set_step(step)
time.sleep(delay)
def backwards(delay, steps):
"""
向後移動。
:param delay: 每一步之間的延遲時間。
:param steps: 移動的步數。
"""
for _ in range(steps):
for step in reverse_seq:
set_step(step)
time.sleep(delay)
使用示例
# 向前移動 100 步,每步延遲 0.01 秒
forward(0.01, 100)
# 向後移動 50 步,每步延遲 0.02 秒
backwards(0.02, 50)
圖表翻譯:
flowchart TD A[開始] --> B[設定步進狀態] B --> C[延遲] C --> D[下一步] D --> E[結束]
上述流程圖描述了步進馬達控制的基本流程:設定步進狀態、延遲一段時間、然後進行下一步,直到結束。這個流程在向前和向後移動的函式中都被使用。
步進電機控制程式
if step[0] == 'F':
# 啟動第一個線圈向前轉
coil1.forward()
else:
# 啟動第一個線圈向後轉
coil1.backward()
if step[1] == 'F':
# 啟動第二個線圈向前轉
coil2.forward()
else:
# 啟動第二個線圈向後轉
coil2.backward()
內容解密:
上述程式碼負責控制步進電機的轉動方向。step[0]
和 step[1]
分別代表兩個線圈的轉動方向,‘F’ 代表向前轉,其他值則代表向後轉。根據這些值,程式碼分別呼叫 coil1.forward()
、coil1.backward()
、coil2.forward()
和 coil2.backward()
函式來控制線圈的轉動。
主程式迴圈
while True:
# 設定步進電機的步驟模式
set_step('S')
# 輸入延遲時間(毫秒)
delay = input("延遲時間(毫秒)?")
# 輸入向前轉的步數
steps = input("向前轉的步數?")
# 呼叫向前轉函式
forward(int(delay) / 1000.0, int(steps))
# 設定步進電機的步驟模式
set_step('S')
# 輸入向後轉的步數
steps = input("向後轉的步數?")
# 呼叫向後轉函式
backwards(int(delay) / 1000.0, int(steps))
內容解密:
這個迴圈程式負責控制步進電機的轉動。它先設定步進電機的步驟模式為 ‘S’,然後輸入延遲時間和向前轉的步數,呼叫 forward()
函式來實作向前轉。接著,它再次設定步進電機的步驟模式為 ‘S’,輸入向後轉的步數,呼叫 backwards()
函式來實作向後轉。
執行結果
$ python3 ch_11_stepper.py
延遲時間(毫秒)?2
向前轉的步數?100
向後轉的步數?100
延遲時間(毫秒)?10
向前轉的步數?50
向後轉的步數?50
延遲時間(毫秒)?
圖表翻譯:
flowchart TD A[開始] --> B[設定步驟模式] B --> C[輸入延遲時間] C --> D[輸入向前轉步數] D --> E[呼叫向前轉函式] E --> F[設定步驟模式] F --> G[輸入向後轉步數] G --> H[呼叫向後轉函式]
圖表翻譯:
這個流程圖描述了步進電機控制程式的執行流程。它從設定步驟模式開始,然後輸入延遲時間和向前轉的步數,呼叫向前轉函式。接著,它再次設定步驟模式,輸入向後轉的步數,呼叫向後轉函式。
步進電機的工作原理
步進電機是一種特殊的電機,它透過一系列的步進運動來實作旋轉。這種電機使用一個齒輪式的轉子和交替的北極和南極磁極,以及電磁鐵來推動轉子一步一步地旋轉(圖 11-12)。需要注意的是,導線的顏色可能會有所不同。
當電磁鐵按照特定的順序被啟用時,電機就會開始旋轉。步進電機在 360 度旋轉中所具有的步數其實就是轉子上的齒數。
步進電機的控制
步進電機的控制是透過控制兩個電磁鐵來實作的。每個電磁鐵都可以被設定為正向或反向,從而控制轉子的旋轉方向。
程式設計
以下是一個簡單的程式範例,展示瞭如何控制步進電機:
forward_seq = ['FF', 'BF', 'BB', 'FB']
def forward(delay, steps):
for i in range(steps):
for step in forward_seq:
set_step(step)
time.sleep(delay)
def set_step(step):
if step == 'S':
coil1.stop()
coil2.stop()
else:
# 設定電磁鐵的方向
if step[0] == 'F':
coil1.forward()
else:
coil1.backward()
if step[1] == 'F':
coil2.forward()
else:
coil2.backward()
在這個範例中,forward
函式用於控制步進電機的旋轉。它接受兩個引數:delay
和 steps
。delay
是每個步進動作之間的延遲時間,steps
是要旋轉的步數。
set_step
函式用於設定電磁鐵的方向。它接受一個字串引數 step
,其中每個字元代表著一個電磁鐵的方向。
旋轉方向
步進電機可以旋轉於兩個方向:正向和反向。要旋轉於反向,只需將 forward_seq
序列反轉即可。
控制步進電機的基本原理
步進電機是一種可以根據控制訊號精確地移動特定角度或距離的電機。控制步進電機的基本原理是透過設定每個線圈的極性來控制電機的旋轉。
控制步進電機的程式碼
以下是控制步進電機的程式碼範例:
if step[0] == 'F':
coil1.forward()
else:
coil1.backward()
if step[1] == 'F':
coil2.forward()
else:
coil2.backward()
這段程式碼根據 step
變數的值來設定每個線圈的極性。如果 step
的第一個字元是 ‘F’,則設定第一個線圈為正向;否則,設定為反向。同樣,第二個線圈的極性也是根據 step
的第二個字元來設定。
步進電機的控制邏輯
步進電機的控制邏輯是根據設定的步進序列來控制電機的旋轉。步進序列是一系列的字元,表示每個線圈的極性。例如,‘FF’ 表示兩個線圈都設定為正向;‘FB’ 表示第一個線圈設定為正向,第二個線圈設定為反向。
使用 L293D H-Bridge 驅動晶片控制雙極性步進電機
雙極性步進電機需要使用 H-Bridge 驅動晶片來控制。L293D 是一種常用的 H-Bridge 驅動晶片,可以用來控制雙極性步進電機。
使用 L293D 的優點
- 可以控制雙極性步進電機
- 可以提供高電流輸出
- 可以用來控制多個電機
使用 L293D 的缺點
- 需要外部電源供應
- 需要額外的元件來控制
圖表翻譯:
flowchart TD A[開始] --> B[設定步進序列] B --> C[控制線圈極性] C --> D[旋轉電機] D --> E[停止電機]
這個圖表表示控制步進電機的流程。首先,設定步進序列;然後,根據步進序列控制線圈極性;接下來,旋轉電機;最後,停止電機。
內容解密:
上述程式碼和圖表表示控制步進電機的基本原理和流程。透過設定步進序列和控制線圈極性,可以精確地控制電機的旋轉。L293D H-Bridge 驅動晶片可以用來控制雙極性步進電機。
從底層實作到高階應用的全面檢視顯示,使用 gpiozero 函式庫控制直流電機和步進電機,為 Python 開發者提供了一個簡潔易用的介面。透過 Motor
類別,即使不深入理解電機驅動的底層原理,也能輕鬆控制電機的轉向和速度。分析 gpiozero 與 ULN2803 驅動器晶片的整合方式,可以發現,此方案巧妙地簡化了硬體控制的複雜性,讓開發者更專注於應用邏輯的開發。然而,gpiozero 主要導向教學和原型設計,在工業級應用中,考量到效能和即時性,仍需評估其適用性。此外,步進電機控制的精確度和穩定性,高度依賴步進序列的設計和延遲時間的控制,開發者需要根據實際應用場景仔細調整這些引數。展望未來,隨著物聯網和邊緣運算的蓬勃發展,預期 gpiozero 這類別易於使用的硬體控制函式庫將扮演更重要的角色,降低開發門檻,加速創新應用落地。對於資源有限的創客和教育場景,gpiozero 提供了絕佳的學習和實驗平臺。玄貓認為,gpiozero 是入門電機控制的理想工具,但專業開發者仍需深入理解底層原理,才能更好地應對複雜的控制需求。