はじめに
このページでは、AGB65−ANDROIDとUSB接続するためのJAVAプログラムの作り方を説明します。
※以下の情報は2012年6月現在のものです。ご注意ください。
AGB65-ANDROIDについてはこちらを参照願います。
ここではとりあえず、AGB65-ANDROIDの接続だけを行ってみます。接続するだけでもいろいろとやることがあります。実際のデータの送受信については次のページで説明しています。
サンプルプログラム
サンプルプログラムはこちらになります。
サンプルプログラムのダウンロード
1)ダウンロードしたファイルを解凍し、Eclipseのワークフォルダ(通常は マイドキュメント\Eclipse\Workspace
)にコピーします。
2)Eclipse上で、 File->Import を開き、Generalの中にある Existin Projects into
Workspace を選択してNextボタンを押します。
3)次の画面で、Select root directry の Browse... ボタンを押し、解凍したフォルダを指定して Finish
ボタンを押します。
4)EclipseのPackageExplolerを見ると、プロジェクトが追加されたのがわかります。
5) このプロジェクトを選択した状態で、スマートフォンとPCをUSBケーブルで接続し、転送ボタンを押します。
6)RunAsのウィンドウが開くので、Android Aplication を選択してOKボタンを押します。
7)USB接続しているスマートフォンのリストが出るので、選択してOKボタンを押します。
8)スマートフォンにサンプルプログラムが転送されました。
9)AGB65-ANDROIDに電源を入れ、スマートフォンをUSB接続します。
この例では、AGB65-USBに、スマートフォンのACアダプタをさして電源を供給しています。
アクセサリを認識すると、次の画面が出ます。
OKを押すと接続となります。尚、この時、「このUSB...」の横のチェックボックスにチェックを入れると、次回からはこのウィンドウは出ずに自動的にアプリが立ち上がります。
アプリの画面です。灰色のところで Device connedted と出ているのがわかりますでしょうか。接続時にはこのような表示を出しています。画面左上のステータス表示のところにUSBマークが出て、ハード的にUSB接続されていることも表示されます。詳しくは下で説明します。
ケーブルを外すと Device not connected と表示されます。
AGB65-ANDROIDの通信仕様、状態遷移
プログラムの説明の前に、USB接続する場合のやりとりの概要を説明します。
OSバージョンが2.3.4以上に含まれている ”UsbAccessory ライブラリ”と、 ”UsbManager ライブラリ”を使えば、アプリケーション上の簡単な記述でアクセサリと通信することができます。この詳しい内容についてはGoogleの
USB Accessoryのページに掲載されています。これによりUSBの接続検知やデータ通信などを行います。
このサンプルプログラムではその部分をまとめて AccessoryManager クラスを作りました。このクラスについては後で説明します。接続の検知や受信イベントの処理など、ハード的な作業はここで行います。
AGB65-ANDROIDの場合、さらにソフト的に接続と切断の状態を、Androidアプリ側から伝える必要があります。(下記の図の4)と5)の部分。)
Androidのアクティビティは次のような状態があります。この中でonResume onPause のときにUSBの接続と切断をしています。赤字の部分がアプリ側で行う作業です。
AGB65-ANDROID固有の特徴として、onResume()の時に0xFEを、onPause()の時に0xFDをアプリから送信する必要があります。つまり、Androidアプリ側からは先頭が0xFEか0xFDの電文は送信できませんのでご注意願います。
プロジェクトの構成
プロジェクトはこのような構成になっています。ファイルは4つ。
−ソースファイル−
AGB65_ANDROID_sample1Activiti.java : アクティビティのソース
AccessoryManager.java : アクセサリとの通信関連のソース。UsbAccessoryライブラリを使用。
−アクセサリフィルタ−
accessory_filter.xml : 接続するアクセサリの情報を設定します。
−マニフェスト−
AndroidManifest.xml : ライブラリの使用の指定、USBが検知されたときに通知されるインテントの設定、など。
その他に、普通は画面にボタンなどを配置する main.xml などが必要ですが、今回は接続するだけ、なので画面はほとんど変化しません。ということでその他のファイルはプロジェクトを生成したときのデフォルトのままになっています。
AndroidManifest.xml
USBアクセサリを使う場合は、マニフェストに次の赤線の部分を追加します。
@
USBが接続された時のインテントを受け取るように設定しています。 USBが接続されると、OSはUSB_ACCESSORY_ATTACHED を発信します。この設定をすると、このアプリケーションでそれを受け取れるようになります。
後の方でも説明しますが、本アプリではUSBの通信部分は AccessoryManager というクラスで管理しています。ここでブロードキャストレシーバ(OSから来る通知を受け取るような仕組み)を設定し、そこにこの
USB_ACCESSORY_ATTACHED がきたら、アプリケーション側も接続の準備をしています。
A
アクセサリの識別情報の設定ファイルを指定します。
B
UsbAccessoryライブラリの使用を宣言します。
accessory_filter.xml
アクセサリの識別情報を指定します。通常はxmlというフォルダを作ってその中に accessory_filter.xml というファイル名で作るようです。xmlフォルダは、プロジェクトを新規で作ったときにはデフォルトでは存在しませんので、resフォルダの下にxmlというフォルダを作る必要があります。
AGB65-ANDROIDの識別は
manufacturer="AsakusaGiken"
model="AGB65-ANDROID"
の2つになります。実際の記述は次のようになります。
注)プロジェクトを新規作成し、自分で作る場合は、このマニフェストやフィルタの設定を忘れがちですので注意して下さい。ビルドやプログラム転送はできますが、実行時にエラーで止まりますが、エラー処理をしていないとなぜとまったかわからなくなりますので、これらの設定を忘れないように注意してください。
AccessoryManagerクラス概要
USBアクセサリを管理するクラスです。使い方はアクティビティのところで説明します。細かい部分は説明しませんのでコメントを参照してください(この中身を理解していなくてもアプリは作れます。)。
使う上で重要なのは次の4つ。
enable() : USBの接続を行う。
write() : アクセサリにデータを送信する。
available() : 受信バッファにたまってる受信データ。
read() : バッファのデータを読む。
全体の構成は次のようになっています。
ActivityからのAccessoryManagerの使い方
AccessoryManagerを使って通信するのに、アクティビティでは下記の赤字の処理をする必要があります。
onCreate()
最後の行で、AccessoriManagerのインスタンスを生成してます。「インスタンスを生成」ですが、Cでマイコンな方にはわかりづらいと思いますが、「対象をメモリに展開」という感じです。
onResume()
onResumeは、アクティビティ(アプリの画面)が、画面に表示されたときに発生します。アプリが一番初めに立ち上がった後や、一度Homeボタンをおした後に戻ってきた、などのときにここが実装されます。
AccessoryManagerのインスタンスはaccessoryManagerという名前で作られておりますので、これをenableします。
onPause()
onPauseは、アクティビティ(アプリの画面)が、画面から消えたときに発生します。他のアプリを起動する、Homeボタンを押す、などのときにおきます。
まず、AGB65-ANDROIDの仕様で、ソフト的に切断したときに0xFDを送らなければいけないので、冒頭の3行で送ってます。
次に、現在がもし接続状態だったら、AGB65-ANDROID側の切断処理が十分終わるまで待ちます。
最後に、AccessoryManagerをdisableします。
ハンドラ
ハンドラは、Cでマイコンな方にはわかりづらいと思いますが、「割り込み」だと思ってください。
onCreateでAccessoryManagerのインスタンスを生成するときに、「USBAccessoryWhat」というint型の定数を渡してます。ハンドラにメッセージがきたときに(割り込みがきたときに)、これが識別子となり、AccessoryManagerからきたものだと認識します。
AccessoryManager側では、どういった状態か?のメッセージしか送っていません。状態はREAD、READY、DISCONNECTの3種類があります。
READY
アクセサリがUSBケーブルでハード的に接続された場合は、AccessoryManagerが検知してREADYを送ります。
AGB65-ANDROIDの仕様で、アプリ側が接続した場合は、0XFEをアクセサリに送信する必要があります。
READ
アクセサリからデータを受信した時に、READを送ります。
今回は送受信していませんのでなにもしていませんが、実際にはAccessoryManagerのreadメソッドを使って、受信したデータを読み取り、適当な処理をします。
DISCONNECT
USBケーブルがハード的に切断された場合は、DISCONNECTを送ります。
必要であれば、切断時の処理をします。今回はとくになにもしていませんが、タイトルの文字をconnectedからnot connectedに変えて、切断された状態を表す、ということをやってます。
その他についてはソース中のコメントを参照願います。
さいごに
ここでは、接続するまで、をご紹介しました。
次は送信について。スマートフォンからデータを送り、サーボコントローラ経由でRCサーボを駆動させてみます。
2012年6月30日
|