8pino を無線化してモータを動かす

手元の Arduino Uno の SCL/SDA の調子が悪いので(先日、モータードライバーを焼き切ったときに一緒にやられた?)、代わりに 8pino を使って動作検証していました。

image

ブレッドボードの左にあるのが 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 から制御して、モーターが動いた状態でも止まらなくなる。

ただ、これだとモーターの動力源的には足りないので(ちょっと動かすぐらいらば大丈夫だけど)、別電源を用意したほうがよさそう。

https://pbs.twimg.com/media/CAv9gOtUIAATNpi.jpg:large

スケッチはこんな感じ。

 
#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がうまく動いてない。

カテゴリー: Arduino, Bluetooth パーマリンク