2019年5月18日土曜日

ESP32とBTS7960でモータを回してみた

前回はBTS7960の動作確認と熱対策をして、仕様を調べるところまでで終わってしまったので、今回はArduinoからPWMを出してモータを回してみた。
ArduinoのボードとしてはESP32搭載ボードを使用してみることに。これならPWMの周波数も高くできるし。Arduino UNOでも分周比を変えれば周波数を高められるんだけどちょうどほしいところができなさそう。BTS7960が25kHzまでだったので、20kHzぐらいで使いたいし。

とりあえずシリアルコンソールからコマンドを打ってPWMのDutyを変更できるようにしてみた。ESP32でPWMを使う場合はanalogWriteではなくてledcWriteを使うんだけど、これだとベース周波数も変更できるし、解像度も8ビット以外が使えるので便利。
周波数は20kHz、解像度は10bit(0~1023)にしてみた。
//ピンアサイン
#define EN 19
#define LPWM 22
#define RPWM 23

void setup() {
  //PWMタイマ設定
  ledcSetup(0, 20000, 10); //ch0,20kHz,10bit
  ledcSetup(1, 20000, 10); //ch1,20kHz,10bit

  //PWMタイマに出力PIN関連付け
  ledcAttachPin(LPWM, 0);
  ledcAttachPin(RPWM, 1);

  //ENピン初期化
  pinMode(EN, OUTPUT);

  //Serial初期化
  Serial.begin(115200);
}

void loop() {
  if (Serial.available() > 0) { // check serial
    char in = Serial.read();
    if (in == 'k') {
      digitalWrite(EN, LOW);
      Serial.println("Stop Motor");
    }else if(in == 'p'){
      int input = Serial.parseInt();
      Serial.println(input);
      Serial.println("PWM control");
      setMotor(input);
    }
  }
}

void setMotor(int pwm) {
  if (pwm == 0) { //ブレーキ
    digitalWrite(EN, HIGH);
    ledcWrite(0, 1023);
    ledcWrite(1, 1023);
  } else if (pwm > 0 && pwm <= 1023) {
    digitalWrite(EN, HIGH);
    ledcWrite(0, pwm);
    ledcWrite(1, 0);
  } else if (pwm < 0 && pwm >= -1023) {
    digitalWrite(EN, HIGH);
    ledcWrite(0, 0);
    ledcWrite(1, abs(pwm));
  }
}

ESP32とは19にL_ENとR_ENをどっちも接続し、22にLPWM、23にRPWM、VCCに3.3V、GNDにGNDを繋ぐ。今回はまだ電流フィードバックを試せる状態にしていないのでISはどっちも繋がなくてオッケー。(ISの抵抗変えないと危ないし、ローパスフィルタとか入れないといけないかも。)

サンプルプログラムを書き込んだらシリアルコンソールからbaudrate 115200で
p512とかp-512って打つとモータが回るはず。kを送信するとスタンバイモードになって、p0とかにすればブレーキが掛かるはず。ブレーキはオン抵抗が小さいハイサイドにしてみた。

ESP32は何も考えなくてもPWMの周波数をいい感じに設定できるから便利だなぁ
ただしちょっとADが使いにくそうな感じがする。バッテリモニタとかにならいいけど、下の方と上の方の精度が悪そう。

まぁ何にせよフィードバックなしでは簡単にモータが回せるのでBlynkとかと併用すればWiFiとかBluetoothのラジコンが簡単に作れちゃうな。

0 件のコメント:

コメントを投稿