ADKのライフサイクル


ADKのライフサイクル

AndroidとArduinoを接続は、下図の手順でおこないます。acc.isConnected()が呼ばれるとAndroidとの接続が開始されます。最初の接続時には、Android端末上に接続の開始を確認するダイアログボックスが表示されます。ダイアログボックスの確認メッセージを確認し、OKを押すとArduinoとAndroid の接続が開始されます。



Arduino側サンプルソース

adksample

ガジェットの仕様の URL が見つかりませんでした


ソースコードの作成が終わったら、ArduinoとPCとAndroidをUSBで接続します。



Arduinoの矢印ボタンをクリックし、スケッチをBuildし実機に転送します。


[ソースコードの解説]ライブラリのインポート

Arduino Uno + USB Host Shieldを使用する場合のライブラリをインポートします。

1: #include <Max3421e.h>
2: #include <Usb.h>
3: #include <AndroidAccessory.h>

[ソースコードの解説]AndroidAccessoryの初期化

このパートの解説を進めるために、Android MarketからAndroid DemoKitのアプリをダウンロードしてきます。

   

AndroidAccessoryの初期化では、Androidアプリと連動するための基礎情報を記載します。

5: AndroidAccessory acc("Google, Inc.", // 会社名
6:                      "DemoKit", // モデル名
7:                      "DemoKit Arduino Board", // アプリ説明
8:                      "1.0", // バージョン
9:                      "http:///www.google.com", // URL
10:                     "0000000012345678"); // シリアル

Androidアプリ側では、accessory_filter.xml というファイルで、ADKに対応するアプリの情報を定義しています。

Androidアプリ側のaccessory_filter.xml
1: <?xml version="1.0" encoding="utf-8"?>
2: <resources>
3:    <usb-accessory manufacturer="Google, Inc." model="DemoKit" version="1.0" />
4: </resources>

Arduino側とAndroid側の
  • 会社名(Google, Inc.)
  • モデル(DemoKit)
  • バージョン(1.0)
の3つの項目がマッチした場合、アプリの起動確認ダイアログボックスが表示されます。



1つでもマッチしない場合は、アプリ説明の部分がタイトルに表示されたダイアログボックスが表示され、指定したURLに飛ばされます。
モデル名を差し替えてみましょう。


5: AndroidAccessory acc("Google, Inc.", // 会社名
6:                      "DemoKit for Original", // モデル名
7:                      "DemoKit Arduino Board", // アプリ説明
8:                      "1.0", // バージョン
9:                      "http:///www.google.com", // URL
10:                     "0000000012345678"); // シリアル



シリアルに関して、今のところ任意の値を使用して大丈夫です。

[ソースコードの解説]AndroidAccessoryのPowerをOnに

Arduinoのスケッチでは、setup()とloop()を記載するルールになっているので、setup()の中で、AndroidAccessoryのパワーをOnにします。この時点では、まだAndroidに接続しにいっていない状態です。

11: void setup();
       …
14: void setup()
15: {
16:   acc.powerOn();
17: }

[ソースコードの解説]Androidに接続

loop()の中で、acc.isConnected()が呼び出されると、Androidに接続しにいきます。

19: void loop()
20: {
21:  if(acc.isConnected()){
22:
23:     // データの送受信処理
24:  }
25: 
26:  delay(10);
27: }

Androidに接続しにいくと、USB accessoryを接続するかどうかの確認用のダイアログボックスが表示されます。ダイアログボックスでOKボタンが押されると、接続が開始されます。



DemoKitと連携させる(In)

DemoKitの[In]の部分にArduinoから値を流し込んでみます。


DemoKitのサンプルアプリでは、Arduinoから3バイトのデータをacc.write()で書き込んで送信し、そのデータをAndroidアプリ側で受信して画面に表示しています。
最初の1バイト目が、領域を示し、2バイト目、3バイト目に値を代入しています。


 項目 領域(1バイト目)  値(2バイト目、3バイト目)
 Button 0x1 B1, B2, B3の場所を2バイト目で指定、3バイト目に 1 か 0の数値を代入
 Temp 0x4 2バイト目と3バイト目で数値を代入
 Light                 0x5 2バイト目と3バイト目で数値を代入
 JoyStick 0x6 2バイト目にx座標、3バイト目にy座標を代入
    

Buttonとの連携

Buttonは、1バイト目で0x1の領域を指定します。2バイト目にButtonの番号(1-3)、3バイト目にボタンの状態(1or0)を代入します。

バイト型のmsg配列の中身
 1バイト目 0x1
 2バイト目 1〜3
 3バイト目 1 or 0


adksample.pde

ガジェットの仕様の URL が見つかりませんでした

adksample.pde

ガジェットの仕様の URL が見つかりませんでした



うまく連携できれば、B1, B2, B3が青く光った状態になります。



TempとLightの連携


TempとLightの部分は、ArduinoからAndroidへ数値を渡しています。
Tempが1バイト目に0x4を、Lightが1バイト目に0x5の値が割り振られています。

バイト型のmsg配列の中身(Temp)
 1バイト目 0x4
 2バイト目上位8Bit 
数値を8ビット右シフト(>>)
 3バイト目下位8Bit 
数値と0xffの論理和

バイト型のmsg配列の中身(Light)
 1バイト目 0x5
 2バイト目上位8Bit 
数値を8ビット右シフト(>>)
 3バイト目下位8Bit
数値と0xffの論理和


adksample.pde

ガジェットの仕様の URL が見つかりませんでした


TempとLightがそれぞれ176度と48.8%になっていれば値が反映されています。Androidアプリ側で受け取った値を補正しているために、違った値がアプリ内では表示されます。


JoyStickの連携

JoyStickは、1バイト目に0x6を指定します。2バイト目、3バイト目にはそれぞれ(x,y)座標を代入します。

バイト型のmsg配列の中身(JoyStick)
 1バイト目 0x6
 2バイト目 x座標
 3バイト目 y座標

adksample.pde

ガジェットの仕様の URL が見つかりませんでした


Joystickの座標が(20,30)になっていれば成功です。


DemoKitと連携させる(Out)

次は、Android側からArduinoに送られてくる値を取得するサンプルを作成してみます。



Android側から送られてくるデータの読み込みには、acc.read()を使用します。Android側からも3バイトの配列が送られてくるので、Arduino側でログを表示します。

adksample.pde

ガジェットの仕様の URL が見つかりませんでした


サンプルソースをBuildし、実機に転送したのちに、Serial Monitorを起動し、ログを表示します。



Android側から送られてくる値の読み込みでは、1バイト目と2バイト目で項目を指定し、3バイト目にはその項目の数値が代入されてきます。

  1バイト目 2バイト目 3バイト目
 Servo1 0x20x16  数値
 Servo2 0x20x17  数値
 Servo3 0x20x18 数値
 Led1(赤) 0x20x0 数値
 Led1(緑) 0x20x1 数値
 Led1(青)             0x20x2 数値
 Led2(赤) 0x20x3 数値
 Led2(緑) 0x20x4 数値
 Led2(青) 0x20x5 数値
 Led3(赤)         0x20x6 数値
 Led3(緑)     0x20x7 数値
 Led3(青) 0x20x8 数値
 Relay1 0x30x0 数値
 Relay2 0x30x1 数値 
ċ
com.google.android.DemoKit.DemoKitLaunch.apk
(2780k)
Akira Sasaki,
2013/01/10 18:35
Comments