玩转物联网人工智能小车(ESP32)——详解舵机控制Servo类

摘要:本文介绍ESP32 ESP32S2 AnalogWrite的详细使用说明

在Arduino IDE中的类库中,虽然已经提供了Servo类来实现对舵机的控制。但是其本身所提供的Servo类并不支持ESP32系列处理器,它所支持的处理器有:AVR,SAM,SAMD,NRF52和STM32F4。如果不是这几种处理器,则需要使用第三方的库来实现此功能。

下面就来打开Arduino IDE的库管理器。在搜索框中输入“esp32 servo”,选择安装下面的“ESP32 ESPS2 AnalogWrite”库来实现对舵机的控制,如下图所示:

单击“安装”就可以将这个类库安装到本机了。之后在需要使用到Servo类的文件头部增加语句“#include <Servo.h>”后,就可以直接使用Servo类了。

Servo类控制舵机通常有以下几个步骤:

  1. Servo类实例化
  2. attach()绑定控制GPIO的引脚以及参数设置
  3. write()方法指定舵机运动角度
  4. read()方法返回舵机位置
  5. detachPin()方法释放绑定的GPIO引脚

ESP32 ESP32S2 AnalogWrite库除了提供了Servo类实现对舵机的控制,还提供了通用的输出PWM、控制LED亮度、蜂鸣器发生等不同用处的PWM波输出功能。

这个Servo类要比Arduino IDE内置的Servo类强大得多,在这里只介绍Servo类中一些常用的方法。

在这里主要讲解即将用到的Servo类的常用方法。

1. Servo对象实例化

Servo提供了无符号构造函数,实例化方法如下:

Servo myservo = Servo();

2. attach()方法

这个方法用来绑定PWM波形输出的引脚,设置舵机的参数以及其他一些个性化输出PWM的参数。为了使用的方便,类库的开发者提供了多种参数组合的设置方法。具体如下所示:

myservo.attach(pin)

myservo.attach(pin, invert)

myservo.attach(pin, ch)

myservo.attach(pin, ch, invert)

myservo.attach(pin, minUs, maxUs)

myservo.attach(pin, ch, minUs, maxUs)

myservo.attach(pin, ch, minUs, maxUs, invert)

myservo.attach(pin, minUs, maxUs, speed, ke)

myservo.attach(pin, ch, minUs, maxUs, speed, ke)

myservo.attach(pin, ch, minUs, maxUs, speed, ke, invert)

这些函数的参数说明如下:

pin(int):输出PWM波形的引脚,也就是控制舵机旋转的引脚。

ch(int):指定输出PWM使用的通道,这是一个可选参数,无此参数,系统会自动分配一个闲置的通道。

minUs(int):以180度舵机为例,这个参数是使舵机运动到0度位置的脉冲时间。

maxUs(int):以180度舵机为例,这个参数是使舵机运动到180度位置的脉冲时间。

speed(double):舵机转动的速率。其单位是度/秒,也就是舵机每秒转动的角度。例如一个舵机的转动速度为100度/秒,那么当它从0度转到180度就需要1.8秒。

ke(double):舵机的标准的s曲线模型常数。这个参数的取值范围在0~1.0之间,当ke=0时,意味着舵机是线性匀速转动,当ke=1.0时,则意味着舵机在瞬间就可以转到指定的位置,会忽略舵机转动的速度(缺省值为1.0)。

invert(bool):输出PWM波形反向。也就是高低电平互换。这个参数主要用于舵机需要用到前置NPN三极管或者N沟道MOSFET驱动的时候。

这个函数的返回值为一个单字节整数(uint8_t类型)。其定义如下:

254:pin参数非法。

253:存在空闲通道。

0~15:如果绑定成功,返回使用的通道号。

255:没有绑定成功。

3. write()方法

这个方法用来控制舵机的旋转。可供使用的方法如下:

myservo.write(pin, value)

myservo.write(pin, value, speed, ke)

其中的pin、speed和ke参数在前面已经解释过了,这里解释以下value参数的含义。value参数是一个float类型的变量,根据其范围不同,含义有所不同,具体含义如下表所示:

传入的value值(float)

实际使用的value值(float)

单位

小于0

0

0-180

0-180

大于180并且小于500

180

大于等于500并且小于舵机最小脉冲时长(毫秒)

舵机最小脉冲时长(毫秒)

毫秒

舵机最小脉冲时长到舵机最大脉冲时长

舵机最小脉冲时长到舵机最大脉冲时长

毫秒

大于舵机最大脉冲时长

舵机最大脉冲时长

毫秒

通过上表可以看出,给这个write()方法传入的value值小于500的时候,被认为时转动的角度,大于500的时候,被认为是控制舵机转动脉冲的宽度(毫秒时长)。

这个write()函数的返回值分两种情况,一种是当ke=1.0时,其返回值为输出PWM波形的占空比率。当ke在0指1.0之间时,其返回值为舵机转动的时间。

4. writeMicroseconds()方法

这个函数使用脉冲宽度时间来控制舵机的运动。其内部就是调用的write()方法。

5. read()方法

这个方法用来返回舵机的位置,其返回值为角度,返回值的范围是0~180度。

6. readMicroseconds()方法

用于返回控制到当前位置的脉冲宽度的毫秒数。

7. detachPin()方法

这个方法用来断开PWM通道与GPIO引脚之间的绑定关系,用来释放GPIO引脚。

这就是Servo类常用的方法,在后边的开发中,可以根据自己的需要,选择合适的方法来实现相应的功能。

作者:一起玩儿科技

物联沃分享整理
物联沃-IOTWORD物联网 » 玩转物联网人工智能小车(ESP32)——详解舵机控制Servo类

发表评论