樹莓派小車——舵機
什麼是舵機
舵機是伺服電機下的一個小類,伺服電機常用於需要高精度定位的領域,比如機床、工業機械臂、機器人等。
而舵機則是國人起的俗稱,因為航模愛好者們最初用它控制船舵、飛機舵面而得名。是伺服電機的簡化版,原本伺服電機的三環控制被簡化成了一環,即只檢測位置環。內部由直流電機,電位器,一些邏輯晶元,出輪組成,價格和品質差異大。以上是航模中常用的9g舵機,所使用材料基本上是塑料,輕盈、便宜。但是掉齒、卡齒、燒壞
是家常便飯。(之前做航模弄壞過好多這種,需要的話買好一點的比如銀燕)
我的小車上所使用這個MG996R,會比9g力量大穩定性強很多。
如何驅動舵機
舵機有引出三根線(黑白灰或者棕紅橙):
棕/黑---->GND
橙/白---->+5V 黃/灰---->PWM信號線以上的前兩根提供舵機電源,最後一根是信號線。信號線使用的是PWM來控制電機的位置。什麼是PWM信號?
脈衝寬度調製(Pulse Width Modulation)就是一種矩形波,通過高電平時間所佔周期的比例也就是占空比來表示不同信號。占空比可以從0%到100%。不過舵機往往不是360°都可以旋轉的,所以在控制舵機的占空比並不是從0%到100%都可以的。本文使用的舵機型號是MG996R,從數據手冊上可以看到,該舵機內部的基準信號是周期為20ms,寬度為1.5ms的PWM信號,如圖。
如果我們輸入一個和基準信號相同的占空比的信號,電機就轉到0°位置。該舵機的最小角度是-90°最大是90°,總共可用角度為180°。周期T=20ms,高電平脈衝寬度0.5ms對應角度為-90°,高電平脈衝寬度2.5ms對應的旋轉角度為90°中間為線性變化。如下如所示。
Python編寫舵機程序
使用python來編寫程序前,先要確保樹莓派的設置GPIO時ENABLE狀態的,否則不能初始化GPIO。然後導入RPi.GPIO模塊。以下整理了GPIO的常用的一些操作。
import RPi.GPIO as GPIO#導入GPIO模塊#GPIO操作 written by K2OGPIO.setmode(GPIO.BCM) #可選擇GPIO編號方式BCM或者BOARDGPIO.setup(GPIO_PIN, GPIO.OUT) #配置GPIO為輸出模式GPIO.setup(GPIO_PIN, GPIO.IN) #配置GPIO為輸入模式GPIO.output(GPIO_PIN,GPIO.HIGH) #指定某一個GPIO通道輸出高電平GPIO.output(GPIO_PIN,GPIO.LOW) #指定某一個GPIO通道輸出低電平GPIO.wait_for_edge(GPIO_PIN, GPIO.RISING) #輸入模式檢測上升沿#有關PWM written by K2Op = GPIO.PWM(channel,frequency) #創建一個 PWM 實例p.start(dc) #啟用 PWM(0.0 <= dc >= 100.0)p.ChangeFrequency(freq) #更改頻率p.ChangeDutyCycle(dc) #更改占空比p.stop() #停止 PWM#最後釋放GPIOGPIO.cleanup()
在第一次我使用PWM時是按照51單片機的經驗直接用循環來寫的,後來發現樹莓派有直接控制GPIO口輸出PWM信號的語句,非常的方便。樹莓派的GPIO編號有兩種方式,分別是BCM和BOARD,這裡我使用BCM編號。當然舵機的兩個電源線可以連接樹莓派的5V和GND(這裡要注意樹莓派通常的GPIO是3.3V),只有兩個引腳是5V輸出,信號線是可以使用3.3V來使用。連接如下圖:
如果真正做工程,電源最好不要從樹莓派上取,可以統一做一塊管理各個部分的電源的PCB。
在我的程序里我對舵機部分定義了一個叫做steer的類。
我的程序使用舵機的步驟
1、在使用時先實例化steer1。
2、然後使用方法steer1.start()。初始化舵機,包括了配置GPIO模式為OUT輸出,設定頻率為50Hz。對17引腳創建一個PWM實例,設置初始的占空比為7.5%(1.5ms高電平每周期),這時舵機回中。
def start(self): print("start is called") self.p = GPIO.PWM(self.channel, self.frequency)#創建一個 PWM 實例 self.p.start(self.dc)#啟用 PWM(0.0 <= dc >= 100.0) print("channel=%d, dc=%f, frequency=%d" %(self.channel,self.dc,self.frequency))
3、之後要舵機轉向使用方法steer1.turn(cd),需要參數cd,根據實際小車需求的角度,舵機的占空比範圍為5%~10%,turn(cd)中參數cd定為-2.5~2.5(對應5%~10%),0為回正,-2.5最左,2.5最右。實際可轉角度大約90°。
def turn(self, deg): if -2.5<=deg<=2.5: dc = deg +7.5 steer.duty(self, dc) else: rdeg = float(input("please input the steering angle again:")) print(rdeg) steer.turn(self, rdeg)def duty(self, dc): #dc = int(input("change dutycycle:")) if 5<=dc<=10: self.p.ChangeDutyCycle(dc)#更改占空比 else: rdc = float(input("please input the dutycycle valve again:")) print(rdc) steer.duty(self, rdc)
4、最後結束時使用方法steer1.stop(),舵機回中,調用PWM的方法stop()。
5、全部程序執行完後要使用GPIO.cleanup()釋放GPIO,否則會佔用GPIO,之後的程序再使用就會報錯。
小車整體連接(暫時)
推薦閱讀:
TAG:樹莓派RaspberryPi | 電子 | DIY |