咸鱼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按键看效果