##モータドライバIC<DRV8835>
今回は、Arduinoを使ってモータ制御します。
過去にFETを使って簡単にモータを制御してみました
(04ArduinoでDCモータを簡単に回してみる)
が、回転方向を制御しようとすると、Hブリッジ回路を作る必要があり、若干回路が複雑になります。
Hブリッジ回路の詳しい説明は、次のサイトにて詳しく紹介されていますので、ありがたく紹介させていただきます。Hブリッジ回路によるブラシ付DCモータの駆動:原理
Hブリッジ回路内蔵のモータドライバICを利用することで簡単にモータの回転方向、速度を制御することが出来ます。
難点は、市販されているICの多くは最大3A程度までのものでうす、大電流に対応するモータドライバはFETやIGBTを使って自作するか、市販されている基板を購入します。
今回は秋月電子でDIP基板のキットを購入しました。
DRV8835使用ステッピング&DCモータドライバモジュール
説明に「2個(並列接続時は1個)のDCモータ、あるいは1個の2相バイポーラステッピングモータを駆動できます。」
とありますが、内部にHブリッジ回路が2個あります。今回は、並列(入力と出力を2回路共通に接続)に接続して1個の小型DCモータを回します。
##接続図
<補足>
VCC・・・ロジック電源
Vdirve・・・モータ電源 今回はUSBから+5V給電
P2・・・モータ接続端子
M1・・・回転方向制御端子 ArduinoのGPIOPINに接続(どこでも大丈夫)
E1・・・PWM入力端子(イネーブル)ArduinonのPWM出力PINに接続
GNDはArduinoボードと共通にします。
ショットキーバリアダイオードは、必要ではありません。
##結線
ブレッドボードに結線してみました。
またもぐちゃぐちゃですみません。
基板がDIP12Pと大きさが同じで、便利です。
##基本プログラム
#define E1 9
#define M1 8
void setup()
{
pinMode( M1, OUTPUT);
}
void loop()
{
digitalWrite(M1,HIGH);
analogWrite(E1, 125); //PWM Speed Control
}
<説明>
digitalWrite(M1,HIGH); 回転方向を指定しています。HIGH→LOWで逆回転になります。
analogWrite(E1, 125); PWM出力です。引数125が回転数に値します。255で100%となるはずです。
このプログラムでは、電源を入れマイコンが起動した瞬間にモータも動き出します。
次のプログラムでは、スタートスイッチ&ストップスイッチを追加します。
##スイッチ追加
byte ON_flag=0;
#define E1 9
#define M1 8
void setup()
{
pinMode( M1, OUTPUT);
pinMode(14, INPUT_PULLUP);
pinMode(15, INPUT_PULLUP);
}
void loop()
{
//スタートスイッチとストップスイッチを監視する
//スタートスイッチ
if(digitalRead(14) == 0)
ON_flag = 1;
//ストップスイッチ
if(digitalRead(15) == 0)
ON_flag = 0;
if(ON_flag){//flagが1ならモータon
digitalWrite(M1,HIGH);
analogWrite(E1, 125); //PWM Speed Control
}
else{ //flagが0ならモータoff
digitalWrite(M1,HIGH);
analogWrite(E1, 0); //PWM Speed Control
}
}
モータを制御するためにどうしても2つ関数(回転方向、PWM)を実行する必要があります。
次のプログラムではこれをまとめたmotor制御関数を利用します。
##モータ制御関数
#define E1 9
#define M1 8
void DCmotor_init(void);
void DCmotor_set(int accel);
#include "arduino.h"
#include "DCmotor.h"
void DCmotor_init(void){
pinMode(M1, OUTPUT);
}
void DCmotor_set(int accel){
int value;
if(accel >= 0){
value = map(accel, 0, 100, 0, 255);
digitalWrite(M1,HIGH);
analogWrite(E1, value); //PWM Speed Control
}
else{
value = map(-accel, 0, 100, 0, 255);
digitalWrite(M1,LOW);
analogWrite(E1, value); //PWM Speed Control
}
}
<説明>
引数 int accel に対して―100~+100(%)の値でそのままモータの回転(-で逆回転)と速度を指定できるようにします。
例
DCmotor_set(50);
+方向に50%で回転
DCmotor_set(-20);
-方向(逆回転)に20%で回転
DCmotor_set(0);
停止
また、DCmotor_set関数中のmap()は0から100の値を0から255に換算(マッピング)しています。
以上のプログラムを組込んでみました。
#include "DCmotor.h"
byte ON_flag=0;
void setup()
{
DCmotor_init();
pinMode(14, INPUT_PULLUP);
pinMode(15, INPUT_PULLUP);
}
void loop()
{
//スタートスイッチとストップスイッチを監視する
//スタートスイッチ
if(digitalRead(14) == 0)
ON_flag = 1;
//ストップスイッチ
if(digitalRead(15) == 0)
ON_flag = 0;
if(ON_flag){//flagが1ならモータon
DCmotor_set(-60);
}
else{ //flagが0ならモータoff
DCmotor_set(0);
}
}
とても簡単ですが、DCを自在に制御できるようになりました。
##おまけ
モータを+100%~-100%に連続変化させています。
byte gr0=1;
int power = 0;
void loop()
{
if(gr0){
power++;
if(power >= 100)
gr0 = 0;
}
else{
power--;
if(power <= -100)
gr0 = 1;
}
DCmotor_set(power);
}