透過 Python 程式碼和 GPIO 函式庫,我們可以精確控制不同種類的馬達。直流馬達的控制主要涉及 GPIO 引腳的設定和 PWM 訊號的產生,以調整馬達的轉速和方向。步進馬達則需要更精確的控制序列,透過全步或半步模式來調整旋轉角度和速度。伺服馬達的控制則依賴於 PWM 訊號的佔空比,以精確控制馬達的旋轉角度。這些控制方法都可以透過 Raspberry Pi 的 GPIO 引腳和 Python 程式碼實作,並可進一步結合藍牙技術,實作遠端控制和更靈活的應用。
Raspberry Pi 的 DC 馬達控制
在本文中,我們將探討如何使用 Raspberry Pi 控制 DC 馬達。DC 馬達是一種常見的馬達型別,廣泛應用於各種電子裝置中。
硬體連線
要控制 DC 馬達,首先需要將馬達連線到 Raspberry Pi 的 GPIO 引腳。以下是連線的步驟:
- Enable Physical Pin 10 (GPIO 15)
- 將 DC 馬達的正極連線到 Raspberry Pi 的 GPIO 引腳 10
- 將 DC 馬達的負極連線到 Raspberry Pi 的 GND 引腳
程式碼實作
以下是使用 Python 控制 DC 馬達的程式碼:
import RPi.GPIO as GPIO
from time import sleep
# 設定 GPIO 模式
GPIO.setmode(GPIO.BOARD)
# 關閉警告訊息
GPIO.setwarnings(False)
# 設定 Enable 和 Input 引腳
Enable1 = 10
input1 = 12
input2 = 18
# 設定 Enable 和 Input 引腳為輸出模式
GPIO.setup(Enable1, GPIO.OUT)
GPIO.setup(input1, GPIO.OUT)
GPIO.setup(input2, GPIO.OUT)
內容解密:
上述程式碼首先匯入了 RPi.GPIO
和 time
模組,然後設定了 GPIO 模式和關閉警告訊息。接下來,設定了 Enable 和 Input 引腳的編號,最後將這些引腳設定為輸出模式。
流程圖
以下是 DC 馬達控制的流程圖:
flowchart TD A[開始] --> B[設定 GPIO 模式] B --> C[關閉警告訊息] C --> D[設定 Enable 和 Input 引腳] D --> E[設定 Enable 和 Input 引腳為輸出模式] E --> F[控制 DC 馬達]
圖表翻譯:
上述流程圖展示了 DC 馬達控制的步驟。首先,設定 GPIO 模式和關閉警告訊息。接下來,設定 Enable 和 Input 引腳的編號,然後將這些引腳設定為輸出模式。最後,控制 DC 馬達的轉動。
使用 Raspberry Pi 控制直流馬達的方向和速度
簡介
在本文中,我們將探討如何使用 Raspberry Pi 控制直流馬達的方向和速度。這個專案需要使用 Python 程式語言和 GPIO 函式庫。
硬體需求
- Raspberry Pi
- 直流馬達
- 馬達驅動器(例如 L298N)
- 電源
- 跳線
軟體需求
- Python 3.x
- GPIO 函式庫
程式碼
import RPi.GPIO as GPIO
import time
# 設定 GPIO 模式
GPIO.setmode(GPIO.BCM)
# 設定 Enable1 腳位為 PWM 輸出
Enable1 = 17
GPIO.setup(Enable1, GPIO.OUT)
# 建立 PWM 物件
pwm = GPIO.PWM(Enable1, 100)
# 啟動 PWM 輸出
pwm.start(0)
# 輸入旋轉方向和 duty cycle
Rotation = input("Enter c/C for clockwise & a/A for anticlockwise: ")
duty_cycle = int(input("Enter Duty Cycle from 1 to 100: "))
# 設定 PWM 輸出值
pwm.ChangeDutyCycle(duty_cycle)
# 設定延遲時間
delay = 0.1
# 列印提示訊息
print("Press Ctrl+c for termination")
# 控制馬達方向
if Rotation == 'c' or Rotation == 'C':
print("Clockwise MOTION")
try:
while True:
# 設定 IN1 和 IN2 腳位為低電平和高電平
GPIO.output(2, False) # pin 2 IN1 of Driver
GPIO.output(7, True) # pin 7 IN1 of Driver
GPIO.output(1, True) # pin 1 IN1 of Driver
time.sleep(delay)
except KeyboardInterrupt:
pass
elif Rotation == 'a' or Rotation == 'A':
print("AntiClockwise MOTION")
try:
while True:
# 設定 IN1 和 IN2 腳位為高電平和低電平
GPIO.output(2, True) # pin 2 IN1 of Driver
GPIO.output(7, False) # pin 7 IN1 of Driver
GPIO.output(1, True) # pin 1 IN1 of Driver
time.sleep(delay)
except KeyboardInterrupt:
pass
內容解密:
上述程式碼使用 Raspberry Pi 的 GPIO 函式庫控制直流馬達的方向和速度。首先,設定 Enable1 腳位為 PWM 輸出,並建立 PWM 物件。然後,輸入旋轉方向和 duty cycle,設定 PWM 輸出值和延遲時間。最後,控制馬達方向和速度,使用 try-except 區塊處理 KeyboardInterrupt 例外。
圖表翻譯:
flowchart TD A[開始] --> B[輸入旋轉方向和 duty cycle] B --> C[設定 PWM 輸出值] C --> D[控制馬達方向] D --> E[設定延遲時間] E --> F[迴圈執行] F --> G[結束]
圖表翻譯:
上述流程圖描述了程式碼的執行流程。首先,輸入旋轉方向和 duty cycle,然後設定 PWM 輸出值。接著,控制馬達方向,設定延遲時間,最後迴圈執行直到結束。
控制伺服馬達使用PWM
伺服馬達是一種可以精確控制角度、速度和加速度的旋轉或線性執行器。伺服馬達的主要應用包括遙控裝置、機器人和工業應用。與普通馬達不同,伺服馬達可以根據規格從0度到180度旋轉,並且可以控制旋轉速度。
在這個實作中,我們使用了Tower Pro伺服馬達SG90。伺服馬達可以推動過載,但不能抬重。Tower Pro伺服馬達的PWM週期為20毫秒(頻率50Hz),需要生成一個PWM訊號,週期為20毫秒,佔空比在0到2毫秒之間,以控制伺服馬達的旋轉。
伺服馬達控制原理
伺服馬達的控制原理是根據PWM訊號的佔空比來控制馬達的旋轉角度和速度。伺服馬達的中性位置通常是90度,從這個位置可以向兩個方向旋轉。
實作伺服馬達控制
import RPi.GPIO as GPIO
import time
# 設定GPIO模式
GPIO.setmode(GPIO.BCM)
# 設定伺服馬達的GPIO腳位
servo_pin = 17
# 設定PWM訊號的頻率和佔空比
pwm_frequency = 50
pwm_duty_cycle = 0
# 建立PWM物件
pwm = GPIO.PWM(servo_pin, pwm_frequency)
# 啟動PWM訊號
pwm.start(pwm_duty_cycle)
try:
while True:
# 設定伺服馬達的旋轉角度
angle = 90
# 計算PWM訊號的佔空比
pwm_duty_cycle = (angle / 180) * 2 + 1
# 設定PWM訊號的佔空比
pwm.ChangeDutyCycle(pwm_duty_cycle)
# 等待一段時間
time.sleep(1)
except KeyboardInterrupt:
# 停止PWM訊號
pwm.stop()
# 清理GPIO資源
GPIO.cleanup()
伺服馬達控制表
角度 | 佔空比 |
---|---|
0度 | 1ms |
90度 | 1.5ms |
180度 | 2ms |
注意:以上程式碼和表格僅為示例,實際的伺服馬達控制可能需要根據具體的硬體和需求進行調整。
伺服馬達控制技術
伺服馬達基本原理
伺服馬達是一種可以精確控制旋轉角度的馬達,廣泛應用於機器人、自動化裝置等領域。要控制伺服馬達,需要使用PWM(脈衝寬度調變)訊號。PWM訊號的-duty cycle(佔空比)決定了伺服馬達的旋轉角度。
伺服馬達控制公式
要計算伺服馬達的duty cycle,需要使用以下公式: Duty_cycle = (set_angle/18) + 2.5 其中,set_angle是所需的旋轉角度,duty cycle是佔空比。
實際控制範例
以下是使用Raspberry Pi控制Tower Pro SG90 9G伺服馬達的範例:
import RPi.GPIO as GPIO
from time import sleep
# 設定GPIO模式
GPIO.setmode(GPIO.BOARD)
# 停用警告
GPIO.setwarnings(False)
# 設定控制引腳
control_pin = 10
GPIO.setup(control_pin, GPIO.OUT)
# 設定PWM頻率
pwm = GPIO.PWM(control_pin, 50)
# 啟動PWM
pwm.start(0)
# 設定延遲時間
delay = 1
# 輸入旋轉角度
set_angle = int(input("Enter Servo Motor Rotation Angle: "))
# 計算duty cycle
duty_cycle = (set_angle / 18) + 2.5
# 控制伺服馬達
pwm.ChangeDutyCycle(duty_cycle)
sleep(delay)
流程圖
以下是控制伺服馬達的流程圖:
flowchart TD A[開始] --> B[輸入旋轉角度] B --> C[計算duty cycle] C --> D[控制伺服馬達] D --> E[延遲] E --> F[結束]
圖表翻譯:
上述流程圖展示了控制伺服馬達的步驟。首先,輸入所需的旋轉角度。然後,計算duty cycle。接下來,控制伺服馬達。最後,延遲一段時間。
步進電機控制
步進電機是一種可以將直流電壓脈衝轉換為機械旋轉的裝置,其旋轉角度與電壓脈衝的寬度成正比。這種電機由兩個主要部分組成:定子和轉子。定子是線圈繞組,轉子通常是永久磁石或鐵磁材料。步進電機通常用於位置控制,因為它們可以精確地控制旋轉角度,一步一步地進行。
步進電機的特點
- 步進電機可以精確地控制旋轉角度。
- 它們是一種特殊的無刷電機,可以將整個旋轉分成多個相等的「步」。
- 步進電機通常用於需要精確位置控制的裝置中,如桌面印表機、3D印表機、CNC加工機等。
- 旋轉速度取決於控制訊號(佔空比)的施加速率。
驅動步進電機
由於樹莓派的GPIO口不能提供足夠的驅動電流,通常需要使用驅動IC(如ULN2003)來驅動步進電機。步進電機可以實作連續和有限角度的旋轉,主要有兩種步序:全步和半步。
全步模式
在全步模式下,兩個線圈同時被啟用。這種模式的優點是簡單易實作,但精度相對較低。
半步模式
在半步模式下,電機每次移動半個基本步角。這種模式的優點是精度更高,但實作複雜度也增加了。
步進電機的控制
步進電機的控制可以透過控制訊號的寬度和頻率來實作。樹莓派可以透過其GPIO口輸出控制訊號,從而控制步進電機的旋轉。
實作步進電機控制的Python程式碼
import RPi.GPIO as GPIO
import time
# 設定GPIO模式
GPIO.setmode(GPIO.BCM)
# 設定步進電機的控制引腳
control_pins = [17, 23, 24, 25]
# 初始化控制引腳為輸出模式
for pin in control_pins:
GPIO.setup(pin, GPIO.OUT)
# 全步模式的序列
full_step_sequence = [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
]
# 半步模式的序列
half_step_sequence = [
[1, 0, 0, 0],
[1, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 1, 0],
[0, 0, 1, 1],
[0, 0, 0, 1],
[1, 0, 0, 1]
]
# 控制步進電機的旋轉
def rotate_motor(sequence, delay):
for step in sequence:
for i, pin in enumerate(control_pins):
GPIO.output(pin, step[i])
time.sleep(delay)
# 旋轉步進電機
rotate_motor(full_step_sequence, 0.01)
# 清理GPIO資源
GPIO.cleanup()
內容解密:
以上程式碼示範瞭如何使用樹莓派控制步進電機的旋轉。首先,設定GPIO模式和控制引腳,然後初始化控制引腳為輸出模式。接下來,定義全步模式和半步模式的序列,然後實作控制步進電機旋轉的函式。最後,旋轉步進電機並清理GPIO資源。
圖表翻譯:
flowchart TD A[初始化GPIO] --> B[設定控制引腳] B --> C[定義步進電機序列] C --> D[控制步進電機旋轉] D --> E[清理GPIO資源]
此圖表示了控制步進電機的流程,從初始化GPIO開始,然後設定控制引腳,定義步進電機序列,控制步進電機旋轉,最後清理GPIO資源。
步進電機控制系統
28BYJ-48 電機特性
28BYJ-48 步進電機是一種常用的電機,具有全步模式和半步模式。全步模式下,每一步對應於 11.25° 的旋轉,總共有 32 步完成一整個旋轉(360°/11.25° = 32)。此外,該電機具有 32/9、22/11、26/9 和 31/10 的齒輪比,總齒輪比為 63.68395,約等於 64。這意味著電機具有 1/64 的減速齒輪。
步進電機控制
步進電機的控制可以透過 Raspberry Pi 進行,電機具有四個單極線圈,每個線圈的額定電壓為 +12V。這使得電機相對容易控制。電機的步進角度為 5.625°/64,這意味著電機需要進行 64 步才能完成一整個旋轉,每一步覆蓋 5.625°。電機的功耗約為 240 mA。
ULN2003 驅動器
ULN2003 是一種驅動器 IC,具有 Darlington 陣列和同時處理七個不同的輸入/輸出的能力。它的工作範圍在 500 mA 左右。ULN2003 可以用於驅動步進電機,提供足夠的電流和電壓來控制電機的運動。
半步模式
半步模式下,電機的步進角度更小,為 5.625°/128。這意味著電機需要進行 128 步才能完成一整個旋轉,每一步覆蓋 2.8125°。半步模式可以提供更高的精度和更平滑的運動。
控制電機
控制電機需要提供適當的電壓和電流來驅動電機。Raspberry Pi 可以用於控制電機,透過提供適當的控制訊號來驅動 ULN2003 驅動器,從而控制電機的運動。控制電機的程式需要根據電機的特性和驅動器的能力進行設計和實作。
內容解密:
以上內容介紹了步進電機控制系統的基本原理和元件,包括 28BYJ-48 電機、ULN2003 驅動器和 Raspberry Pi 控制系統。步進電機的控制需要根據電機的特性和驅動器的能力進行設計和實作。透過提供適當的控制訊號和電壓,電機可以實作精確的運動和控制。
flowchart TD A[控制系統] --> B[ULN2003 驅動器] B --> C[28BYJ-48 電機] C --> D[運動控制] D --> E[精確控制]
圖表翻譯:
此圖表顯示了控制系統、ULN2003 驅動器、28BYJ-48 電機和運動控制之間的關係。控制系統提供控制訊號給 ULN2003 驅動器,驅動器則驅動 28BYJ-48 電機,從而實作精確的運動控制。
控制馬達(直流馬達、步進馬達和伺服馬達)
控制馬達是機器人和自動化系統中的重要組成部分。馬達可以分為直流馬達、步進馬達和伺服馬達三種。下面我們將介紹如何使用 Raspberry Pi 控制這三種馬達。
步進馬達控制
步進馬達是一種可以精確控制轉動角度的馬達。它的工作原理是透過控制電流的流向來控制馬達的轉動。下面是步進馬達的控制流程:
步進馬達的控制序列
步驟 | 橙色 | 黃色 | 粉色 | 藍色 | 紅色 |
---|---|---|---|---|---|
1 | 0 | 1 | 1 | 1 | 1 |
2 | 0 | 0 | 1 | 1 | 1 |
3 | 1 | 0 | 1 | 1 | 1 |
4 | 1 | 0 | 0 | 1 | 1 |
5 | 1 | 1 | 0 | 0 | 1 |
6 | 1 | 1 | 1 | 0 | 0 |
7 | 0 | 1 | 1 | 1 | 0 |
8 | 0 | 0 | 0 | 0 | 0 |
步進馬達控制程式
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pins = [10, 11, 12, 13]
# 控制步進馬達的轉動
def control_stepper_motor():
# 初始化馬達的狀態
motor_state = [0, 0, 0, 0]
# 控制馬達的轉動
for i in range(8):
# 設定馬達的狀態
motor_state[0] = (i == 0) or (i == 3) or (i == 4) or (i == 7)
motor_state[1] = (i == 1) or (i == 2) or (i == 5) or (i == 6)
motor_state[2] = (i == 2) or (i == 3) or (i == 6) or (i == 7)
motor_state[3] = (i == 0) or (i == 1) or (i == 4) or (i == 5)
# 設定 GPIO 的狀態
for j in range(4):
GPIO.output(pins[j], motor_state[j])
# 等待一段時間
sleep(0.1)
# 執行步進馬達控制程式
control_stepper_motor()
圖表翻譯:
此圖示為步進馬達控制的流程圖。圖中展示了步進馬達的控制序列和馬達的轉動角度。步進馬達的控制原理是透過控制電流的流向來控制馬達的轉動。
內容解密:
步進馬達控制程式的工作原理是透過控制 GPIO 的狀態來控制馬達的轉動。程式中定義了步進馬達的控制序列和馬達的狀態。透過設定 GPIO 的狀態和等待一段時間,程式可以控制馬達的轉動角度。
步進馬達控制:全步和半步模式
步進馬達是一種能夠精確控制旋轉角度和速度的電機,廣泛應用於各種自動化裝置中。要控制步進馬達的旋轉,需要根據不同的模式(全步或半步)和旋轉方向(順時針或逆時針)設定馬達的相序。
全步模式
全步模式是步進馬達的基本執行模式,在這種模式下,馬達的每個相都會依次接收電流,從而使馬達順時針或逆時針旋轉。以下是全步模式的相序設定:
full_step = [
[0, 1, 1, 0],
[1, 1, 0, 0],
[1, 0, 0, 1],
[0, 0, 1, 1]
]
這個設定表示馬達的四個相(A、B、C、D)將按照這個順序接收電流:A和B、B和C、C和D、D和A。
半步模式
半步模式是另一種執行模式,在這種模式下,馬達的相會以更細膩的方式接收電流,從而實作更高的精度和更低的振動。以下是半步模式的相序設定:
half_step = [
[0, 1, 1, 0],
[1, 1, 1, 0],
[1, 1, 0, 0],
[1, 1, 0, 1],
[1, 0, 0, 1],
[1, 0, 1, 1],
[0, 0, 1, 1],
[0, 1, 1, 1]
]
這個設定表示馬達的四個相將按照這個順序接收電流:A和B、A、B和C、B、C和D、C、D和A、D、A和B。
Raspberry Pi 和移動介面透過藍牙
要控制步進馬達,需要使用 Raspberry Pi 或其他單板計算機。以下是使用 Raspberry Pi 和移動介面透過藍牙控制步進馬達的示例程式碼:
import RPi.GPIO as GPIO
# 設定 GPIO 模式
GPIO.setmode(GPIO.BCM)
# 設定步進馬達的引腳
pins = [17, 23, 24, 25]
# 初始化步進馬達
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, 0)
# 輸入旋轉模式和方向
seq = input("Enter f/F for full step & h/H for half Step: ")
rotation = input("Enter c/C clockwise & a/A for anticlockwise: ")
# 設定旋轉步數和延遲時間
steps = 512
delay = 0.01
# 根據旋轉模式和方向控制步進馬達
if seq == 'f' or seq == 'F':
if rotation == 'c' or rotation == 'C':
for i in range(0, steps):
for fullstep in range(0, 4):
for pin in range(0, 4):
# 控制步進馬達的相序
GPIO.output(pins[pin], full_step[fullstep][pin])
# 延遲一段時間
time.sleep(delay)
這個程式碼示例使用 Raspberry Pi 的 GPIO 引腳控制步進馬達的相序,從而實作旋轉。
Stepper Motor 控制程式碼分析
在控制 Stepper Motor 時,需要精確地控制每個步驟的執行順序和時序。以下程式碼片段展示瞭如何使用 Python 和 GPIO 函式庫來控制 Stepper Motor。
全步驟模式
在全步驟模式下,Stepper Motor 每次移動一個完整的步驟。程式碼如下:
for fullstep in range(3, 0, -1):
for pin in range(0, 4):
GPIO.output(pins[pin], full_step[fullstep][pin])
sleep(delay)
這段程式碼使用兩個巢狀迴圈來控制 Stepper Motor 的全步驟模式。外層迴圈 for fullstep in range(3, 0, -1):
會依次執行每個全步驟,內層迴圈 for pin in range(0, 4):
則會設定每個 pin 的輸出狀態。
半步驟模式
在半步驟模式下,Stepper Motor 每次移動半個步驟。程式碼如下:
for halfstep in range(0, 8):
for pin in range(0, 4):
GPIO.output(pins[pin], half_step[halfstep][pin])
這段程式碼使用兩個巢狀迴圈來控制 Stepper Motor 的半步驟模式。外層迴圈 for halfstep in range(0, 8):
會依次執行每個半步驟,內層迴圈 for pin in range(0, 4):
則會設定每個 pin 的輸出狀態。
旋轉方向控制
Stepper Motor 的旋轉方向可以透過設定 rotation
變數來控制。程式碼如下:
if rotation == 'a' or rotation == 'A':
# 逆時針旋轉
elif rotation == 'c' or rotation == 'C':
# 順時針旋轉
這段程式碼使用 if
判斷式來設定 Stepper Motor 的旋轉方向。
錯誤處理
如果使用者輸入錯誤的命令,程式碼會印出錯誤訊息。程式碼如下:
else:
print("Wrong Entry")
這段程式碼使用 else
判斷式來處理錯誤輸入。
內容解密:
上述程式碼片段展示瞭如何使用 Python 和 GPIO 函式庫來控制 Stepper Motor。透過設定 rotation
變數和 seq
變數,可以控制 Stepper Motor 的旋轉方向和步驟模式。程式碼使用巢狀迴圈來控制 Stepper Motor 的全步驟模式和半步驟模式,並使用 if
判斷式來設定旋轉方向和錯誤處理。
圖表翻譯:
以下是 Stepper Motor 控制程式碼的流程圖:
flowchart TD A[開始] --> B[設定旋轉方向] B --> C[設定步驟模式] C --> D[全步驟模式] D --> E[半步驟模式] E --> F[設定 pin 輸出狀態] F --> G[延遲] G --> H[錯誤處理] H --> I[結束]
這個流程圖展示了 Stepper Motor 控制程式碼的執行流程,包括設定旋轉方向、步驟模式、pin 輸出狀態和延遲等步驟。
Raspberry Pi 與藍牙行動介面
藍牙是一種無線替代方案,能夠取代我們使用的許多有線通訊,以傳輸語音和資料。Raspberry Pi 3 B+ 內建了 BCM43438 整合晶片,包括 2.4 GHz WLAN、藍牙和 FM 收音機。使用藍牙的主要目的就是解放板載的 GPIO 埠。以下,我們將介紹如何建立 Raspberry Pi 和智慧型手機之間的藍牙通訊,以控制裝置。
Raspberry Pi 在物聯網和創客領域扮演著重要的角色,其GPIO控制能力結合藍牙無線通訊,更拓展了應用場景。本文深入探討瞭如何使用 Raspberry Pi 控制不同種類的馬達,包括直流馬達、步進馬達和伺服馬達,並詳細解析了全步、半步等控制模式以及PWM技術的應用。透過程式碼範例和流程圖,更清晰地展現了控制邏輯和硬體連線方式。技術限制深析方面,文章點出了樹莓派GPIO口驅動能力的不足,並提出了使用驅動IC如ULN2003的解決方案。同時,也說明瞭伺服馬達的負載能力限制。整合價值分析方面,藍牙通訊的引入,使得遠端控制馬達成為可能,提升了系統的靈活性和應用範圍。展望未來,隨著邊緣計算和AI技術的發展,預期Raspberry Pi將在更複雜的機器人控制和自動化系統中扮演更關鍵的角色,例如結合機器視覺實作更精密的運動控制,或是整合雲端平臺進行遠端監控和管理。玄貓認為,熟練掌握Raspberry Pi 的馬達控制技術,將有助於開發者在快速變化的科技浪潮中保持競爭力。