📂硬件
🔖硬件
2024-03-31 12:49阅读: 199评论: 0推荐: 0

ESP8266_Servo

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的时候设置好,才能得到对应的角度。

测试代码

copy
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
#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),实际就是设置脉宽多少

copy
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
#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舵机!】

本文作者:faf4r

本文链接:https://www.cnblogs.com/faf4r/p/18106608

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   faf4r  阅读(199)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起