不動の鳥の勉強記録

時間があるときに勉強したことをメモします。

Grove I2C ミニモータードライバをNefryBTで操作する

ずっと前からモーターの制御をしたかったので、
Grove I2Cミニモータードライバと、NefryBTを使ってモーターを動かしてみましたので、
忘れないようにメモを残します。
Seeed社のWikiに記載のサンプルプログラムが動かなくて最初躓いたので同じ人がいるのではないかと思います。
サンプルプログラムが動かないのはきっとライブラリがおかしいのではということで、
Wikiの下部に"Do not hesitate~"と書いてあったのでテックサポートにメールしましたが、
1週間ほどたってもまだ返信はありません。

■I2C ミニモータードライバ
www.switch-science.com
今回はこちらのモータードライバを利用しました。
千石電商さんで取り扱っていました。
データシートはこちらとなります。
前まではHIGHかLOWかの制御しかない簡単なモジュールだったのですが、
複雑な制御をするモジュールはデータシートを見ないと何もできず今回勉強になりました。

■I2Cとは
こちらのサイトがGoogleでトップに出てくるので参考になりました。
I2C通信の使い方

個人的な感想としてはマイコンレジスタを指定して、
writeモードもしくはreadモードでレジスタの操作を行うものと認識しました。

■接続とアドレス設定について
NefryBTでI2C通信を行う時はGroveコネクタのD0に差し込みます。
I2Cのアドレス設定はデータシートを参考に、
今回はOUTPUTのCH1にモーターを接続したので、書き込みのアドレスは0xC4hとなりました。
ただ、Arduinoの場合は1ビット右シフトするので、0x62hとなります。
※未検証ですがOUTPUTのCH2の場合は、書き込みアドレスが0xC0hとなるので0x60hとなるはずです。

■操作について
I2Cを制御するためにWire.hを使います。
Wire.hはググるとたくさん出てきてスタンダードな制御方法のようです。

データシートのブリッジ制御からモーターは下記4つの操作ができるとのこと。
 ・スタンバイ/惰走・・・スタンバイモード次の制御をまつ。(0x00)
 ・正転・・・時計回りに回転する。(0x01)
 ・逆転・・・反時計回りに回転する。(0x02)
 ・ブレーキ・・・回転をブレーキする。(0x03)
これをレジスタの下位2ビットにそれぞれ入力します。
上位の6ビットで電圧(VSET)の設定を行って回転速度を制御します。
電圧設定(VSET)と出力電圧の関係性はデータシートの"電圧設定(VSET DAC)"の表を確認してください。

このブリッジ制御を行うためのレジスタのサブアドレスはデータシートの"I2Cレジスタ・マップ"から
 CONTROL: 0x00
 FAULT: 0x01
となっていました。

ここまでの情報がわかってやっとモーターが回せるようになりました。
単純に正転するサンプルプログラムは下記となります。

#include<Wire.h> // Wire.hを利用する

#define ADDR 0x62 // CH1の書き込みアドレス
#define CONTRL 0x00 //レジスタのサブアドレス
#define FAULT 0x01 //レジスタのサブドレス

void setup(){
 Wire.begin();
}

void loop(){
 Wire.beginTransmission(ADDR); // CH1の書き込みアドレスに対して操作をする
 Wire.write(CONTRL); // サブアドレスを指定する
 Wire.write(0xFD): //電圧設定とブリッジ制御を行う 
        //0xFD=11111101 上位6ビットが電圧設定、下位2ビットがブリッジ制御(01なので正転)
 Wire.endTransmission();
}


ソースコード
C++なれていなくお作法もWebで調べた感じですが、
DRV8830の制御方法をArduinoのライブラリ化してGitHubにアップロードしました。
github.com


■所感
チップセットのデータシートの見方や、I2C通信がまったくわからない状況で、
なんとかやってみよう!と始めたので理解まで時間がかかりました。
独学でネットで調べて学んでいるので本とかで簡単にわかるものがあると便利だなーと思いました。
私の周りには電子工作している方がいないのでしんどいです。笑

内容についてご指摘やアドバイスありましたら是非教えてください。

以上。