ADKとArduinoの使いかた


先月の記事に続きについてADK-demoボードの使いかたとAndroidAccessoryデモアプリのビルド方法についてレポートいたします。

Android Accessoryとは
今年5月にgoogleから発表されたAndroidハードウェア拡張規格のことです。
詳しい情報はこちらを参照してください。
 http://developer.android.com/guide/topics/usb/adk.html

今回はgoogleで公開されているソースコードを使用しました。
 https://dl-ssl.google.com/android/adk/adk_release_0512.zip


Android Accessoryの面白いところ
一般的にハードウェアの拡張といえばUSBに周辺機器を接続するというイメージがありますが
Android Accessoryは、なんと外部装置がUSBホストでAndroid端末が周辺機器として振舞います。
この方式を取るメリットとしてはスマートフォンのように電力的に非力なデバイスから
外部へ電力供給させることなく、外部から電力供給を受けながら半永久的に動作させることが
できることです。またフレームワーク層でハードウェア/ドライバを隠蔽してくれていることから
難しいドライバなどを書かなくても外部機器を接続できるメリットもあります。


1.Android Accessoryを実現するためのハードウェア
当初Android AccessoryはArduinoをベースとした実装として発表されましたが
最近になってArduinoを用いないADK対応ボードもいくつか出てきているようです。
今回はADKの基本を知るためにもArduinoをベースにしたものを用いることにしました。

Arduinoを用いたADKを実現するアプローチとして次のようなものがあります。
 a) RT-ADKボード
 b) Arduino ADKボード
 c) Arduino MEGA 256 + USB HOST Shield 2.0
d) Arduino uno + SparkFun USB HOST Shield


RT-ADKボードとサブボード

RT-ADKボードはGoogleのロゴも付いていて、持っていて嬉しい基板ではありますが
ちょっと入手が大変なこともあり、今回は本家Arduinoが出しているArduino ADKボードでの
使用方法も併せて記載いたします。


Arduino USBシールドとADKボードの違いについて
オリジナルのUSB HOSTはシールドという形で拡張されるようになっていますが
RT-ADKボードとArduino ADKではシールド接続用の信号を温存するために
USB回路の接続にArduino非互換の信号を使っています。
そのため本家 USB HOSTシールドのライブラリをそのまま使うことができません
ちょっと古いですが最初のうちはADK Package配布に含まれているライブラリを使うようにしてください。
どうしても新しいものを使いたい方は次のピン割り当てを書き換えれば使えるようになるはずです。
 INT GPIO_9 -> ATMEGA2560(PE6)
 RST GPIO_8 -> ATMEGA2560(PJ2)
 GPX GPIO_7 -> ATMEGA2560(PJ3)


1-1.ツールとライブラリの準備
ADKで必要となるArduinoの開発環境は次のようにインストールを行う必要があります。

Arduinoソフトウェア
Arduinoを動かすための基本ツールは次の場所から入手することができます。
 http://arduino.cc/en/Main/Software
ここでは9/20時点で最新版であるArduino 0022 を使用しています。
arduino-0022.zipをダウンロードし、任意のフォルダに展開します。
このツールは任意のフォルダから起動できるので外部ドライブに展開しても使用することができます。
今回はG:\に展開したものとして記載しています。


Arduino ADK追加ファイル
Arduino ADKを使うために必要な追加ファイルは次の場所に公開されています。
なおこの追加ファイルはRT-ADKやunoには必要ありません。
http://www.arduino.cc/en/Main/ArduinoBoardADK

一番下にWindowsドライバのinfファイルが入ったzipファイルがありますのでダウンロードして
Arduino MEGA ADK.infをG:\arduino-0022\driversにコピーしておきます。


Android Accessoryライブラリ
Android Accessoryで使用するライブラリをインストールします。
adk_release_0512.zipを展開しADK_release_0512\firmware\arduino_libs以下にある
次の2つのフォルダをG:\arduino-0022\librariesにコピーします。


・Capacitive Sensingライブラリ
RT-ADKボードに載っているタッチセンサーのライブラリもインストールします。
 http://www.arduino.cc/playground/Main/CapSense

ここに公開されている CapacitiveSense003.zip をダウンロードし
展開されたCapacitiveSense003フォルダをG:\arduino-0022\librariesにコピーします。


1-2. スケッチのビルド
Arduinoの世界ではソースコードをスケッチと呼びます。
ADKで配布されているコードにはスケッチも含まれていますので、これをビルドして使用します。
まずADK_release_0512\firmwareにあるdemokitフォルダをG:\arduino-0022にコピーしておきます。

arduino.exeを起動後にFile -> Openを実行し 上記コピーしたフォルダにあるdemokit.pdeを開きます。
次にTools -> Board にて "Arduino Mega 2560"を選択します。
Sketch -> Verify Compileを実行することによりビルドが開始されます。

正常にビルドされればステータス部分に"Done compiling"と表示されます。


Arduino ADKのみを使う場合は
Arduino ADKには RT-ADKの付属サブボードのようなものがありませんのでブレッドボードで代用します。
今回はフルカラーLED3個とスイッチ2個を載せてみました。

RT-ADKのサブボードに比べブレッドボードに載せた回路はなかり簡素なものとなっていることから
ADKオリジナルソースから次のコードをコメントアウトする必要があります。
 JoyStick
 Temp/Light Sensor
 Relay
 ServoMoter
 CapacitiveSenser
修正済みのスケッチを次の場所に置きましたので、こちらを参考にして下さい。
https://sites.google.com/a/brilliantservice.co.jp/beagleboard/adk/demokit_ADK.pde?attredirects=0&d=1


1-3. スケッチのアップロード
ビルドが終わったスケッチをアップロードする前に、予めPCとAdruinoを接続しておきます。
Arduinoボードを最初に接続した時にはドライバを要求されますので次のドライバをインストールして下さい。
RT-ADK -> G:\arduino-0022\drivers\FTDI USB Drivers\
 Arduino ADK -> G:\arduino-0022\drivers\Arduino MEGA ADK.inf

次に Tools -> Serial Portでボードに接続しているポートを指定します。
File -> Upload to I/O board を実行すればビルドされたスケッチがボードへ転送され
ADKボードとして使用することができます。


2.AndroidAccessoryデモアプリ(DemoKit)
AndroidAccessoryを動作させるためのデモアプリはAndroid Open Accessory Development Kit
(adk_release_0512.zip)に含まれています。
今回はこのデモアプリを使って動作確認するところまで記載いたします。

なお、とりあえず動作だけという方のためにビルド済みのapkファイルも準備しました。
https://sites.google.com/a/brilliantservice.co.jp/beagleboard/adk/DemoKit_singed.apk?attredirects=0&d=1
署名付きにしましたので、そのまま adb install等でインストールできます。


☆ ネットワーク越しのデバッグ
ADKはadbで使われるUSBポートを塞いでしまうため、USB接続によるデバッグができなくなります。
そこで有線LAN経由でadbを使えるようにします。
ここではBeagleBoardIPアドレスを192.168.1.23として記載ています。
IPアドレスは使用する環境に合わせて読み替えてください。

BeagleBoard側の設定
adbデーモンを停止したのちにadbの設定切り替えます。
シリアルコンソールから次のように入力します。


# stop adbd
# ifconfig usb0 192.168.1.23 up
# setprop service.adb.tcp.port 5555
# start adbd

adbdはAndroid起動時にUSB接続となってしまいますので
起動ごとに上記の操作を行うようにしてください。


・ホスト側の設定
いったんadbサーバを停止してからネットワーク経由で接続を行います。


adb kill-server
adb start-server
adb connect 192.168.1.23:5555

正常に接続できれば、USB接続と同じように"adb"や"ddms"を使ってデバッグを行うことができます。


2-1. ソースコードの準備
今回は Android Open Accessory Development Kitで公開しているソースコードを用いました。
ここで配布されているADK Package(adk_release_0512.zip)をD:\workspaceに展開します。


2-2. Eclipseプロジェクトの作成
配布されているソースコードはそのままビルドすることができないことから
新規プロジェクトを作成しつつインポートさせます。
Eclipseを起動後 File -> New -> Android Projectで新規プロジェクトを作成します。

新規プロジェクトのダイアログが出ますので次の項目を入力してFinishボタンを押します。

Project nameは任意の名前でかまいません
 "Create project from existing source"を選択し
 "D:\workspace\adk_release_0512\ADK_rlease_0512\app"を指定
Build Targetは"Google APIs(2.3.3)"を選択
Android 2.3.4の項目が無いのは2.3.4発表時に3.0のためにAPI Level 11が定義されていたため
適切なAPI Levelが割り当てられなかったためのようです。
そのため2.3.4は2.3.3+αとして扱われています。


2-3. ビルド、デバッグ
ADBの接続ができていればそのまま動作させることができます。
Targetバージョンが一致していないため警告マークが出ますが問題ありません。

デモアプリをインストール後にADK ボードを接続すると次のような画面が出ます。

ここでOKのボタンを押すとデモアプリが動き出します。
ボタンやジョイスティック操作に合わせて画面が変化したり、R,G,Bのスライダを
動かすとLEDが点灯すれば正常に動作しています。


今回は早足ではありましたがAndroidに独自ハードウェアを付ける方法について解説いたしました。
AndroidといえばJavaアプリというイメージがありますが、Adruinoが繋がるようになれば
簡単にハードウェアを触れるようになります。
これを機にハードウェアに興味を持ってくださる方が増えれば幸いです。


次回はADKの応用編としてFarmboxのプラットフォームとそれに必要になる機能
(無線LANWebカメラなど)の追加方法についてレポートする予定です。