
このサーボは4.8VなんだけどとりあえずUSBの5Vで動かしてみた。
今回はサーボ用のライブラリを使わずにESP32のPWM(ledc)だけで動かしてみた。サーボの標準的な通信は20ms周期の中でHighの割合が0.5ms~2.4msの間で角度が変化するようになってるのでESP32のPWMタイマーを50Hzにセットして0.5msから2.4ms相当のDutyで制御してみた。
#define servoPin 21 //入力Pin設定
#define servoPWMch 0 //サーボ用PWMチャンネル(0-15)
#define servoMin 102 //サーボ最小角度 0.5ms / 20ms * 4096(12bit)
#define servoMax 492 //サーボ最大角度 2.4ms / 20ms * 4096(12bit)
void setup() {
Serial.begin(115200);
ledcSetup(servoPWMch, 50, 12);//PWMタイマ初期化 0ch,50Hz(20ms),12bit
ledcAttachPin(servoPin, servoPWMch);//PWMタイマに出力Pin割当
//ledcWrite(servoPWMch, servoMin);//最小角度にセット
}
void setServo(uint8_t servoIn){
uint16_t servoDuty = map(servoIn,0,255,servoMin,servoMax);//0-255で指定した角度をduty比に変換
ledcWrite(servoPWMch, servoDuty);//指定角度にセット
}
void loop() {
while (Serial.available() > 0)
{
char incomingCharacter = Serial.read();
int val;
switch (incomingCharacter)
{
case 's':
{
//Serial.print(incomingCharacter);
val = Serial.parseInt();
uint8_t servoOut = constrain(val, 0, 255);
setServo(servoOut);
Serial.println(val);
break;
}
case 'S':
{
Serial.println(incomingCharacter);
ledcWrite(servoPWMch, 0);//サーボオフ
break;
}
}
}
}
とりあえずこんな感じでシリアルコンソールでs0とかs255とか送れば0から255の間でサーボが0~180°の間で動いてくれる感じ。大文字のSを送るとPWM信号が止まるのでサーボもフリーになる。ledcWriteを使えばLEDの調光やDCモータ制御だけじゃなくてラジコンサーボも動かせちゃうの便利だなぁ。一応16ch分タイマはあるっぽいのでこの単純なプログラムだけで16ch分は動かせそう。


