書籍『はじめてのM5StickC』のご紹介!記事掲載して頂きました。

【Arduino入門編㉒】ArduinoでDCモーターを制御する。【L298Nデュアルモータードライバ】

今回はモータードライバを使いArduinoでDCモーターを制御してみたいと思います。

Arduinoで何か動くものを作ろうと思えばまず思い浮かぶのがモーターだと思います。
モーターと言ってもDCモーターやブラシレスモーター、サーボモーターやステッピングモーターなどいろいろとあります。

これまでArduino入門編の記事としてサーボモーターに関して何度か扱ってきてその制御方法をご紹介しました。
サーボモーターはPWM(Pulse Width Modulation)というパルス幅変調方式という制御方法が使われ、指定した角度までサーボを回転させるというものでした。

PWM制御はArduinoではよく使われる制御方法となり、デジタル処理のHIGH or LOW(ONとOFF)だけでは実現できない、例えばLEDをゆっくり点灯や消灯させたりするといったアナログ的な制御が可能となります。

この制御方法を使えばDCモーターを回転や停止させる以外にもモーターの回転速度を制御することも出来るようになります。
Arduinoを使ったロボットカーやスマートカーなどラジコンとして動かすものなどを作ることが出来ます。

しかしモーターの駆動には比較的高い電力を必要とするため、その接続には少し工夫する必要があります。
サーボモーターを動かした時もそうでしたがArduinoと直接繋いで動かす場合、Arduinoから供給できる電力はそれほど多くないため複数台のサーボモーターの駆動には外部電源を用意する必要がありました。

今回動かしてみるDCモーターも同様で駆動には大きな電流が必要となるためArduinoと直接しそこからの電力供給だけでは動かすことが出来ず、Arduinoの定格を超える電流が流れるとArduino自体の破損の原因にもなってしまいます。

そこで必要となってくるのが『モータードライバ』というものです。

今回、L298Nモータードライバを使いArduinoを使ってDCモーターを制御してみたいと思います。
サーボモーターをステアリングに使いタイヤをDCモーターで回転させて動かすラジコンなんかにも簡単に応用できるようになります。

ArduinoでDCモーターを制御する【L298Nデュアルモータードライバ】

今回の目的

先述したようにDCモーターの駆動には比較的大きな電力が必要となります。
Arduinoからの出力だけでは直接動かすことが出来ず、Arduino自体の破損にもつながってしまいます。

そこでDCモーターの駆動にはリレーを使ったりモータードライバを使ったりと、いろいろな方法が取られ制御されています。
今回は一般的によく使われる『モータードライバ』というものを使ってDCモーターを制御してみたいと思います。

モータードライバは、出力側(モーター駆動部分)と制御側(Arduinoとの制御信号のやりとり)が独立しているので、モータードライバに接続した電源(外部電源)を利用してモーターの駆動を行う事ができます。

今回Arduino用途ではよく使われるL298Nというモータードライバを使いDCモーターの制御をやってみたいと思います。
デュアルタイプのモータードライバとなり2台までのDCモーターを同時に制御することが出来ます。
モーターの回転・停止・逆回転といった動作以外にもPWM制御により回転スピードを変えたりすることも出来るため、Arduinoを使ったラジコンやロボットカーなどでよく使われるモータードライバとなります。

このL298Nモータードライバを使いDCモーターを自在に動かし、そしてモータードライバの使い方について理解できるところまでを今回の目標としたいと思います。

DCモーターとは?

今回動かすDCモーターとは直流電圧を加えることにより回転させるモーターとなります。
電圧をかける極性(プラスとマイナス)を入れ替えることにより正回転や逆回転させることが出来るモーターとなります。

身の回りでよく見かけるものとなりモーターの中では一番馴染みがあるものではないでしょうか?
用途や定格等により様々なものがあります。

こちらはタミヤのFA-130モーターでミニ四駆やラジコンなどでよく見かけるモーターですね。
極性を入れ替えることにより正回転・逆回転させたり、加える電圧値により回転するスピードが変化します。

今回使うL298Nモータードライバはデュアルタイプのものとなり2台のDCモーターを同時に制御することが出来ます。
そこで今回はタミヤのダブルギヤボックスを例にして動かしてみたいと思います。
2台のモーターを制御出来れば簡単なラジコンならすぐに作れちゃいますね!

タミヤ ダブルギヤボックスで遊ぶ!歯車の構造を学べるよく出来たキットです!

またこのようなタイヤ・ホイールを使ってみるのも面白いかと思います。
こちらもArduino用途の工作でよく見かけるモーター&ギアパーツがセットとなったものです。
標準で使われているTTモーターは6Vや12Vタイプのものがあり、高速で回転させることが出来ます。

モータードライバとは?

Arduino(こちらではArduino Unoで説明していきます)の出力端子にはデジタル入出力端子があります。
HIGHとLOWの出力が出来ることからこれまでLEDの点灯などで使ってきました。

それではこのデジタル出力ピンにモーターを直接接続すればモーターのON/OFFが出来そうですが・・・
実際にはArduinoに直接モーターを接続しても動かすことが出来ません。

これまでやってきたサーボモーターでもそうですが、モーターの駆動には比較的大きな電力を必要とします。
しかしArduinoのデジタル入出力ピンでは20mAほどしか電流を流すことができず、さらにこれ以上の大きな電流が流れてしまうことによりArduino自体の破損にもつながります。

サーボモーターの場合、複数台の駆動にはArduinoとは別に駆動用に外部電源を用意しました。
DCモーターも同様でモーター駆動用の電源をArduino駆動電源とは別に用意する必要があります。

そこで利用されるのが『モータードライバ』となります。
モーターを駆動するための電源を接続し、Arduinoからの制御信号を受け取りモーターを回転させたり停止させたりなどの制御を行うためのパーツとなります。

Arduinoとの制御信号のやり取りとモーターを駆動するための回路が別系統となっているので、これで問題なくArduinoでDCモーターを制御することが出来るようになります。

L298Nデュアルモータードライバモジュール

ArduinoでDCモーターを動かすにはモータードライバというものが必要だというこが理解できたかと思います。

Arduinoで使えるモータードライバには、用途や定格等により様々なものが販売されています。
Arduinoでよく使われるモータードライバの1つに東芝のTA7291Pというモータードライバがあります。
シングルタイプのモータードライバとなり1個のDCモーターを制御することが出来ます。
使うモーターの数によりドライバの数も増やして使えばいいのですが、このTA7291Pの生産は終了してしまったようですね。(まだ販売はされているようですが)

そこで今回はL298Nというモータードライバモジュールを使ってみたいと思います。
基本的な使い方は同じですが、このL298Nはデュアルモータードライバとなっており2台のDCモーターを接続&制御出来るようになっています。
そしてモジュール化されているので接続も簡単となります。

ブレッドボードを使ったテスト環境での使用以外にもモジュール化されているので製作物にそのまま組み込むことも簡単に出来るので便利となります。

PWM制御も可能となっていてモーターの回転スピードを可変させることも出来ます。
Arduinoを使ったスマートカーやラジコンなどでよく使われるモータードライバの1つとなります。

私もこのモータードライバを使ったラジコンを現在製作中です。
そのため今回の記事を少し前倒ししてご紹介させてもらっています。
構成等もいろいろと検討中ですが・・・出来上がったらあらためてご紹介できればと思います。

便利で使いやすいモータードライバとなります。
制御方法も最後まで読んで頂ければ比較的簡単に行えるかと思います。

それではL298Nモータードライバを詳しく見ていきましょう。

L298Nモータードライバモジュールの概要

今回使うL298Nは、Arduino用途で使われるモータードライバとして非常にメジャーなものとなります。
ArduinoやRaspberryなどマイコンボードと接続することで比較的簡単にDCモーターを制御することが出来ます。

ディアルタイプのモータードライバとなっており、2つのDCモーターを接続し同時に制御することが出来ます。
またPWM制御にも対応しているので、モーターの回転スピードを可変させたりも出来ます。

モーターに流せる電流はデータシートを見ると2Aまで流せるようで大きいのが特徴です。
今回タミヤのダブルギヤボックスを例にFA-130モーターを動かしてみたいと思いますが、さらに大きなDCモーターでも駆動させることが出来ます。

今回使うL298Nモータードライバはモジュール化された製品でテスト環境で使う以外に製作物にも組み込みやすい形状となっています。

モジュールのサイズは約43mm×43mm×27mmとなりヒートシンク部分が突き出る形状となっています。
小型?ではないですが性能は十分で使いやすいモータードライバとなります。

モーターの接続端子および駆動電源供給端子(モーター駆動用)はネジターミナルとなっています。
またArduinoとの信号線の接続はピンヘッダーとなっています。

またArduinoには直接接続し機能を拡張することが出来る「シールド」と呼ばれるものがあります。
そしてモータードライバにもこのようなシールドタイプのものも販売されています。
こちらはL293DというArduino用のモータードライバシールドとなり、4台までのDCモーターを駆動できるものとなります。

モータードライバとしての基本的な使い方は同様なので使用用途により使い分けると便利になります。

L298Nモータードライバ 定格について

モジュール化されたL298Nモータードライバは多数販売されています。
製品各社で多少の値のばらつきがあるようですが、ほぼ以下のような定格になっているようです。
Arduinoを使ったモーターを動かす用途では十分な性能です。

L298N モータードライバ定格
マスターチップL298N
モーター駆動電圧5V~35V
モーター駆動電流2A
ロジック電圧(制御部分の電圧)5V
ロジック電流0~36mA
内部回路Hブリッジ駆動(デュアルHブリッジ)
最大出力 25W

L298N 接続端子の説明

L298Nモータードライバに搭載されたピン配列および使用用途をまとめてみます。

まず基板左右にあるOUT1~OUT4はモーターを接続する端子となります。
ネジターミナル形状となっています。
OUT1とOUT2がモーター①、OUT3とOUT4がモーター②の接続端子となります。

次に電源端子部分です。
+12V power端子GND端子+5V power端子の順にこちらもネジターミナル形状となっています。
+12V power端子とGND端子はモーター駆動用の電源を接続します。
この端子に印加する電圧がモーター駆動の最大電圧となります。

MEMO
今回定格3VのFA-130モーターを例に接続しようと考えています。
よって本来この端子には3Vの電圧を入力する形となりますが、このドライバモジュールの動作電圧は5V~35Vとなっているため5Vで動作させることにします。

+5V power端子は出力端子となります。
5Vの電圧が取り出せるためArduinoに電力を供給する場合に利用できます。
そしてこの端子の出力は5V enableピンによって決めます。
デフォルトでは5V enableピンにはジャンパーピンが刺さった状態となっており5Vの電圧が取り出せる状態となっています。

MEMO
ArduinoをUSBケーブル経由でPCと接続している場合は不要ですが、例えばラジコンなどの製作物に組み込んで動かす際などでPCと接続せず単体で動かす場合にこの端子からArduinoを駆動するための電源を確保できます。

製品仕様によりモーターに12V以上の電圧を供給する場合は外部5V電源を使う必要があるようで、このenableピンを外して使用しArduinoへの電力供給は別の外部電源を用意するのが望ましいようです。

つぎに制御信号部分です。
ENAIN1IN2IN3IN4ENBピンの順に並んでいます。

デフォルト状態ではENAピンとENBピンにはジャンパーピンが取り付けられています。
ENAピンとENBピンはモーターをPWM制御させる際に使用するピンとなります。

そしてIN1ピンとIN2ピンがモーター①の出力、IN3ピンとIN4ピンがモーター②の出力(回転方向)を決めるピンとなります。
こちらは実際に配線しスケッチを見た方が分かりやすいので詳しくは後述します。

以上をまとめると接続端子はこのようになります。

接続ピン使用用途
モーター接続端子 OUT1
OUT2
1つ目のモーターを接続する端子
OUT3
OUT4
2つ目のモーターを接続する端子
電源端子+12V
power
モーターの駆動用電源端子。
印加する電圧がモーターの最大駆動電圧となります。
PWM制御ではデューティー比を255にした時にこの電圧となります。
GNDGND端子。
モーター駆動用電源のGNDおよびArduinoのGND端子を共通にして使います。
+5V
power
5V enableピンにジャンパーピンが刺さった状態で5Vが出力されます。
Arduinoの駆動電源として使えます。
5V
enable
この端子にジャンパーピンがつながった状態では+5V power端子に5Vが出力されます。
製品仕様上、モーター駆動電源に12V以上の電圧を扱う場合は外す必要があります!
制御端子ENAモーター①をPWM制御で動かす場合に使用します。
デジタル制御(ON/OFFのみ)の場合はジャンパーピンは繋いだ状態で使います。
ENBモーター②をPWM制御で動かす場合に使用します。
デジタル制御(ON/OFFのみ)の場合はジャンパーピンは繋いだ状態で使います。
IN1
IN2
モーター①の制御用の端子。(回転方向を決める)
IN3
IN4
モーター②の制御用の端子。(回転方向を決める)

L298Nモータードライバの各端子の役割をまとめてみました。
難しそうに見えますが実際に配線してみると簡単なのでやっていきます。

モーターをON/OFFのみの制御で動かしてみる

L298Nモータードライバは、ON/OFFのみの制御のほかPWM制御により回転スピードを変えることも出来ます。
まずは基本となるON/OFFのみの制御でDCモーター1つを動かしてみます。

接続はこのようになります。

今回モーター駆動電源には5Vを安定化電源を使ってかけています。
テスト環境ではこのようなブレッドボード用電源が1台あれば5Vの電圧を簡単に取り出すことが出来るので便利となります。
また乾電池を4本直列に繋いで接続(6Vになりますが)しても問題ありません。

モーターはOUT1とOUT2に接続します。

制御部分の接続は、モーターを単純にON/OFFさせるだけの動作なのでPWM制御で使うENA・ENB端子は使っていません。
PWM制御で使わない場合はジャンパーピンを挿しておく必要があります

そしてIN1とIN2をArduinoのデジタルピンに繋ぎますが、今回はD3ピン・D4ピンを使いました。

今回Arduinoの電源はPCと接続して供給しているので+5V power端子は使っていません。
PCと接続せずArduinoを単体で動かす場合は、この+5V power端子をArduinoの5V端子に繋ぐことによりArduinoを駆動する電力を確保することが出来ます。

MEMO
+5V power端子を使ってArduinoの駆動電源とする場合、Arduinoの5Vラインである[5V]端子に接続します。
Vin端子ではないのでお間違えなく!(Vin端子は7~12Vの入力が必要)

Arduinoの電源供給方法に関してはこちらの記事を参考にして下さい。

【Arduino入門編⑮】Arduino Unoへの電力供給(外部電源)および電源出力端子の使い方!【追記】

あと忘れがちですが、GND端子はArduinoと共通となるように接続しておく必要があります

全体の接続図はこのようになります。

これでモーターの回転はD3ピンとD4ピンの出力で制御することが出来ます。
具体的な動作はこのようになります。

IN1(Arduino D3)IN2(Arduino D4)モーターの動作
LOW LOW停止
HIGH LOW正回転
LOW HIGH逆回転
HIGH HIGHブレーキ

上記表を見ると分かるように、制御ピンIN1~IN4はそれぞれモーター接続端子OUT1~OUT4ピンの出力に対応しています。
つまり、IN1をHIGHにするとOUT1からモーター駆動電圧の電圧5V(今回ドライバへの電源端子に5Vを印加している)が出力されるということです。
一方をHIGHにしもう一方をLOWにすることによりモーターが動作(回転)し、HIGHとLOWを入れ替えることにより回転方向が反転するということです。
停止したければ両方をLOWにし(惰性で回転します)、ブレーキをかけたければ両方をHIGHにするということです。

これが分かればあとはデジタル入出力ピンのHIGHとLOWの設定だけなのでスケッチは簡単です。
このようなスケッチを作ってみました。
正回転→停止→逆回転→ブレーキを2秒間隔で繰り返すスケッチとなります。

モーターをもう1台接続して2台を動かす場合も同様です。

2台目のモーターの制御ピン(IN3ピンとIN4ピン)はArduinoのD5ピン・D6ピンを使いました。

先程のスケッチにモーター2を追加しただけなので簡単ですね。

PWM制御でモーターの回転速度を制御する

それでは最後にモーターの回転速度も制御してみたいと思います。
L298NモータードライバはPWM制御にも対応しています。
PWM制御させる際に使うのがENAピンENBピンとなります。
ENAピンはモーター①のPWM制御用でENBピンはモーター②のそれになります。

ここで注意したいのは、Arduino UnoでPWM出力ができるデジタルピンはD3/D5/D6/D9/D10/D11となります。
ENAピン・ENBピンはこのどれかに接続する必要があります。

今回はENAピンをArduinoのD9ピン、ENBピンをD10ピンに接続しました。

ENAピン・ENBピンの接続は、ジャンパーピンを外し手前のピンヘッダーに接続します。

このようなスケッチを作ってみました。
正回転・逆回転でスピードが徐々に上がっていく動作をします。

先程のIN端子のHIGH/LOWの組み合わせで回転方向を決め(正回転・逆回転・停止)、ENA/ENBピンに指定したデューティー比により回転スピードを変えるというものです。

PWM制御なのでanalogWrite関数を使いデューティー比(0~255)を指定してモーターの回転速度を制御しています。

analogWrite関数を使ったデューティー比やPWM制御の概要に関してはこちらの記事を参考にして下さい。

【Arduino入門編③】PWM制御でLEDをゆっくり点灯&消灯させてみる!アナログ出力(PWM)の解説その①

便利なDCモーター用ドライバです!

長々と書いてしまいましたがL298Nモータードライバの使い方や仕様について理解できたでしょうか?

テスト環境では今回の方法で問題ありませんが、実際にラジコンなどに組み込む際には電源まわりは少し工夫した方がいいかもしれません!

現在このモータードライバを使って簡単なラジコンみたいなものを作り今後Arduinoを使っていろいろと組み込めるテスト機にしようと考えています。

このモジュールでは先述したようにモーター駆動用の電源端子(+12V power端子)に印加する電圧がほぼそのまま出力されます。
今回5Vを入力してモーターを動かしてみました。
その際モーター端子の電圧を計測するとほぼその値になっていました。

テスト環境では安定化電源等により常に一定の電圧が取り出せるわけですが、実際にラジコンなどで動かす場合は乾電池やバッテリーなどで駆動させるため徐々にその電圧は下がっていきます。

何度か動かしてテストしていますが、DC/DCコンバーターなどを使いドライバに入力する電圧を一定にしておく方がいいかれませんね!

今回のポイント

L298Nモータードライバの特徴
  • IN1とIN2(モーター2はIN3とIN4)のHIGHとLOWの組み合わせで正回転・逆回転・停止をさせる!
  • ENA・ENBピンにジャンパーピンを挿した状態ではON/OFFの制御となる !
  • PWM制御ではENA・ENBピンにデューティー比を指定しする事により回転スピードを変える事が出来る!

今回使ったアイテム

L298N デュアルモータードライバモジュール

今回モータードライバにはモジュール化されたL298Nを使いました。
Arduinoでよく使われる非常にポピュラーなモータードライバとなります。

FA-130モーター

今回、タミヤのダブルギヤボックスに付属していたFA-130モーターを使いました。
よく出来たギヤボックスなので今回のようなモータードライバのテストや動作チェックはもちろん、実際にラジコンなどに組み込むのにも便利かと思います。

タミヤ ダブルギヤボックスで遊ぶ!歯車の構造を学べるよく出来たキットです!

Arduino UNO

Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!

Arduino スターターキット

これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。

私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)

そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)

参考 チュートリアルダウンロードELEGOO

基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。

スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていくのがいいと思います。

最後に!

今回、DCモーターを駆動するためのL298Nモータードライバを使ってみました。

モータードライバは用途や定格等により様々なものが販売されています。
使用方法や概要など理解出来れば他のドライバも仕様など多少の違いがありますが使えるかと思います。

Arduinoを使ってDCモーターを制御出来るようになると出来ることの幅が広がりますね!

その他 Arduino入門編 関連の記事

コメントを残す