前回は、H ブリッジ回路を作って DC ブラシモータを回してみました。
しかし、モータ回すならモータドライバって IC があるじゃないですか。そっちのほうがきっと簡単です。
秋月電子通商で使えそうなモータドライバを物色してみたのですが、うーん、どれも電圧が高い、電流が小さいってんで、これイイね、なものを見つけられませんでした。
それでも、なんとかなりそうかなぁ、実験で壊してももったいなくない値段だよなぁ、ということで選んだのが「フルブリッジドライバ 7V BD6211F-E2」(推奨電源電圧 3.0~5.5V 、出力電流 1A ) です。
電源を 3V として、VREF 制御モードで出力を 1.5V 相当にすればいい感じじゃないでしょうか。電流値は足りませんが、無負荷での実験で、過電流保護もあるってことですからなんとかなるでしょう。
やってみましょう。
モータドライバ BD6211 を使った回路
試行錯誤しながら作った回路がこれ。
上は 3V の電源回路です。三端子レギュレータ NJM317 を使い、R2 、R3 で出力電圧を決めています。
モータドライバ BD6211 の電源電圧は最低 3V です。電圧降下して 2.5V 付近になると不足電圧保護が働き、モータが回らなくなります。しきい値付近ではモータの動きがおかしくなりました。
この回路でモータにかかる電圧は 2V ちょっとです。モータに 3V かけるときは電源電圧を 4V ほどにします。が、電流容量が足りなくなるかもしれません。過電流保護は 1.5A で働くようですが、BD6211 はかなり熱くなります。
Arduino の左側は、正転・逆転の押しボタンスイッチと出力電圧調整用のボリュームです。押しボタンスイッチは、押しているあいだモータを回転させ、両方同時に押すとブレーキをかけます。
Arduino の右側がモータ制御回路です。
R7~R12 と D2~D4 は Arduino の出力 5V を、BD6211 の制御入力 3V に合わせるためのレベル変換回路です。Arduino の出力を BD6211 に直接つなぐと、壊れます。はい、壊しました (;´Д`)
これはあとで備忘録として解説します。
出力電圧制御の VREF は、Arduino からパルス (PWM) で出力しますので、C7 で平滑して直流電圧にします。
C6 は BD6211 のノイズ除去用です。VCC (2pin) と GND (8pin) につなぎます。
C5 はモータからのノイズの除去用です。モータに近いところにつけます。
5V → 3V レベル変換回路
モータドライバ BD6211 は、モータ用電源と制御用電源とを同じ電圧レベルにしなければいけません。今回は 3V にしていますので、制御用の信号レベルも 3V に合わせる必要があります。
そのための方法をいろいろ迷っていたのですが、cepstrum さんのサイトを参考に、この回路を使わせていただくことにしました。ありがとうございます。
BD6211 の入力側の等価回路を見てみましょう。
ポイントはふたつのダイオード。これは入力の過電圧などから内部を保護するためのものです。
この入力に Arduino の 5V 出力を直接つなぐとどうなるでしょうか。そう、3V のラインにズドーンと電流が流れてしまいます。
ならば抵抗入れて電流を制限すればよし。ですが、このダイオードは本来そういう使い方をするためのものではありません。
そこで、Arduino との間にレベル変換のための回路を追加します。
Arduino の出力 5V は、4.7KΩ を介してダイオードのアノード側で 3.7V になります。ここに流れる電流は 0.28mA 。
BD6211 の入力電流はデータシートによると 0.05mA 。22KΩ による電圧降下は 1.1V で、BD6211 の入力電圧は 2.6V になります。
BD6211 の入力 H レベルは 2.0V 以上ですから、これで問題なく制御できます。
VREF の入力等価回路も同様にダイオードがあります。こちらは FET を駆動するだけの電流しか流れませんが、実験の上で同じ定数にして、平滑コンデンサを追加しました。
スケッチ
実験用のスケッチなので、基本的な動きだけを行います。
- #define SWITCH_ON LOW
- #define SWITCH_OFF HIGH
- #define CONTROL_ON HIGH
- #define CONTROL_OFF LOW
- const byte potentiometerPin = A0;
- const byte forwardSwitchPin = A1;
- const byte reverseSwitchPin = A2;
- const byte forwardControlPin = 10;
- const byte reverseControlPin = 11;
- const byte referenceVoltagePin = 9;
- const byte SPEED_LOW = 65;
- const byte SPEED_HIGH = 130;
- void setup() {
- pinMode(forwardSwitchPin, INPUT);
- pinMode(reverseSwitchPin, INPUT);
- pinMode(forwardControlPin, OUTPUT);
- pinMode(reverseControlPin, OUTPUT);
- }
- void loop() {
- int referenceVoltage = analogRead(potentiometerPin);
- referenceVoltage = map(referenceVoltage, 0, 1023, SPEED_LOW, SPEED_HIGH);
- analogWrite(referenceVoltagePin, referenceVoltage);
- if(SWITCH_ON == digitalRead(forwardSwitchPin)) {
- digitalWrite(forwardControlPin, CONTROL_ON);
- } else {
- digitalWrite(forwardControlPin, CONTROL_OFF);
- }
- if(SWITCH_ON == digitalRead(reverseSwitchPin)) {
- digitalWrite(reverseControlPin, CONTROL_ON);
- } else {
- digitalWrite(reverseControlPin, CONTROL_OFF);
- }
- }
1~4 行目。スイッチ入力とモータドライバ出力の定義です。HIGH 、LOW 表記だとどっちがどの状態かわからなくなるので、規定しています。
6~11 行目は、入出力ピンの指定。
ちなみに「byte potentiometerPin = A0;」とすると、変数 potentiometerPin には「14」が代入されるんですよ。へぇ〜 (^_^;)
12~13 行目は、VREF 電圧の最小値と最大値を指定しています。モータ出力電圧は、約 0.8~1.6V ぐらいになりました。
16~19 行目は、各ピンの入出力モードの指定です。
押しボタンスイッチのピンを内部プルアップにしてプルアップ抵抗を省く、ってのももちろんアリです。お好みでどうぞ。
23~25 行目でボリュームからの電圧を受け取って、VREF 制御へ出力します。出力は PWM ですが、平滑回路で直流に変換しています。
27~36 行目。押しボタンスイッチの状態を読み取り、押している間だけ FIN 、RIN 制御へ出力します。両方同時に押すとブレーキモードになります。
ブレッドボード
「やってみてからブログを書く」のがポリシーです。たぶん、です (^_^;)
上のブレッドボードは、いつもの実験用の電源回路です。5V 電源も載っているんですが、今回は 3V 側のみ使っています。5V 電源は Arduino の出力を利用しました。
下左側が入力部分。正転、逆転の押しボタンスイッチと、出力電圧調整用のボリュームです。
下右側がブリッジドライバ BD6211 とレベル変換回路です。BD6211 の上にコンデンサがあるので、ちょっと隠れていますが、BD6211 は SOP8 変換基板に載せてあります。
あ、左端の赤いジャンパー線は試験時に使っていたものなので、無視しといて下さい。
DC ブラシモータを回してみて
改善すべき点は、やっぱりいろいろあります。
まず、1.5V という低い電圧で動作するブリッジドライバってあるんでしょうか? みなさん、どうやってマブチモータを制御しているんでしょう?
きっとあるんでしょうね。ぼちぼち探してみます。
モータを回してもギューンって音がするだけ (;´Д`)
こいつにギヤなりプーリなりをつけて、何かを動かす動力とするのは機械工作です。うーん、こいつはあまり経験がない。
でも、そのうち何か、動くモノを作ってみたいです。