Servo的使用,以SG90舵机为例
舵机控制说明 (Servo.h里时间单位都是微秒us,角度是°)
舵机通过脉冲宽度的时间
来控制(PWM
),频率是50Hz的(即一个周期是20ms)。(!!!脉宽是本质)
SG90舵机的控制参数范围是:0°: 0.5ms , 180°: 2.5ms
。
然后对于每一度,将脉宽范围除以180°即得。
servo.attach(GIO, pulse_width_min, pulse_width_max);
这里就可以设置上面的脉宽min和max(出于安全考虑,Servo的默认值是1000,2000,导致实际运行时并不是满的180°)
使用,实际就是设置脉宽:
servo.write(degree_OR_pulse_width_in_us);
当值<200时,参数为度数
,根据上面除法得到每度的脉宽然后内部设置对应脉宽(范围内);
超过200后,值代表脉宽
(范围内),直接写入脉宽,和servo.writeMicroseconds()
一样。
注意超出范围的值将被设为最低或最大值
舵机运行的实际脉宽:可用servo.read()
查看度数,servo.readMicroseconds()
查看实际脉宽。
总之,使用Servo的时候,要先确定自己舵机的pwm控制参数,然后在attach的时候设置好,才能得到对应的角度。
测试代码
#include <Servo.h>
Servo my_ser;
void setup()
{
Serial.begin(115200);
Serial.println();Serial.println();
my_ser.attach(2, 500, 2500); //将舵机信号连接到GPIO2, D4,设置高电平脉冲时间上下限(保证实际转动角度的参数)
my_ser.write(0);
delay(100);
}
//展示了脉宽变化和对应的实际脉宽
void loop()
{
//degree change
for (int i = 0; i < 200; i+=1) {
my_ser.write(i);
Serial.printf("i: %d\tdegree: %d\tpulse_width_us: %d\n", i, my_ser.read(), my_ser.readMicroseconds());
delay(200);
}
//pulse width change
for (int i = 200; i < 2600; i+=1) {
my_ser.write(i); //等价于my_ser.writeMicroseconds(i);
Serial.printf("i: %d\tdegree: %d\tpulse_width_us: %d\n", i, my_ser.read(), my_ser.readMicroseconds());
delay(200);
}
}
用analog直接控制脉冲
analogWriteFreq(freq);
:设置频率,一般50Hz
analogWriteRange(range);
:设置步长,即将一个周期分成多少份,使用时的单位就是份数了
analogWrite(PIN, value);
:将PIN的脉宽设为value份数。取值范围为(0, range),实际就是设置脉宽多少
#include <Servo.h>
const uint8_t servo = 2; //舵机在GPIO2
Servo my_ser;
void setup() {
Serial.begin(115200);
Serial.println();
analogWriteFreq(50); //设置频率为50Hz,即周期20ms
analogWriteRange(200); //将20ms分成200份,每份0.1ms
my_ser.attach(servo);
analogWrite(servo, 5); //初始化
delay(500);
analogWrite(LED_BUILTIN, 200);
delay(200);
}
void loop() {
for (int i = 5; i < 26; i++) {
analogWrite(servo, i);
Serial.printf("i: %d\tdegree: %d\tpulse_width_us: %d\n", i, my_ser.read(), my_ser.readMicroseconds());
delay(1000);
}
}
值得注意的是,输出始终为i: i可变 degree: 90 pulse_width_us: 1500
,而其它值不变,没试my_ser.write
,但是用analog就没什么必要了,且它的read
都不可用了的样子,值一直不变。
参考资料
代码里的Servo.h
另外,arduino常有不代码提示的问题,我看网上说好像要把项目放在设置里那个位置才行,不过有时候又可以,我又懒得放那,就没试了。
analog:[【万物皆可PWM!使用ESP8266驱动SG90舵机!】
标签:200,ESP8266,servo,舵机,Servo,my,ser From: https://www.cnblogs.com/faf4r/p/18106608