L298N モータードライブコントローラ

DCモータを簡単に駆動出来るボード”L298N DCモータコントロールボードの説明です。

ボードの説明

このボードで2個のDCモータが駆動出来ます。ボードの詳細は以下の通り。

ボードの使用例

1 MAXスピードで回転(ハード)

ENA,ENBジャンパーをつないでIN1,2,3,4をコントロールすれば入力電圧(12V)でモータが回ります。ここで注意点は

  • モータにかかる電圧は回路ドロップが有るため入力電圧より約2V低い
  • ボード内のロジックは5V仕様。
    • 回転方向管理端子IN1,2,3,4は 3.3Vロジックで管理出来る。

ESP32を使って下記の様に配線してみました。

1 MAXスピードで回転(ソフト)

スケッチはコントロール端子を初期化した後、モータを回したい方向に合わせて各端子をHigh,Low設定しています。一方づつ 正転、反転、停止 を繰り返します。

wheel00.ino

#include "Arduino.h"

// wheel parameter
#define wheel_N1            26
#define wheel_N2            27
#define wheel_N3            14
#define wheel_N4            12

void setup()
{
    Serial.begin(115200);

    // init wheel
    pinMode(wheel_N1, OUTPUT);
    pinMode(wheel_N2, OUTPUT);
    pinMode(wheel_N3, OUTPUT);
    pinMode(wheel_N4, OUTPUT);

    digitalWrite(wheel_N1, LOW);
    digitalWrite(wheel_N2, LOW);
    digitalWrite(wheel_N3, LOW);
    digitalWrite(wheel_N4, LOW);

}

void loop() {
  Serial.println("Turn Right A");
  digitalWrite(wheel_N1, HIGH);
  digitalWrite(wheel_N2, LOW);
  delay(3000);

  Serial.println("Turn Left A");
  digitalWrite(wheel_N1, LOW);
  digitalWrite(wheel_N2, HIGH);
  delay(3000);

  Serial.println("Brake A");
  digitalWrite(wheel_N1, HIGH);
  digitalWrite(wheel_N2, HIGH);
  delay(500);

  Serial.println("Turn Right B");
  digitalWrite(wheel_N3, HIGH);
  digitalWrite(wheel_N4, LOW);
  delay(3000);
  
  Serial.println("Turn Right B");
  digitalWrite(wheel_N3, LOW);
  digitalWrite(wheel_N4, HIGH);
  delay(3000);

  Serial.println("Stop B");
  digitalWrite(wheel_N3, LOW);
  digitalWrite(wheel_N4, LOW);
  delay(500);

}

2 スピードをコントロールして回転(ハード)

このボードはENA,ENBの電圧に比例してモータに送られる電圧が設定出来ます。ENA,ENBの電圧が0Vの時モータへ0V。5Vの時モータへ入力電圧が送られます。ENA,ENBの対のピンには5Vが出力されていて、前回の回路はここをショートしていたのでENA,ENBの電圧は5V。よってモータへ入力電圧が供給されモータはMAXスピードで回転します。

PWMを使ってENA,ENBピンの電圧を設定すればモータ回転速度を管理出来る事になります。そこで回路を下記の様に変更しました。

L298NとESP32のロジック電圧が違う点に注意が必要必要です。L298Nのロジック電圧は5V、ESP32のロジック電圧は3.3V。つまりロジック電圧は3.3VのESP32ではMAX電圧をモータに与える事が出来ません。ESP32で与えられる最大値は

   最大値 = 入力電圧 X 3.3 / 5 (V)

になります。

2 スピードをコントロールして回転(ソフト)

analogWrite()関数を使ってENA,ENB端子の電圧を管理してモータの回転速度を変更しています。

wheel01.ino

#include "Arduino.h"

// wheel parameter
#define wheel_N1            26
#define wheel_N2            27
#define wheel_N3            14
#define wheel_N4            12

#define wheel_ENA           13
#define wheel_ENB           25

void setup()
{
    Serial.begin(115200);

    analogWrite(wheel_ENA, 0);
    analogWrite(wheel_ENB, 0);

    // init wheel
    pinMode(wheel_N1, OUTPUT);
    pinMode(wheel_N2, OUTPUT);
    pinMode(wheel_N3, OUTPUT);
    pinMode(wheel_N4, OUTPUT);

    digitalWrite(wheel_N1, LOW);
    digitalWrite(wheel_N2, LOW);
    digitalWrite(wheel_N3, LOW);
    digitalWrite(wheel_N4, LOW);

}

void loop() {
  int a;

    Serial.println("Turn A");
    digitalWrite(wheel_N1, HIGH);
    digitalWrite(wheel_N2, LOW);
    for(a = 0; a < 256; a += 50){
      Serial.println("vol: " + String(a));
      analogWrite(wheel_ENA, a);          
      delay(3000);
    }
    Serial.println("Stop A");
    analogWrite(wheel_ENA, 0);          
    delay(1000);

    Serial.println("Turn B");
    digitalWrite(wheel_N3, HIGH);
    digitalWrite(wheel_N4, LOW);
    for(a = 0; a < 256; a += 50){
      Serial.println("vol: " + String(a));
      analogWrite(wheel_ENB, a);          
      delay(3000);
    }
    Serial.println("Stop B");
    analogWrite(wheel_ENB, 0);          
    delay(1000);

}

最後に

スピードのコントロールが出来て非常に使い易いボードです。ホビーでDCモータを使う製品にはうってつけのボードです。

スピードコントロールですが、電圧値=回転スピード とならない事に注意が必要です。例えば、ENA端子にanalogWrite(wheel_ENA, 1); とすると MAXスピードの 256分の1で回転するかと言うとそでは有りません。analogWrite(wheel_ENA, 1);関数は基本的にモータを駆動する電圧のコントロールで、その電圧でモータが回るとは限らないからです。スピードをコントロールする場合にはこの点に気を付けましょう。