如何讓控制樹莓派讓舵機轉起來
前面講了使用pycharm配置樹莓派代碼遠程調試,目前手裡面隻有舵機,沒有舵機支架,這篇文章就說一下如何讓控制樹莓派讓舵機轉起來。
首先說下舵機的工作原理,伺服電機通常被稱為舵機,它是一種帶有輸出軸的小裝置。當我們向伺服器發送一個控制信号時,輸出軸就可以轉到特定的位置。隻要控制信号持續不變,伺服機構就會保持軸的角度位置不改變。如果控制信号發生變化,輸出軸的位置也會相應發生變化。
舵機的工作原理
舵機内部的控制電路,電位計(可變電阻器)和電機均被連接到電路闆上,如内部結構圖的右邊部分。控制電路通過電位計可監控舵機的當前角度。
如果軸的位置與控制信号相符,那麼電機就會關閉。如果控制電路發現這個角度不正确,它就會控制馬達轉動,直到它達到指定的角度。舵機角度根據制造商的不同而有所不同。比如,一個180度的舵機,它可以在0度至180度之間運動。由于限位裝置被安裝在主輸出裝置上,超出這個範圍機械結構就不能再轉動了。
舵機的輸出功率與它所需要轉動的距離成正比。如果輸出軸需要轉動很長的距離,馬達就會全速運轉,如果它隻需要短距離轉動,馬達就會以較慢的速度運行,這叫做速度比例控制。
如何讓舵機轉到指定角度?
控制線用于傳輸角度控制信号。這個角度是由控制信号脈沖的持續時間決定的,這叫做脈沖編碼調制(PCM)。舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms範圍,總間隔為2ms。脈沖的寬度将決定馬達轉動的距離。例如:1.5毫秒的脈沖,電機将轉向90度的位置(通常稱為中立位置,對于180°舵機來說,就是90°位置)。如果脈沖寬度小于1.5毫秒,那麼電機軸向朝向0度方向。如果脈沖寬度大于1.5毫秒,軸向就朝向180度方向。以180度舵機為例,對應的控制關系是這樣的:
0.5ms————-0度;
1.0ms————45度;
1.5ms————90度;
2.0ms———–135度;
2.5ms———–180度;
看完原理後,試着看讓舵機動起來,這裡我們使用GPIOzero這個庫,先安裝下sudo pip3 install gpiozero,
安裝完後先看看這個庫的幫助說明, https://gpiozero.readthedocs.io/en/stable/recipes.html#servo,幫助給的示例代碼如下:
from gpiozero import Servo
from time import sleep
servo = Servo(18)
while True:
servo.min()
sleep(2)
servo.mid()
sleep(2)
servo.max()
樹莓派與舵機的具體的接線圖如下:
舵機由2塊3.7V的18650電池串聯提供7.4的電壓,樹莓派的(0V)與舵機的0V共地,舵機的pwn線接樹莓派的12pin(默認情況下,所有 GPIO 引腳編号都使用 Broadcom (BCM) 編号)。
然後運行上面的Python代碼,這樣舵機就動起來了。
問題出現:這段代碼雖然可以使舵機轉動,但是如果在調用time.sleep()函數時,舵機會不規則的抖動,最後查閱資料https://gpiozero.readthedocs.io/en/stable/api_output.html?highlight=pigpio,給出這樣的解釋:
To reduce servo jitter, use the pigpio pin driver rather than the default RPi.GPIO driver (pigpio uses DMA sampling for much more precise edge timing). See Changing the pin factory for further information.大意就是說"要減少伺服抖動,請使用pigpio引腳驅動器,而不是默認的RPi"。
使用pigpio庫調整代碼:
先安裝pigpio庫,sudo pip3 install pigpio ,然後我繼續修改代碼:
import pigpio
import time
pin = 18 #要控制的io口
pi = pigpio.pi()
pi.set_PWM_range(pin, 20000)#pin是要輸出PWM的IO口, 20000設定PWM的調節範圍,
#我們的舵機的控制信号是50Hz,就是20ms為一個周期。就是20000us。
#設為20000,就是最小調節為1us
pi.set_PWM_frequency(pin, 50) #設定PWM的頻率,pin是要設定的IO口, 50 是頻率
# pi.set_PWM_dutycycle(pin, 1500) #設定占空比
while True:
for i in range(500, 2500 1,5):
pi.set_PWM_dutycycle(pin, i) #設定pwm的脈寬, pin為引腳,i為脈寬
time.sleep(0.01)
time.sleep(10)
for i in range(2500, 500-1,-5):
pi.set_PWM_dutycycle(pin, i)
time.sleep(0.01)
time.sleep(10)
這樣舵機會連續轉動,而且在調用time.sleep()期間沒有抖動現象。
至此,樹莓派控制單舵機的教程完畢!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!