久しぶりの電子工作ネタ.
Lチカやシリアル通信もいいけど
電子工作をやるなら,やっぱり動くもの(モータ)を自由自在に制御してみたい.
ということで今回は,
- Arduino
- モータドライバIC
を使って,マブチモータ(理科の実験とかで使うDCモータ)の制御をやってみた.
アナログ回路だとインバータやフィードバック制御が必要になるけれど,モータドライバICを使えばとても簡単にモータの制御(正転/逆転/ブレーキ)ができた.
モータの制御
今回制御するのが,ラジコンや模型でよく使われている,工作用DCモータ.「マブチモータ」という名前は,割と聞いたことがある人も多いのではないのだろうか.DCモータなので,乾電池を繋ぐだけで簡単に動かすことができる.
マブチモータの種類など,詳しい情報は以下のページが参考になる.
今回使ったのは「FA130」というモデル.
これを,「正転/逆転/ブレーキ」させることが目標.
モータの正転・逆転・ブレーキ
正転/逆転は,電池の向きを逆にして電流を流す向きを変えれば,簡単に変えられる.しかし,それでは「制御した」とはとても言えない・・・.
また,電池とモータを離せば「ブレーキ」じゃないか・・・?とも思うけど,それはただ単に惰性で止まっているだけで,電気的にブレーキがかかったことにはならない.
*
じゃあどうやって制御すればよいのか?
大学の講義で習った制御方法のひとつに,「ハーフブリッジインバータとフィードバック制御回路(PI制御など)」という方法がある.
ハーフブリッジインバータというのは,ごく簡単に説明すると
という目的をもつ回路構成.
また,フィードバック制御は,ブレーキをかけるための回路.
回転数をモータから読み取り,回転数指令値とコンパレートして,トランジスタの駆動信号を変える.
具体的な回路例は,以下の通り.
引用=古橋武:「パワーエレクトロニクスノート 工作と理論」,コロナ社,p.133 (2018)
ただし,この回路では多くの部品点数が必要となる.
モータを制御するために,これだけの部品を組み上げるのは面倒...
もっと簡単な回路で制御できないだろうか?
そう思って,いろいろ調べてみると「モータドライバIC」という便利なものがあることを発見した.
モータドライバICって何?
まず,以下のページを読むと,モータドライバICの利点がわかる.
先に述べたような回路の場合,目的の制御をするのに多くの部品が必要となる.また,抵抗やトランジスタなどの素子がもつ特性に気を配り,保護対策も自分で行わなければならない.
一方,モータドライバICでは,少ない部品・実装面積で制御が可能.しかも,IC内部に保護機能を持っている.
モータドライバICを使えば,簡単・手軽にモータの制御ができるというわけだ.
今回使用するモータドライバICは,秋月で購入した.
TB67H450モータドライバモジュール: 組立キット 秋月電子通商-電子部品・ネット通販
なお,上記モジュールははんだ付けによる組み立てが必要.自分用の半田ごては持っていなかったので,これも併せて購入した.はんだ付けにあたり買ったものは以下の通り.
- 半田ごて
- こて台
- はんだ
- はんだ吸い取り線
- ピンセット
ピンヘッダをドライバモジュールに差し込んで・・・
はんだづけすると,以下のような形になる.
これで,ブレッドボードにぶすっと差し込んで使うことができるようになった.
モータドライバモジュールの使い方
今回使うモータドライバモジュールの動かし方は,秋月の製品ページに掲載されている「アプリケーションノート」に詳しい.
http://akizukidenshi.com/download/ds/toshiba/TB67H450FNG_application_note_ja_20190510.pdf
アプリケーションノートの概要には以下の通り記述されている.
TB67H450FNG は、PWM チョッパ方式の DC ブラシモータドライバです。
モータ出力部を 1 チャネル内蔵しています。
低 ON 抵抗の MOS プロセス、および PWM 駆動方式の採用により高熱効率駆動が可能になります。
また、IN1、IN2 の 2 つの入力信号により、正転/逆転/ショートブレーキ/ストップの 4 モードを選択できます。
つまり,PWM信号をIN端子へ入力することで,正転・逆転・ブレーキができる,ということだ.
IN(入力)に対する,OUT(出力)の信号は以下の表の通り.
IN1,IN2は2つある入力端子を,L,Hは,PWM信号のLOW,HIGHを示している.
たとえば正転モードは,「IN1=HIGH・IN2=LOW」と入力すればよい.OUT1とOUT2の間に接続されたDCモータへ電圧が印加され,モータが正転する.
ハーフブリッジインバータ回路と比較すると直感的で簡単だ.PWM信号を入れれば,正転/逆転/ブレーキに必要な信号の出力は,全部ICがやってくれる.
また,モータを駆動する電圧(Vm)も「4.4V~44V」と,幅広い電圧を入れることができる(たとえば鉄道模型だと12V くらいらしいので,このモータドライバでも動かせることになる).
PWM信号はArduinoから入力する
さて,モータドライバICへ入力するPWM信号はどうやってつくればよいのか?
アナログ回路の組み合わせでつくることも,もちろんできる.
でも,Arduinoを使えば,もっと簡単にPWM信号を出力できる.Arduinoのデジタルピンは,信号をPWMとして出力するからだ.
Arduinoなどのマイコンは,通販などで手軽に買うことができて,コードの読み書きも簡単なので,電子工作を始めるなら1台持っておくと便利.
Arduino Unoについては以下の記事を参照.
ここまでで,「Arduino→(PWM)→モータドライバ→(駆動電圧)→DCモータ」というモータ制御の流れがわかった.
ここからは,具体的な回路とArduinoのスケッチを書いていく.
モータ駆動回路
実装する機能はシンプルにひとつのみ.
なお,この切り替えは,ブレッドボード上の「スイッチ」で行うことにした.
モータドライバICによるDCモータ駆動回路の例は,先ほど紹介した秋月の製品ページに掲載されている「アプリケーションノート」に掲載されている.
また,マルツオンラインの以下のページも参考になる.
今回は,アプリケーションノートにある回路を利用した.具体的には以下の通り.7.1「DCブラシモータ駆動の場合」を用いる.
Control I/Oは,Arduinoに対応する.
この回路例を,もう少し具体的に,動作させて必要だった修正も加えたのが以下の回路図.
フィルタコンデンサなど,素子の適正値は,アプリケーションノートに書いてあるので,それをそのまま採用した.
また,回路例からの素子の変更点などは以下.
- 1Ω抵抗がなかったので,RS端子はGNDに接続(定電流機能は使わない)
- モータ駆動電圧として6V投入(ただし,マブチモータの限界電圧3.0Vを超えないようにArduino側のPWMのDuty比を低めにする)
参考:電池ボックス 単3×3本 リード線・フタ・スイッチ付: パーツ一般 秋月電子通商-電子部品・ネット通販
回路図中にあるスイッチなどは,正転/逆転/ブレーキをパワーパックライクに切り替えるためのもの(最終的には鉄道模型を動かしたいので・・・).後述.
Arduinoのスケッチ
次に,Arduinoのスケッチ.スケッチのざっくりした設計思想は以下.
- PWM波形の出力パターン(正転/逆転/ブレーキ)を関数にする
- スイッチの状態を読み取って,動作を決める
/* Arduino UnoとモータドライバICを用いてDCモータを制御する */ const int IN1PIN = 3; const int IN2PIN = 11; const int BUTTON = 7; const int TOGGLE_L = 12; const int TOGGLE_R = 13; void setup() { pinMode(IN1PIN, OUTPUT); pinMode(IN2PIN, OUTPUT); pinMode(BUTTON, INPUT); pinMode(TOGGLE_L, INPUT); pinMode(TOGGLE_R, INPUT); } void loop() { /* 駆動投入6Vで大きすぎる */ /* モーター最大定格(3V)超えないように70/255を掛ける*/ const int val_speed = 120; /* 最小値0 最大値255 */ int val = val_speed * 70 / 255; int button = digitalRead(BUTTON); int front = digitalRead(TOGGLE_L); int back = digitalRead(TOGGLE_R); /* プッシュボタンが押されている間のみ運転 */ if (button == LOW){ stopRotate(); } else { if(front == HIGH){ frontRotate(val); } else if(back == HIGH){ backRotate(val); } else stopRotate(); /* 中立はブレーキ */ } } /* 正転 */ void frontRotate(int val){ analogWrite(IN1PIN, val); analogWrite(IN2PIN, 0); } /* 逆転 */ void backRotate(int val){ analogWrite(IN1PIN, 0); analogWrite(IN2PIN, val); } /* ブレーキ */ void stopRotate(){ analogWrite(IN1PIN, 0); analogWrite(IN2PIN, 0); }
モータの速度と限界電圧について
変数「val_speed」に代入したDuty比に従って,一定の速度で駆動する.
val_speedを大きくすれば,入力PWMのDuty比が大きくなる.
モータドライバICは,入力PWMのDuty比にしたがって,出力信号の電圧を出力する.入力のDuty比が大きくなると,OUTピンからモータへ出力する電圧も大きくなる.
モータの回転速度(rpm)は出力電圧に比例する(詳しい式は省略,こちらを参考)
したがって,変数val_speedを大きくすると,モータの回転速度も上がるということ.
*
正転・逆転・ブレーキ関数内で,analogWriteによってpinからPWMを出力する.Arduinoのデジタルピンから出力されるPWMは,0~255の値でDuty比が決まる.以下の式で対応している.
Duty比 [%]=(デジタルピンに書き込む値)×(100/255)
ただし,モータドライバの駆動電圧=6Vに対して,DCモータFA130の限界電圧が3Vなので,
val_speedをそのまま関数に投げると,ある値を超えるとDCモータの限界電圧を超える(値を変えて試すと,val_speed=78より大きい値を書き込むと,モータの電圧が3Vを超えた).
なので,val_speed=70が最大値となるように,変数変換を書き加えた.
val = val_speed × (70/255)
この変数変換は,モータ駆動電圧を3V程度にすれば必要がない.
ボタン・スイッチについて
ボタン・スイッチによって,駆動・ブレーキを切り替える.回路中にはトグルスイッチとプッシュボタンの2種類があり,その状態をArduinoによって読み取る.具体的には以下.
- プッシュボタン・・・押したとき(通電=HIGH)のみ駆動
- トグルスイッチ・・・正転/逆転を切り替え,中立のときはブレーキ
プッシュボタンを離しているときは,常にブレーキとなるようにスケッチを描いた(フェールセーフ).
実際に組んで動かす
スケッチをArduinoに書き込んで動かしてみる.
多少,試行錯誤の結果,実際にモータを制御することができた.
スイッチの設計とかはガバガバだったけど,正転/逆転/ブレーキをすることができた.
これを応用すれば,鉄道模型の制御なんかもできると思う.
また,スケッチを書き換えたり,スイッチを増やしたりすることで,より複雑な制御もできるようになる.
VR(可変抵抗)を使って速度調節機能を実装
動画の回路では速度調節機能を追加している.
VR(可変抵抗)を追加して,そのアナログ値(0~1023)をArduinoから読み込む.
そしてVRの大小に合わせて,スピードを可変にするスケッチがこちら.
/* Arduino UnoとモータドライバICを用いてDCモータを制御する */ const int IN1PIN = 3; const int IN2PIN = 11; const int BUTTON = 7; const int TOGGLE_L = 12; const int TOGGLE_R = 13; const int VR = 3; /* analogPin(=A3)*/ void setup() { Serial.begin(9600); pinMode(IN1PIN, OUTPUT); pinMode(IN2PIN, OUTPUT); pinMode(BUTTON, INPUT); pinMode(TOGGLE_L, INPUT); pinMode(TOGGLE_R, INPUT); pinMode(VR, INPUT); int rpm = 0; float val_VR = 0.0; int button =LOW; int front = LOW; int back = LOW; } void loop() { /* 駆動投入6Vで大きすぎる */ /* モーター最大定格(3V)超えないように70/255を掛ける*/ /* analogRead()は整数型なのでfloatに型変換して除算する */ float val_speed = (float)analogRead(VR) / 1023; //analog値0~1023を0~1に変換 //float val_speed = analogRead(VR) / 1023 これだと0,1のみ int rpm = val_speed * 70; // 最小値0,最大値70とする Serial.println(rpm); // 値の監視 /* 各スイッチの状態を変数に格納 */ int button = digitalRead(BUTTON); int front = digitalRead(TOGGLE_L); int back = digitalRead(TOGGLE_R); /* プッシュボタンが押されている間のみ運転 */ if (button == LOW){ stopRotate(); } else { if(front == HIGH){ frontRotate(rpm); } else if(back == HIGH){ backRotate(rpm); } else stopRotate(); /* 中立はブレーキ */ } } /* 正転 */ void frontRotate(int val){ analogWrite(IN1PIN, val); analogWrite(IN2PIN, 0); } /* 逆転 */ void backRotate(int val){ analogWrite(IN1PIN, 0); analogWrite(IN2PIN, val); } /* ブレーキ */ void stopRotate(){ analogWrite(IN1PIN, 0); analogWrite(IN2PIN, 0); }
VRの値を0~1の値に変換してから,PWMの引数として最小0・最大70に換算している(rpm).
先ほど実装した「正転/逆転/ブレーキ」はそのままなので,
ボタンを押したままVRを変化させると,モーターが加速したり減速したりする.
まとめ:鉄道模型を動かしたい
以上,モータドライバICとArduinoを使ったモータ制御の記録.
今後の制作目標は,以下の2つ.
- 鉄道模型の簡易パワーパック自作
- VVVFインバータ(的なもの?)の作成→三相誘導モータ駆動
1つ目については,今回作った回路を繋ぎ変えて,モータ駆動電圧を12Vくらいに上げれば簡単にできるはず.うまく動いたら,基板とかスイッチとか買いそろえて,基板への実装もしてみたい.
また,本物のパワーパックでは,踏切とかポイントの制御もできるらしい.なので,そういう追加機能もArduinoひとつで制御してみたくもある.
【追記】回路作成したので記事にまとめて公開しました.
2つ目については,Arduinoに関してもう少し勉強が必要(PWMの周波数制御).なので,簡易パワーパックができてから,追加機能として取り組みたい.
*
こんな計画なのだけれど,まず「鉄道模型」が手元にないので・・・それを買わないといけない.線路への改造など考えると,NゲージよりはHOゲージくらいがちょうどいいのだろうか.
HOゲージとなると,1車両当たりそれなりのお値段がする.なので,電車を1編成というよりは機関車1台をとりあえず買うことになるだろう(自分が好きな,愛知機関区EF64-1000形のHOゲージは,TOMIXから発売されているらしいぞ).
【追記】買いました!
パワーパック自作など,つづきはまた次回.
ネット上にはたくさんのアイディアが転がっているので,それらも参考に作ってみようと思う.