2014年7月26日 星期六

Raspberry Pi GPIO (三) 控制伺服馬達


首先我們來了解一下伺服馬達的控制方式,伺服馬達與步進馬達雖然功能相似,但控制原理卻大大不同。

標準的伺服馬達上會有三條控制線,分別為:VCC,GND,還有訊號線。VCC 與 GND 用於提供內部直流馬達及控制線路所需的能源,電壓通常介於 4 ~ 6 V 之間,電壓大小差別在於扭力的大小,和轉動速度的快慢。

而訊號線則是用來控制馬達的轉動.,輸入的訊號為 PWM ,也就是脈衝寬度調變,伺服馬達的角度就是由 PWM 的 Duty Cycle 去控制,以我用的 S03T 2BBMG 作為範例:



下面為這顆馬達的控制規格:



這顆馬達在規格上是寫可以控制到180度,但是實際上它只能轉動170度,還有千萬不要送超過馬達控制角度的訊號給伺服馬達,這樣會使馬達受損,齒輪組損壞。

基本上我們送出的PWM必須要在 1 秒內產生 50 個波以上才能夠讓伺服馬達運作,而我使用的 Python 中可以透過以下程式去設定:
pwm_motor = GPIO.PWM(p,50)
pwm_motor.start(0)
在這當中 p 為輸出的腳位號碼,50 則是頻率(Hz),而 start(0) 則是設定一開始的Duty Cycle為 0,由於 Python 控制的是 Duty Cycle 的百分比,所以我們必須把上面表格中的頻寬轉為百分比才能使用。

由於我們是使用 50Hz 的 PWM,所以 1 個波的時間為:

1 / 50 =  0.02 = 20 ms

再來就可以計算頻寬的百分比了

+90度:( 0.8 ms / 20 ms ) * 100 = 4
+60度:( 0.9 ms / 20 ms ) * 100 = 4.5
    0度:( 1.5 ms / 20 ms ) * 100 = 7.5
-60度:( 2.1 ms / 20 ms ) * 100 = 10.5
-90度:( 2.2 ms / 20 ms ) * 100 = 11

接下來就是硬體電路的部分:

伺服馬達的 VCC 使用外接電池盒( 6 V ) 然後 GND 與 電池盒的 GND 還有 RPI 的 GND 必須接在一起達到共地,然後訊號腳的部分,我們使用可以送出PWM的第12腳作為 GPIO,如下圖所示:



實際電路:


再來是我測試用的程式,我讓伺服馬達由 +90度 => 0度 => -90度 去做循環,下面為我的程式碼:

#!/usr/bin/python
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
MotorPin=12
GPIO.setup(MotorPin,GPIO.OUT)
pwm_motor = GPIO.PWM(MotorPin, 50)
pwm_motor.start(7.5)

while True:
        for a in range(100):
                pwm_motor.ChangeDutyCycle(4)
                time.sleep(0.01)
                print a
#       pwm_motor.stop()
        for b in range(100):
                pwm_motor.ChangeDutyCycle(7.5)
                time.sleep(0.01)
                print b
#       pwm_motor.stop()
        for c in range(100):
                pwm_motor.ChangeDutyCycle(11)
                time.sleep(0.01)
                print c
#       pwm_motor.stop()
        for d in range(100):
                pwm_motor.ChangeDutyCycle(7.5)
                time.sleep(0.01)
                print d

實際影片:


4 則留言:

  1. Hi 向您請教一下請問頻寬的百分比的0.8ms 0.9ms ... 是怎麼得知的呢?
    看了好久還是不得其解

    回覆刪除
  2. 我沒接觸過這類電子,但應該是看說明書啊

    回覆刪除
  3. 我沒接觸過這類電子,但應該是看說明書啊

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除