鹹魚ZTMR實例—舵機
主控板:ZTMR開發板
SG90舵機
範圍180°(-90°~90°)
舵機是一種位置(角度)伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。目前在高檔遙控玩具,如航模,包括飛機模型,潛艇模型;遙控機器人中已經使用得比較普遍。舵機是一種俗稱,其實是一種伺服馬達。
引腳說明
引腳 | 說明 |
---|---|
暗灰(棕色) | GND |
紅色 | 5V |
橙色 | X1 |
舵機用法
from pyb import Servo
用法 | 說明 |
---|---|
s1=Servo(1) | 使用X1控制(X1,VIN,GND) |
s1.angle(45) | 轉到45° |
s1.angle(-60,1500) | 1500ms內轉到-60° |
s1.speed(50) | 以速度50繼續轉動 |
# main.py -- put your code here!
from pyb import Servo
s1=Servo(1) #使用X1控制
s1.angle(45) #轉到45°
s1.angle(-60,1500) #1500ms內轉到-60°
原理及代碼說明鹹魚硬件—舵機Servo
例程1:用戶按鍵USER控制舵機轉動,並在串口中顯示轉動角度
# main.py -- put your code here!
from pyb import Servo,Switch
sw = Switch() #定義按鍵對象名字爲sw
s1 = Servo(1) #構建舵機對象s1,輸出引腳爲X1
#定義7組角度:0,30,60,90,-30,-60,-90
angle=[0,30,60,90,-30,-60,-90]
key_node = 0 #按鍵標誌位
i = 0 #用於選擇角度
def key():
global key_node
key_node = 1
sw.callback(key) #記錄按鍵
#X1指定角度,啓動時i=0,默認0°
s1.angle(angle[i])
while True:
if key_node==1: #按鍵被按下
i = i+1
if i == 7:
i = 0
key_node = 0 #清空按鍵標誌位,迴歸到0°
s1.angle(angle[i]) #X1指定角度
print(angle[i])#打印X1角度
串口顯示效果
之前講過PWM,試着用佔空比來實現
控制舵機的PWM波是一種方波,頻率爲50Hz,週期即其倒數:20ms,在每個週期裏面,高電平佔0.5ms到2.5ms之間。0.5ms代表的是0度,2.5ms代表的是180度,其他的度數可以按比例換算。
PWM(脈寬調製模塊)
from pyb import Pin,Timer
p = Pin('X1')
ti = Timer(2,freq=1000) #X1是定時器2的CH1
ch = ti.channel(1,Timer.PWM,pin=p) #設置PWM引腳
ch.pluse_width_precent(50) #設置PWM輸出佔空比
舵機的控制一般需要一個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度;
例程2:用戶按鍵USER控制舵機轉動,並在串口中顯示轉動角度
from pyb import Pin, Timer, Switch
i = 7.5 # 20ms內的0.5-2.5換成百分比形式就是2.5%-12.5%。7.5即爲中間。
sw = Switch() # 初始化用戶按鍵
p = Pin('X1')
ti=Timer(5,freq=50)
ch1=ti.channel(1,Timer.PWM,pin=p) #X1爲PWM輸出
while True:
swt=sw()
if swt:
i += 0.01
pyb.udelay(1000) # 延時1000us,減點速
if i > 12.4:
i = 12.4
else:
i -= 0.01
pyb.udelay(1000)
if i < 2.6:
i = 2.6
ch1.pulse_width_percent(i) # 控制佔空比,
print(i)
按住USER按鍵看效果