11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-05-09

##モータドライバ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モータを回します。

##接続図
DRV8835.png
<補足>
VCC・・・ロジック電源
Vdirve・・・モータ電源 今回はUSBから+5V給電
P2・・・モータ接続端子
M1・・・回転方向制御端子 ArduinoのGPIOPINに接続(どこでも大丈夫)
E1・・・PWM入力端子(イネーブル)ArduinonのPWM出力PINに接続

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

##結線
ブレッドボードに結線してみました。
feesa.jpg
またもぐちゃぐちゃですみません。
基板が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);
}
11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?