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のより詳細なコマンド内容を確認したい場合は、以下のリンク先にある説明書をご覧ください。
サンプルプログラム(サンプルスケッチ)

- DRV8830使用DCモータードライブキット
- DCモーター「FA-130RA-2270L」
- I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
- 抵抗10kΩ 2個
- Arduino Uno
- USBケーブル
- ブレッドボード
- ジャンパ線
- 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秒間ごと繰り返します。
おすすめのArduinoボードはどれ?
当記事『Arduino-DCモータードライバ「DRV8830」の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。

また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。

 おすすめ電子CAD
 おすすめ電子CAD