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

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

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

はじめに

前回はモーターの回転の向きを変えてみましたが、今回はモーターの回転数を変えながら動かしてみます。使ったものと配線図は変更ありません。

使ったもの

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

配線図

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

(モーターから上に出ている3本の線はホールセンサーの電源と信号線ですが、今回は使っていません)

前回も書きましたが、モータードライバへの入力は

  • IN1=LOW, IN2=LOW --- 停止
  • IN1=HIGH, IN2=LOW --- 正回転
  • IN1=LOW, IN2=HIGH --- 逆回転
  • IN1=HIGH, IN2=HIGH --- ブレーキ

になっています。

これに加えて、今回はENA端子(黄色線)を使います。ここをPWM信号で0Vから5Vまで変化させると、それによってモーターの回転数が変わります。

つまり、IN1とIN2で回転の向きを決め、ENAによって回転数が決まることになります。

プログラム

void setup() {
  // 初期設定
  Serial.begin(9600);

  pinMode (18, OUTPUT);
  pinMode (19, OUTPUT);
  pinMode (26, OUTPUT);

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

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

void loop() {
  // PWMを5秒ずつ25上げていく
  for (int i=106; i<=256; i+=10) {
    Serial.println(i);
    ledcWrite(0, i);
    delay(5000);
  }

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

前回と同様に、18,19,26ピンを、それぞれ IN1、IN2、ENAへの出力とします。

ESP32では、アナログ出力はピン毎ではなく、チャネル毎に制御します。10行目でチャネルのセットアップ、11行目で26ピンをチャネル0に割り当てています。チャネルは周波数12kHz、分解能は8bitとしています。8bitなので0~256の257段階になります。最大が255ではなくて256なんですよね。

loop関数では、106=約2V から2秒おきに10ずつ上げています。約2Vと書きましたが、実際にはESP32は3.3V出力ですから、3.3/256*106=1.366V になって、それをロジックレベル変換しているので、2.07Vがドライバへの入力になります。

なんで2Vからかというと、事前に0から試したところ、このモーターでは2V+αくらいからゆっくり動き始めたからです。

なお、ESP32では analogWrite 関数は無く、ledcWrite 関数を使って、初期設定したチャネルに対して、割合を指定します。

実際に動かした結果が、下の動画です。手持ちで撮ったので揺れているのはご勘弁。だんだんと回転数が上がっているのが分かると思います


次回はホールセンサーを用いて回転数を測ってみます。