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

##モータドライバIC＜DRV8835＞
今回は、Arduinoを使ってモータ制御します。
過去にFETを使って簡単にモータを制御してみました
[(04ArduinoでDCモータを簡単に回してみる)](https://qiita.com/mat-MUNET/items/1556519b8fda384eb242)
が、回転方向を制御しようとすると、Hブリッジ回路を作る必要があり、若干回路が複雑になります。
Hブリッジ回路の詳しい説明は、次のサイトにて詳しく紹介されていますので、ありがたく紹介させていただきます。[Hブリッジ回路によるブラシ付DCモータの駆動:原理](https://micro.rohm.com/jp/techweb_motor/knowledge/basics/basics-03/260)
Hブリッジ回路内蔵のモータドライバICを利用することで簡単にモータの回転方向、速度を制御することが出来ます。
難点は、市販されているICの多くは最大３A程度までのものでうす、大電流に対応するモータドライバはFETやIGBTを使って自作するか、市販されている基板を購入します。

今回は秋月電子でDIP基板のキットを購入しました。
[DRV8835使用ステッピング＆ＤＣモータドライバモジュール](http://akizukidenshi.com/catalog/g/gK-09848/)
説明に「２個（並列接続時は１個）のＤＣモータ、あるいは１個の２相バイポーラステッピングモータを駆動できます。」
とありますが、内部にHブリッジ回路が2個あります。今回は、並列（入力と出力を2回路共通に接続）に接続して1個の小型DCモータを回します。



##接続図
![DRV8835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/ea0f75ef-959f-4858-4fd6-13f620d39f9a.png)
＜補足＞
VCC・・・ロジック電源
Vdirve・・・モータ電源　今回はUSBから+5V給電
P2・・・モータ接続端子
M1・・・回転方向制御端子　ArduinoのGPIOPINに接続（どこでも大丈夫）
E1・・・PWM入力端子（イネーブル）ArduinonのPWM出力PINに接続

GNDはArduinoボードと共通にします。
ショットキーバリアダイオードは、必要ではありません。

##結線
ブレッドボードに結線してみました。
![feesa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/fa280fb3-2ba5-59db-c86b-964a1f3584e3.jpeg)
またもぐちゃぐちゃですみません。
基板がDIP12Pと大きさが同じで、便利です。

##基本プログラム
```cpp: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％となるはずです。

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

##スイッチ追加
```cpp: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が１ならモータon
      digitalWrite(M1,HIGH);        
      analogWrite(E1, 125);   //PWM Speed Control
   }
    else{ //flagが０ならモータoff
      digitalWrite(M1,HIGH);        
      analogWrite(E1, 0);   //PWM Speed Control
   }
}
```
モータを制御するためにどうしても2つ関数（回転方向、PWM）を実行する必要があります。
次のプログラムではこれをまとめたmotor制御関数を利用します。
##モータ制御関数
```cpp:DCmotor.h
#define  E1  9                         
#define  M1  8 
void DCmotor_init(void);
void DCmotor_set(int accel);
```
```cpp: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に換算（マッピング）しています。


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

```cpp: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が１ならモータon
      DCmotor_set(-60);
   }
    else{ //flagが０ならモータoff
      DCmotor_set(0);
   }
}
```

とても簡単ですが、DCを自在に制御できるようになりました。

##おまけ
モータを+100%~-100%に連続変化させています。

```cpp: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);
}
```