BCM 編號 12, 13, 18, 19 的四隻腳位,有支援硬體 PWM 功能
duty_cycle工作週期計算公式來由:
Python 套件所指定 PWM 是工作週期而非脈衝寬度,所以我們必須先進行轉換。
當頻率為 50 Hz 時,則每一個週期為 1/50 = 0.02 秒,也就是 20 毫秒 (ms)。
1 ms 的脈衝寬度其工作週期為 1 / 20 * 100% = 5%。
故PWM 的頻率設定為 50 Hz,然後控制工作週期在 5~10% 之間,就可以從 -90 度旋轉到 +90 度(0~180度)。
旋轉角度 | 工作週期 (當頻率為 50 Hz 時) | |
0 度 | 5% | |
45 度 | 6.25% | |
90 度 | 7.5% | |
135 度 | 8.75% | |
180 度 | 10% |
另外舵機當頻率一般5V供電50HZ時0.5ms為0度佔2.5%,2.4ms為180度佔12%
要使用Raspberry pi的硬體PWM需啟動pigpio daeman
指令如左:systemctl start pigpiod
python 測試程式如下:
import pigpio
import time
PWM_CONTROL_PIN = 18#(18是BCM腳位,實體腳位是12)
PWM_FREQ = 50#頻率50HZ
STEP = 15
pi = pigpio.pi()
def angle_to_duty_cycle(angle=0):
duty_cycle = int((500 * PWM_FREQ + (1900 * PWM_FREQ * angle / 180)))
return duty_cycle
#一般舵機是500~2400ms,轉0~180度
#MG996R舵機似乎是771~2193ms
try:
print('按下 Ctrl-C 可停止程式')
for angle in range(0, 181, STEP):
dc = angle_to_duty_cycle(angle)
print('角度={: >3}, 工作週期={: >6}'.format(angle, dc))
pi.hardware_PWM(PWM_CONTROL_PIN, PWM_FREQ, dc)
time.sleep(0.5)
for angle in range(180, -1, -STEP):
dc = angle_to_duty_cycle(angle)
print('角度={: >3}, 工作週期={: >6}'.format(angle, dc))
pi.hardware_PWM(PWM_CONTROL_PIN, PWM_FREQ, dc)
time.sleep(0.5)
pi.hardware_PWM(PWM_CONTROL_PIN, PWM_FREQ, angle_to_duty_cycle(90))
while True:
next
except KeyboardInterrupt:
print('關閉程式')
finally:
pi.set_mode(PWM_CONTROL_PIN, pigpio.INPUT)#恢復腳位預設狀態