12/8
プログラムの内容 †
- Arduino の光センサの状態をAndroid に表示、Android でArduino のLEDを点滅
使い方 †
- Arduino とAndroid 端末を USB ケーブルで接続し、Android 端末でこのアプリケーションを起動します。
起動すると、最初、Android ロボットが寝た絵が表示された後、以下のような表示が出ます。
- 表示画面上部の [In], [Out] タブで入出力表示を切り替えます。起動した直後は入力データを表示しています。
- 入力表示のとき、
- a0 ... a7 の下の数字がArduino のアナログ入力ポートの A0 ... A7 の値を示します。
- Digital Input: の右に並ぶ8つの数字(0 から 7) の背景の色が Arduino のポート 0 ... 7 に入力されたディジタル値を表します。白だったら0で 水色だったら1を表します。
- 出力表示のとき、以下のような画面になります。
- Arduino の 8 から 13 までの 6 のポートへの出力を制御し、表示します。
- pin8 - pin13 の右が現在の出力を表します。
- 各 pin のラジオボタンでデジタル出力か、アナログ出力の選択を行います。
- デジタル出力の場合 [on] をタッチすると、その pin に 約5Vが出力されます。[0ff]をタッチすると、そのpinに約0V が出力されます。
- アナログ出力の場合、スライドバーの位置で、PWM の比率を 0-255 階調で指定します。
- [Stop] タブを選ぶと、プログラムを終了します。ただし、再起動するとき、Android の設定画面でこのアプリケーションを強制終了しないと、再起動しないことがあります。
ADK利用の流れ †
- 1. BroadcastReceiver? を利用して、ACTION_USB_PERMISSION を判定する。
- 2. UsbAccessory?のインスタンスを取得する。
- 3. UsbAccessory?のインスタンスよりParcelFileDescriptor?を取得する。
- 4. ParcelFileDescriptor?よりFileDescriptor?を取得し、FileInputStream?とFileOutputStream?を取得する
- 5. 各Streamを利用し、入出力の処理を行う。
Manifest の内容 †
AdkArduinoActivity?.java †
- 本アプリケーションの GUI を担当しているクラスのソースです。UsbAccessory? の起動なども行います。
- このActivity の起動時に onCreate(), onStart() と共に, onResume() がシステム側から起動されます。
- onResume() 内で prepareUsbConnection?() が呼び出され、prepareUsbConnection?() 内で mUsbManager? を作成します。
- また、prepareUsbConnection?() では、Usb が接続されたときに、それを認識する準備を行います。この準備により、Usbが接続されたとき、以下の部分によってそれが受信され、Usb との接続が行われます。
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent){
Log.i(TAG, "BroadcastReceiver-onRecieve");
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
Log.i(TAG, "BroadcastReceiver-onRecieve- ACTION_USB_PERMISSION");
synchronized (this) {
UsbAccessory accessory = UsbManager.getAccessory(intent);
if (intent.getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
openAccessory(accessory);
startService();
doBindService();
} else {
Log.d(TAG, "permission denied for accessory "
+ accessory);
}
mPermissionRequestPending = false;
}
} else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
Log.i(TAG, "BroadcastReceiver-onRecieve- ACTION_USB_ACCESSORY_DETACHED");
UsbAccessory accessory = UsbManager.getAccessory(intent);
if (accessory != null && accessory.equals(mAccessory)) {
closeAccessory();
}
}
}
};
- openAccessory(accessory); で 入出力ストリームが作成され、startService(); で AdkService? を起動します。
- AdkService? が ADK を使って、Arduino との情報交換を行います。
- doBindService?(); は、AdkArduinoActivity? と AdkService? を結びつけ、この間の情報交換を可能にします。
- AdkArduinoActivity? と AdkService? の間の情報交換は、Handlerを使って行います。
AdkService?.java †
AdkThread?.java †
Arduino-Android(AdkService?, AdkThread?)間通信 †
- Arduino から Android へは、以下の4バイトのデータを連続して送ります。
- 最初の 1 バイト目 : 'a' または 'd' ... アナログデータかデジタルデータを表す。
- アナログデータの場合の 2,3,4 バイト目の内容
- 2 バイト目: アナログポート番号
- 3 ,4 バイト目: 3バイト目の内容 << 8 | 4 バイト目の内容 が、そのポートのアナログ値を表す。
- デジタルデータの場合の 2,3,4 バイト目の内容
- 2 バイト目: Arduino の 0-7 ポート の内容をこの順番で並べた値。
- 3,4 バイト目: 未使用
- Android から Arduino へデータを送るときは、以下の 3 バイトを送ります。
- 1 バイト目: 'a' または 'd' ... アナログデータかデジタルデータを表す。
- 2 バイト目: Arduino のポート番号(8 - 13)
- 3 バイト目: 値。デジタル値の場合は 0 か 1。アナログ値の場合は 0 - 255。
AdkService?-AdkArduinoActivity?間通信 †
ArduinoProcess?.java †
Counter: 2408,
today: 1,
yesterday: 0