Android + Arduino =♥

少し前まで、GoogleはUSBでAndroidデバイスを動作させるためのAPI公開しました 。 今日は、それが何であるかを感じ、私たちにとってどんな機会が開かれているかを知る時です。









したがって、Arduino Mega 2560、 USB Host Shield 、およびシアン 7.0.1 RC1ファームウェア(Android 2.3.4)を搭載したHTC Desireがあります。 念のため、後で説明するすべての機能は、携帯電話用のAndroid 2.3.4およびタブレット用のAndroid 3.1以降でのみ機能することをお知らせします。

このUSBホストシールドは、特にArduino Mega 2560との組み合わせでは完全に成功するわけではないことに注意してください。最初の問題は、この拡張ボードがArduino UNO向けに作られていることです。写真)。 2番目の問題は、かなり予想されていましたが、この拡張カードが機能するための外部電源の必要性でした。 Circuits @ HomeのUSB Host Shield 2.0はより成功していると考えられますが、高価です。




スローされたSPIコンタクトを持つボード



Arduinoソフトウェアのセットアップ



1.まだインストールされていない場合は、Arduinoのソフトウェアをダウンロードしてインストールします

2. ADKパッケージ (DemoKitアプリケーションを含む)をダウンロードして解凍ます。 app



firmware



、およびhardware



フォルダーが表示されます。

3. CapSenseライブラリをダウンロードします

4. firmware/arduino_libs/AndroidAccessory



firmware/arduino_libs/USB_Host_Shield



<arduino_installation_root>/libraries/



コピーしfirmware/arduino_libs/AndroidAccessory





5. <arduino_installation_root>/libraries/



CapSenseディレクトリを作成し、CapSenseアーカイブからCapSense.cpp



およびCapSense.h



そこにコピーします。



ファームウェアのダウンロード



GoogleはArduino用のDemoKitスケッチを親切に提供しています。 必要なのは、 firmware/demokit/demokit.pde



からそれを開き、コンパイルしてボードにfirmware/demokit/demokit.pde



です。



Androidテストアプリケーション



DemoKitパッケージには、機能を示すAndroidアプリケーションのソースコードも含まれています。 Googleは、Androidプロジェクトを独自に作成し、このアプリケーションを構築することを提案しています。 最初に、 APIレベル10をインストールする必要があります 。 その後、すべてが簡単です-Androidプロジェクトを作成し、 app



フォルダーへのパスを指定し、ビルドターゲットでGoogle API(Platform 2.3.3 、APIレベル10)を指定します。 アプリケーションを収集し、電話にインストールします。 アセンブリを台無しにしたくない人- 完成したAPKをダウンロードできます



打ち上げ



電話機をUSBホストシールドに接続するだけです。 すべてを正しく行った場合、画面からDemoKitアプリケーションを起動するように求められます。







アプリケーション自体には、In(ボタン、ジョイスティック、センサー)とOut(LED、リレー、サーボ)の2つのタブがあります。







私は、LEDのペアとボタンでデモを行うのに十分であると判断しました。 この奇跡がどのように機能するかは、ビデオで確認できます。







いくつかのコード



この例では、USBを介して送信されるメッセージは3バイトで構成されます。

最初のバイトは、コマンドまたはデバイスのグループ、たとえばLEDを定義します-0x2

2番目のバイトは特定のデバイスを示します。たとえば、緑色のLED-0x1

3番目のバイトには、デバイスに送信される値が含まれます。たとえば、最大輝度は0xffです



Arduino



 ... /*  */ AndroidAccessory acc("Google, Inc.", "DemoKit", "DemoKit Arduino Board", "1.0", "http://www.android.com", "0000000012345678"); void setup() { .... acc.powerOn(); } void loop() { byte msg[3]; /*   */ if (acc.isConnected()) { /*    Android  */ int len = acc.read(msg, sizeof(msg), 1); if (len > 0) { /*    */ if (msg[0] == 0x2) { if (msg[1] == 0x0) analogWrite(LED3_RED, msg[2]); else if (msg[1] == 0x1) analogWrite(LED3_GREEN, msg[2]); else if (msg[1] == 0x2) analogWrite(LED3_BLUE, msg[2]); } } msg[0] = 0x1; b = digitalRead(BUTTON1); if (b != b1) { msg[1] = 0; msg[2] = b ? 1 : 0; /*    */ acc.write(msg, 3); b1 = b; } } }
      
      







Android



 import com.android.future.usb.UsbAccessory; import com.android.future.usb.UsbManager; ... public class DemoKitActivity extends Activity implements Runnable { private UsbManager mUsbManager; UsbAccessory mAccessory; FileInputStream mInputStream; FileOutputStream mOutputStream; ... private void openAccessory(UsbAccessory accessory) { mFileDescriptor = mUsbManager.openAccessory(accessory); if (mFileDescriptor != null) { mAccessory = accessory; FileDescriptor fd = mFileDescriptor.getFileDescriptor(); mInputStream = new FileInputStream(fd); mOutputStream = new FileOutputStream(fd); Thread thread = new Thread(null, this, "AccessoryThread"); thread.start(); } } public void run() { int ret = 0; byte[] buffer = new byte[16384]; int i; while (ret >= 0) { //    ret = mInputStream.read(buffer); i = 0; while (i < ret) { int len = ret - i; switch (buffer[i]) { case 0x1: //    if (len >= 3) { Message m = Message.obtain(mHandler, MESSAGE_SWITCH); m.obj = new SwitchMsg(buffer[i + 1], buffer[i + 2]); mHandler.sendMessage(m); } i += 3; break; } } } } //   -      : // mActivity.sendCommand((byte)2, (byte)0, (byte)255) public void sendCommand(byte command, byte target, int value) { byte[] buffer = new byte[3]; if (value > 255) value = 255; buffer[0] = command; buffer[1] = target; buffer[2] = (byte) value; if (mOutputStream != null && buffer[1] != -1) { try { mOutputStream.write(buffer); } catch (IOException e) { ... } } } }
      
      







結論



このような機会を発見したGoogleは、当然、最初から多数のアクティブなAndroidアクセサリが登場することを期待していますが、実際には、さまざまなセンサー、センサー、およびドライブと対話するための便利なデバイスを実際に入手できるという事実にとらわれません。 このようなデバイスは、ロボットのようなものの脳になりやすい。



また、ArduinoのAndroidデバイスは、GPS、Bluetooth、WiFi、加速度計などを備えた拡張カードとして機能することを忘れないでください。



参照資料



1. Android USBアクセサリー

2. Android Open Accessory開発キット



All Articles