ArduinoとモータドライバICによるDCモータの駆動制御

久しぶりの電子工作ネタ.

Lチカやシリアル通信もいいけど

電子工作をやるなら,やっぱり動くもの(モータ)を自由自在に制御してみたい.

ということで今回は,

  • Arduino
  • モータドライバIC

を使って,マブチモータ(理科の実験とかで使うDCモータ)の制御をやってみた.

アナログ回路だとインバータやフィードバック制御が必要になるけれど,モータドライバICを使えばとても簡単にモータの制御(正転/逆転/ブレーキ)ができた.

モータの制御

今回制御するのが,ラジコンや模型でよく使われている,工作用DCモータ.「マブチモータ」という名前は,割と聞いたことがある人も多いのではないのだろうか.DCモータなので,乾電池を繋ぐだけで簡単に動かすことができる.

マブチモータの種類など,詳しい情報は以下のページが参考になる.

https://www.mabuchi-motor.co.jp/motorize/branch/motor/

今回使ったのは「FA130」というモデル.
これを,「正転/逆転/ブレーキ」させることが目標.

モータの正転・逆転・ブレーキ

正転/逆転は,電池の向きを逆にして電流を流す向きを変えれば,簡単に変えられる.しかし,それでは「制御した」とはとても言えない・・・.

また,電池とモータを離せば「ブレーキ」じゃないか・・・?とも思うけど,それはただ単に惰性で止まっているだけで,電気的にブレーキがかかったことにはならない.

じゃあどうやって制御すればよいのか?

大学の講義で習った制御方法のひとつに,「ハーフブリッジインバータとフィードバック制御回路(PI制御など)」という方法がある.

ハーフブリッジインバータというのは,ごく簡単に説明すると

スイッチ(トランジスタ)を入れたり切ったりすることで,モータに流れる向きを変えて正転/逆転を制御する

という目的をもつ回路構成.

また,フィードバック制御は,ブレーキをかけるための回路.
回転数をモータから読み取り,回転数指令値とコンパレートして,トランジスタの駆動信号を変える.

具体的な回路例は,以下の通り.

引用=古橋武:「パワーエレクトロニクスノート 工作と理論」,コロナ社,p.133 (2018)

ただし,この回路では多くの部品点数が必要となる.

モータを制御するために,これだけの部品を組み上げるのは面倒...

もっと簡単な回路で制御できないだろうか?

そう思って,いろいろ調べてみると「モータドライバIC」という便利なものがあることを発見した.

モータドライバICって何?

まず,以下のページを読むと,モータドライバICの利点がわかる.

https://lab.fujiele.co.jp/articles/7058/

先に述べたような回路の場合,目的の制御をするのに多くの部品が必要となる.また,抵抗やトランジスタなどの素子がもつ特性に気を配り,保護対策も自分で行わなければならない.

一方,モータドライバ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(出力)の信号は以下の表の通り.

TB57H450FNG 入出力ファンクション

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モータ駆動回路の例は,先ほど紹介した秋月の製品ページに掲載されている「アプリケーションノート」に掲載されている.

また,マルツオンラインの以下のページも参考になる.

TA7291P を使った小型モータ駆動回路 | マルツオンライン

今回は,アプリケーションノートにある回路を利用した.具体的には以下の通り.7.1「DCブラシモータ駆動の場合」を用いる.

Control I/Oは,Arduinoに対応する.

この回路例を,もう少し具体的に,動作させて必要だった修正も加えたのが以下の回路図.

フィルタコンデンサなど,素子の適正値は,アプリケーションノートに書いてあるので,それをそのまま採用した.

また,回路例からの素子の変更点などは以下.

  • 1Ω抵抗がなかったので,RS端子はGNDに接続(定電流機能は使わない)
  • モータ駆動電圧として6V投入(ただし,マブチモータの限界電圧3.0Vを超えないようにArduino側のPWMのDuty比を低めにする)
モータ駆動電圧(VM)は,電圧降下含めて3.5V程度(=単3電池×3)がちょうどいいと思われる.が,手元に3本電池ボックスがなかったのと,4本電池ボックスがあったのと・・・で,今回は単三電池4本(=6V)を入れている.この回路で,Duty比100%のPWMを印可すると,モータに5V以上かかって壊れる可能性が高い.なので,以下で紹介するスケッチ内で,限界電圧3Vを上回らないようにしている.

参考:電池ボックス 単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を変化させると,モーターが加速したり減速したりする.

最初,analogRead(VR)とだけ書いて回そうとしたら,うまく回らなかった.原因は,analogRead(VR)が整数型だということ.整数型÷整数型では整数の範囲でしか計算されない.したがって,計算結果を格納する変数(ここではval_speed)をfloatにしても,0.0か1.0の2通りしか出力されない.analogRead(VR)をfloatに変換してから割り,かつ格納する変数もfloat型にすることでうまく回すことができた.
ArduinoはC言語と同じなので,四則演算は大きい方の型に反映される.たとえば,float型で計算しても格納する変数が整数(int)型であれば,変数にはint型が格納される.上のスケッチだと,rpmという変数にその性質を利用している.

まとめ:鉄道模型を動かしたい

以上,モータドライバICとArduinoを使ったモータ制御の記録.

今後の制作目標は,以下の2つ.

  1. 鉄道模型の簡易パワーパック自作
  2. VVVFインバータ(的なもの?)の作成→三相誘導モータ駆動

1つ目については,今回作った回路を繋ぎ変えて,モータ駆動電圧を12Vくらいに上げれば簡単にできるはず.うまく動いたら,基板とかスイッチとか買いそろえて,基板への実装もしてみたい.
また,本物のパワーパックでは,踏切とかポイントの制御もできるらしい.なので,そういう追加機能もArduinoひとつで制御してみたくもある.

【追記】回路作成したので記事にまとめて公開しました.

Arduinoとモータドライバで動く!鉄道模型のPWMコントローラ
DCモータ制御回路を応用して,鉄道模型(HOゲージ)を動かしてみた.回路作成から試運転までの記録.

2つ目については,Arduinoに関してもう少し勉強が必要(PWMの周波数制御).なので,簡易パワーパックができてから,追加機能として取り組みたい.

こんな計画なのだけれど,まず「鉄道模型」が手元にないので・・・それを買わないといけない.線路への改造など考えると,NゲージよりはHOゲージくらいがちょうどいいのだろうか.

マイコンよりもはんだごてよりも,鉄道模型がぶっちぎりでお高い・・・

HOゲージとなると,1車両当たりそれなりのお値段がする.なので,電車を1編成というよりは機関車1台をとりあえず買うことになるだろう(自分が好きな,愛知機関区EF64-1000形のHOゲージは,TOMIXから発売されているらしいぞ).

【追記】買いました!

パワーパック自作など,つづきはまた次回.
ネット上にはたくさんのアイディアが転がっているので,それらも参考に作ってみようと思う.

関連記事

電気系大学生がArduino Unoを買ってみた【電子工作入門】
マイコンボード「Arduino uno」を買って,IDEをダウンロードして,LEDをチカチカさせてみた.電子工作楽しい!
VVVFインバータとは何か?しくみと役割を電気系大学生がまとめてみた
あの音の正体は何か?そもそもインバータは何をしているのか?パワーエレクトロニクスからその仕組みと役割をまとめてみた.
タイトルとURLをコピーしました