2021年3月31日 星期三

Raspberry Pi硬體PWM控制舵機Servo Moto

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)#恢復腳位預設狀態