MicroPython for ESP32 舵机控制详解
一、什么是舵机
舵机其实是一种伺服马达,是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。
目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
我们常见的舵机有180度及360度舵机,两种舵机的驱动略有不同。
二、180度舵机与360度舵机的核心区别
一)、转动范围与功能定位
-
180度舵机
- 角度控制:可精确旋转到 0°~180° 范围内任意指定角度,通过 PWM 脉宽直接映射目标位置。
- 应用场景:适用于需要精准定位的场景(如机械臂关节、摄像头云台)。
-
360度舵机
- 连续旋转:支持 无限制全周旋转,通过 PWM 信号控制 旋转方向与速度,而非固定角度。
- 应用场景:适合需持续运动的场景(如轮式机器人驱动、传送带控制)
二)、 控制信号与响应逻辑
参数 | 180舵机 | 360舵机 |
PWM脉宽范围 | 0.5ms - 2.5ms | 0.5ms - 2.5ms |
线性对应0° - 180° | 0.5ms 正转最大速度 | |
1.5ms停止 | ||
2.5ms反转最大速度 | ||
信号持续需求 | 需持续发送PWM信号以维持角度 | 仅需单次信号即可维持运动状态 |
三)、硬件设计与控制特性
-
闭环控制机制
- 180度舵机:内置电位器反馈,形成角度闭环控制,确保位置精度。
- 360度舵机:通过编码器或电流检测实现速度闭环,稳定转速但无法定位。
-
机械结构差异
- 限位设计:180度舵机内置机械限位防止超范围转动,360度舵机无物理限位。
- 扭矩特性:180度舵机通常扭矩更大(如 SG90 约 1.8kg·cm),适合负载定位;360度舵机更注重转速调节
三、舵机工作原理与控制方法
接下来我们以SG90 180度舵机为例讲解舵机工作原理与控制方法。
一)、工作原理
-
基准电压与信号调制
- SG90舵机内部设有基准电压,当外部PWM信号输入后,控制电路将信号与基准电压比较,生成直流偏置电压。
- 电压差通过电机驱动芯片驱动电机正转或反转,同时带动电位器旋转,直至电压差归零,电机停止转动,形成闭环反馈控制。
-
PWM信号的作用
- 舵机通过接收周期为20ms(频率50Hz)的PWM信号控制角度。
- 脉冲宽度在0.5ms~2.5ms范围内变化,对应舵机输出轴0°~180°的旋转角度。
-
核心组件协作
- 电位器:实时检测舵机位置并反馈至控制电路。
- 减速齿轮组:降低电机转速并提升扭矩,确保角度控制的精准性
二)、引脚定义
- 接线颜色与功能:
- 红色:电源正极(VCC,4.8~6V)
- 棕色:地线(GND)
- 橙色/黄色:PWM 信号输入(SIG)
- 线长:32cm(标准 JR 插头)
三)、与ESP32C3连接方法:
SG90 | ESP32 |
红色 | 5V VCC |
棕色 | GND |
橙色/黄色 | GPIO2 |
四)、控制方法
-
PWM信号参数要求
参数 数值/范围 周期 20ms(50Hz) 有效脉宽 0.5ms~2.5ms 角度分辨率 约0.9°~1.0°/μs -
典型角度与脉宽对应关系
角度 脉宽(ms) 0° 0.5 90° 1.5 180° 2.5
四、控制代码
通过前面的讲解,如何控制SG90舵机,相信大家都非常清楚了,直接上代码:
from machine import Pin,PWM
import timeservo = PWM(Pin(2),freq=50)def set_angle(angle):min_duty = 36max_duty = 140duty = int(min_duty + (max_duty - min_duty) *(angle / 180))servo.duty(duty)while True:for angle in range(0,181,10):set_angle(0)time.sleep_ms(200)for angle in range(180,-1,-10):set_angle(180)time.sleep_ms(200)
五、校准舵机的角度
运行上面的代码,舵机确实转动起来了,但很多时候,我们会发现,舵机的角度不对,这就需要我们校正舵机的角度。
舵机角度的校正,很多时候需要重复多次进行,需要一点点耐心。
1. 硬件基础检查
- 确保舵机接线正确(信号线→GPIO、电源线→5V、地线→GND),避免因接触不良或供电不足导致角度偏移。
2. 校准参数调整
舵机角度校准需通过调整 PWM占空比范围 实现,关键参数为 min_duty
(对应0°)和 max_duty
(对应180°):
- 默认参数:
若实际角度与设定角度偏差较大,需逐步调整这两个值:min_duty = 40 # 0.5ms脉冲(对应0°) max_duty = 115 # 2.5ms脉冲(对应180°)
- 手动测试:编写循环代码,逐步增大/减小占空比,观察舵机实际停止位置16。
- 公式修正:根据测试结果重新计算占空比范围,例如:
-
duty = min_duty + (max_duty - min_duty) * (angle / 180)
-
-
多次验证:重复测试0°和180°的极限位置,确保舵机不卡顿或抖动
3. 扩展校准技巧
- 电源干扰处理:若舵机抖动,需外接独立电源并确保GND共地。
- 机械限位调整:部分舵机可通过物理螺丝微调初始位置
4.校准代码
def calibrate(min_val,max_val):servo.duty(min_val)time.sleep(5)servo.duty(max_val)time.sleep(5)calibrate(36,140)