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

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

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

はじめに

AliExpress でキャタピラ式のロボットベースを購入したのですが、組み立てる前にDCモーター制御について、少し研究してみます。

回路を組むにあたって、悩んだのが電圧です。ESP32は3.3Vまたは5V電源で信号線は3.3V、DCモータードライバは安く出回っている「L298N DC モータドライバ」が手元にあったので、これを使うことにしたのですが、電源/信号線ともに5V、更に購入したDCモーターは定格電圧が9Vなので、はっきり言ってバラバラです。

最初は9Vを用意して、そこから5Vに降圧とも考えたのですが、ロボットを組んだ後でPCとUSB接続してプログラムを変更するときに、間違って電源が入ると嫌なことになりそうなので、安全のため5Vを基準とすることにしました。したがって5Vから9Vへの昇圧と、信号線のレベル変換が必要になります。

5Vから9Vへの昇圧は、秋月電子の「4.7V~12.6V出力 最大10A 同期式昇圧型スイッチング電源モジュール TPS61088使用」を購入しました。

使ったもの

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

配線図

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

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

ESP32から5Vを引き出し、そこから電源モジュールで9Vに昇圧しています。一方、信号線はレベル変換モジュールで3.3Vから5Vに変換して、モータードライバに接続しています。
モータードライバとの接続では、緑と橙の信号線が回転方向の制御用、黄色の信号線がPWM入力のアナログ電圧です。この電圧レベルでモーターに送る電圧を制御しています。回転数の制御が不要な場合には、黄色の線は不要で、モータドライバ側でジャンパで短絡しておけばOK。というか、購入時は短絡されているので、それを外して黄色信号線を接続しています。

モータードライバへの入力は

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

になっています。正回転と逆回転は相対的なものですが。
今回のモーターはホールセンサー付きなので、全部で6線出ていますが、赤と黒がモーター本体の電源線なので、とりあえずそれだけ接続。ホールセンサーは今のところ使うつもりがないのですが、あとで実験してみようと思います。

プログラム

まずは単純な正逆回転のテストです。

#define IN1 18
#define IN2 19
#define ENA 26

void setup() {
  // 初期設定 
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (ENA, OUTPUT);

  // ENAは常時HIGH
  digitalWrite(ENA,HIGH);
}

void loop() {
  // 正回転
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  delay(2000);

  // ブレーキ
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, HIGH);
  delay(2000);

  // 逆回転
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  delay(2000);

  // ブレーキ
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, HIGH);
  delay(2000);
}

プログラムはいたって単純で、setup関数でピン出力の初期設定、今回はピン18,19,26を使いましたが、たいした理由はなく、ESP32のボードのピン配置で並んでいたからです。そしてENA信号をHIGHにしています。ここをHIGHにすると、電源電圧がモーターにすべて印加されます。

loop関数では、2秒毎に正回転、ブレーキ、逆回転、ブレーキを繰り返すようにしています。

実行した結果が、下記の動画です。

次回は回転速度の変更をしてみようと思います。