AndroidのUSBHost機能でArduinoと接続
Androidの3.1以降にUSBホスト機能がありますが、これを利用してArduinoと接続させてみました。
AndroidをUSBホストとして、ADKとかmicroBridgeを利用せずに接続します。
必要なものは、以下のとおり
・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とシリアル通信する