PWM舵机控制库是一个基于Arduino框架的ESP32驱动舵机的控制库,支持普通PWM舵机和乐幻索尔(Lobot)串行总线舵机。本库提供了简单易用的API,让您可以轻松控制各类舵机,实现精确的角度控制和平滑移动。
- 自动更新机制:无需在loop()中手动调用update()方法
- 丰富的控制接口:支持多种移动方式(即时、指定时间、平滑移动)
- 可自定义参数:可调整脉冲宽度(500-2500μs)以适配不同类型的舵机
- 角度范围可调:默认支持0-180度,可根据需求自定义
- 速度控制:可设置舵机移动速度,实现不同速度下的平滑转动
- 串行通信:通过串口与Lobot舵机控制板通信
- 多舵机控制:支持同时控制多个舵机
- 动作组功能:支持运行、停止、调速等动作组操作
- 电池电压监测:可读取控制板电池电压
- 舵机角度读取:支持读取舵机当前角度位置
- 控制器:ESP32系列(建议使用ESP32-S3等新型号)
- 舵机类型:
- 普通PWM舵机(SG90、MG995等)
- 乐幻索尔(Lobot)串行舵机(需配合其控制板)
- 供电:建议使用独立的舵机电源,避免干扰主控板
- 在PlatformIO项目中,打开
platformio.ini文件 - 添加本库作为依赖:
lib_deps = ESP32Servo - 重新构建项目
- 安装ESP32开发板支持
- 通过库管理器安装ESP32Servo库
- 将本项目代码复制到您的项目中
#include <Arduino.h>
#include "PWMServoController.h"
PWMServoController myservo; // 实例化普通PWM舵机控制对象
// 舵机连接的引脚
const uint8_t SERVO_PIN = 18; // ESP32-S3的GPIO18,根据实际连接修改
void setup() {
Serial.begin(9600);
Serial.println("PWM舵机控制示例开始");
// 初始化舵机,连接到指定引脚
myservo.init(SERVO_PIN);
// 调整脉冲宽度以适应更多种类的舵机
myservo.setPulseWidth(500, 2500);
// 启用自动更新(默认已启用)
myservo.setAutoUpdate(true);
}
void loop() {
// 不再需要调用myservo.update(),库会自动处理
// 以不同速度来回移动舵机
Serial.println("舵机移动到0度位置(慢速)");
myservo.moveServo(0, 2000); // 慢速移动到0度,用时2000毫秒
delay(3000); // 等待舵机移动完成并稍作停留
Serial.println("舵机移动到180度位置(快速)");
myservo.moveServo(180, 500); // 快速移动到180度,用时500毫秒
delay(1000); // 等待舵机移动完成并稍作停留
}#include <Arduino.h>
#include "LobotServoController.h"
LobotServoController controller(Serial2); // 使用Serial2与控制板通信
void setup() {
Serial.begin(9600);
Serial2.begin(9600); // Lobot控制板默认波特率
Serial.println("Lobot舵机控制示例开始");
delay(1000); // 等待串口初始化
}
void loop() {
// 单个舵机控制
controller.moveServo(1, 500, 1000); // ID为1的舵机移动到500位置,用时1000ms
delay(2000);
// 多个舵机同时控制
LobotServo servos[3];
servos[0].ID = 1;
servos[0].Position = 500;
servos[1].ID = 2;
servos[1].Position = 600;
servos[2].ID = 3;
servos[2].Position = 700;
controller.moveServos(servos, 3, 1000); // 3个舵机同时移动,用时1000ms
delay(5000);
}| 方法 | 描述 |
|---|---|
init(uint8_t pin) |
初始化舵机,连接到指定引脚 |
setPulseWidth(uint16_t minPulse, uint16_t maxPulse) |
设置舵机的脉冲宽度范围 |
setAngleRange(uint16_t minAngle, uint16_t maxAngle) |
设置舵机的角度范围 |
moveServo(uint16_t angle, uint16_t time) |
在指定时间内将舵机移动到目标角度 |
moveServoSmooth(uint16_t targetAngle, uint16_t speed) |
以指定速度平滑移动舵机到目标角度 |
moveServoImmediate(uint16_t angle) |
立即移动舵机到指定角度 |
detachServo() |
断开舵机连接,停止PWM信号 |
getServoPos() |
获取舵机当前角度 |
setSpeed(uint16_t speed) |
设置舵机的默认移动速度 |
update() |
更新舵机位置(使用自动更新时通常不需要调用) |
setAutoUpdate(bool enable) |
设置是否启用自动更新 |
| 方法 | 描述 |
|---|---|
moveServo(uint8_t servoID, uint16_t Position, uint16_t Time) |
控制单个舵机转动 |
moveServos(LobotServo servos[], uint8_t Num, uint16_t Time) |
同时控制多个舵机转动 |
runActionGroup(uint8_t NumOfAction, uint16_t Times) |
运行指定的动作组 |
stopActionGroup(void) |
停止当前运行的动作组 |
setActionGroupSpeed(uint8_t NumOfAction, uint16_t Speed) |
设置指定动作组的运行速度 |
setAllActionGroupSpeed(uint16_t Speed) |
设置所有动作组的运行速度 |
getBatteryVoltage(void) |
获取电池电压 |
getServosPos(uint8_t numOfServos, ...) |
获取指定舵机的位置 |
- 电源供应:舵机运行时电流较大,建议使用独立电源供电
- 接线检查:使用前检查舵机信号线、电源线连接是否正确
- 更新机制:PWM舵机控制器默认启用自动更新,无需在loop()中手动调用update()
- 角度限制:为避免损坏舵机,确保设置的角度范围在舵机的机械限位内
- ESP32兼容性:本库针对ESP32进行了优化,使用其他平台可能需要修改
本项目采用MIT许可证开源。
- ESP32Servo库
- 乐幻索尔(Lobot)官方技术支持
- v1.0.0 (2025.04.09) - 首次发布,支持PWM舵机和Lobot舵机控制