【micropython】TPYBoardV10X控制舵机实验
原创版权归山东萝卜科技有限公司所有,转载必须以链接形式注明作者和原始出处。
0引言
大家应该都看到过机器人的手臂啊腿脚啊什么的一抽一抽的在动弹吧...是不是和机械舞一样的有节奏,现在很多机器人模型里面的动力器件都是舵机。
但是大家一般见到的动力器件都是像步进电机啊,直流电机啊这一类的动力器件了,应该对舵机比较陌生,下面就为大家介绍一下舵机的原理和使用方法吧。要想使用一个器件呢,必须要了解它的特性和原理。那下面就先来介绍一下原理吧。
先说一下舵机有什么优点:一是体积紧凑,便于安装;二是输出力矩大,稳定性好;三是控制简单,便于和数字系统接口。本文中使用的是sg90的舵机,个人感觉性能一般,但是比较稳定和耐造,个人做实验用还是比较不错的。
1.舵机基本介绍:
1.1舵机的组成与参数
先抄一段说明:舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。有的可以转到185度。
舵机结构图
1.2舵机的接线
舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同。
1.3舵机的控制原理
舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比(1. 占空比是指高电平在一个周期之内所占的时间比率。2. 正脉冲的持续时间与脉冲总周期的比值。例如:正脉冲宽度1μs,信号周期10μs的脉冲序列占空比为0.1。即:脉冲的宽度除以脉冲的周期称为占空比。)来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。
2.Python语言控制舵机的方法
其实说了以上这些呢,都是为了给大家介绍利用Python语言来控制舵机的转动角度,和普通单片机一样的,都是需要用不同宽度的脉冲来控制器转动的角度。说白了,我们需要做的就是使用Python语言来输出不同宽度的脉冲信号,来给到信号线里面去。现在一般的舵机脉宽呢都是在0.5ms到2.5ms之间,这就可以计算了,0.5MS-2.5MS这两毫秒里面呢可以控制转动到180度,这样算下来,转一度的脉冲时间大约就是2毫秒/180度=0.011毫秒/度,这样依次计算就可以了。剩下的就是写一个脉冲信号了,相信写脉冲信号的程序大家都很熟悉啦。
但是,在舵机里面有一些几点几的毫秒的延时脉冲,这个在Python语言里如果想要利用delay()函数来做延时的话,很难做到每个角度都可以转到,甚至说是很难做到转动到大多数的角度。所以,你需要找到一个比毫秒延时还要精确的延时函数来作为脉冲的计时延时函数。我现在用的是time.sleep(i)这个函数,这个函数里面的i,建议设置在0.0000-0.0035之间。不能说精确的转动到每个角度吧,但是百分之九十的角度都是可以转到。如果想让舵机进行循环摆动,一定要记得加上适当的延时,因为程序可以飞快的跑,但是舵机转动也是需要一点时间的。舵机转动时间肯定要比程序跑一遍的时间要长的多啦。
3、TPYBoard v102控制舵机实验
3.1实验目的
通过加速度传感器的X方向控制舵机的转动,让舵机随TPYBoard 的转动而转动
3.2实验材料
1、TPYBoard v102 开发板 1 块
2、sg90舵机 1个
3、杜邦线 若干
3.3实验线路图
这里电路图很简单,只需要给舵机接上VCC和GNG(这是最基本的,这个开发板上好多电源和地可以用)。然后把舵机的信号线接到任意一个GPIO口(后面程序里面要在这个GPIO往外输出脉冲的,我用了X1,还有很多其他的GPIO口可以用。)就可以了。先上一张原理图,只是一张模拟的结构图哈。
是不是很抽象?下面上一张图,大家可以秒懂啦。
3.4实验代码
注意:实验中用0做了x的分界点,有的开发板,x的范围可能在11-31不等,所以这个分界点,可以在实验中自己取值。
import pyb import time from pyb import Pin xlights = (pyb.LED(2), pyb.LED(3)) ylights = (pyb.LED(1), pyb.LED(4)) M0 = Pin('X1', Pin.OUT_PP) accel = pyb.Accel() i=0.0001 j=0.0000 while True: x = accel.x() print("x=") print(x) Y=x+20 M0.high() time.sleep(i*Y) M0.low() time.sleep(i*Y) pyb.delay(12) if x > 0: xlights[0].on() xlights[1].off() elif x < 0: xlights[1].on() xlights[0].off() else: xlights[0].off() xlights[1].off()
在micropython中也有封装的Servo(舵机)类库,详细说明见:
http://docs.tpyboard.com/zh/latest/library/pyb.Servo/?highlight=servo
3.5实验效果演示
http://v.youku.com/v_show/id_XMTY1MzE5ODIyOA==.html
虽然舵机只是能实现转动指定的角度,看起来功能很单一,但是单一的功能结合起来,就能完成很复杂的任务。