首先我們來了解一下伺服馬達的控制方式,伺服馬達與步進馬達雖然功能相似,但控制原理卻大大不同。
標準的伺服馬達上會有三條控制線,分別為: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
實際影片:
Hi 向您請教一下請問頻寬的百分比的0.8ms 0.9ms ... 是怎麼得知的呢?
回覆刪除看了好久還是不得其解
我沒接觸過這類電子,但應該是看說明書啊
回覆刪除我沒接觸過這類電子,但應該是看說明書啊
回覆刪除作者已經移除這則留言。
回覆刪除