検索コード

ESP32とL298Nモジュールを使ってDCモーターの速度を制御する方法

ESP32とL298Nモジュールを使ってDCモーターの速度を制御する方法

DCモーターの制御は、適切なコンポーネントと理解があれば簡単な作業です。このチュートリアルでは、ESP32マイクロコントローラーとL298Nモータードライバーモジュールを使用して、2つのDCモーターを制御する方法を探ります。このガイドの最後には、ESP32からのPWM信号に基づいてモーターの速度と方向を調整できるようになり、ロボティクスや自動化における多様な応用が可能となります。

ESP32_L298N_DC_main

このチュートリアルに付随するビデオでは、配線やコーディングを含む全プロセスの視覚的なデモンストレーションが提供されています(ビデオは00:00にあります)。

ハードウェアの解説

L298N モータコントローラモジュール
L298Nモーターコントローラーモジュール

モーター制御を実現するために、ESP32とL298Nモータードライバーモジュールを使用します。ESP32はWi-FiとBluetooth機能を備えた強力なマイコンで、IoTプロジェクトに最適です。L298NはHブリッジモータードライバーで、PWM信号を使用してモーターの方向と速度を制御することができます。L298Nモジュールは2つのHブリッジ回路を備えているため、2つのモーターを独立して制御できます。各Hブリッジはモーターの方向(時計回りまたは反時計回り)とPWM信号を変化させることで速度を制御することができます。L298Nのイネーブルピンと入力ピンをESP32に接続することで、モーターを効果的に操作できます。

データシートの詳細

製造業者 STマイクロエレクトロニクス
部品番号 L298N
論理/入出力電圧 5 V
供給電圧 5-46 V (VS)
出力電流(チャンネルごと) 2 A最大/チャネル(絶対最大)
ピーク電流(チャネルごと) 2.5 A
PWM周波数ガイダンス 1 kHz - 15 kHz
入力論理閾値 2.5 V(高)、1.5 V(低)
電圧降下 / RDS(on)/ 飽和度 1.8 Vで2 A
熱的限界 150 ℃
パッケージ 15ピン マルチワット
ノート / バリアント デュアルHブリッジモータードライバー

  • モーターの電圧定格がL298Nの供給電圧と一致していることを確認してください。
  • 高電流での連続運転のために、適切なヒートシンクを使用してください。
  • すべてのコンポーネントのグラウンドを接続して、フローティングリファレンスを避けてください。
  • アプリケーションに適したPWM周波数を使用してください(1-15 kHz)。
  • 過熱を防ぐために、最大電流定格に注意してください。
  • 配線を確定する前にモーターの方向をテストして、損傷を避けてください。
  • 安定性のために、電源のデカップリングコンデンサを検討してください。

配線指示

ESP32_L298N_wiring

L298NをESP32に配線するには、まず2つのDCモーターをL298Nの出力端子に接続します。モーター1をラベルの付いた端子に接続しますOUT1そしてOUT2、そしてモーター2にOUT3OUT4モーターの極性は問題ではありません。L298Nが方向を制御します。次に、外部電源を接続してください。VMSGNDL298Nの端子。モーターに対して適切な電圧が供給されていることを確認してください。通常、5Vから46Vの間です。5VL298Nのターミナルは必要に応じてESP32に電力を供給するために使用できますが、電流要件が満たされていることを確認してください。コントロールピンに接続してください。ENAGPIO 19に、IN1GPIO 18に、そしてIN2モーター1にはGPIO 5に接続します。モーター2は接続してください。IN3GPIO 17へ、IN4GPIO 16に、そしてENBGPIO 4に接続します。最後に、ESP32とL298Nのグラウンドを接続して共通の基準を保証します。

コード例とウォークスルー

以下のコードスニペットは、ESP32用に設計されたL298Nライブラリを使用してモーターを制御する方法を示しています。このライブラリは、モーターにコマンドを送信するプロセスを簡素化します。まず、必要なライブラリをインクルードし、モーターのパラメータを定義します。


#include 
#define ENA 19
#define IN1 18
#define IN2 5
#define IN3 17
#define IN4 16
#define ENB 4
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB);

このスニペットでは、両方のモーターの制御ピンを定義します。ライブラリのインスタンスrobot作成され、プログラム全体でモーターを制御するために使用されます。次に、シリアル通信を設定し、ロボットインスタンスを初期化します。setup()空の文字列


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

これにより、デバッグ用のシリアル通信が初期化され、モーター制御ライブラリの操作の準備が整います。最後に、主要な制御ロジックが配置されます。loop()モーターを回転させてその速度を調整できる機能:


void loop() {
  robot.rotate(motor1, 80, CW); // run motor1 at 80% speed in CW direction
  delay(3000); // wait for 3 seconds
  robot.brake(1); // brake motor1
  delay(2000); // wait for 2 seconds
}

この抜粋は、モーター1を80%の速度で時計回りに3秒間回転させた後、ブレーキをかける方法を示しています。完全なコードにはモーター2や異なる速度のための追加のロジックが含まれており、この記事の下に読み込まれた完全なプログラムで見ることができます。

デモンストレーション / 期待すること

実行されると、モーターはESP32から送信されたPWM信号に応じて動作します。モーター1が80%の速度で時計回りに回転し、その後ブレーキ動作が見られます。このプログラムには、速度の変動を徐々に管理するロジックも含まれており、モーターの加速を0%から100%まで観察することでテストできます(動画は05:00で)。一般的な落とし穴には、グラウンドを適切に接続しないことが含まれ、これが不規則な動作を引き起こす可能性があります。また、L298Nの定格電流を超えると過熱する原因となります。モーターの挙動を監視し、必要に応じてパラメータを調整することを忘れないでください。

動画のタイムスタンプ

  • 00:46 イントロダクション
  • 04:07 ESP32をL298Nに接続する
  • 06:10 ESP32ボードで動作するようにArduino IDEを準備中
  • 08:15 Arduinoコードの解説
  • 15:00 単一モーター制御のデモンストレーション
  • 16:00 2つのDCモーターの制御デモンストレーション
  • 17:00 L298Nと外部電源からESP32への電源供給のデモンストレーション

画像

L298N モーターコントローラーモジュール
L298N モーターコントローラーモジュール
ESP32_L298N_DC_main
ESP32_L298N_DC_main
ESP32_L298N_wiring
ESP32_L298N_wiring
278-Library Example for L298N Module to control DC motors
言語: C++
/*
 * Library Example for L298N Module to control DC motors
 * 
 * This code is to control a single motor. For two motor control, please open L298N_DC_2_Motors.
 * This code is ready for ESP32.
 * Watch video instructions for this code:  https://youtu.be/2JTMqURJTwg
 * 
 * Written by Ahmad Shamshiri on December 24, 2019 
 * in Ajax, Ontario, Canada. www.robojax.com
 * 
 * 
  * 
 * Get this code and other Arduino codes from Robojax.com.

or make a donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#include <Robojax_L298N_DC_motor.h>
// motor 1 settings
#define CHA 0
#define ENA 19 // this pin must be PWM enabled pin if Arduino board is used
#define IN1 18
#define IN2 5

// motor 2 settings
#define IN3 17
#define IN4 16
#define ENB 4// this pin must be PWM enabled pin if Arduino board is used
#define CHB 1

const int CCW = 2; // do not change
const int CW  = 1; // do not change

#define motor1 1 // do not change
#define motor2 2 // do not change

// for single motor
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, true);	

// for two motors without debug information	// Watch video instruction for this line: https://youtu.be/2JTMqURJTwg
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA,  IN3, IN4, ENB, CHB);

// for two motors with debug information
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB, true);

void setup() {
  Serial.begin(115200);
  robot.begin();
  //L298N DC Motor by Robojax.com

}

void loop() {
  
 // robot.demo(1);
  robot.rotate(motor1, 80, CW);//run motor1 at 60% speed in CW direction
  robot.rotate(motor2, 70, CCW);//run motor1 at 60% speed in CW direction
  
  delay(3000);

  robot.brake(1);
  robot.brake(2);  
  delay(2000);


  robot.rotate(motor1, 100, CW);//run motor1 at 60% speed in CW direction
  delay(3000);
  
  robot.rotate(motor2, 100, CCW);//run motor1 at 60% speed in CW direction
  
  robot.brake(1);
  robot.brake(2);   
  delay(2000);  

  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor1, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(1);
  delay(2000);  
  
  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor2, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(2);
  delay(2000);    
  // Robojax L298N Library. Watch video instruction https://youtu.be/2JTMqURJTwg
}

ファイル📁

Arduinoライブラリ(zip)

フリッツィングファイル