このサーボは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分は動かせそう。
0 件のコメント:
コメントを投稿