公開日:2019/01/08
title.png

3rd Season


#3-8 ブラシDCモータ

 これまで、Iduinoスタータキットに入っていたモータをサーボモータ ⇒ ステッピングモータと、回してきましたので、3種類入っていたモータの最後の1つ、ブラシDCモータを回してみます。

ar38_3vmtr.jpg

 回すの一番簡単なのに、何でこいつが最後なのだか……。この種のモータは、2つある端子にGNDと適切な電源を印加したら勝手に回ります、Arduino不要です。今回は、モータの回転方向と回転速度の両方をArduinoから制御してみたいと思います。

ブラシDCモータ

 まずは、Iduinoスタータキットに入っていたDCモータの仕様を確認したいのですが、本体には、メーカ名も型番も、手掛かりになりそうなものが何一つありませんてした。しかも、最悪なことに、上に示した写真のモータは「130型」というデファクトで、互換品や動作電圧の異なるタイプが多数出ており、手元のモータがどういった仕様なのか、全く知ることができませんでした。
 唯一、パッキングリストに載っていた、「3V Motor」という名前だけが頼りです(上写真)。

 このタイプのモータを使ったおもちゃを昔持っていた記憶があります。乾電池2本ないし4本直列で動くタイプのおもちゃだったので、「3V Motor」を前提とするなら、アルカリ(マンガン)乾電池2本直列で動くように設計されたモータなのでしょう。
 Arduinoを使っていると、電源電圧は3.3Vまたは5Vが用意できるのですが、3.3Vで良いでしょうか?「3V Motor」に対しては、1割ほど高い電圧ですが……。最悪、乾電池から電源を取るしかないですね。

モータドライバIC

 冒頭で述べたように、ブラシDCモータは電源さえ供給してしまえば回ります。ですが、回転方向や回転速度を制御するなら、適切なドライバICを使った方が楽に回路を構成できます。「#3-6 ステッピングモータ」の時に調べたL293Dという型番のICが使えます。
 もう一度、データシートを検索しておさらいしておきましょう。

  L293Dのデータシートを検索する

 出力電流はMAX 600mA(絶対最大定格)となっています。「#3-6 ステッピングモータ」で使ったULN2003Aの出力電流がMAX 500mAですので、それよりも少し多めに流せるようになっているようです。
 どうやら、MCUからの信号を受けるロジック電源(Vss)と、モータを駆動するための電源(Vs)が分離されています。何々、フムフム。

Symbol Parameter Min Max Unit
Vs Supply Voltage Vss 36 V
Vss Logic Supply Voltage 4.5 36 V

※上の表は、ST版データシートからの引用です。ロジック電圧Vss=36V(MAX)って、すごいな……(誤記?)。TI版データシートでは、Vss=7V(MAX)でした。

 まぁ!大変。なんと、モータ駆動用に供給する電源(Vs)は、ロジック電源(Vss)より低くすることができません。おまけに、ロジック電源(Vss)は、MIN 4.5Vですので、3Vに落とすこともできません。
 と、言うことは、肝心な「3V Motor」が繋げないではないですか!

 わざわざ、「キット」の中に入っていたL293Dと「3V Motor」なのですが、組み合わせて使うことはできないようですorz。

USBファン(扇風機)

 さてどうしたものかと悩んでいると、筆者の手元にUSBに繋ぐと風を送ってくれるUSBファン(扇風機)がありました。

ar38_usbfan.jpg

 本体にスイッチ(見るからにメカニカル)がついていますが、回転方向や回転速度などは変えられない、とてもシンプルな扇風機です。「スイッチをONすると、ただ回転する」という単純な動作から、「どうせブラシDCモータ直結なんでしょ?」と予想。最悪、壊れてしまうことも覚悟の上で、実験してみました。
 USBの端子から電源線(VBUS及びGND)を引き出して、VBUSに5Vと、GNDを接続したところ、回りました。これは当たり前です、そういう商品(USBから5Vをもらって回転する)ですから。次に、VBUSにGND、GNDに5Vと、逆電圧をかけたところ、今度も回りました。逆回転です。やっぱりただのブラシDCモータですね。

※何らかの制御用に電子回路(やレギュレータ等)が入っているタイプだと、逆電圧で回路にダメージを与える場合がありますので、皆様はまねをなさらぬよう、ご注意申し上げますm(1__)m。

 予想される回路図は以下。

ar38_usbfan.png

 しかも、都合の良いことに、PCのUSB端子に挿さって回っていた扇風機なので、定格5Vで500mA未満であると考えられます。L293Dの出力許容電流値600mAを満たしており、問題ないでしょう。

 と、言うことで、このUSBファンを、DCモータとして使用して、回転制御を行ってみようと思います。ただのDCモータとして使うので、とりあえず、SW1はONしたままで使います。何らかの緊急事態が起きた時に電源を切断できる緊急回避スイッチとしては使えるかもしれません。

USB端子

 USBファンはそのまま、分解せずに使おうと思います。なので、使っていないUSB延長ケーブルからAタイプコネクタのオス端子と、メス端子のついたケーブルをそれぞれ切り出して、DCモータに電源を供給しようと思います。USB Aタイプのコネクタを覗き込む様にした時に、内部に導体が4つ見えます。その端子割り当ては以下の通りです。

ar38_usbcon.png

 導体部分に色を付けておきましたが、ケーブルを切断したときに、中から出てきた配線の色になっています。3本分解して、3本ともこの色になっていたので、デファクトになっているものと思われます。ただし、間違って接続されているケーブルもあるかもしれないので、念のため、「#2-9 抵抗値を測定する」で使った抵抗測定回路とプログラムを使って、導通を確認してから使います。
 今回は電源線だけを使いますので、1(VBUS)と4(GND)を引き出す必要があります。

 さすがに、ケーブルから引き出した配線のままでは、ブレッドボードには挿さりませんので、ユニバーサル基板とピンソケットを使って、以下図のような治工具を作成しました。

ar38_usbjig.jpg

 将来別な用途に使用できるかもしれないので、D+,D-も含め、4本すべてをピンソケットにはんだ付けしました。そのままでは、はんだ付けした根元部分が動いてしまって、すぐに金属疲労で切れてしまうので、ケーブルの根元部分に細い針金を巻き付けて固定しておきました。

 将来的には、ユニバーサル基板の空き領域にL293Dを実装して、DCモータの制御基板にしたいと思いますが、まずは、ブレッドボードを使って動作を確認するための治工具です。

※ちなみに、ユニバーサル基板とピンソケットは、「#3-3 I2C接続 LCD表示モジュール」で購入した物の残り。

DCモータの回転制御

 さっき「モータドライバ」の節で、L293Dのデータシートを探していた時に、「アプリケーションノート」というドキュメントも見つけていました。そこに記された回路で、DCモータの回転方向と回転速度を制御することが可能です。「その手」がありましたね。闇雲にデータシートを探すだけではなくて、メーカが発行しているアプリケーションノートにも、有用な情報が含まれている場合があると再認識しました。

 以下、今回の実験回路図です。右下のコネクタ2つ(CN1とCN2)が、前節で作成したUSBコネクタ治工具部分の回路となります。

ar38_dcmtr.png

 モータは、電流を供給して回している限り「モータ」ですが、電流を遮断して惰性で回り始めると「発電機」となって、逆に回路へ電流を流し込んできます。この電流から駆動回路を保護するために、ダイオードが挿入されています。L293Dには、保護ダイオードがIC内に集積されているので便利です。"D"の付かない「L293」には、保護ダイオードが入っていないので、自分で外付けに配置する必要があることに留意してください。

 モータを駆動するための電源は、Arduinoの電源(Vcc)とは分離して、別なUSB端子(VBUS)から供給しています。結構電流を食うはずなので、Arduinoのボードから供給しない方が無難です。
 また、L293Dには4つのドライバが入っているのですが、そのうちの2つしか使用しないので、残りの入力ピン(9,10,15)はGNDに落として処理しておきます。バイポーラステッピングモータを回す時には、4つのドライバ全て使います。定格電流値内で回せることが条件ですが、DCモータなら2つまで駆動できる構成となっています。

 IN1、IN2、ENBの3端子でArduinoから制御します。

ENB IN1 IN2 OPERATION
H H L Turn Right
H L H Turn Left
H H H Fast Stop
H L L Fast Stop
L X X Free Running

 右とか左とか書いてありますが、モータの端子のつなぎ方次第で逆に回ります。要は、「右」と「左」の状態では、逆に回りますよ、と考えてご覧ください。
 ENB端子がHIGHの時、IN1≠IN2とするとモータが回転します。回転方向は、IN1≠IN2とした時のHIGHにする端子によって決定します。IN1=IN2では、モータを停止(Fast Stop)します。一方、ENB端子をLOWに落とすと電力の供給が断たれ、モータは「フリーラン(Free Running)」状態となって、いずれ停止します。

※筆者の実験では、「Fast Stop」と「Free Running」後の停止に差が見られませんでした。実は、どっちも同じ??

 回転速度はどのように制御するのでしょうか?「#2-7 7SEG LEDを表示する」で、LEDの明るさを制御するのに使用したのと同様に、PWM出力を使って、モータに供給する電力(の平均値)を変化させることによって回転速度を制御します。
 ただし、IN1、IN2は、L-LやH-Hの状態を作ってしまうと、回転を停止する方向に力が働いてしまうため、ここにPWM波形は入力できません。PWM波形はENB端子に印加します。

回してみましょう

 テスト用のプログラムをリンクしておきます。

  完成プログラム:test_dc_motor.ino

 いつもの様にシリアルモニタから以下のコマンドを受け付けるようになっています。

 ArduinoとUSB基板、ブレッドボード間のGNDを確保します。後は上の回路図の通りに配線して、USB基板に接続した、USBメスコネクタにUSBファン、USBオスコネクタを適切なUSB端子に接続して、モータの電源を供給します。
 実験中の様子です(↓)。

ar38_circt.jpg

  実験サンプル:【 】内はシリアルモニタからの送信データ
  【pwm,256】
  OK: PWM=256

  【turn,r】
  OK: Turn Right

  【turn,s】
  OK: Fast Stop

  【turn,l】
  OK: Turn Left …… △ 再回転できない場合あり

  【pwm,128】
  OK: PWM=128 …… × 回転が止まった。トルク不足?

  【pwm,256】
  OK: PWM=256 …… △ 再回転できない場合あり

  【pwm,0】
  OK: PWM=0

 なお、【pwm】コマンドの<duty>が小さすぎると、最低限回転させるのに必要なトルクが得られず、モータが回転しない場合があると思います(筆者の環境だと、<duty>=128では回転を維持できませんでした)。モータが回転する最小の<duty>値に関しては、お使いになるモータの特性や、その負荷によって変わってきます。
 回転速度を制御する時に、PWMのデューティを0〜255で制御するのではなく、<最小duty>〜255の間で制御する必要があると思いますので、使用環境に応じて計測しておく必要があると思われます。

 しかし、何か変です。双方向の回転も、ある程度のスピード制御も、正常に動いているのに、どうも、回転スピードが遅いです。USB治工具でVBUSとGNDをモータに直結すると、結構良い勢いで回転するのですが、L293Dを通すと、【pwm,255】コマンドで最速設定にしても、かなりスピードが落ちています(体感で半分くらい?)。
 トルクも落ちているようで、【turn,s】コマンドで一旦回転を停止してしまうと、再度【turn,r】コマンドを打っても、回転しません。羽の部分を少し指で押して、滑り出しを手伝ってあげると、ようやく回る、という具合です。指でアシストするという行為が必要とは言え、ちゃんと論理通りに動作しているので、回路に誤りがあるわけでは無い様です。

モータドライバ(再び)

 USB治工具上でVBUSとGNDを直結すると、正常に高速回転するので、USB治工具とUSBファン自体に問題は無いようです。
 DCモータ(USBファン)を取り外した状態で、L293Dの出力端子(回路図中のM+とM-)の電位を測定(Logiscope、【ina】コマンド)してみたところ、【turn,r】、【pwm,255】の状態で、M+=5V、M-=0Vと、問題なし。続いて、DCモータを接続した状態で同様に測定すると、M+=4V、M-=0.95Vとなっていて、どうもこれが悪さしている様子。モータを繋ぐと、M+(出力電圧)がドロップし、M-(GND)も浮いています。これでは、モータにかかる電圧は正味4−0.95≒3V程度となり、5V定格のモータに対してパワー不足が否めません。

 理由がわからず、あれこれ調べていると、それらしきスペックが見つかりました(出展:TI版L293Dデータシート)。

PARAMETER CONDITION MIN TYP MAX UNIT
Voh High-level output voltage Ioh=-600mA Vs−1.8 Vs−1.4   V
Vol Low-level output voltage Iol=600mA   1.2 1.8 V

 出力電圧のスペックですね。電流が600mA流れると、HIGHを駆動する時、TYPでモータ駆動電圧(Vs)より1.4V低い電圧を出力しますよ、LOWを駆動する時も、TYPで1.2Vを出力しますよ、というスペックです。さすがに、600mAも流していないはずだけど、観測されたM+=4V、M-=0.95Vも、あながち異常な出力とも言えなさそう(上表のスペック範囲内)。

 どう考えるべきか?こういう(↓)ことで合っている?

※自信無いですが……。実験結果から導き出した結論です。間違っていたらごめんなさい。皆様は、ご自身で良く調べて、お使いくださいm(1__)m。

 と、言うことで、筆者手持ちのACアダプタを検索したところ、6VのACアダプタが見つかりました。6VのACアダプタをモータ駆動電源(Vs)に接続したところ、USB(5V)からの給電に比べて高速に回転することを確認しました。【turn,s】コマンドで停止後、【turn,r】コマンドを実行すると、何とか、回転を再開します。
 ただ、まだちょっと、トルクが足りていないようで、一度停止すると再回転できないことがしばしばありました(指で少し手伝ってあげると回転できる)。安定して使用するには、もう少し高い電圧(7V〜)のACアダプタが必要みたいです。筆者手持ちでは、6V ACアダプタの次は9Vまで飛んでしまったため、実験はここで終了です。

 回路としては正しいはず(L293Dのアプリケーションノート通り、かつ、論理動作は正しかった)なので、供給電圧さえ調整可能なら、ここでミッション完了です。

※後日、昇圧電源モジュールを入手して、所望の電源電圧を供給し、ミッションを完了しました。詳しくは末尾「後日のアップデート」をご覧ください。

リレー登場

 USB(5V)からの給電では、駆動電圧がちょっと足りない「らしい」ことが分かったのですが、USBから給電したかったので、これではちょっと目的を果たせません。そこで、Iduinoスタータキットに入っていたリレーモジュールを使ってみることにしました。

ar38_relay.jpg

 制御側(写真右側)の端子は3本、Vcc、GND、S(制御信号)です。駆動側(写真左側)にも3つの端子が見えます。ねじで配線を挟み込んでコンタクトするタイプの端子です。端子の下に隠れてよく見えないのですが、シルクにNC、NOと書いてあるようです。

 まずは、マークされている型番でデータシートを探してみましょう。

  型番(SRD-05VDC-SL-C)からデータシートを検索する

 データシートによると、10A/125VAC、7A/28VDCということで、ちょっとした家電製品なら、スイッチングできてしまうスペックみたいですね(こんなちっちゃい筐体にAC100V印加する気にはならないけど……)。電気的特性は判ったのですが、モジュール端子の意味が解りません。たぶん、2相のプリント基板なのですが、中央に「デンッ」と、リレー本体が実装されてしまっている関係で、リレーの下に配置された配線が見えず、回路図が読み取れません。

 まあ、実験してみますか。
 リレーモジュールの制御側端子にArduinoのVccとGNDを繋ぎ、制御信号Sを適切なデジタル端子に繋ぎます(ここでは、D4としておきます)。Logiscopeを起動して、コマンドウインドウに【out,4,1】と入力して「OK」ボタンを押すと、カチッと音がして、リレーモジュール基板上のLEDが点灯しました。なるほど、S端子にHIGHを駆動すると、リレーがONになるみたいですね。【out,4,0】と入力すると、またカチッと音がして、リレーがOFFになりました。

 あとは、駆動側3端子の意味ですね。もう1機Arduinoを起動して、「#2-9 抵抗値を測定する」で使った抵抗測定回路で3端子間の抵抗値を測定します。結果、分かったのは、中央の端子が共通となっていて、左側端子が常時閉(NC…Normally Close?)、右側端子が常時開(NO…Normally Open?)となっています。S端子にHIGHを駆動してリレーがONになると、開/閉が逆転します。

 リレーは、コイルに電流を流すことで電磁石を形成し、電極を磁石にくっつけることで導通/非導通を切り替える装置です。リレーがONしている間、コイルに電流が流れ続けます。データシートによると、71.4mA(Nominal Current)だそうです。結構、派手に電流を消費します。高々5Vのスイッチングに71.4mAも消費するのは、ちょっともったいないかもしれないですね。

 では改めて、リレーを使ったDCモータの制御回路です。

ar38_relay.png

ar38_circt_r.jpg

 同じUSBからの給電でしたが(L293Dから駆動した場合と異なり)、勢い良く回ります。うーん、回転方向も回転速度も制御できず、ON/OFFだけ制御できる回路、と言うことで、残念なレベルダウンです……。回転速度の制御が可能になれば、「1/fゆらぎ扇風機」の真似事なんてものも面白いかも、と思っていたのですが、ON/OFF制御ではそれも叶わずorz。


 一番簡単に回せると思っていたDCモータに、一番振り回されてしまいました……。


後日のアップデート

 後日、昇圧電源モジュールを入手して、DCモータ(USBファン)の回転速度制御を完成しました。「#6-3 1/fゆらぎ扇風機」でご確認ください。

 L293Dを通したことで低下してしまう出力電圧分、あらかじめ昇圧電源モジュールで昇圧した状態でL293Dに供給し、出力が十分な電圧(5V)になるように調整する解決策を選択しています。


btn_arduino.png

btn_prev.png btn_next.png

home