玩转物联网人工智能小车(ESP32)——26. 学习舵机的使用方法

摘要:本文介绍舵机的使用方法

在前面介绍TT马达的时候,提到过舵机。舵机是一种精密控制类电动机,也是电动机的一种,它的主要作用是旋转到某一指定位置,在机器人领域使用得相当的广泛,用来实现各种机械臂和机器人关节的运动。

下面就来了解一下舵机的工作原理。在前面知道TT马达是由电动机和减速箱组成,而舵机为了精确控制电机的旋转角度,因此,在普通马达和减速箱的基础上增加了用于测量角度的角度传感器以及控制电机旋转的控制电路。这样,控制电路在电机旋转的过程中,通过角度传感器来得到当前电机已经旋转的角度,从而保证其可以在指定的位置停止。这个角度传感器最简单的就是使用一个可调电位器来实现,通过接入电路的电阻来计算出电位器滑片所在的位置。舵机的原理图如下所示:

下图为目前在玩具、航模中最经常使用的小型舵机。不同的舵机之间的差别主要体现在齿轮材质、旋转扭矩和旋转角度的不同。

舵机齿轮的材质通常有塑料和金属两种,很明显,金属的舵机齿轮不易磨损、精准度更高一些,成本也略高,缺点是重量略重。舵机的旋转角度是指它能旋转的最大范围,通常有90度版,180度版和360度版,其中无限位器的360度版舵机是可以连续旋转的。

下面来了解一下是如何控制舵机工作的。控制舵机旋转需要一个20毫秒的脉冲信号,该信号的高电平部分决定着舵机旋转到哪个位置。对于180度的舵机而言,要求该脉冲信号的高电平的时长为0.5ms~2.5ms之间,对应舵机度盘的角度为0~180度,两者之间呈线性关系。也就是说,当舵机收到某个范围内的脉冲信号后,会依据该脉冲的宽度,转到相应的位置。直到下一个控制脉冲来临之前,该舵机的位置均不会发生改变。

下面,将可旋转范围的中间位置设置为0度,那么180度舵机的旋转范围就是正负90度,输入的控制脉宽与舵机的角度之间的关系如下图所示:

对于360度舵机而言,通常是无限位器的,那么360度舵机是可以连续旋转的,因此不能用一个脉冲来指定360度舵机运动到指定的位置。此时的舵机更像是一个具有闭环控制,速度稳定的减速电机。360度舵机的控制也是通过20ms的脉冲来进行控制(高电平宽度不大于2.5ms),只不过脉冲宽度的含义不同。当脉冲高电平宽度在1.5ms附近时,360度舵机停止运动,当脉冲高电平宽度大于1.5ms时,舵机为正转状态,高电平时长越长,电机转速越快。当脉冲高电平时长小于1.5ms时,舵机为反向转动状态,高电平时间越短,电机转速越快。

下面来看一个常见的SG90型号的舵机的电器参数:

尺寸:

21.5mmX11.8mmX22.7mm

重量:

9克

无负载速度:

0.12秒/60度(4.8V) 0.002s/度

堵转扭矩:

1.2-1.4公斤/厘米(4.8V)

使用温度:

-30~~+60摄氏度

死区设定:

7us (7MHZ)

工作电压:

4.8V-6V

转动角度:

180度(左90,右90)

结构材料:

塑料齿

位置等级:

1024级

脉冲控制精度:

2us

舵机模块有三个引脚,分别是电源+、电源GND和信号线。如下图所示:

线缆的颜色也可能是:红色(正极)、棕色(地线)和橙色(信号线),不同生产厂家使用线缆的颜色不同。

下面就把舵机接到ESP32芯片的开发板上,用程序来驱动舵机转起来。舵机的供电可以使用ESP开发板上的5V输出,信号线我接到了P23引脚。打开Mixly,选择“Audrino ESP32”,舵机功能位于Mixly的“执行器”功能模块组中。第一个程序来实现将舵机转动到30度的位置。设置好后如下图所示:

接下来就可以上传运行了,看看是不是可以将舵机控制到指定位置了?注意,设置一个舵机动作之后,一定要留一段时间的延时,让舵机有一个动作的时间。如果,舵机连续收到指令而来不及动作,就有可能在原地摆动,或者不动。

下面来实现一个更复杂的功能,让舵机在0~180度的范围内连续摆动。这样,如果将来把超声波测距传感器装到舵机上,就可以实现在180度的范围内,连续测量周边障碍物的距离,为实现避障小车打下了基础。

首先声明两个全局变量,一个是degree,表示需要舵机转到哪个角度,初始为90度,也就是在中间位置。另一个是step,表示每次舵机转动几度,默认step为5。

然后是编写初始化功能,初始化功能的任务就是让舵机恢复到初始90度的位置。如下图所示:

接下来就是主功能函数了,它要实现的功能是让舵机在0~180度内一次旋转,主要需要完成以下工作。

  1. 将舵机转到degree指定的位置。
  2. 计算下一步应该转到的位置,令degree编程degree+step。
  3. 判断是不是马上到一端终点了,如果到终点了,就让step变成其相反数,这样degree就会朝着相反的方向变动了。

实现后的程序如下所示:

这样,就可以实现舵机以5度为步长,在0~180度内来回旋转了。最后看一下Mixly生成的源代码。

#include <ESP32_Servo.h>

volatile int degree;

volatile int step;

Servo servo_23;

void setup(){

  degree = 90;

  step = 5;

  servo_23.attach(23,500,2500);

  servo_23.write(90);

  delay(1000);

}

void loop(){

  servo_23.write(degree);

  delay(100);

  degree = step + degree;

  if (degree >= 180 || degree <= 0) {

    step = 0 – step;

  }

}

通过代码可以看到,Arduino将舵机的操作封装成了Servo对象。Servo对象使用attach()方法初始化输出舵机控制脉冲的引脚和0度以及180度脉冲对应的高电平时长。然后调用其write()方法就可以将舵机旋转到指定的角度了。

下面来看一下在MicroPython中是如何使用舵机的。在MicroPython中,明确将舵机分成了180度和360度两种,180度的舵机可以指定旋转的角度而360度舵机则可以指定旋转的速度。这比C语言的控件要考虑得更周全些。具体使用方法如下:

生成的代码如下:

import servo

servo.servo180_angle(26,100)

只是简简单单的一行程序就实现了控制舵机转动到指定位置的功能。

在这里,再介绍一个Mixly的功能,这个功能是Python环境所特有的,就是可以随时输入Python程序并执行。这主要是因为Python是一种解释语言,不需要编译,在执行的时候,就是边执行,边解释。具体的使用方法是在COM输出窗口中的“>>>”提示符后面直接输入要执行的Python代码,回车之后,该代码就被自动的执行了。如下图所示:

有了这个功能,就让我们在执行Python程序的时候,可以随时的分步执行,随时的输出各种调试信息和状态信息,是非常非常方便的一个功能。

物联沃分享整理
物联沃-IOTWORD物联网 » 玩转物联网人工智能小车(ESP32)——26. 学习舵机的使用方法

发表评论