※この記事は2014年11月27日に公開した記事を再編集し、2022年1月14日に再度公開しました。
前回、DCモータのON/OFFをArduinoで制御してみました。今回はさらにモータについて掘り下げてみたいと思います。
ラジコンを例にとってもON/OFFだけではなく、通常の回転、逆回転、ストップ、ブレーキなどのように様々な動作がモータに必要になってきます。今回はモータドライバを利用してモータを制御してみましょう。
目次
- 今回の電子工作レシピ
- DCモータドライバって何?
- モータドライバの使い方
- モータドライバを使ってモータを動かしてみる
- Arduinoでモータドライバをコントロール
- 温度センサ付きデスクトップ扇風機
- まとめ
今回の電子工作レシピ
完成までの時間目安:60分
必要なパーツ
- Arduino本体(Arduino Uno R3)http://www.switch-science.com/catalog/789/
- ブレッドボード http://www.switch-science.com/catalog/313/
- DCモータ(FA-130RA-227 http://akizukidenshi.com/catalog/g/gP-06437/)
- モータドライバ(BD6222HFP http://akizukidenshi.com/catalog/g/gI-08041/)
- SOP16ピンDIP変換基板(http://akizukidenshi.com/catalog/g/gP-06541/)
- ダイオード(1N4007 http://akizukidenshi.com/catalog/g/gI-00934/)×2
- 抵抗器 10KΩ×2 / 100KΩ×2
- 温度センサ(lM61CIZ http://akizukidenshi.com/catalog/g/gI-02726/)
- コンデンサ(100μF http://akizukidenshi.com/catalog/g/gP-02724/)
- 単3電池ボックス(4本直列用)
- 単3電池×4本
- トグルスイッチ(http://akizukidenshi.com/catalog/g/gP-03913/)
DCモータドライバって何?
モータドライバ BD6222HFP
何やら小さい部品が登場しました。これがモータドライバです。色々な形がありますが、今回はこのモータドライバを使ってみます。モータドライバとはその名の通り、モータをドライブ(制御)するための回路が詰まった集積回路(IC)です。
さっそく習うよりも慣れろ、ということでモータドライバも実際の回路をもとに動かしながらその使い方を学んでいきたいと思います。
実際に部品を手にとって見ていただくとわかるのですがこれまで使っていた部品に比べ、サイズがかなり小さいです。ICから出ている端子も幅が短く、ブレッドボード上に接続することがこのままではできないように感じます。
そんな時にはブレッドボード上で変換できるように、変換基板を利用します。SOP16ピンDIP変換基板の上に、ICを載せてハンダ付けを行っていきます。
今回利用するBD6222HFPはICの片側だけに端子がありますので、変換基板も片側だけを利用します。
SOP16ピンDIP変換基板
さっそく変換基板上にICを載せてハンダ付けを行っていきます。端子間の幅が非常に狭いので、これまでのパーツをハンダ付けするのに比べてやや難易度が上がります。このようなICをハンダ付けする場合は、ハンダごてが触れてもずれないように変換基板とICをしっかり固定する必要があります。
今回はこて台についているクリップで基板とICを固定していますが、クリップ等がない場合、変換基板とICをテープでとめたりするのがよいと思います。ただし、テープでとめる場合等は、ハンダ付けの途中でICが熱を持ってその熱でテープが溶けてしまうこともあるため、気をつけてください。
また、ハンダの量ですが、通常の部品に使っている量の半分も満たないくらいの量で十分ですので、ハンダの量が多くて隣の端子とくっついてしまった場合(私も今回1回やってしまいました…)は、ハンダ吸い取り線やハンダ吸取器などを利用すると良いでしょう。
ハンダ付け完了!
モータドライバの使い方
ハンダ付けが完了したところで、次にモータドライバのそれぞれの端子の役割をデータシートで確認してみます。BD6222HFPはこの小さいサイズで電圧6~15v、電流2Aの出力をモータに流すことができます。
- VREF – モータ用の電源コントロール(3 ~ 15v)
- OUT1 – モータへの出力端子
- FIN – RINと組み合わせて回転、逆回転、ストップ、ブレーキなどの信号入力
- GND – グランド
- RIN – FINと組み合わせて回転、逆回転、ストップ、ブレーキなどの信号入力
- OUT2 – モータへの出力端子
- VCC – モータドライバ用電源入力(6~15v)
前回でも学んだように、モータはArduinoを電源として動かすにはちょっと足りないため、別途電池を用意しましたね。モータドライバでは、モータ用の電源とモータドライバのIC用にそれぞれ電源入力端子があります。
VREFはモータに電源を供給する端子です。モータの回転数などはここに入力する電圧で決まります。VCCはモータドライバの起動用の電源供給端子です。
OUT1およびOUT2は出力端子ですのでモータに接続します。前回も記述したようにモータはプラスマイナス向き関係なく接続が可能です。
FINおよびRINはモータドライバを操作するための入力端子です。ここに様々なパターンで電流を流すことでモータを制御することができます。
モータドライバを使ってモータを動かしてみる
それぞれの役割がわかったところで、実際に簡単な回路を組み立てながら使い方を学んでいきます。
下記の回路はモータドライバを使って回転・逆回転をテストする回路です。左右どちらかのスイッチを押すと、FINまたはRINからモータドライバへ信号(電流)が送られモータへ電流が流れます。
Arduinoでモータドライバをコントロール
では、次にスイッチ部分をArduinoに置き換えてみましょう。Arduinoに置き換えることで、一定時間でモータの回転を止めたり、逆回転にしたりということがプログラム側から制御できるようになります。下記のプログラムは1秒ごとに回転→休止→逆回転→休止を繰り返すプログラムです。
int leftP = 9; int rightP = 10; void setup() { pinMode(leftP, OUTPUT); pinMode(rightP, OUTPUT); } void loop() { digitalWrite(rightP, LOW); digitalWrite(leftP, HIGH); delay(1000); digitalWrite(rightP, LOW); digitalWrite(leftP, LOW); delay(1000); digitalWrite(leftP, LOW); digitalWrite(rightP, HIGH); delay(1000); digitalWrite(rightP, LOW); digitalWrite(leftP, LOW); delay(1000); }
今回はdigitalWriteでモータに出力を行っていますが、モータドライバのVREFは入力する電圧によって回転数が変わりますので、analogWrite関数に置き換えることで回転数を変更することも可能です。ただ、出力が3v以下の弱い場合(BD6222HFPだと3〜15vが仕様)はモータがキューンと泣くだけで回転はしません。
温度センサ付きデスクトップ扇風機
アナログ入力ピンと組み合わせることで光センサなどのセンサを使ってある一定の値になったらモータを動かすなんてこともArduinoを利用することで手軽にできるようになります。
簡単な例を出すとすれば、温度センサと組み合わせることで、温度が一定以上になると自作扇風機が回るなんてデバイスを作ることができますね。今回は温度センサにLM61CIZを利用してみます。LM61CIZはよく利用されている温度センサで-30度から100度まで測ることができます。
int leftP = 9; int rightP = 10; void setup() { pinMode(leftP, OUTPUT); pinMode(rightP, OUTPUT); Serial.begin(9600); } void loop() { int ans = analogRead(0); int tv = map(ans,0,1023,0,5000); int temp = map(tv,300,1600,-30,100) //温度が25度以上になったら回転を始める if(temp > 25){ digitalWrite(rightP, LOW); digitalWrite(leftP, HIGH); delay(1000); digitalWrite(rightP, LOW); digitalWrite(leftP, LOW); delay(1000); digitalWrite(leftP, LOW); digitalWrite(rightP, HIGH); delay(1000); digitalWrite(rightP, LOW); digitalWrite(leftP, LOW); } Serial.println(temp); delay(1000); }
赤文字で記した部分が、LM61CIZをArduino上で利用する際の変換式になります。今回はシンプルに温度センサの値が25度を超えている場合(青文字のif文)にモータ出力を行っています。25度を超えている限りは常にモータが回り続けるようになっています。
まとめ
簡単なモータドライバの使い方について少しわかったでしょうか?次回からはモータドライバのストップ、ブレーキなどの使い方も取り入れて、Arduinoで簡単なラジコンカーを作ってみたいと思います。
ラジコンカーを作るとなると、モータは1個でいいの?左右に曲がる為のステアリング制御でモータ2個が必要?回路が大きくなるとラジコンカー自体の大きさも大きくなってしまう?などなど、色々考える必要が出てきますので、次回は簡易百葉箱でも行ったようにラジコンカーの仕様を決めて学びながら制作に取りかかってみたいと思います。
この連載の記事
- 第11回 Arduinoでモーターを制御する!(その1)モーターの基本を勉強してみる。
- 第12回 Arduinoでモーターを制御する!(その2)モータードライバって何?(このページの記事)
- 第13回 Arduinoでモーターを制御する!(その3)。自作ラジコンカーに挑戦!サーボモーターでステアリング実装。
- 第14回 Arduinoでモーターを制御する!(その4)。リモコンの実装とArduino Pro Miniを使って小型化。