気の向くままに辿るIT/ICT/IoT
IoT・電子工作

Arduinoでトランジスタ/リレー/モータドライバを使ってDCモータを動かす

ホーム前へ次へ
Arduinoって?

Arduinoでトランジスタ/リレー/モータドライバを使ってDCモータを動かす

Arduinoでトランジスタ/リレー/モータドライバを使ってDCモータを動かす

2017/09/10

乾電池だけでDCモータを回す例

乾電池でDCモータを駆動

 140型DCモータなど模型などでよく使われるモータは、1.5V〜3V(単1/単2/単3/単4などの乾電池1〜2本程度)でプラスとマイナスをつなげば、簡単に動かすことができ、極性を逆にすれば、回転も逆になり、電圧の高低で回転スピードが変化します。

 写真では、中心が黒く周囲が白く見えますが、実際には、モータシャフトに十字に黒いビニールテープを貼った白く円形の紙を挿して回している状態。

ArduinoでDCモータを駆動する例

 それほど簡単に動かすことができるDCモータも数百mA〜1A程度もの電流を要するため、1ポート最大40mA程度というArduinoの出力電流の仕様上、そのままでは無理がありますが、トランジスタやリレーとモーター用の別電源を使うなど、ちょっと工夫すれば、ArduinoでもDCモータを動作させることができます。

 そんなの面倒だから、電池だけで動かせばいいじゃないかと一瞬思うかもしれませんが、ArduinoでDCモータを動かせるということは、プログラム次第でDCモータをそこそこ操ることができるということで単に電池につなぐだけよりも利用の幅が広がり、きっと手間をかけるだけの価値は十分にあるでしょう。

 それでも不足するような用途には、回転角を指定できるステップ(ステッピング)モータと、これが脱調するようなより高速な動作・制御が必要な用途には、サーボモータ(180度程度ではなく360度回したければギアのストッパを除去するなどして改造)とモータドライバを使うとよいでしょう。

Arduino+トランジスタでDCモータを回す例

トランジスタとダイオードを使いArduinoでDCモータを駆動

 FET、MOSFETなど含め、トランジスタなら、Arduinoからの僅かな電流をトランジスタのベースに、コレクタ(この場合、同程度の出力があるエミッタでも可?)をDCモータの入力、エミッタ(コレクタ?)をGNDに配線すれば、相応のトランジスタを用意することでDCモータを回せるほどの、より多くの電流が流れます。(MOSFETなら電流量を電圧で制御できます。)

 N型とP型があるMOSFETは電圧で電流を、NPN型とPNP型があるトランジスタは、電流で電流を制御でき、NPN型のトランジスタなら、トランジスタのベースからエミッタに少量の電流を流すことで負荷側に多くの電流を流すべく制御でき、(Arduinoからの)僅かな電流をトランジスタのベースに流すとコレクタからエミッタにトランジスタの増幅率(hFE)に応じた多量の電流が流れるのでコレクタ側にDCモータの入力、エミッタ側をGNDに配線するとDCモータを回すこともできるようになったりもします。

 ただし、万一にもArduinoの許容を超えるほど電流が逆流するとArduinoが壊れる可能性が大なので逆流防止に(整流)ダイオードを併用するのが賢明。

 大は小を兼ねるらしいですが、ダイオードの選定については、まだよくわかっていない自身は、とあるDIYキットで使われていたものの1つ1N4004を買って使ってみています。

 コレクタ負荷、エミッタ負荷について調べてみたら、ダイオード、正逆転Hブリッジ、ドライバICなど含め、モータのOn/Off制御法に簡潔明瞭な説明がありました。

 この回路で使ったのは、Arduino Uno x1、USBケーブル x1、DCモーター x1、400穴ブレッドボード x1、単3乾電池x2本とこれ用の電池ボックス x1、トランジスタ(NPN S8050) x1、ダイオード(1N4004)、LED 5mm(緑) x1、抵抗(220Ω) x1、ジャンパワイヤ適量、両端ワニグチクリップケーブル適量で激安品を確保すれば、700〜1000円程度でいけそうです。

 スケッチは、ArduinoのD11のHIGHとLOWを一定時間で切り替えるだけ、回路もLED用の抵抗を追加した以外は、Device Plusページの後段にあるものそのままで、電池ボックスのプラスからモータの一端とダイオードのカソード、ダイオードのアノードにトランジスタのコレクタとモータの他端、UnoのD11から抵抗〜LEDアノード、LEDカソードからトランジスタのベース、トランジスタのエミッタを電池ボックスのマイナスにつなぎます。

 自身はまだやってみたことがありませんが、トランジスタを4つ使って回路を組むと正転・逆転も(停止も?)できる模様も、こうした回路であるHブリッジ付きのモータドライバを使うと簡単に制御できます。

 1秒ごとに連動してLEDが点灯・消灯しつつ、DCモータが回転・停止するスケッチを実行してみた動画がこれ(が、1秒だと慣性もあって完全には停止しない内に次の回転が始まりますが...)。

Arduino+リレーモジュールでDCモータを回す例

 これを踏まえ、1秒から3秒に変更したものの、それ以外は全く同じスケッチでトランジスタではなく、リレーモジュールを使ってDCモータを動作させてみた動画がこれです。(完全に停止したことは判別できる一方、やはり、DCモータに慣性があるのでOFFの際、リレーモジュール上のLEDやスイッチ切り替え音とは微妙に一致しない。)

 ここでは、直流電圧で別電源の直流電圧を制御していますが、リレーなら、Arduinoからの僅かな電圧・電流で大きな電圧・電流を制御でき、DC(直流)だけでなくAC(交流)電源に接続されたものも制御できるのでリレーの仕様にもよりますが、入力DC5VでAC100Vの家電を制御することも可能となります。

 この回路で使ったのは、Arduino Uno x1、USBケーブル x1、DCモーター x1、単3乾電池x2本とこれ用の電池ボックス x1、リレーモジュール(入力DC5V) x1、ジャンパワイヤ適量、両端ワニグチクリップケーブル適量で激安品を確保すれば、こちらも700円〜1000円程度でいけるのではないかと。

リレーモジュールを使いArduinoでDCモータを駆動

 リレーの場合は、Arduinoとリレーモジュール間でリレー用の電圧(今回仕様のリレーは入力5V)、リレー用のGND、信号出力ポート(今回はD11)とリレーモジュールのSIG(signal)を接続、ネジ止め端子台となっているリレーモジュールの出力(NO/(COM)/NC)の内、NO/(COM)か、NC/(COM)を使い、(COM)を別途用意したDCモータ用電源(乾電池など)のマイナスに接続、NOかNCの何れかとDCモータ用電源のプラスをDCモータに接続すれば機能します。

 尚、NOはNormal(ly) Open(通常・何もしないとき、回路がOFF/開)、COMは、Common(共通(のGND))、NCは、Normal(ly) Close(通常・何もしないとき、回路がON/閉)。

 リレーでDCモータを扱う場合でも逆流の懸念はあり、リレーモジュールであれば、入力と出力間において内部で電気信号 => 光 => 電気信号と変換することで電気的に絶縁しながら信号を伝達する半導体素子オプトカプラ/フォトカプラによって実質逆流を防止し、回路を保護する回路が搭載されたものと、そうでないものがあるのでオプトカプラ付きを選ぶのが、単体のリレーからモジュールを自作するならオプトカプラを載せるのが賢明。

 近年、ここで使ったような比較的大きな箱型でカチカチ音のする物理的なスイッチを切り替える機械式リレーではなく、半導体による無接点の切り替えで長寿命、静音な小型化されたソリッドステートリレー(SSR)が主流となっているようである一方、SSRには、ソーラーパネルなどでも使われるような、ネジ留めのごっついタイプもある模様。

NEC 2705絶縁保護フォトカプラ付きSRD-05VDC-SL-C 1チャンネル リレーモジュール
[2017/09/24]

 先で使った37センサ・モジュールキットに入っていたリレーモジュールにはありませんが、本来は、このリレーモジュールのように光接点により、入出力が電気的に絶縁保護されたオプトカプラ(写真のフォトカプラはNEC 2705)付きのリレーモジュール(写真のリレーはSRD-05VDC-SL-C)を使うのが安全。(今日、届いたので掲載。)

 もう1つ届いたソリッドステートリレーOMRON G3MB-202Pを使ったモジュールで駆動・停止には、ロッカスイッチを利用し、DCモータを動かしている動画がこれです。

 これも接続は同様ですが、ArduinoボードからVCC(5V/3.3V)をSSR/Solid State RelayのDC+に、GNDをブレッドボード上でコモンとしてSSRのDC-とロッカスイッチの一端を接続、ロッカスイッチの他端とSSRのCH1を繋げば入力側はOK。

 この状態で出力側の一方をDCモータの一端へ、他方をDCモータ用電源(ここでは乾電池)のマイナス、DCモータ用電源のプラスをDCモータの他端へつなぐと機能します。

Arduino+DCモータドライバでDCモータを制御する例

 更にDCモータドライバというDCモータを制御するためのドライバモジュールが市販されており、普通、保護回路も搭載されているはずなので、これを使うとより手軽にDCモータを扱うことができるでしょう。

[2017/09/13] モータドライバを追加発注、2週間前後で届く予定なので後日、モータドライバによるDCモータ制御について掲載予定。

[2017/09/24] => [2018/06/30]訂正・追記

 届いたところで、とりあえず、L9110S Hブリッジ付きモータドライバでDCモータを駆動させている様子の動作確認

 ちなみにこの写真では、出力のMOTOR A側を使うことにし、VCC/GNDをArduinoボード(Uno)、A-1A/A-1Bピン(なぜかA-1Bのみ逆に印字されてる)を電池、MOTOR A(それぞれMotor BとB-1A/B-1Bでも可)の端子台にDCモータをつなぎました。

 正転・逆転・停止は、ここで電池につないでいる2本をArduinoボードのデジタルピンの内、任意の2本につないでプログラム的に制御する必要があります。

 あっさり見つかったHow to use the HG7881 (L9110) Dual Channel Motor Driver Moduleのスケッチが秀逸。

 シリアルモニタから高速・低速・逆転・停止にそれぞれ緩急付けるメニューを指定することができるようになっています。

 尚、リンク先の回路は、スケッチそのままなら、ArduinoボードのD10/D11にモータドライバのB-1A/B-1B、端子台のMotor B(それぞれA-1A/A-1BとMotor Aでも可)からモータにつなぎ、モータドライバのVCC/GND(L9110Sは電源電圧2.5V-12V/定格電流800mA)には、安定・安全、ボード損傷回避などの為、Arduinoボードからではなく、電池・ACアダプタ・安定化電源など外部から供給します。

 ちなみに逆転の逆転で正転...というわけにはいかず、正転している場合に逆転するようになっている模様。

 DCモータの制御についてトランジスタ、リレー、モータドライバと見てきましたが、あとは、MOSFET Motor Example画像のようにMOSFETを使うか、手動・手回し、他にも方法はあるかもしれないものの、思いつきません。

 手動で速度をコントロールしたい場合には、ポテンショメータ(可変抵抗)や、これにボリュームつまみがついた速度・ボリューム・調光コントロールモジュールなどを使うとよいでしょう。

ホーム前へ次へ