はじめに
前回はモーターの回転の向きを変えてみましたが、今回はモーターの回転数を変えながら動かしてみます。使ったものと配線図は変更ありません。
使ったもの
- D1 mini ESP32 ESP-WROOM-32
- L298N DC モータドライバ
- 4.7V~12.6V出力 最大10A 同期式昇圧型スイッチング電源モジュール
- TXS0108E 双方向ロジックレベル変換モジュール
配線図
(モーターから上に出ている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 関数を使って、初期設定したチャネルに対して、割合を指定します。
実際に動かした結果が、下の動画です。手持ちで撮ったので揺れているのはご勘弁。だんだんと回転数が上がっているのが分かると思います
次回はホールセンサーを用いて回転数を測ってみます。