手元の Arduino Uno の SCL/SDA の調子が悪いので(先日、モータードライバーを焼き切ったときに一緒にやられた?)、代わりに 8pino を使って動作検証していました。
ブレッドボードの左にあるのが 8pino のつもり(ATTiny85互換なので、そのまま利用)。
モータードライバの DRV8830 の SCL と SDA は、8pino の #2 と #0 に差せば ok。シリアル通信は、8pino の #3 と #4 を使って HC-05 と通信させる。8pino に 5V を給電させれば、ひとまず HC-05 は動くようになりました。通信がうまく動かなかったのは電源のところに 10μF 程度のコンデンサを置くことで解消した模様。モーターへの給電は、1.5V を送ってしまうと、通信が止まってしまうので、0.6 V ぐらいに抑える。そうすると、Bluetooth から制御して、モーターが動いた状態でも止まらなくなる。
ただ、これだとモーターの動力源的には足りないので(ちょっと動かすぐらいらば大丈夫だけど)、別電源を用意したほうがよさそう。
スケッチはこんな感じ。
#include <SoftwareSerial.h> #include <TinyWireM.h> const int DRV8830 = 0xC8 >> 1 ; // 0x64; SoftwareSerial mySerial = SoftwareSerial(3, 4); // RX, TX void writeRegister( int drv, byte vset, byte data ) { int vdata = vset << 2 | data ; TinyWireM.beginTransmission( drv ); TinyWireM.send( 0x00 ); TinyWireM.send( (vset<<2) + data ); TinyWireM.endTransmission(); } void setup() { // put your setup code here, to run once: TinyWireM.begin(); writeRegister( DRV8830, 0x00, 0x00 ); mySerial.begin(9600); delay( 2000 ); } void loop() { int len = mySerial.available(); if ( len < 2 ) return ; int type = mySerial.read(); // M or L int num = mySerial.read(); // MF/MB/M0, L0/L1 if ( type == 'M' || type == 'N') { int mode = 0; switch ( num ) { case '0': mode = 0; break; case 'F': mode = 1; break; case 'B': mode = 2; break; default: mode = 0; break; } switch ( mode ) { case 0: writeRegister( DRV8830, 0x00, 0x00 ); mySerial.print("stop----"); break; case 1: writeRegister( DRV8830, 0x0A, 0x02 ); mySerial.print("forward-"); break; case 2: writeRegister( DRV8830, 0x0A, 0x01 ); mySerial.print("back----"); break; } } }
ATTiny85 は Wire をそのままは使えないので、TinyWireM.h を使う。Bluetooth モジュールへのシリアル通信もポート番号が異なるので、SoftwareSerial を使う。
Bluetooth はシリアル通信を使っているので、コントロールしているストアアプリのほうへ、mySerial.print すると応答を返せる。通常 8pino のような小さい arduino はデバッグ用のシリアルポートがつなげなくて困るのだけど、こんな風に Bluetooth 経由で情報を取り出せるのはいいかなと思う。
これを netduino で動かしたいんだが、まだ I2Cがうまく動いてない。