meideru blog

家電メーカーで働いているmeideruのブログです。主に技術系・ガジェット系の話を書いています。

Arduinoとモータードライバ(bd6211f)を使ってDCモーター(FA-130RA) を回転させてみた

 

前にも画像をアップしたかもしれませんが、今、Arduinoを使って戦車っぽいものを作ろうとしています。

@作成中のArduino戦車
作成中のArduinoの戦車

お気付きの方も多い方思います・・・。上の画像ではArduinoの出力ピンにモーターを直差ししていますが、これではモーターは動きません。

理由は電流が足りていないからです。

Arduinoは最高で電圧5V・電流40mAを出力できるのに対して、上の画像で使用しているモーター(FA-130)は無負荷時でも電圧1.5V・電流200mAを必要とします。つまり、電流が足りないのです。

この問題を手っ取り早く解決する方法はモータードライバを使用することです。(他にも自力で増幅回路を組むという方法もありますが、モーターを逆回転させることを考えるとHブリッジという回路を組む必要があります。これは面倒なのでモータードライバを使用したほうが簡単です。)

今日はArduinoとモータードライバを使用してモーターを回転させる実験をしてみようと思います。

目次

使うもの

@使うもの
使うもの

【使うもの】

  • Arduino UNO
  • モータードライバ(BD6211F)
  • DCモーター(FA-130RA 2270)
  • ブレッドボード
  • 電池ボックス
  • 単三電池4本
  • 9V電池
  • バッテリースナップ
  • ジャンパ線
  • ピン
  • クリップ

これらの部品はほぼ全てスイッチサイエンスさんで取り揃えました。

 

モータードライバはBD6211Fというローム社製のものです。

@BD6211F
BD6211F電子工作向けのモータードライバだと他にも東芝製がメジャーらしいんですが、私がよく使うスイッチサイエンスではローム社製を押していたので、そっちを買いました。ネットで調べたところ、このモータードライバの弱点はやや熱がこもりやすいという点らしいです。

DCモーターはFA-130RA 2270というマブチモーター製のものです

@FA-130RA 2270
FA-130RA 2270ホビー用途では不動の人気らしいです。

事前準備

モータードライバに関しては事前に準備が必要でした。

モータードライバのデータシートを見てみましょう。

BD6211Fのデータシート

@真理値表
真理値表真理値表を見ると、PWM制御とVREF制御のどちらかでモーターを制御できることがわかります。

データシートによると、PWM制御だと入力可能なPMWの周波数は20kHz ~ 100kHzで、それ以上だと追従できない可能性があると書いてあります。ArduinoのPWMの出力周波数は約500Hzで規格外なのでPWM制御は使うことができません。

なので、必然的にVREF制御を使うことになります。

VREF制御だとモータードライバの裏面のVREFとVCCの接続をカッターで切り離す必要があります。初期状態だとVREFとVCCは接続されているようです。

@VREFとVCCの接続をカッターで切り離す
VREFとVCCの接続をカッターで切り離す

こんな感じです。

配線・接続方法

@配線・接続方法 その1
接続方法 その1

@配線・接続方法 その2
接続方法 その2

@配線・接続方法 その3
接続方法 その3@配線・接続方法 その4
接続方法 その4

 

接続方法は上の画像のようにしました。

FINを7番、RINを8番、VREFを9番に接続しています。

PWM信号を平滑化するためにコンデンサを入れるとより良くなるようですが、入れていません。

Arduinoにプログラムを書き込む

この実験ではモーターが「ゆっくり正回転 → 高速で正回転 → ゆっくりで逆回転 → 高速で逆回転」という流れを繰り返すプログラムを書き込みたいと思います。

const int FIN = 7;
const int RIN = 8;
const int VREF = 9;
const int MIN = 76;   //255 * 1.5 / 5
const int MAX = 153;  //255 * 3 / 5

void setup()
{
  pinMode(FIN, OUTPUT);
  pinMode(RIN, OUTPUT);
  pinMode(A0, OUTPUT);
}

void loop()
{
  //positive
  digitalWrite(FIN, HIGH);
  digitalWrite(RIN, LOW);
  analogWrite(VREF, MIN);
  delay(5000);
  analogWrite(VREF, MAX);
  delay(5000);
  
  //negative
  digitalWrite(FIN, LOW);
  digitalWrite(RIN, HIGH);
  analogWrite(VREF, MIN);
  delay(5000);
  analogWrite(VREF, MAX);
  delay(5000);  
}

グローバル変数のMINとMAXについてちょっと説明します。

DCモーターは1.5Vから3.0Vまで印加できるので、電圧を調整してトルクや回転数を調整しようと思います。

Arduinoのアナログ出力は0~255まで対応していて、MINの76が1.5Vに、MAXの153が3.0Vに対応しています。なのでMINとMAXはこの値になっています。

結果

予想通りの動きをしてくれました!

いやぁ良かった・・・。

これと同じ方法を使えば戦車のモーターを動かせますね!

次は戦車を完成させようと思います!

余談

実はこの実験が成功する前に2回ほど失敗しています。

モータードライバに電流を流しすぎたのか、もしくはショートさせてしまったのか理由はわかりませんが、2つほどダメにしてしましました。

@ダメにしてしまったモータードライバ
ダメにしてしまったモータードライバ

 

びっくりしたのはショートか電流を流しすぎてしまった時に一瞬、ICから煙を吹き出したことです。

ICは本当に精密な部品なんですね・・・。

以後気をつけます。

 

ノシ

 - 技術系