FrontPage
12/8 Arduino と Android の接続 ... ADK †
ADK の概要 †
- ADK ...Accessory Development Kit
- ADK はAndroid のアクセサリを作成するための、参考的な実装です。これは、ハードウェア会社や電子工作を趣味としている人々のスタートポイントとして利用できます。各ADKのリリースは、ソースコードとハードウェアの仕様が一緒に供給されます。これにより、あなた自身のアクセサリを簡単に作ることができます。新しい、これと異なるADKのハードウェアを作ることを推奨します。
Android の機能を強化するため、オーディオのドッキングステーションや、運動機器や、個人的な医療検査機器や、電子百葉箱や、その他の外部ハードウェア機器などがAndroid アクセサリとして使えます。
アクセサリは、Android Open Accessory (AOA)プロトコルを使って、USB ケーブルやBluetooth 接続を通じて、Android デバイスと通信します。もし、USB を使うアクセサリを作成する場合、あなたのアクセサリハードウェアとAndroid が通信するために、どのようにAOAプロトコルを実装するか、理解する必要があります。より詳しくは、 Android Open Accessory protocol をみてください。
- 参考ページ/文献
簡単なADK応用プログラムの開発例 †
ADK 開発環境の構築 †
1. Arduino (1.0 以上)の開発環境をインストール †
2. ADK パッケージのダウンロード †
3. Arduino の例題プログラムやライブラリやハードウェアの仕様が入ったパッケージをダウンロードして、解凍 †
- app, arduino_libs, hardware ディレクトリがある。
4. Arduino開発環境にADKライブラリのインストール †
- arduino_libs/AndroidAccessory? と arduino_libs/USB_Host_Shield directories を <arduino_installation_root>/libraries/にディレクトリごと、すべてコピー。
5. Arduino のスケッチ(firmware)を作成し、Arduinoに書き込み †
- 以下、ADKの firmware の簡単なスケッチの例(今後、ずっとこれを使います)
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>
/*
data format
pin
A0-A7 ... analog input
4-7 ... digital input
8-11 ... digital/analog(pwm) output
receive
[
'a' or 'd'
pin,
data,
]
send
[
4 (=data_length(byte)),
'a'
port,
data(high),
data(low)
]
or
[
4 (=data_length(byte)),
'd'
data (pin 0-7)
data (0x00)
data (0x00)
]
*/
#define analogInMax 8
#define digitalInMax 8
#define digitalOutMax 14
int analogIns[analogInMax];
int digitalIns[digitalInMax];
int digitalOuts[digitalOutMax];
int digitalVal;
AndroidAccessory acc("Google, Inc.",
"AdkTwitter",
"DemoKit Arduino Board",
"1.0",
"http://www.android.com",
"0000000012345678");
void setup();
void loop();
void setup()
{
Serial.begin(115200);
Serial.print("\r\nStart");
for(int i=0;i<digitalInMax;i++) digitalIns[i]=i;
for(int i=0;i<digitalOutMax;i++) digitalOuts[i]=i;
for(int i=0;i<digitalInMax;i++)
pinMode(digitalIns[i],INPUT);
for(int i=digitalInMax;i<digitalOutMax;i++)
pinMode(digitalOuts[i],OUTPUT);
// pinMode(ledPin, OUTPUT);
// pinMode(b3Pin, INPUT);
analogIns[0]=A0;
analogIns[1]=A1;
analogIns[2]=A2;
analogIns[3]=A3;
analogIns[4]=A4;
analogIns[5]=A5;
analogIns[6]=A6;
analogIns[7]=A7;
acc.powerOn();
}
void loop()
{
byte inMsg[3];
byte outMsg[4];
if (acc.isConnected()) {
int len = acc.read(inMsg, sizeof(inMsg), 1);
int i;
byte b;
if(len>0){
if(inMsg[0]=='a'){
if(inMsg[1]<digitalOutMax)
analogWrite(digitalOuts[inMsg[1]], inMsg[2]);
}
else
if(inMsg[0]=='d'){
if(inMsg[1]<digitalOutMax){
if(inMsg[2]==1)
digitalWrite(digitalOuts[inMsg[1]], HIGH);
else
digitalWrite(digitalOuts[inMsg[1]], LOW);
}
}
}
digitalVal=0;
for(int i=0;i<digitalInMax;i++){
int b=0;
if(digitalRead(digitalIns[i])==HIGH)
b=1;
digitalVal=digitalVal<<1 | b;
}
outMsg[0]='d';
outMsg[1]=digitalVal & 0xff;
outMsg[2]=0;
outMsg[3]=0;
acc.write(outMsg,4);
int sensorValue;
for(int i=0;i<analogInMax;i++){
sensorValue = analogRead(analogIns[i]);
outMsg[0]='a';
outMsg[1]=i;
outMsg[2]=(sensorValue>>8) & 0xff;
outMsg[3]=sensorValue & 0xff;
acc.write(outMsg,4);
}
}
delay(100);
}
6. Android 側開発環境構築 †
- Eclipse の Android SDK マネージャ のアイコンをクリックして起動し、Android 4.0 ( Google APIs 14 を含む) をインストールします。
7. Android 側アプリ開発 †
- Eclipse の上で、UsbAccessory? などを使ったAndroid のプロジェクトを作成します。既存の、ソースが公開されているプロジェクトをダウンロードして、それを書き換えることで、開発が比較的楽にできます。ここでは、 https://github.com/takashiyamanoue/AdkArduino01 のページから、ZIP に固められたプロジェクトをダウンロードして利用することにします。
- ダウンロードした AdkArduino01-master.zip を解凍します。解凍するとAdkArduino01-master ディレクトリの中に AdkArduino01 ディレクトリが入っています。
- Eclipse を起動し、[File]->[New]->[Other] を選びます。
- Android Project from Existing Code をクリックし、[Next]ボタンをクリックします。
- 解凍したディレクトリ内にある AdkArduino01 ディレクトリを選んで、[Finish]をクリックし、Eclipse にダウンロードしたプロジェクトを読み込みます。
- Eclipse の Package Explorer に org.yamalab.android.AdkArduino01.AdkArdinoLaunch? が現れます。この段階では、エラーがあることを示す赤い四角内に白いバツ印のアイコンが表示されています。
- 読み込んだプロジェクトの properties の android の項目で Google APIs, Platform 4.0, API Level 14 を選びます(講習会で使う ICONIA TAB の場合)。このAPI を選ぶことにより、ADK で利用するUSB アクセサリなどが利用できるようになります。これでエラーが消えます。
- 読み込んだプロジェクトのソースコードを書き換えます。
- AdkArduinoActivity?.java の
boolean emulatorDebug= ... ;
の行が
boolean emulatorDebug= false ;
であった場合、これを
boolean emulatorDebug= true ;
に書き換えます。このプロジェクトの場合、emulatorDebug を true にすることにより、Arduino との通信を行わないようにしてGUI のデバッグなどが行えるようになります。
8. Eclipse 上のデバッグ †
- Eclipse のデバッグ機能、 LogCat?、Emulator を使ってデバッグします。
9. パッケージの生成、実機へのインストール、実機でのデバッグ †
9. Android 端末と Arduino をUSBケーブルで接続。 †
10. 実行。 †
ADK利用の流れ †
- 1. BroadcastReceiver? を利用して、ACTION_USB_PERMISSION を判定する。
- 2. UsbAccessory?のインスタンスを取得する。
- 3. UsbAccessory?のインスタンスよりParcelFileDescriptor?を取得する。
- 4. ParcelFileDescriptor?よりFileDescriptor?を取得し、FileInputStream?とFileOutputStream?を取得する
- 5. 各Streamを利用し、入出力の処理を行う。
Arduino の光センサの状態をAndroid に表示、Android でArduino のLEDを点滅 †
デバッグ †
- LogcatViewer? [#z89dd6d3]
Android で、LED 点灯自動制御 †
総合演習 †
- 隣どおし、または前後で2-4人のグループを作って、今までのプログラムを参考にしたり、改造したりして、何か面白いものを作ってください。
Counter: 2313,
today: 1,
yesterday: 0