読者です 読者をやめる 読者になる 読者になる

pのメモ

技術系のお話が中心になると思います。おかしなところがありましたら、ご指摘いただければ幸いです。

AndroidのUSBHost機能でArduinoと接続

Androidの3.1以降にUSBホスト機能がありますが、これを利用してArduinoと接続させてみました。
AndroidをUSBホストとして、ADKとかmicroBridgeを利用せずに接続します。

f:id:systemp:20130407142147j:plain


必要なものは、以下のとおり

・USBホスト機能をもっているAndroid端末
 バージョンが3.1以上であればよいかというと、そういう分けでもないようです。
 端末によって、対応してたりしてなかったり。
・USBホストケーブル
 ホスト対応したものが、必要なので要注意です。
 私はこれを使いました。自分で配線して用意することもできます。
Arduino
 Arduino Duemillanove,UNO R1以前とUNO R2以降でUSBシリアルのやり方に違いがあるかもです。前者はUSBシリアル変換チップでやってるのに対し、後者はAVRのファームで処理してるっぽいです。
 私はDuemillanoveを使いました。

接続は、[Android]-(USBホストシールド)-[Arduino]-[サーボ]という構成。
Arduinoへの給電は、ホスト側(Android)から行われますが、今回はサーボを動かしたかったので別途アダプタでArduinoへ給電しています。サーボの電源をArduinoから取ってますが、電流が多く必要となる場合は、別途電源を用意する必要があると思います。


まずはAndroid側の実装。
あ、今回はライブラリとして「usb-serial-for-android」を使用させていただきました。
簡単に示すと次のような感じで実装します。

// オープンまで(エラーチェックとか細かいのは省略)
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbSerialDriver serialDevice = UsbSerialProber.acquire(usbManager);
serialDevice.open();
serialDevice.setBaudRate(9600);

// データを用意して...(詳細略)
String str = String.format("%03d", progress);
byte[] bytes;
bytes = str.getBytes("UTF-8");
serialDevice.write(bytes, bytes.length);

// write()で書き込み
serialDevice.write(bytes, bytes.length);

// クローズ
serialDevice.close();

で、Arduinoスケッチは以下のとおり。かなりざっくりとした実装です。

#include <Servo.h>

Servo servo;
char led_pin = 13;
char servo_pin = 11;
char serial_recv;
int angle = 90;

void setup() {
  servo.attach(servo_pin);
  pinMode(led_pin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  angle = readAngle();
  if(angle>=0){
    digitalWrite(led_pin, true);
    servo.write(angle);
    digitalWrite(led_pin, false);
  }
  delay(20);
}

// ざっくり
int readAngle() {
  int i = 0;
  char tempBuf[4];
  int ret = -1;
  char c;

  if(Serial.available()>2) {
    ret = 0;
    i=0;
    while(i < 3) {
      tempBuf[i] = Serial.read();
      if (tempBuf[i] < 0) {
        break;
      }
      i++;
    }
    ret = (tempBuf[0]-'0')*100 + (tempBuf[1]-'0')*10 + (tempBuf[2]-'0');
    tempBuf[3]='¥0';
  }
  return ret;
}

Android側から回転角度として3桁数文字を送って、Arduino側でread、回転角度をサーボに指示する。
こんな感じで動きます。


以下の情報を参考とさせていただきました。
橋本商会 » AndroidのUSBホスト機能でArduinoとシリアル通信する