2019年7月27日土曜日

ESP32でラジコンサーボを動かしてみた

ESP32でTower ProのSG92Rっていうマイクロサーボを動かしてみた。秋月とかでも結構お安く売っている。Aliexpressだと一個250円ぐらいかも。

このサーボは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 件のコメント:

コメントを投稿