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

  • URLをコピーしました!

当記事では、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」のコマンド

レジスタサブアドレスレジスタ名デフォルト値説明
00x00CONTROL0x00出力状態/出力電圧の設定
10x01FAULT0x00障害状態の読み取り/クリア

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

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

Arduino Uno DCモータードライバ DRV8830 配線図
用意するもの
  1. DRV8830使用DCモータードライブキット
  2. DCモーター「FA-130RA-2270L」
  3. I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
  4. 抵抗10kΩ 2個
  5. Arduino Uno
  6. USBケーブル
  7. ブレッドボード
  8. ジャンパ線
  9. 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を実現したい方におすすめです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次