範例八
控制伺服馬達
擴充板上最多支援八顆伺服馬達,ESP32 PWM 需使用 ledcWrite function 來寫 (以下範例),或自行外掛 ESP32Servo library 來用,可自行 google.
// 範例八:
// 驅動 ESP32 GYRO Shield 擴充板上的八組伺服馬達 SG90,需注意要使用外部電源才能提供充夠的電流
// 使用 GPIO32/33/25/26/4/16/5/19
// 需要的 library :
// FB : https://www.facebook.com/mason.chen.1420
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h" //disable brownout problems
#include "driver/rtc_io.h"
void servo_angle(int channel, int angle) // 使用 PWM 控制馬達轉動角度
{
// regarding the datasheet of sg90 servo, pwm period is 20 ms and duty is 1->2ms
int SERVO_RESOLUTION = 16;
float range = (pow(2,SERVO_RESOLUTION)-1)/10;
float minDuty = (pow(2,SERVO_RESOLUTION)-1)/40;
uint32_t duty = (range)*(float)angle/180.0 + minDuty;
ledcWrite(channel, duty);
delay(10);
}
int pos =0;
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
#ifdef debug
Serial.begin(115200);
#endif
ledcSetup(4, 50, 16);
ledcAttachPin(32, 4); // gpio32, channel 4
ledcSetup(5, 50, 16);
ledcAttachPin(33, 5);
ledcSetup(6, 50, 16);
ledcAttachPin(25, 6);
ledcSetup(7, 50, 16);
ledcAttachPin(26, 7);
ledcSetup(8, 50, 16);
ledcAttachPin(4, 8);
ledcSetup(9, 50, 16);
ledcAttachPin(16, 9);
ledcSetup(10, 50, 16);
ledcAttachPin(5, 10);
ledcSetup(11, 50, 16);
ledcAttachPin(19, 11);
servo_angle(4, 90);
servo_angle(5, 90);
servo_angle(6, 90);
servo_angle(7, 90);
servo_angle(8, 90);
servo_angle(9, 90);
servo_angle(10, 90);
servo_angle(11, 90);
}
void loop() {
for (pos=20; pos <=170; pos+=5) {
servo_angle(4, (pos));
delay(2);
servo_angle(5, (pos));
delay(2);
servo_angle(6, (pos));
delay(2);
servo_angle(7, (pos));
delay(2);
servo_angle(8, (pos));
delay(2);
servo_angle(9, (pos));
delay(2);
servo_angle(10, (pos));
delay(2);
servo_angle(11, (pos));
delay(2);
}
for (pos=170; pos >=20; pos-=5) {
servo_angle(4, (pos));
delay(2);
servo_angle(5, (pos));
delay(2);
servo_angle(6, (pos));
delay(2);
servo_angle(7, (pos));
delay(2);
servo_angle(8, (pos));
delay(2);
servo_angle(9, (pos));
delay(2);
servo_angle(10, (pos));
delay(2);
servo_angle(11, (pos));
delay(2);
}
}