行き当たりばったり電子工作

昔の論理IC電子工作少年が、四苦八苦しながら現在の電子工作に挑戦する話。

ESP32でDCモーター制御(3)

はじめに

前回まででESP32でのモーター制御を確認しましたが、購入したモーターには回転数を読み取るホールセンサーがついているので、それについても少し実験してみます。実際にロボット戦車を組み立てるときに使うかどうかは決めていませんが、使い方だけでも確認しておきたいと思いました。

使ったもの

前回と変わらず。

  • D1 mini ESP32 ESP-WROOM-32
  • L298N DC モータドライバ
  • 4.7V~12.6V出力 最大10A 同期式昇圧型スイッチング電源モジュール
  • TXS0108E 双方向ロジックレベル変換モジュール

配線図

ESP32でDCモーター制御3 配線図

モーターの上から3本の線が出ていますが、これがホールセンサーの電源と信号線です。信号線(青)は1本しか書いていませんが、実際には90度ずらした2センサーが搭載されているので、本来は2本です。90度ずらすことで位相がずれて回転方向が分かるようになっているのですが、今回は回転方向は明確なので、1本だけ使って回転数のみ計測することにしました。センサーの動作電圧は5Vでした。

なお、この今回のモーターは1/75の減速ギヤ付きで、通販の説明では「9V/150RPM」と書いてあります。ホールセンサーは減速前のモーター軸に付いているので、計測値の1/75が出力軸の回転数になるはずです。

このセンサーからのパルスは軸1回転で1回なので、20秒間カウントして3倍し、それを75で割ることで、出力軸のRPMを求めることにします。

プログラム

static uint16_t cnt = 0;

void count(){
  cnt++;
}

void setup() {
  // 初期設定
  Serial.begin(9600);
  sleep(1);
  Serial.println ("Volt,RPM");
 
  pinMode (18, OUTPUT);
  pinMode (19, OUTPUT);
  pinMode (26, OUTPUT);
  
  // 割り込みの定義
  attachInterrupt(digitalPinToInterrupt(5), count, RISING);

  // PWM分解能とPWMチャネルの設定
  ledcSetup(0, 12000, 8);
  ledcAttachPin(26, 0);

  // 初期は回転せず、方向だけ設定
  ledcWrite (0,0);
  digitalWrite(18, LOW);
  digitalWrite(19, LOW);
}

void loop() {
  static unsigned long mtime;

  // 回転開始
  digitalWrite(18, HIGH);

  // PWMを5秒ずつ10上げていく
  for (int i=156; i<=256; i+=25) {
    // 電圧を変更して回転が安定するまで5秒待つ
    ledcWrite(0, i);
    delay(5000);
    
    // センサーで回転数をカウントする
    cnt=0;
    interrupts();
    mtime = millis();
    sleep(20);
    mtime = millis() - mtime;
    noInterrupts();

    // 回転数をシリアル出力
    Serial.print("Volt:" + String(9.0*i/256.0));
    Serial.print(",");
    Serial.println("RPM:" + String(cnt*60.0/(mtime/1000.0)/75.0));
  }

  // 停止して5秒まつ
  digitalWrite(18, LOW);
  delay(5000);
}

プログラムは単純で、徐々に電圧を上げながら、ピン5の割り込みで20秒間のパルス数をカウントして、50~53行目で電圧(9V換算)とを出力軸のRPMを計算して表示しています。なお電圧の値は、あくまでPWMによる制御の割合から算出しているので、実際にモーターに印加されている電圧を測っているわけではありません。実際に昇圧回路の出力側を測ったところ8.98Vになっていましたので、ほぼ9Vと考えて良いと思っています。モータードライバーで少し降圧されている可能性もありますが。

測定結果

測定結果のシリアルモニタとシリアルプロッタの表示は、以下のとおりです。

■シリアルモニタ

測定値

■シリアルプロッタ

測定値グラフ

シリアルプロッタは見づらいですが、X軸「3」が5.48V、「7」が9Vです。
これを見ると、8V超あたりまではリニアに回転数が上がっているのですが、最後の9Vで少し傾きが減っています。とはいえ、163RPMということは通販サイトに載っているスペック150RPM±10%には入っているようです。

定格あたりで少し回転数の増加率が下がるのかな?よくわかりませんが、とりあえず計測できたので、これで良しとしましょう。実際にリニアに制御したい場合には8Vまでにした方が無難なようです。ロボット戦車だと、そこまでの制御は不要な気がしますが。

ロボット戦車を組み立てたときに左右のモーターの回転数が個体差で違ってきそうであれば、センサーを使って同調させるかも知れません。まずは組み立ててから考えることにします。

ところでシリアルプロッタ。X軸を指定できるようにならないかなあ。X軸はVoltにしたいよねえ。