手元の 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 から制御して、モーターが動いた状態でも止まらなくなる。
ただ、これだとモーターの動力源的には足りないので(ちょっと動かすぐらいらば大丈夫だけど)、別電源を用意したほうがよさそう。
スケッチはこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #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がうまく動いてない。