06ArduinoとモータドライバDRV8835を繋いでDCを動かしてみる


モータドライバ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と大きさが同じで、便利です。

基本プログラム

Robot19
#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%となるはずです。

このプログラムでは、電源を入れマイコンが起動した瞬間にモータも動き出します。
次のプログラムでは、スタートスイッチ&ストップスイッチを追加します。

スイッチ追加

Robot19
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制御関数を利用します。

モータ制御関数

DCmotor.h
#define  E1  9                         
#define  M1  8 
void DCmotor_init(void);
void DCmotor_set(int accel);
DCmotor.cpp
#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に換算(マッピング)しています。

以上のプログラムを組込んでみました。

Robot19
#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%に連続変化させています。

Robot19
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);
}