L298Nモータードライバー– Arduinoインターフェース、仕組み、コード、回路図
このArduinoチュートリアルでは、Arduinoを使用してDCモーターを制御する方法を学習します。 DCモーターを制御するためのいくつかの基本的な手法をよく見て、L298NモータードライバーとArduinoボードを使用してDCモーターを制御する方法を学習する2つの例を示します。
次のビデオを見るか、以下のチュートリアルを読むことができます。
DCモーターの速度は、モーターへの入力電圧を制御するだけで制御できます。最も一般的な方法は、PWM信号を使用することです。
PWM、またはパルス幅変調は、高速で電源をオン/オフすることにより、電子デバイスに流れる電圧の平均値を調整できるようにする技術です。平均電圧は、デューティサイクル、つまり信号がオンになっている時間と信号がオフになっている時間の長さによって異なります。
したがって、モーターのサイズに応じて、Arduino PWM出力をトランジスタのベースまたはMOSFETのゲートに接続し、PWM出力を制御することでモーターの速度を制御することができます。低電力のArduinoPWM信号は、高電力モーターが駆動されるMOSFETのゲートのオンとオフを切り替えます。
一方、回転方向を制御するには、モーターを流れる電流の方向を逆にする必要があります。これを行う最も一般的な方法は、Hブリッジを使用することです。 Hブリッジ回路には、トランジスタまたはMOSFETの4つのスイッチング素子が含まれており、中央のモーターがHのような構成を形成しています。 2つの特定のスイッチを同時にアクティブにすることで、電流の方向を変更して、モーターの回転方向を変更できます。
したがって、PWMとHブリッジの2つの方法を組み合わせると、DCモーターを完全に制御できます。これらの機能を備えた多くのDCモータードライバーがあり、L298Nはその1つです。
L298Nは、2つのDCモーターの速度と方向を同時に制御できるデュアルHブリッジモータードライバーです。このモジュールは、最大2Aのピーク電流で5〜35Vの電圧を持つDCモーターを駆動できます。
L298Nモジュールのピン配置を詳しく見て、どのように機能するかを説明しましょう。モジュールには、モーターAとB用の2つのネジ留め式端子台と、アースピン用のもう1つのネジ留め式端子台、モーター用のVCC、および入力または出力のいずれかである5Vピンがあります。
これは、モーターのVCCで使用される電圧に依存します。モジュールには、ジャンパーを使用して有効または無効にできるオンボード5Vレギュレーターがあります。モーターの供給電圧が最大12Vの場合、5Vレギュレーターを有効にし、5Vピンを出力として使用できます(たとえば、Arduinoボードに電力を供給するため)。ただし、モーター電圧が12Vを超える場合は、ジャンパーを切断する必要があります。これらの電圧は、オンボードの5Vレギュレーターに損傷を与えるためです。この場合、ICが正しく動作するために5V電源に接続する必要があるため、5Vピンが入力として使用されます。
ここで、このICは約2Vの電圧降下を引き起こすことに注意してください。したがって、たとえば、12V電源を使用する場合、モーター端子の電圧は約10Vになります。これは、12VDCモーターから最大速度を引き出すことができないことを意味します。
次はロジック制御入力です。イネーブルAピンとイネーブルBピンは、モーターの速度を有効にして制御するために使用されます。このピンにジャンパーが存在する場合、モーターが有効になり、最大速度で動作します。ジャンパーを取り外すと、PWM入力をこのピンに接続して、モーターの速度を制御できます。このピンをアースに接続すると、モーターが無効になります。
次に、入力1と入力2のピンは、モーターAの回転方向を制御するために使用され、入力3と4は、モーターBの回転方向を制御するために使用されます。これらのピンを使用して、L298NIC内のHブリッジのスイッチを実際に制御します。入力1がLOWで入力2がHIGHの場合、モーターは前方に移動します。逆に、入力1がHIGHで入力2がLOWの場合、モーターは後方に移動します。両方の入力が同じ場合、LOWまたはHIGHのいずれかでモーターが停止します。同じことが入力3と4およびモーターBにも当てはまります。
それでは、いくつかの実用的なアプリケーションを作成しましょう。最初の例では、ポテンショメータを使用してモーターの速度を制御し、プッシュボタンを使用して回転方向を変更します。これが回路図です。
したがって、L298Nモータードライバー、DCモーター、ポテンショメーター、プッシュボタン、およびArduinoボードが必要です。
このArduinoチュートリアルに必要なコンポーネントは、以下のリンクから入手できます。
Arduinoコードは次のとおりです:
説明: したがって、最初に、プログラムに必要なピンといくつかの変数を定義する必要があります。セットアップセクションでは、ピンモードとモーターの初期回転方向を設定する必要があります。ループセクションでは、ポテンショメータの値を読み取ることから始め、そこから得られる0から1023までの値、PWM信号の0から255までの値、または0から100%のデューティサイクルの値にマッピングします。 PWM信号。次に、analogWrite()関数を使用して、PWM信号をL298Nボードのイネーブルピンに送信します。これにより、実際にモーターが駆動されます。
次に、ボタンを押したかどうかを確認します。その場合は、入力1と入力2の状態を逆に設定して、モーターの回転方向を変更します。押しボタンはトグルボタンとして機能し、押すたびにモーターの回転方向が変わります。
これを学んだら、Arduinoロボットカーを自分で作ることができます。回路図は次のとおりです。
必要なのは、2つのDCモーター、L298Nモータードライバー、Arduinoボード、および制御用のジョイスティックだけです。電源は3.7Vのリチウムイオン電池を3本使用し、合計11Vを使用しました。シャーシを3mmのティック合板で作成し、金属製のブラケットを使用してモーターを取り付け、モーターにホイールを取り付け、前面にスイベルホイールを取り付けました。
それでは、Arduinoコードを見て、それがどのように機能するかを見てみましょう。 (下に完全なコードがあります)
ピンを定義した後、ループセクションで、ジョイスティックのX軸とY軸の値を読み取ることから始めます。ジョイスティックは、実際にはArduinoのアナログ入力に接続された2つのポテンショメータで構成されており、0から1023までの値があります。ジョイスティックが中央位置にある場合、両方のポテンショメータまたは軸の値は約512です。
少し許容誤差を追加し、470から550までの値を中心と見なします。したがって、ジョイスティックのY軸を後方に移動し、値が470を下回ると、4つの入力ピンを使用して2つのモーターの回転方向を後方に設定します。次に、減少する値を470から0に変換し、増加するPWM値を0から255に変換します。これは、実際にはモーターの速度です。
同様に、ジョイスティックのY軸を前方に移動し、値が550を超えると、モーターを前方に移動し、550から1023までの読み取り値を0から255までのPWM値に変換します。ジョイスティックが中央にある場合、モーターの速度はゼロになります。
次に、車の左右の制御にX軸をどのように使用するかを見てみましょう。
繰り返しになりますが、最初にX軸の読み取り値を0から255までの速度値に変換する必要があります。左に移動するには、この値を使用して左のモーター速度を下げ、右のモーター速度を上げます。ここでは、算術関数のために、2つの追加の「if」ステートメントを使用して、モーター速度の範囲を0〜255に制限します。
車を右に動かすのにも同じ方法が使われます。
関連:555タイマーICを使用してPWMDCモーター速度コントローラーを作成する方法
印加電圧やモーター自体によっては、低速になるとモーターが動き出しなくなり、ブーンという音がします。私の場合、PWM信号の値が70未満の場合、モーターは移動できませんでした。したがって、この2つのifステートメントを使用して、実際には70〜255の速度範囲に制限しました。 L298NドライバのイネーブルピンへのPWM信号。
Arduinoロボットカーの例の完全なコードは次のとおりです。
このチュートリアルはこれですべてです。次のビデオでは、スマートフォンとワイヤレス制御を有効にするためのBluetoothと無線デバイスを追加して、このArduinoロボットカーをアップグレードします。
以下のコメントセクションでお気軽に質問してください。Arduinoプロジェクトのコレクションを確認することを忘れないでください。
PWMDCモーター制御
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);
// Set initial rotation direction
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
void loop() {
int potValue = analogRead(A0); // Read potentiometer value
int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255
analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin
// Read button - Debounce
if (digitalRead(button) == true) {
pressed = !pressed;
}
while (digitalRead(button) == true);
delay(20);
// If button is pressed - change rotation direction
if (pressed == true & rotDirection == 0) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
rotDirection = 1;
delay(20);
}
// If button is pressed - change rotation direction
if (pressed == false & rotDirection == 1) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
rotDirection = 0;
delay(20);
}
}
Code language: Arduino (arduino)L298Nモータードライバーを使用したArduinoロボットカーコントロール
int xAxis = analogRead(A0); // Read Joysticks X-axis
int yAxis = analogRead(A1); // Read Joysticks Y-axis
Code language: Arduino (arduino)// Y-axis used for forward and backward control
if (yAxis < 470) {
// Set Motor A backward
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
// Set Motor B backward
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
}
Code language: Arduino (arduino)// X-axis used for left and right control
if (xAxis < 470) {
// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
int xMapped = map(xAxis, 470, 0, 0, 255);
// Move to left - decrease left motor speed, increase right motor speed
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
// Confine the range from 0 to 255
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
if (motorSpeedB > 255) {
motorSpeedB = 255;
}
}
Code language: Arduino (arduino)// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
if (motorSpeedA < 70) {
motorSpeedA = 0;
}
if (motorSpeedB < 70) {
motorSpeedB = 0;
}
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
Code language: Arduino (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;
int 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); // Read Joysticks X-axis
int yAxis = analogRead(A1); // Read Joysticks Y-axis
// Y-axis used for forward and backward control
if (yAxis < 470) {
// Set Motor A backward
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
// Set Motor B backward
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
}
else if (yAxis > 550) {
// Set Motor A forward
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
// Set Motor B forward
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 550, 1023, 0, 255);
motorSpeedB = map(yAxis, 550, 1023, 0, 255);
}
// If joystick stays in middle the motors are not moving
else {
motorSpeedA = 0;
motorSpeedB = 0;
}
// X-axis used for left and right control
if (xAxis < 470) {
// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
int xMapped = map(xAxis, 470, 0, 0, 255);
// Move to left - decrease left motor speed, increase right motor speed
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
// Confine the range from 0 to 255
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
if (motorSpeedB > 255) {
motorSpeedB = 255;
}
}
if (xAxis > 550) {
// Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
int xMapped = map(xAxis, 550, 1023, 0, 255);
// Move right - decrease right motor speed, increase left motor speed
motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped;
// Confine the range from 0 to 255
if (motorSpeedA > 255) {
motorSpeedA = 255;
}
if (motorSpeedB < 0) {
motorSpeedB = 0;
}
}
// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
if (motorSpeedA < 70) {
motorSpeedA = 0;
}
if (motorSpeedB < 70) {
motorSpeedB = 0;
}
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}
Code language: Arduino (arduino)
製造プロセス
- IRリモコンをハックする方法
- ラインフォロワーロボット
- ArduinoMegaをNEO-6MGPSモジュールとインターフェースする方法
- Arduinoトレーニングプラットフォーム
- サーミスタの使い方は簡単ですか?!
- DIY Arduinoロボットアーム–ハンドジェスチャで制御
- DCモーター制御ライブラリ
- スクラップDVDドライブ、L293Dを使用してミニCNC2Dプロッタを作成する方法
- 自宅でジェスチャ制御ロボットを作る方法
- ここにアイデアがあります:ブレイン・コンピューター・インターフェースがどのように機能するか
- ダイレクト ドライブ モーターの利点 – それが何であり、どのように機能するか。