以前、Arduino入門編記事としてL298Nというモータードライバを使いDCモーターの制御方法をご紹介しました。
L298Nドライバボードを使えばArduinoと接続し2台までのDCモーターを同時に制御する事ができます。
DCモーターやステッピングモーターなどを動かす場合、その駆動には大きな電力を必要とすることからArduinoなどのマイコンボードからの出力だけでは電流不足となるためこのようなドライバボードを使う必要があります。
ArduinoやRaspberry Piなどのマイコンボードに接続し使えるモータードライバには様々なものが販売されています。
L298NはDCモーターの制御でよく使われるモータードライバとなり比較的簡単に扱うことが出来るので電子工作用途ではよく使われるものとなります。
Arduinoで使えるモータードライバには他にもいろいろとあります。
その中でL293Dチップを使ったドライバもよく使われます。
Arduinoにはボードに挿し込むことにより機能を拡張出来るシールドと呼ばれる便利な拡張ボードがありますが、今回はL293Dドライバチップを搭載したモータードライバシールドをご紹介したいと思います。
目次
ArduinoでL293Dモータードライバシールドを使ってみる!
以前、このような手のひらに乗るサイズの小型ロボットカーを製作しました。
テスト動作でいろいろとモータードライバを試していましたが、最終的にこのロボットカーではこのサイズ感でモデリングし組み込める寸法やモーターへの出力値等の関係でL298Nドライバボードを使いました。
L298Nは小型で2台までのDCモーターを制御でき、モーターへの出力も高いことから採用しました。
非常に便利なモータードライバでこのような電子工作用途での製作物では便利に使えます。
そしてサイズやモーターへの出力値等の問題で使わなかったL293DもArduinoで使える便利なモータードライバの1つとなります。
今回はL293Dドライバチップを内蔵したシールドタイプのL293Dモータードライバシールドをご紹介したいと思います。
Arduinoのシールドとは?
Arduinoにはボードに接続することにより機能を拡張出来る『シールド』と呼ばれる拡張ボードが多数あります。
このようにArduinoボードに接続するだけでいろいろな機能を追加することが出来ます。
ArduinoボードはUnoやNano、Megaなどいろいろとあります。
シールドのピン配列は規格化されているので上写真のようにUnoに取り付けたり、Megaに取り付けて使うことも出来ます。
これまでご紹介してきたものでは、『プロトタイプシールド』というものがあります。
Vcc・GNDが多く取ることができ、このように170タイポイントのブレッドボードを上に置きちょっとした回路を組むなどテスト環境で便利に使えるものとなります。
また、『センサーシールド』を使えば複数のサーボモーターを接続できその電源も確保できるので、このようなロボットを動かすのにも便利に使えます。
今回は、モーターを駆動するためのドライバが組み込まれた『L293Dモータードライバシールド』を使ってみたいと思います。
L293Dモータードライバシールド
こちらがL293Dモータードライバシールドとなります。
冒頭でご紹介したL298Nドライバボードは2台までのDCモーター(デュアルチャンネル)を制御する事ができました。(ステッピングモーターも可能)
このL293Dモータードライバシールドでは、4台までのDCモーターや2台のステッピングモーター、2台のサーボモーターの制御が出来るシールドタイプのモータードライバとなります。
参考 293Dモーターシールド データシートRajguruelectronicsまた、このモータードライバシールドに関する情報はArduino公式ページのPROJECT HUBでも紹介されています。
分かりやすく紹介されているので興味ある方は見て下さい。
シールドタイプのモータードライバは2台のモーターを制御出来るタイプのものでは他にL298Pモータードライバシールドなどもあるようです。
DCモーターやステッピングモーターなどをArduinoで動かしたい場合、その駆動には比較的大きな電力を必要とすることからArduinoからの出力だけでは電流が不足するためこのようなモータードライバを使い動かす(制御する)のが一般的となります。
1から制御回路を組むのは大変で面倒ですからね!
そして通常のモータードライバ(ボードなど)を使う場合その配線が多くなりがちですが、このようなシールドタイプのドライバを使うことによりArduinoと直接接続する事ができ配線数を減らしスッキリとコンパクトにする事が出来ます。
製作物などに組み込む場合は便利となりますね!
L293Dモータードライバシールドは本家ボードはAdafruitとなります。
本家ボード以外にも多数の互換ボードが販売されています。
今回使用しているものは、こちらの互換ボードとなります。
新しいバージョンとなるV2.2やV2.3も販売されているようです!
使用されているIC(チップ)は、2チャンネルのモータードライバチップL293Dが2つとそれを制御するための74HC595NというシフトレジスタICが使われています。
L293Dドライバチップはそれ単体でも使われることが多いものとなりますが、このシールドタイプのモータードライバには2つのL293Dチップが使われていて、DCモーターなら4台まで同時に制御する事ができます。
制御用として74HC595Nシフトレジスタを使用しているのでサーボモーターやDCモーター、ステッピングモーターなどと組み合わせて制御が出来る便利なArduino用のシールドとなります。
2台のDCモーターでタイヤを回転させ、1台のサーボモーターでステアリングを制御するといったラジコン用途などでも使えますね!
ボード概要
L293Dモータードライバシールドは、L293Dチップ(IC)をベースにしたドライバボードとなります。
L293Dチップは2チャンネルのモータードライバとなり2台のDCモーター(または1つのステッピングモーター)を制御出来るICです。
このシールドには2つのL293Dチップが搭載されていて、中央にある74HC595Nというシフトレジスタチップでそれぞれを制御しています。
そのため、このシールドでは4台のDCモーターや2台のステッピングモーター、それに加え2台のサーボモーターを同時に制御する事が出来るシールドとなります。
シールドタイプのボードなので、Arduino(こちらではArduino Unoを使って説明していきます)に挿し込むだけで上記機能を追加できる便利なシールドとなっています。
シールドタイプのボードはピン配列が規格化されているので、Arduino Megaなどでも同様に挿し込むだけで機能を追加し使うことが出来ます。
ボード上の各端子について
それではボード上の各端子を見ていきます。
外部電源端子
こちらが外部電源からの電力供給用の電源端子となります。
電源端子とモーター接続端子はターミナルブロック形状となっています。
DCモーターやステッピングモーター、サーボモーターの駆動用の電源となるため基本的にこちらに外部電源を接続して動かす形となります。
Arduinoへの給電はシールド側から行うことが出来るので、Arduino自身への給電(USB端子やDCジャックなどから)は不要となります。
動作電圧は4.5~25Vの範囲となっていて、モーター接続端子への各チャンネル出力は0.6A(ピーク時最大電流1.2A)となっています。
電源端子の横に[PWR]と書かれた端子がありますが、デフォルトではジャンパーピンが接続され短絡されています。
短絡状態ではシールドとArduino側の電源が共通で取られる形となります。
ジャンパーピンを外し開放する事によりArduinoとシールドの電源を独立させることが出来ます。
また電源端子の左横には物理スイッチとして[リセットスイッチ]も付けられています。
モーター接続端子
次にモーター接続端子です。
こちらもターミナルブロック形状となっています。
左右に2台ずつ計4台までのDCモーターを接続して同時に動かすことが出来ます。
そしてこのシールドの動作電圧は4.5V~25Vとなっています。
電源端子に印加した電圧がモーター接続端子からの出力電圧となります。
6Vモーターを接続して使うなら電源端子に外部電源から6Vを印加するということですね!
動作電圧に関しては少し注意が必要かもしれません!
例えば、工作用途でよく使われるFA-130などのDCモーターではその動作電圧が3V(1.5~3.0V)のモーターもありますが、4.5V以下の電圧ではこのシールドを動作させることができないので注意が必要です。
また、内蔵されているモータードライバチップL293Dはチャンネルあたりの出力が600mA(ピーク時1.2A)の出力となっています。
使用用途にもよりますが、冒頭でご紹介したロボットカーの製作ではこのシールド経由ではパワーと速度を出すことができなかったため、最大駆動電流が2AとなるL298Nモータードライバを使いました。
そして今回ご紹介しているL293Dモータードライバシールドは、V1.Xのものとなります。
新しいV2.2やV2.3タイプのものでは、L293DチップからTB6612 MOSFETに変更されチャンネルあたりの出力が1.2A(ピーク時3A)と高くなっているようです。
V1.XタイプのものはAmazonなど国内サイトでも数百円程度と安価で入手する事が出来るので、このシールドを使われる場合はその使用用途により選択されるのがいいかと思います。
またモーター端子は、DCモーター以外にもステッピングモーターを接続して動かすことも出来ます。
ステッピングモーターの接続は最大2台まで可能となっています。
サーボ接続端子
L293Dモータードライバシールドは、DCモーターやステッピングモーター以外にもサーボモーターを動かすことも出来ます。
5V駆動のサーボモーターに対応していて2台まで接続して制御する事ができます。(上段3ピンがサーボ①、下段がサーボ②となります)
接続端子は以上となります。
2台のサーボモーターに加え4台のDCモーターや2台のステッピングモーターをそれぞれ同時に制御して動かすことが出来る便利なArduino用のモータードライバシールドとなります。
L293Dモータードライバシールドの仕様
動作テストとして実際に動かしてみたいと思いますが、簡単にL293Dモータードライバシールドの仕様をまとめておきます。
- Arduinoの高解像度専用タイマーに接続された5V「ホビー」サーボ用の2つの接続が可能(ジッターなし)
- 個別の8ビット速度選択を備えた最大4つの双方向DCモーター(約0.5%の分解能)
- シングルコイル、ダブルコイル、インターリーブまたはマイクロステッピングを備えた最大2つのステッピングモーター(ユニポーラまたはバイポーラ)の駆動が可能
- 4Hブリッジ:L293Dチップセットはブリッジあたり0.6A(1.2Aピーク)、4.5V〜25Vのサーマルシャットダウン保護を提供
- プルダウン抵抗は、電源投入時にモーターを無効に保ちます
- ワイヤ(10-22AWG)と電源を簡単に接続するための大きなターミナルブロック
- リセットボタンを搭載
- 個別のロジック/モーター電源用の外部電源を接続するための2ピンターミナルブロック
- Arduino Mega/DiecimilaおよびDuemilanoveとの互換性をテスト済み
以上がこのシールドの主な仕様となります。
AdafruitからArduino用のライブラリが用意されているので比較的簡単にそれぞれのモーターを動かすことが出来ます。
【動作例①】サーボモーターを動かしてみる
それでは実際にモーターを接続して動かしてみたいと思います。
まずはサーボモーターからです。
サーボモーターは2台まで同時に動かすことが出来ます。
サーボモーターの制御にはArduino IDE標準ライブラリとなる「Servoライブラリ」が使用できます。
サーボモーターの制御方法に関しては、こちらの記事も参考にして下さい。
サーボ接続端子の上段がサーボ①、下段がサーボ②となっています。
サーボ①はArduino 側のD9ピン、サーボ②はD10ピンと繋がっています。
簡単なテスト動作用スケッチを作ってみました。
Servoライブラリが使えるので簡単ですね!
1秒おきにサーボ①が0°→180°、サーボ②が180°→0°動く簡単なスケッチです。
サーボモーターを動かす場合、サーボ①はD9ピン・サーボ②はD10ピンに接続されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | // L293Dモータードライバシールドを使ってみる! // https://burariweb.info // // サーボモーターの制御 #include <Servo.h> // Servoライブラリのインクルード Servo myservo1; // サーボモーターオブジェクトの生成 Servo myservo2; const int Servo1_PIN = 9; // サーボ接続ピンの指定 const int Servo2_PIN = 10; void setup() { myservo1.attach(Servo1_PIN); // サーボモーターの設定 myservo2.attach(Servo2_PIN); } void loop(){ myservo1.write(0); // 指定角度にサーボを動かす myservo2.write(180); delay(1000); myservo1.write(180); // 指定角度にサーボを動かす myservo2.write(0); delay(1000); } |
【動作例②】DCモーターを動かしてみる
DCモーターとステッピングモーターを動かすには、Adafruitが提供している『Adafruit Motor Shild Library』ライブラリが必要となるので事前にインストールしておく必要があります。
ライブラリのインストールは、[スケッチ]→[ライブラリをインクルード]→[ライブラリの管理]から
[Adafruit Motor Shild Library]で検索し、V1のものをインストールします。(V2タイプのライブラリもあるので注意して下さい)
またGitHubからZIPファイルをダウンロードしてインストールすることもできます。
ライブラリのインストールが完了したらテスト動作で動かしてみます。
モーター端子1とモーター端子4にそれぞれDCモーターを接続し2台のモーターを動かしてみます。
6VタイプのFA-130モーターを使用しました。
接続した2台のモーターを3秒間正回転(最大速度)→3秒間逆回転(半分の速度)→3秒間停止を繰り返すスケッチとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // L293Dモータードライバシールドを使ってみる! // https://burariweb.info // // DCモーターの制御 #include <AFMotor.h> // AFMotorライブラリのインクルード AF_DCMotor motor1(1); // モーター①をモーター端子1に接続 AF_DCMotor motor2(4); // モーター②をモーター端子4に接続 void setup(){ motor1.run(RELEASE); // モーターを一旦停止させる motor2.run(RELEASE); delay(2000); } void loop(){ motor1.setSpeed(255); // モータースピードを設定(0~255の範囲) motor2.setSpeed(255); motor1.run(FORWARD); // モーター1とモーター2を正回転させる motor2.run(FORWARD); delay(3000); motor1.setSpeed(128); // モータースピードを設定(0~255の範囲) motor2.setSpeed(128); motor1.run(BACKWARD); // モーター1とモーター2を逆回転させる motor2.run(BACKWARD); delay(3000); motor1.run(RELEASE); // モーターを停止させる(ブレーキ) motor2.run(RELEASE); delay(3000); } |
スケッチ解説
モーターを制御するために必要なライブラリのインクルード。
6 | #include <AFMotor.h> // AFMotorライブラリのインクルード |
接続するモーター名と接続端子の指定。(モーター端子1~4)
※freq(周波数)は省略可。
AF_DCMotor motorname(portnum, freq);
8 9 | AF_DCMotor motor1(1); // モーター①をモーター端子1に接続 AF_DCMotor motor2(4); // モーター②をモーター端子4に接続 |
モータースピードの設定。
0~255(8ビット)の範囲で指定します。
setSpeed(speed);
21 22 | motor1.setSpeed(255); // モータースピードを設定(0~255の範囲) motor2.setSpeed(255); |
27 28 | motor1.setSpeed(128); // モータースピードを設定(0~255の範囲) motor2.setSpeed(128); |
モーターの運転モードの設定。
cmdの値は、FORWARDで正回転・BACKWARDで逆回転・RELEASEで停止(setSpeed(0)と同じ)させます。
run(cmd);
23 24 | motor1.run(FORWARD); // モーター1とモーター2を正回転させる motor2.run(FORWARD); |
29 30 | motor1.run(BACKWARD); // モーター1とモーター2を逆回転させる motor2.run(BACKWARD); |
33 34 | motor1.run(RELEASE); // モーターを停止させる(ブレーキ) motor2.run(RELEASE); |
詳しくは、AdafruitのAF_DCMotor Classを参考にして下さい!
参考 AF_DCMotor ClassAdafruit【動作例③】ステッピングモーターを動かしてみる
ステッピングモーターも2台まで動かすことが出来ます。
片側にDCモーターを2台、もう片側に1台のステッピングモーターという組み合わせでも制御する事ができます。
ユニポーラ型の小型ステッピングモーター(28BYJ-48)を2台動かしてみたいと思います。
28BYJ-48ステッピングモーターはこちらの記事で詳しく解説しているので参考にして下さい。
28BYJ-48はユニポーラ型のステッピングモーターとなり、内部のコイルはこのように接続されています。(画像引用:秋月電子通商)
各コイル共通となっている赤ケーブルは、モーター接続端子中央にあるGND端子に接続します。
あとは青色・黄色のペアとオレンジ色・ピンク色のペアで接続します。
バイポーラ型のモーターの場合は、GNDに接続する配線がない以外同様となります。
簡単なスケッチを作ってみました。
ステッピングモーター①とステッピングモーター②が順番に180°正回転・360°逆回転を交互に繰り返すスケッチとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | // L293Dモータードライバシールドを使ってみる! // https://burariweb.info // // ステッピングモーターの制御 #include <AFMotor.h> // ライブラリのインクルード AF_Stepper motor1(64, 1); // ステッピングモーターオブジェクトの生成 AF_Stepper motor2(64, 2); // (分解能,接続端子) int speed = 350; // 回転スピードの設定(rpm) void setup(){ motor1.setSpeed(speed); // モーター速度を設定 motor2.setSpeed(speed); motor1.release(); // モーターを解放 motor2.release(); delay(1000); } void loop(){ // ステッピングモーターを動かす motor1.step(2048, FORWARD, INTERLEAVE); // 2048ステップ(180°)正回転させる motor2.step(2048, FORWARD, INTERLEAVE); motor1.step(4096, BACKWARD, INTERLEAVE); // 4096ステップ(360°)逆回転させる motor2.step(4096, BACKWARD, INTERLEAVE); } |
スケッチ解説
ステッピングモーターを制御するために必要なライブラリのインクルード。
6 | #include <AFMotor.h> // ライブラリのインクルード |
ステッピングモーターオブジェクトの生成。
最初の引数はステッピングモーターの分解能となります。(モーター1回転あたりのステップ数)
28BYJ-48のステップ角は5.625°となっています。
よって360°/5.625°=64ステップというように設定しました。
2番目の引数はシールドに接続しているステッピングモーター番号となります。(M1/M2に接続しているモーターは1、M3/M4に接続しているモーターは2となります)
AF_Stepper steppername(steps, portnumber);
9 10 | AF_Stepper motor1(64, 1); // ステッピングモーターオブジェクトの生成 AF_Stepper motor2(64, 2); // (分解能,接続端子) |
モーター速度をrpmで指定。
setSpeed(rpm);
16 17 | motor1.setSpeed(speed); // モーター速度を設定 motor2.setSpeed(speed); |
28BYJ-48ステッピングモーターの無負荷時の最高回転数は4秒で1回転、つまり1分間で15回転(rpm)で最大速度となるのですが!
28BYJ-48のrpmについて書かれた記事があったのでこちらも参考にして下さい。 参考 28BYJ-48 5v Stepper Motor — How Many RPM Can I Spin This Thing?Medium
stepコマンドでモーターを動かします。
step(steps, direction, style);
ステップ数(steps)を指定してモーターを回転させます。
回転方向(direction)は、FORWARDで正回転・BACKWARDで逆回転を指定します。
励磁方式はstyleで指定します。
1相励磁の場合SINGLE、2相励磁はDOUBLE、1-2相励磁ではINTERLEAVE、マイクロステップはMICROSTEPで指定します。
また、モーターをシングルステップさせるonestep関数も用意されています。
詳しくは、AdafruitのAF_Stepper Classを参考にして下さい!
以上、L293Dモータードライバシールドを使ってサーボモーターとDCモーター、ステッピングモーターを動かしてみました。
スケッチを工夫して4台までのDCモーターや2台までのステッピングモーター、2台のDCモーターに1台のステッピングモーターの組み合わせに加え2台のサーボモーターも同時に制御出来るモータードライバシールドとなります。
シールドで使われているデジタルピンについて
このシールドを使用している時は、DCモーターやステッピングモーターの制御でArduino側のデジタルピンD3/D5/D6/D11ピンが使用されています。
そして、D4/D7/D8/D12ピンはシフトレジスタチップで使われており、サーボモーターはD9/D10ピンを使用します。
デジタルピンの空きとしてD2とD13ピンは使えるようですね。
またアナログピンA0~A5までの6ピンは使われていないため使用することが出来ます。
アナログピンなのでデジタルピンとして使用することも出来ます。
アナログピンは、シールド上にスルーホールのパッドが用意されています。
ピンヘッダーなどを取り付けて使うことが出来ます。(5VやGNDピンとのピッチは2.54mmよりも大きくなっています)
【追記】無線モジュールを接続する一例!
L293Dモータードライバシールドは複数台のモーターを動かすラジコン用途に使われることが多いと思いますが、ラジコン用途で使用する場合には無線モジュールとの接続は必須になってくると思います。
Arduinoとの接続ではA0~A5端子は全て未使用となっておりピンヘッダーを取り付けてIO端子として使うことが出来ます。
またサーボ用の端子はArduinoのD9/D10端子に直結して接続されているだけなのでこの端子を使って無線モジュールの接続に使うことも出来ます。
この投稿をInstagramで見る
最後に!
L293Dモータードライバシールドは、Arduinoのシールドの中でもメジャーな製品になるかと思います。
現在V2.Xタイプのものが新しいバージョンとなるようですが、V1.Xタイプのものは安価な価格で入手がしやすいため工作用途で使える場面は多いと思います。
先述のようにこのドライバシールドのチャンネルあたりの出力は600mAとなり、DCモーターを使ったラジコン用途では私の場合出力がもう少し欲しい感じだったのでL298Nドライバボードを使い製作したという経緯があります。
使用用途によっては便利に使えるシールドだと思います。
コメントを残す