Arduinoのサンプルプログラム

Arduino-DCモータードライバ「DRV8830」の使い方

当記事では、ArduinoでDCモータードライバ「DRV8830」を使う方法を詳しく解説します。

DCモータードライバ「DRV8830」はI2Cで制御するため、ArduinoのWireライブラリを使ったプログラムで動作させます。

なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。

DCモータードライバ「DRV8830」の基本スペック

「DRV8830」はI2C制御で、正転、逆転、ブレーキ、惰走などの制御が可能なDCモータードライバです。さらに、複数アドレスを選択することにより、最大9個のDCモーターを接続することができます。

当記事では、基板にモジュール化された秋月電子通商の「DRV8830使用DCモータードライブキット」を使用して、サンプルプログラムを解説していきます。

基本スペック DRV8830
電源電圧 DC2.75~6.8V
最大駆動電流 1A
機能 正転/逆転/ブレーキ/惰走/の切り替え・速度コントロール


DRV8830のより詳細なスペックを確認したい場合は、以下のリンク先にある説明書をご覧ください。

また、参考としてDCモーター「FA-130RA-2270L」の基本スペックをいかに記載します。

基本スペック FA-130RA-2270L
電源範囲 1.5~3.0VDC
(Typ. 1.5V)
無負荷時電流 0.2A
(max. 0.26A)
無負荷時回転数 約8100~9900rpm/min
定格負荷時電流 0.66A
(max. 0.85A)
定格負荷時回転数 約7000rpm/min
負荷 6.0g・cm
負荷出力 0.43W
効率 44%
静止電流 2.2A
静止トルク 26g・cm
重量 約17g(コードを除く)


FA-130RA-2270Lのより詳細なスペックを確認したい場合は、以下のリンク先にあるデータシートをご覧ください。

DCモータードライバ「DRV8830」のコマンド

レジスタ サブアドレス レジスタ名 デフォルト値 説明
0 0x00 CONTROL 0x00 出力状態/出力電圧の設定
1 0x01 FAULT 0x00 障害状態の読み取り/クリア


DRV8830のより詳細なコマンド内容を確認したい場合は、以下のリンク先にある説明書をご覧ください。

サンプルプログラム(サンプルスケッチ)

用意するもの
  1. DRV8830使用DCモータードライブキット
  2. DCモーター「FA-130RA-2270L」
  3. I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
  4. Arduino Uno
  5. USBケーブル
  6. ブレッドボード
  7. ジャンパ線
  8. PC(プログラム書き込み・シリアルモニタ表示)

※実体配線では、Arduino Unoの5Vから「DRV8830使用DCモータードライブキット」に給電していますが、今回のサンプルプログラムはDCモーターを無負荷で回転することを想定しています。DCモーターに負荷をかけて回転する場合は、より大きな電流が流れるので、「DRV8830使用DCモータードライブキット」の給電は十分に容量の大きいACアダプタ(2A以上)など別途電源を用意してください。

正転/停止


#include <Wire.h>

//アドレス指定
#define DRV8830_ADDR 0x64
#define CONTROL 0x00
#define FAULT 0x01
  
void setup()
{  
  //I2C初期化
  Wire.begin();//I2Cを初期化

  //DRV8830 CONTROLクリア
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x00);//コントロールクリア
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  //DRV8830 FAULTクリア
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(FAULT);//フォルト(障害状態)
  Wire.write(0x80);//フォルトクリア
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(1000);//1000msec待機(1秒待機)
}

void loop()
{
  //DRV8830 CONTROL 正転0.48V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x06 << 2 | 0x01);//正転0.48V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機

  //DRV8830 CONTROL 正転0.96V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x0C << 2 | 0x01);//正転0.96V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機

  //DRV8830 CONTROL 正転1.45V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x12 << 2 | 0x01);//正転1.45V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
 
  delay(1000);//1000msec待機(1秒待機)

  //DRV8830 CONTROL 惰走
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x00);//惰走
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機
  
  //DRV8830 CONTROL ブレーキ
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x03);//ブレーキ
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
    
  while(1);//無限ループ
}

サンプルプログラムでは、セットアップでI2CとDCモータードライバ「DRV8830」を初期化した後、正転を1秒間続けた後、停止します。

正転/逆転の繰り返し


#include <Wire.h>

//アドレス指定
#define DRV8830_ADDR 0x64
#define CONTROL 0x00
#define FAULT 0x01
  
void setup()
{  
  //I2C初期化
  Wire.begin();//I2Cを初期化

  //DRV8830 CONTROLクリア
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x00);//コントロールクリア
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  //DRV8830 FAULTクリア
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(FAULT);//フォルト(障害状態)
  Wire.write(0x80);//フォルトクリア
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(1000);//1000msec待機(1秒待機)
}

void loop()
{
  //DRV8830 CONTROL 正転0.48V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x06 << 2 | 0x01);//正転0.48V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機

  //DRV8830 CONTROL 正転0.96V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x0C << 2 | 0x01);//正転0.96V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機

  //DRV8830 CONTROL 正転1.45V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x12 << 2 | 0x01);//正転1.45V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
 
  delay(1000);//1000msec待機(1秒待機)

  //DRV8830 CONTROL 惰走
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x00);//惰走
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機
  
  //DRV8830 CONTROL ブレーキ
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x03);//ブレーキ
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機
    
  //DRV8830 CONTROL 惰走
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x00);//惰走
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機

  //DRV8830 CONTROL 逆転0.48V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x06 << 2 | 0x02);//逆転0.48V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機
  
  //DRV8830 CONTROL 逆転0.96V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x0C << 2 | 0x02);//逆転0.96V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機

  //DRV8830 CONTROL 逆転1.45V
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x12 << 2 | 0x02);//逆転1.45V
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
 
  delay(1000);//1000msec待機(1秒待機)

  //DRV8830 CONTROL 惰走
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x00);//惰走
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  delay(10);//10msec待機
  
  //DRV8830 CONTROL ブレーキ
  Wire.beginTransmission(DRV8830_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(CONTROL);//コントロール
  Wire.write(0x00 << 2 | 0x03);//ブレーキ
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  
  delay(10);//10msec待機
}

サンプルプログラムでは、セットアップでI2CとDCモータードライバ「DRV8830」を初期化した後、ループで正転と逆転を1秒間ごと繰り返します。

テキストのコピーはできません。