您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何使用樹莓派控制舵機MG90D,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
舵機是一種位置(角度)伺服的驅動器,適用于那些需要角度不斷變化并可以保持的控制系統。目前,在高檔遙控玩具,如飛機、潛艇模型,遙控機器人中已經得到了普遍應用。我們這里使用的淘寶上常見的MG90舵機。如下圖,需要注意,不同的型號,其轉向的角度,力距不一樣,可以根據自己的需求進行選用。
舵機的控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負輸出到電機驅動芯片決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。
??舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對應的控制關系是這樣的:
脈寬、占空比和舵機轉角之間的關系表格:
脈沖/ms | 占空比 | 角度 |
---|---|---|
0.5 | 2.5% | 0 |
1.0 | 5% | 45 |
1.5 | 7.5% | 90 |
2.0 | 10% | 135 |
2.5 | 12.5% | 180 |
在上表的基礎上,我們需要計算一些關鍵參數。
根據上表,如果我們要使舵機轉到指定的角度θ(0≤θ≤180)θ(0≤θ≤180) ,則需要輸入的脈沖占空比為:
D=2.5+(θ×(12.5?2.5))/180=2.5+(θ×10)/180
舵機轉動需要一定時間,給它發指令應避免引起沖突。舵機的轉速大概為0.2秒每60度,即0.003s/° 。而舵機的精度為180°/1024≈0.18°,對應的脈沖占空比精度為(12.5?2.5)/1024≈0.01 ,因此,在步進轉動內(即每次轉0.18°,后面直接取0.2°),給舵機發的指令間隔時間不應該低于0.2×0.003=0.0006s ,舍入一下即0.001s。而如果我們是任意指定轉角,那么兩次指令的間隔時間則應該長于180×0.260=0.4s,這是從0度轉到180度的時間。
將舵機棕色線接到GND,紅色線接到+5V引腳,橙色線接到GPIO.12(BCM18)引腳。
Rotation.py
import RPi.GPIO as GPIO import time # 這個類表示單個的SG90模塊 class Rotation: frequency=50 #脈沖頻率(Hz) delta_theta=0.2 #步進轉動間隔(度) min_delay=0.0006 #轉動delta_theta的理論耗時(s) max_delay=0.4 #從0轉到180的耗時(s) def __init__(self,channel,min_theta,max_theta,init_theta=0): ''' 構造函數: channel: 舵機信號線所連接的樹莓派引腳編號(BCM編碼) min_theta: 舵機轉動的最小角度 max_theta: 舵機轉動的最大角度 init_theta: 舵機的初始角度 ''' self.channel=channel if(min_theta<0 or min_theta>180): self.min_theta=0 else: self.min_theta=min_theta if(max_theta<0 or max_theta>180): self.max_theta=180 else: self.max_theta=max_theta if(init_theta<min_theta or init_theta>max_theta): self.init_theta=(self.min_theta+self.max_theta)/2 else: self.init_theta=init_theta #初始角度 #計算最小角度、最大角度的占空比 self.min_dutycycle=2.5+self.min_theta*10/180 self.max_dutycycle=2.5+self.max_theta*10/180 def setup(self): ''' 初始化 ''' GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(self.channel,GPIO.OUT) self.pwm=GPIO.PWM(self.channel,Rotation.frequency) #PWM self.dutycycle=2.5+self.init_theta*10/180 #脈沖占空比的初始值 self.pwm.start(self.dutycycle) #讓舵機轉到初始位置 time.sleep(Rotation.max_delay) def positiveRotation(self): ''' 正相步進轉動,每次調用只轉動delta_theta度 ''' self.dutycycle=self.dutycycle+Rotation.delta_theta*10/180 if self.dutycycle>self.max_dutycycle: self.dutycycle=self.max_dutycycle self.pwm.ChangeDutyCycle(self.dutycycle) time.sleep(Rotation.min_delay) def reverseRotation(self): ''' 反相轉動,每次調用只轉動delta_theta度 ''' self.dutycycle=self.dutycycle-Rotation.delta_theta*10/180 if self.dutycycle<self.min_dutycycle: self.dutycycle=self.min_dutycycle self.pwm.ChangeDutyCycle(self.dutycycle) time.sleep(Rotation.min_delay) def specifyRotation(self,theta): ''' 轉動到指定的角度 ''' if(theta<0 or theta>180): return self.dutycycle=2.5+theta*10/180 self.pwm.ChangeDutyCycle(self.dutycycle) time.sleep(Rotation.max_delay) def cleanup(self): self.pwm.stop() time.sleep(Rotation.min_delay) GPIO.cleanup()
ServoCtrl.py
import time rot = Rotation(18, 0, 180) rot.setup() time.sleep(2) for i in range(0,900): rot.positiveRotation() for i in range(0,900): rot.reverseRotation() rot.cleanup()
上述內容就是如何使用樹莓派控制舵機MG90D,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。