一起玩儿物联网人工智能小车(ESP32)——32. 舵机控制Servo类详解
摘要:本文介绍ESP32 ESP32S2 AnalogWrite的详细使用说明
摘要:本文介绍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类控制舵机通常有以下几个步骤:
- Servo类实例化
- attach()绑定控制GPIO的引脚以及参数设置
- write()方法指定舵机运动角度
- read()方法返回舵机位置
- 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类常用的方法,在后边的开发中,可以根据自己的需要,选择合适的方法来实现相应的功能。
更多推荐
所有评论(0)