L298Nモータードライバーをマスターする:Arduino制御、回路図、サンプルコード
このArduinoチュートリアルでは、ArduinoでDCモーターを制御する方法を学びます。DCモーター制御の基本技術を見て、L298NモータードライバーとArduinoボードを使用したDCモーター制御の2つの例を通じて学習します。 以下の動画をご覧いただくか、書面によるチュートリアルをお読みください。 DCモーターの速度は、モーターへの入力電圧を制御することで調整でき、最も一般的な方法はPWM信号を使用することです。 PWM(パルス幅変調)は、高速で電源をオン/オフすることで電子デバイスに供給される電圧の平均値を調整する技術です。平均電圧はデューティサイクル(1周期内のオン時間とオフ時間の比率)によって決まります。 モーターのサイズに応じて、ArduinoのPWM出力をトランジスタのベースやMOSFETのゲートに接続し、PWM出力を制御することでモーター速度を調整できます。低電力のArduino PWM信号がMOSFETのゲートをオン/オフし、それにより高電力のモーターを駆動します。 回転方向を制御するには、モーターに流れる電流の方向を反転させればよく、最も一般的な方法はHブリッジを使用することです。Hブリッジ回路は4つのスイッチング素子(トランジスタやMOSFET)で構成され、中央にモーターを配置してH字型の構成をとります。特定の2つのスイッチを同時にオンにすることで電流の流れる方向を変え、モーターの回転方向を変更できます。 PWMとHブリッジを組み合わせれば、DCモーターを完全に制御できます。これらの機能を備えたDCモータードライバーは多数あり、L298Nもその1つです。 L298NはデュアルHブリッジモータードライバーで、2つのDCモーターの速度と方向を同時に制御できます。モジュールは5〜35VのDCモーターを駆動可能で、ピーク電流は最大2Aです。 L298Nモジュールのピンアウトを見て、動作原理を説明します。モジュールにはモーターAとB用の2つのねじ端子ブロック、グランドピン、モーター用VCC、5Vピン(入力または出力)用のもう1つのねじ端子ブロックがあります。 5Vピンの役割はモーター用VCC電圧によります。モジュールにはオンボード5Vレギュレーターがあり、ジャンパーで有効/無効を切り替えます。モーター電源電圧が12V以下なら5Vレギュレーターを有効にし、5Vピンを出力として使用可能(例:Arduinoボードへの給電)。しかしモーター電圧が12Vを超える場合はジャンパーを外す必要があります(それ以上の電圧だとオンボード5Vレギュレーターが破損するため)。この場合、5Vピンを入力として使用し、ICを正常動作させるために5V電源を接続する必要があります。 このICは約2Vの電圧降下があります。例えば12V電源を使用すると、モーター端子電圧は約10Vになり、12V DCモーターの最大速度は得られません。 次にロジック制御入力。Enable AとEnable Bピンはモーターの有効化と速度制御に使用。ジャンパーが装着されている場合はモーターが有効になり最大速度で動作、ジャンパーを外してPWM入力を接続すれば速度制御可能。このピンをグランドに接続するとモーターは無効化されます。 Input 1とInput 2はモーターAの回転方向制御、Input 3と4はモーターB用。これらのピンでL298N IC内部のHブリッジスイッチを制御します。Input 1がLOWでInput 2がHIGHなら前進、逆なら後進。両方とも同じ(LOWまたはHIGH)なら停止。Input 3、4も同様です。 実践的なアプリケーションを作ってみましょう。最初の例では、ポテンショメーターでモーター速度を制御し、プッシュボタンで回転方向を変更します。回路図は以下の通り。 必要な部品:L298Nモータードライバー、DCモーター、ポテンショメーター、プッシュボタン、Arduinoボード。 必要なコンポーネント: Arduinoコードは以下の通り: 説明: まずピンとプログラム用変数を定義。setup()でピンモードとモーターの初期回転方向を設定。loop()ではポテンショメーター値を読み取り、0〜1023を0〜255(PWM信号の0〜100%デューティサイクル)にマッピング。analogWrite()でL298NのEnableピンにPWM信号を送信しモーターを駆動。 次にボタンが押されたかチェック、押されていれば回転方向をInput 1とInput 2の状態を反転させて変更。プッシュボタンはトグルボタンとして動作し、押すたびに回転方向が切り替わります。 これを理解したら、独自のArduinoロボットカーを作れます。回路図は以下の通り: 必要なのは2つのDCモーター、L298Nモータードライバー、Arduinoボード、制御用ジョイスティック。電源には3.7Vリチウムイオンバッテリー3個直列(計11V)を使用。シャーシは3mm厚合板で製作、金属ブラケットでモーター固定、ホイール取り付け、前部にキャスターを装着。 Arduinoコードを見て仕組みを理解しましょう(完全なコードは下部に掲載)。 ピン定義後、loop()でジョイスティックのX、Y軸値を読み取り。ジョイスティックは2つのポテンショメーターで構成され、Arduinoのアナログ入力に接続、値は0〜1023。中央位置では両軸とも約512です。 少し許容範囲を設け、470〜550を中央とみなします。Y軸を後ろに倒して470未満なら両モーターを後退方向に設定(4つの入力ピン使用)。その後、470〜0の減少値を0〜255の増加PWM値(モーター速度)に変換。 同様にY軸を前に倒して550超なら前進、550〜1023を0〜255のPWM値に変換。中央ならモーター速度はゼロ。 X軸による左右制御の仕組み: X軸読み取り値を速度値0〜255に変換。左旋回ではこの値で左モーターを減速、右モーターを加速。算術演算の結果、範囲を0〜255に制限するため2つの追加if文でクランプしています。 右旋回も同じ方法です。 関連:555タイマーICを使用したPWM DCモーター速度コントローラーの作り方 印加電圧とモーター特性により、低速ではモーターが起動せずブーン音を出すことがあります。私のモーターではPWM値70未満で動作しなかったため、2つのif文で速度範囲を70〜255に制限。最後に最終的なモーター速度(PWM信号)をL298NドライバーのEnableピンに送信。 このチュートリアルは以上です。次回の動画では、Bluetoothと無線デバイスを追加してこのArduinoロボットカーをアップグレードし、スマートフォン制御とワイヤレス制御を可能にします。 ご質問はコメント欄で、私のArduinoプロジェクトコレクションもぜひご覧ください。

PWM DCモーター制御


Hブリッジ DCモーター制御

L298Nドライバー




ArduinoとL298Nモータードライバー

Arduinoコード
/* Arduino DC Motor Control - PWM | H-Bridge | L298N - Example 01
by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9
#define in1 6
#define in2 7
#define button 4
int rotDirection = 0;
int pressed = false;
void setup() {
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(button, INPUT);
// 初期回転方向設定
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
void loop() {
int potValue = analogRead(A0); // ポテンショメーター値読取
int pwmOutput = map(potValue, 0, 1023, 0, 255); // 0-255にマッピング
analogWrite(enA, pwmOutput); // L298N EnableピンにPWM信号送信
// ボタン読取 - チャタリング防止
if (digitalRead(button) == true) {
pressed = !pressed;
}
while (digitalRead(button) == true);
delay(20);
// ボタン押下で回転方向変更
if (pressed == true && rotDirection == 0) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
rotDirection = 1;
delay(20);
}
if (pressed == false && rotDirection == 1) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
rotDirection = 0;
delay(20);
}
}L298Nモータードライバーを使用したArduinoロボットカー制御


int xAxis = analogRead(A0); // ジョイスティックX軸読取
int yAxis = analogRead(A1); // ジョイスティックY軸読取
// Y軸:前進/後退制御
if (yAxis < 470) {
digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // モーターA後退
digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // モーターB後退
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
}// X軸:左/右制御
if (xAxis < 470) {
int xMapped = map(xAxis, 470, 0, 0, 255);
motorSpeedA = motorSpeedA - xMapped; // 左モーター減速
motorSpeedB = motorSpeedB + xMapped; // 右モーター加速
if (motorSpeedA < 0) motorSpeedA = 0;
if (motorSpeedB > 255) motorSpeedB = 255;
}
// 低速時のブーン音防止(モーターに合わせて調整。私のモーターはPWM 70未満で動かない)
if (motorSpeedA < 70) motorSpeedA = 0;
if (motorSpeedB < 70) motorSpeedB = 0;
analogWrite(enA, motorSpeedA); // モーターAにPWM信号送信
analogWrite(enB, motorSpeedB); // モーターBにPWM信号送信Arduinoロボットカー例の完全なコード
/* Arduino DC Motor Control - PWM | H-Bridge | L298N
Example 02 - Arduino Robot Car Control
by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9
#define in1 4
#define in2 5
#define enB 10
#define in3 6
#define in4 7
int motorSpeedA = 0, motorSpeedB = 0;
void setup() {
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void loop() {
int xAxis = analogRead(A0);
int yAxis = analogRead(A1);
// Y軸:前進/後退
if (yAxis < 470) {
digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
} else if (yAxis > 550) {
digitalWrite(in1, LOW); digitalWrite(in2, HIGH);
digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
motorSpeedA = map(yAxis, 550, 1023, 0, 255);
motorSpeedB = map(yAxis, 550, 1023, 0, 255);
} else {
motorSpeedA = 0; motorSpeedB = 0;
}
// X軸:左/右
if (xAxis < 470) {
int xMapped = map(xAxis, 470, 0, 0, 255);
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
if (motorSpeedA < 0) motorSpeedA = 0;
if (motorSpeedB > 255) motorSpeedB = 255;
}
if (xAxis > 550) {
int xMapped = map(xAxis, 550, 1023, 0, 255);
motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped;
if (motorSpeedA > 255) motorSpeedA = 255;
if (motorSpeedB < 0) motorSpeedB = 0;
}
// 低速ブーン音防止
if (motorSpeedA < 70) motorSpeedA = 0;
if (motorSpeedB < 70) motorSpeedB = 0;
analogWrite(enA, motorSpeedA);
analogWrite(enB, motorSpeedB);
}
製造プロセス
- ArduinoでユニバーサルIRリモコンを自作:ステップバイステップガイド
- Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
- Arduino MegaとNEO-6M GPSモジュールの接続:ステップバイステップガイド
- Arduino Mega 2560搭載 総合トレーニングキット – センサー、モーター、カスタムPCB完備
- サーミスタを使った温度測定: Arduinoステップバイステップガイド
- DIY ハンドジェスチャー制御 Arduino ロボットアーム - ステップバイステップ構築ガイド
- 高性能Arduinoライブラリ:DCモーター制御用
- ジャンクDVDドライブで作るミニCNC 2Dプロッター - L293Dシールド使用
- ArduinoとMPU-6050で作るジェスチャー制御ロボット(自作ハンドジェスチャーRCカー)
- ダイレクトドライブモーター:メリット、種類、動作原理
- 脳・コンピューターインターフェース:思考を行動に再接続