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を実現したい方におすすめです。