今回は玩具などに使われている小型のDCモータの制御を行います。
モータドライバ
Arduinoからモータを制御するには
Arduino でモータを制御しようとするとき、大きな問題となるのが電流の大きさです。
Arduino の出力端子は最大で 40 mA の電流を流すことができます。これは LED を光らせるのには充分ですが、モータはそれよりはるかに多くの電流を必要とします。玩具に使われているような小型のモータでも、数百 mA ~ の電流が流れるのです。このため、Arduino の出力端子に直接モータを接続することはできません。
※たとえば模型工作用の定番モータであるマブチRE-260RAは、電源3.0V・適正負荷時で電流700mAとされています。
そこで、Arduino の制御信号を受けて、モータ用の大きな電流を制御することのできる回路を作成する必要があります。
Hブリッジ
ワンボードマイコンなどの電子装置からモータを制御するのによく使われる回路としてHブリッジがあります。Hブリッジの動作原理は、下図のようになります。

この図では模式的に SW1 ~ SW4 の4つのスイッチで表していますが、実際にはトランジスタやFETなど、ワンボードマイコンから制御できる電子的なスイッチ素子が使われます。4つのスイッチとモータの接続がアルファベットの『H』のような形になっていることが、『Hブリッジ』という名前の由来です。
では、Hブリッジによってどのようにモータを制御するのか、その原理を見て行きましょう。
静止(空転)

最初の回路図のようにすべてのスイッチが開いている(切れている)と、モータはどこにも接続されていないことになります。当然、モータが自分から回転することはありません。ただし、モータの軸に外部からトルク(物体を回転させようとする作用)が加わると、機械的な摩擦など比較的小さな抵抗だけで回転させることができます。
正転

SW1 と SW4 を閉じる(回路を接続する)と、図のようにモータには極性の通りの電流が流れます。この状態を『正転』と呼びます。
逆転

SW2 と SW3 を閉じると、図のようにモータには正転とは逆方向に電流が流れます。DCモータでは電流を流す方向を逆にすると回転方向も逆になります。この状態を『逆転』と呼びます。
ブレーキ

SW2 と SW4 を閉じると、モータの端子が両方とも GND に接続されます。一見この状態は、電源からの電流が流れないので静止状態と同じに思えますが、外部からのトルクがモータの軸に加わったときの動作が静止状態とは異なります。
※SW2とSW4のかわりに、SW1とSW3を閉じるのでも同じ効果です
外部からのトルクによってモータの軸を回転させると、モータは発電機として動作します。このときモータの両端に起電力が発生しますが、モータの端子が短絡されているため、図のように電流が流れ、エネルギーを消費してしまいます。その結果、外部からのトルクがモータの軸を回転させる時の抵抗が静止状態よりずっと大きくなるのです。この状態はブレーキとして使用されます。
※この原理は鉄道車両のブレーキとしても利用されています
モータドライバ DRV8835
一昔前ならば大型のトランジスタなどを使ってHブリッジ回路を組んだのですが、いまは同等の回路をワンチップに組み込んだモータドライバICが安価に入手可能です。

今回は定番のモータドライバICの1つ、DRV8835 を使用してモータの制御を行います。DRV8835 はわずか3×2mmの小さなチップICですが、2組のHブリッジ回路を内蔵しており、2つのDCモータの制御を行うことができます。モータは正転/逆転を指定可能で、PWMを利用すれば回転数を制御することもできます。モータ1つあたり 1.5 A(=1500mA)まで電流を流すことができますので、玩具・模型用の小型モータなら充分に使用可能です。
※『模型用』といっても、ミニ四駆に使われるような高出力モータには2A以上の電流が必要なものがあります。そのようなものはDRV8835では制御できませんので、カタログやデータシートで電流量を確認してください。
チップ単体では小さすぎて配線が困難なのですが、端子をICピッチ(2.54 mm 間隔)に変換するキットが秋月電子通商で販売されています(上の写真)。チップが12ピンDIPサイズの基板に取り付けられていて、ピンヘッダだけ自分で基板に半田付けする半完成品です。また、DRV8835 チップのデータシートに掲載されている推奨回路ではロジック/モーター各電源にコンデンサを取り付けることが推奨されていますが、このキットではコンデンサも基板上に取り付けられていますので、外付けは不要です。
電力制御なので放熱が心配ですが、3V 程度の低電圧で動作する玩具用小型モータならばヒートシンク(放熱板)はなくても大丈夫なようです。
端子
DRV8835 には12の端子があります。秋月のICピッチ変換キットの場合、基板上の印字が読める向きに置いたときに左上になるのが 1番ピンで、そこから反時計回りに 2,3,…,12番ピンの順に並んでいます。

各端子の役割は下の表の通りです。
ピン番号 | 名称 | 機能 | 接続例 |
---|---|---|---|
1 | VM | モータ用の電源。2~11Vが可能 | モータ用電池の+側 |
2 | A-OUT1 | モータAへの出力1 | モータAの+側 |
3 | A-OUT2 | モータAへの出力2 | モータAの-側 |
4 | B-OUT1 | モータBへの出力1 | モータBの+側 |
5 | B-OUT2 | モータBへの出力2 | モータBの-側 |
6 | GND | GNDを接続 (ロジック、モータ共通) | モータ用電池の-側 およびArduinoのGND端子 |
7 | B-IN2/B-ENBL | モータBの制御入力2 | Arduinoの出力端子 |
8 | B-IN1/B-PHASE | モータBの制御入力1 | Arduinoの出力端子 |
9 | A-IN2/A-ENBL | モータAの制御入力2 | Arduinoの出力端子 |
10 | A-IN1/A-PHASE | モータAの制御入力1 | Arduinoの出力端子 |
11 | MODE | モード設定 | Arduinoの出力端子 またはプルアップ/プルダウン |
12 | VCC | ロジック用の電源。2~7Vが可能 | Arduinoの5V端子 |
使用法
DRV8835には2つの制御方法があります。
IN/INモード(MODE端子がLOW)
MODE 端子に LOW を入力(このモード固定で使用する場合はプルダウンでもよい)すると、IN/IN モードになります。このとき、x-IN1端子・x-IN2端子 と x-OUT1端子・x-OUT2端子 の関係は次のようになります。
x-IN1 | x-IN2 | x-OUT1 | x-OUT2 | 状態 |
---|---|---|---|---|
LOW | LOW | 高インピーダンス | 高インピーダンス | 静止(空転) |
LOW | HIGH | LOW | HIGH | 逆転 |
HIGH | LOW | HIGH | LOW | 正転 |
HIGH | HIGH | LOW | LOW | ブレーキ |
これは、Hブリッジの回路のイメージに対応した制御方法といえます。入力端子のうち、HIGH にする側に PWM を入力すると、そのパルスがそのまま出力にも反映され、モータの回転数制御ができます。
PHASE/ENABLEモード(MODE端子がHIGH)
MODE端子に HIGH を入力(このモード固定で使用する場合はプルアップでもよい)すると、PHASE/ENABLEモードになります。このとき、x-ENBL(ENABLE)端子・x-PHASE端子 と x-OUT1端子・x-OUT2端子 の関係は次のようになります。
x-ENBL (x-IN2) | x-PHASE (x-IN1) | x-OUT1 | x-OUT2 | 状態 |
---|---|---|---|---|
LOW | LOW/HIGH | LOW | LOW | ブレーキ |
HIGH | LOW | HIGH | LOW | 正転 |
HIGH | HIGH | LOW | HIGH | 逆転 |
このモードでは、
ENABLEがブレーキ(LOW)/アクセル(HIGH)
PHASEが正転(LOW)/逆転(HIGH)
と役割が別れていて、直感的に判りやすいかもしれません。
なお、このモードでは『静止(空転)』がありません。ENABLE を LOW にするとブレーキがかかってしまうので、PWM制御は難しいかもしれません。一応動くことは動くとは思いますが、PWMのデューティ比が小さい領域でほとんど動かなかったり、振動が大きかったりするかもしれません(モータの種類にもよります)。
製作
使用部品
今回は以下の部品を使用します。
部品 | 数量 | 備考 |
---|---|---|
ブレットボード | 1 | 一般的なもの |
DRV8835使用ステッピング &DCモータドライバモジュール | 1 | 秋月電子通商でキット入手可 (ピンヘッダの半田付けが必要) |
単3電池2本用電池ボックス | 1 | |
模型用モータ | 1 | マブチRE-260などの小型モータ |
ジャンパ線 | 赤2本 黒3本 黄2本 | 電池ボックスおよびモータの配線用は別 |
電池ボックス
モータ用の電源は 3.0V なので、乾電池2本分を入れられる電池ボックスを用意します。ブレッドボードとの接続のため、最初からジャンパ線つきのものを用意するか、ジャンパ線を半田付けするなどしましょう。ジャンパワイヤーつきの電池スナップもあります。
模型用モータ
DRV8835 で制御可能なのは電流 1.5 A(=1500mA)以下の直流モータです。模型用小型モータの定番、マブチ RE-260RA や FA-130RA あたりが入手しやすく、また工作もしやすいでしょう。1つ150~300円程度で販売されています。ヨドバシカメラやAmazon、秋月電子通商で通販も可能です(2023年8月現在)。
モータ単体で購入するとリード線が付いていないので、これもジャンパ線を半田付けしてしまうのがよいと思います。
回路
今回の回路は下図の通りです。

電源がロジック(Arduino)5V とモータ(図中では 3V )の2系統ありますが、GND は両系統で共通です(DRV8835 には GND 端子が1つしかありません)。モータには電流が数百 mA 必要なので、50 mA 程度しか供給できない Arduino の 3.3V 端子をモータ用の電源として使用することはできません。必ずモータのカタログに書かれている電流以上を流せる電池ないし電源モジュールを用意して下さい。
※アルカリ乾電池なら単3形でも1000mA程度の供給能力があります。
モータの+、-は便宜的なものです。一般の模型用小型モータには極性はありませんが、接続を逆にすると回転方向も逆になるので、複数のモータを使う場合のためどちらかを+と決めて考えるようにしたほうがいいでしょう。
今回は DRV8835 を IN/IN モード固定で使用するので、MODE端子は GND に接続(プルダウン)しています。ハイインピーダンスな入力専用端子なので抵抗を介さなくても大丈夫だと思います。
応用として回転数制御を行うことも考え、Arduino からの制御用にはアナログ(PWM)出力が可能な D3 ピンと D5 ピンを使用しています。
配線
配線図は以下の通りです。

DRV8835 は、この図の左下が1番ピン(VM)になる向きです。
プログラム
今回のスケッチは以下の通りです。
#define MOTOR_AIN1 3
#define MOTOR_AIN2 5
void setup() {
pinMode(MOTOR_AIN1, OUTPUT);
pinMode(MOTOR_AIN2, OUTPUT);
}
void loop() {
digitalWrite(MOTOR_AIN1, HIGH);
digitalWrite(MOTOR_AIN2, LOW);
delay(2000);
digitalWrite(MOTOR_AIN1, LOW);
digitalWrite(MOTOR_AIN2, LOW);
delay(1000);
digitalWrite(MOTOR_AIN1, LOW);
digitalWrite(MOTOR_AIN2, HIGH);
delay(2000);
digitalWrite(MOTOR_AIN1, HIGH);
digitalWrite(MOTOR_AIN2, HIGH);
delay(1000);
}
プログラムの解説
定数設定
#define MOTOR_AIN1 3
#define MOTOR_AIN2 5
モータの制御に使用する出力端子を指定します。回路図の通り、モータの+側(モータドライバのAIN1端子)に Arduino の D3 端子、モータの-側(モータドライバのAIN2端子)に Arduino の D5 端子を指定しています。
初期設定
void setup() {
pinMode(MOTOR_AIN1, OUTPUT);
pinMode(MOTOR_AIN2, OUTPUT);
}
モータ制御に使用する端子を pinMode() 関数で『OUTPUT(出力)』に指定します。
モータの制御
あとは、loop() 関数の中で以下の制御を繰り返します。
digitalWrite(MOTOR_AIN1, HIGH);
digitalWrite(MOTOR_AIN2, LOW);
delay(2000);
まず、モータの+側に HIGH、モータの-側に LOW を出力します。このとき、モータは『正転』となります。信号出力後、delay() 関数によって 2000 ms =2秒待ちます。
digitalWrite(MOTOR_AIN1, LOW);
digitalWrite(MOTOR_AIN2, LOW);
delay(1000);
モータの+側、-側にともに LOW を出力します。このとき、モータは『静止(空転)』となります。その状態で 1000 ms =1秒待ちます。
digitalWrite(MOTOR_AIN1, LOW);
digitalWrite(MOTOR_AIN2, HIGH);
delay(2000);
モータの+側に LOW、-側に HIGH を出力します。このとき、モータは『逆転』となります。その状態で 2000 ms =2秒待ちます。
digitalWrite(MOTOR_AIN1, HIGH);
digitalWrite(MOTOR_AIN2, HIGH);
delay(1000);
モータの+側、-側にともに HIGH を出力します。このとき、モータは『静止(ブレーキ)』となります。その状態で 1000 ms =1秒待ちます。
つまり、モータは正転(2秒)→空転(1秒)→逆転(2秒)→ブレーキ(1秒)を繰り返します。
コンパイル&実行
実行するとこのようになります。
プログラムの通り、正転(2秒)→空転(1秒)→逆転(2秒)→ブレーキ(1秒)です。
回転方向は動画ではよく判りませんが、『空転』より『ブレーキ』の方が惰性で回転している時間があきらかに短いことが判ると思います。
まとめ
- Arduinoの出力ピンに直接DCモータを接続することは出来ない
- DCモータの正転・逆転を制御するには、モータドライバICを使用する
コメント