舵机是一种精密控制类电动机,也是电动机的一种,它的主要作用是旋转到某一指定位置,在机器人领域使用得相当的广泛,用来实现各种机械臂和机器人关节的运动。
舵机的原理图如下所示:一、不同舵机的差异
1. 扭矩:
舵机的扭矩决定了它能驱动的负载大小,是选型时的重要指标。扭矩越大,能承受的外部负载就越强。
2. 工作角度:
舵机的控制角度范围影响其在机械系统中的适用性。有些舵机能提供180度的角度控制,而有些则能提供360度或更多,这需要根据应用需求来选择。
3. 速度:
转速由舵机无负载情况下转过一定角度所需时间来衡量,与马达类型、电压、齿轮箱减速比等因素有关。快速响应的应用场合需要选择转速快的舵机。
4. 通讯协议:
不同的舵机可能支持不同的通讯协议,如PWM或总线控制信号。PWM舵机需要持续输入信号,而总线舵机具有保持功能,可以按需求选择适合的通讯方式。
5. 工作电压:
舵机的工作电压直接关系到其动力输出和能耗,需要根据系统供电情况和能耗要求进行选择。
6. 外壳及齿轮材质:
外壳和齿轮的材质会影响舵机的耐用性和重量。金属齿轮通常更耐用但会增加重量,塑料齿轮则相反。
7. 尺寸:
根据安装空间和机械设计的需求,选择合适尺寸的舵机至关重要。
8. 马达类型:
不同类型的马达(如直流电机、步进电机等)有不同的特性,例如步进电机可以提供精确的位置控制。
9. 配件:
舵机的配件,如线缆长度、连接器类型也需要考虑,以便与现有系统兼容。
10. 可靠性指标:
对于设备中使用的舵机,除了基本的动力性能外,还要关注寿命、稳定性、一致性、噪音和耐高低温等可靠性要求。
二、如何控制舵机工作
1.控制原理
当舵机收到某个范围内的脉冲信号后,会依据该脉冲的宽度,转到相应的位置。直到下一个控制脉冲来临之前,该舵机的位置均不会发生改变。输入的控制脉宽与舵机的角度之间的关系如下图所示:
360度舵机通常无限位器,所以可以连续旋转。360度舵机的控制通过20ms的脉冲来进行控制(高电平宽度不大于2.5ms)当脉冲高电平宽度在1.5ms附近时,360度舵机停止运动,当脉冲高电平宽度大于1.5ms时,舵机为正转状态,高电平时长越长,电机转速越快。当脉冲高电平时长小于1.5ms时,舵机为反向转动状态,高电平时间越短,电机转速越快。
2.引脚
舵机的三个引脚:电源+、电源GND和信号线。
3.代码
1.180度舵机
//驱动180读舵机 安装ServoESP32库
//接线 棕色 负极 红色 5V 橘黄色 信号线 D4
//安装库 ServoESP32
//控制舵机正传180度 反转180度
#include <Servo.h>
static const int servoPin = 4;
Servo servo1;
void setup() {
Serial.begin(115200);
servo1.attach(servoPin);
}
void loop() {
for(int posDegrees = 0; posDegrees <= 180; posDegrees++) {
servo1.write(posDegrees);
Serial.println(posDegrees);
delay(20);
}
for(int posDegrees = 180; posDegrees >= 0; posDegrees--) {
servo1.write(posDegrees);
Serial.println(posDegrees);
delay(20);
}
}
2.360度舵机
#include <Arduino.h>
int t = 100;
int channel_PWM = 3; //使用3号通道 定时器1 总共16个通道
// 舵机频率,那么周期也就是1/50,也就是20ms ,PWM⼀共有16个通道,0-7位⾼速通道由80Mhz时钟驱动,后⾯8个为低速通道由1Mhz
int freq_PWM = 50; //50HZ pwm波
// PWM分辨率,取值为 0-20 之间 ,这⾥填写为10,那么后⾯的ledcWrite 这个⾥⾯填写的pwm值就在 0 - 2的10次⽅ 之间 也就是 0-1024,如果是要求不⾼的东西你可以直接拿1000去算了
int res_PWM = 10; //分辨率 0-1024 共1025
const int PWM_PIN = 4; //使用4号引脚
void setup() {
ledcSetup(channel_PWM,freq_PWM,res_PWM); //设置通道
ledcAttachPin(PWM_PIN,channel_PWM); //将引脚绑定到通道上
}
//正传t秒 停止t秒 反转t秒 停止t秒 循环...
void loop() {
ledcWrite(channel_PWM,52); //20ms⾼电平为1ms左右 ,也就是1/20*1024 = 52,此时360度舵机正传5秒
delay(t);
ledcWrite(channel_PWM, 77); //20ms⾼电平为1.5ms左右 ,也就是1.5/20*1024 = 77,此时360度舵机⼏乎停转
delay(t);
ledcWrite(channel_PWM, 102); //20ms⾼电平为2ms左右 ,也就是2/20*1024 = 102,此时360度舵机反转
delay(t);
ledcWrite(channel_PWM, 77); //20ms⾼电平为1.5ms左右 ,也就是1.5/20*1024 = 77,此时360度舵机⼏乎停转
delay(t);
//ledcDetachPin(PWM_Pin); //这个是解除IO⼝的pwm输出功能模式
}