範例八

控制伺服馬達

擴充板上最多支援八顆伺服馬達,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);

}

}