はじめに
このページでは、AGB65−ANDROIDとAGB65-ADC及びセンサーを使い、スマートフォンからRCサーボを動かすプログラムの作り方を説明します。前回はアクセサリへの送信でしたが、今回は受信もおこないます。
※以下の情報は2012年7月現在のものです。ご注意ください。
AGB65-ANDROIDについてはこちらを参照願います。
スマートフォンとの通信部分は「スマートフォンとの接続」を参照願います。
前に作ったアプリと今回のアプリを1つのスマホに混在させるとエラーが起きますので、前に作ったAGB65-ANDROIDのアプリがインストールされている場合は、「設定」−>「アプリ」からアプリを選択し、「アンインストール」しておいてください。
サンプルプログラム
サンプルプログラムはこちらになります。
サンプルプログラムのダウンロード
ダウンロードしたファイルを解凍〜スマートフォンへ書き込み、まではスマートフォンと接続のページを参照願います。
スマートフォンにプログラムを書き込んだら、AGB65-ANDROIDに電源を入れ、スマートフォンをUSB接続します。
今回はスマホに付属していたAC充電用ACアダプタを電源にしています。電源についてはバッテリ駆動などもできます。詳しくはAGB65-ANDROIDの紹介ページを参照してください。
センサーは、AGB65-ADCの#1-3に3種類のセンサーをつけています。浅草ギ研で販売している電圧出力方式のセンサーは、浅草ギ研から専用コネクタケーブル(写真のツイスト線)が販売されていますので、ハンダ付けなしで接続できます。
アクセサリを認識すると、次の画面が出ます。
OKを押すと接続となります。尚、この時、「このUSB...」の横のチェックボックスにチェックを入れると、次回からはこのウィンドウは出ずに自動的にアプリが立ち上がります。
アプリの画面です。灰色のところで Device connedted と出ているのがわかりますでしょうか。接続時にはこのような表示を出しています。画面左上のステータス表示のところにUSBマークが出て、ハード的にUSB接続されていることも表示されます。
SensorReadボタンを押すと、#1-4のセンサー値が表示されます。
#4はなにもセンサーをつけていないので、値は不定となり読み込むたびに変わります。
3番目に表示されているのは感圧センサの値ですが、無負荷では電圧の半分の値が出ますので”127”が表示されます。 感圧センサーを押してSensorReadを押すと、この値が下がります。浅草ギ研ではセンサーを豊富にラインナップしています。また、電圧出力方式のセンサーなら、この構成で読み取ることができます。
ケーブルを外すとタイトルには Device not connected と表示されます。
プロジェクトの構成
プロジェクトはこのような構成になっています。ファイルは6つ。
−ソースファイル−
AGB65_ANDROID_sample3Activiti.java : アクティビティのソース
AccessoryManager.java : アクセサリとの通信関連のソース。UsbAccessoryライブラリを使用。
−アクセサリフィルタ−
accessory_filter.xml : 接続するアクセサリの情報を設定します。
−マニフェスト−
AndroidManifest.xml : ライブラリの使用の指定、USBが検知されたときに通知されるインテントの設定、など。
−画面定義ファイル−
main.xml :画面を定義するxmlファイル
−文字列定義ファイル−
strings.xml :ボタンの文字などを定義するファイル
AndroidManifest.xml / accessory_filter.xml
/ AccessoryManager.java の3つはUSB接続に関するファイルです。これらについてはスマートフォンと接続のページを参照願います。
画面の構成
以下、画面構成の main.xml の中身です。画面構成については前のページでも簡単に説明していますのでここでは簡単に、
まずはボタン部分。
結果はとりあえず4センサー分表示させることにします。表示はTextViewのtextプロパティをプログラム中で変更します。
ボタンのテキストと、結果のデフォルト表示はstring.xmlで定義しています。
アクティビティ
アクティビティを説明します。
今回はボタンとTextViewを配置しますので、onCreateイベント(アプリ起動時のイベント)でButtonとTextViewを生成します。それぞれmain.xmlのIDに対応させています。行35で「ボタンがクリックされたときのイベント」を登録しています。
次に、行番号は飛びますが、命令送信の部分を説明します。
まず、ボタンを押すと、イベントリスナーの部分が動きます。行174のView v で、押されたView(コンポーネントのようなもの)を情報を
vに代入します。行182の getID() で、押されたViewのIDを取り出します。このIDはmain.xmlで設定したIDです。今回、ボタンのIDは button4
になってますので、それを一応確認してから、行184でデータを送信しています。sensorReadAll()については次を参照願います。
命令送信については前のページでも説明したとおり、単純にバイト配列を引数としてwriteメソッドを実行するだけです。行166の部分です。
行161〜165はAGB65-ADCの仕様に沿ったデータパケットを作っています。このパケットで、「全ポート読み取り」命令になり、16ポート全ての値が8ビット値で返されます。
この命令がAGB65-ANDROIDを経由してAGB65-ADCに送られます。返信は次のようなパケット構造になります。
[255] [ID(120-127)] [バイト長(17)] [命令(1)] [P1結果] [P2結果] ... [P16結果]
返信データは、AccessoryManagerを通して、このアクティビティのハンドラに帰ってきます。
ここで1つポイントですが、JAVAはbyteサイズ、つまり8bitサイズの変数は符号なしがありません。基本的には32bit符号あり、のデータ構造で扱うようです。マイコンでCな私にはここがかなりつまずきました。JAVAの仕様には載ってますけどJAVA仕様までは確認してなかった。
AGB65-ADCからの返信は 0xFF つまり10進数で255が先頭になりますが、これをそのままハンドラで受けると、符号あり数で判定されるので
−1 になります。128以上の数は全部マイナスになります。
8ビットの電文のやりとりだと、これだと扱いづらいので、とりあえず「符号あり8ビット」をJAVAの普通のint(符号あり32ビット)に変えるメソッドを作りました。
このような書き方が一般的かどうかわかりませんが、とりあえずこれで 255 は 255 と認識されます。
さて、肝心のハンドラの部分です。
このアクティビティはonCreateのときにAccessoryManagerを実体化しています。このとき、AccessoryManagerからのメッセージだよと認識させるためにint型の”定数” USBAccessoryWhat を渡しています。
上の行29のところです。
ハンドラは、別なスレッド(プログラム?)からのメッセージを受け取るものです。割り込みベクターのような感じです。
通信は別のプログラム AccessoryManager.java でハンドリングします。
AccessoryManageからの通信イベントは3つあります。
READ : アクセサリから通信を受信したとき
READY : USBが物理的に接続されたとき
DISCONNECTED : USBが物理的に切断されたとき
AccessoryManagerではこれらのイベントが発生すると、定数USBAccessoryWhatと、イベントの種類をハンドラに送ります。今回、センサーからのデータを受信しますので、READの時にそのデータを受け取るプログラムを書きます。それが下の赤四角のところです。
110〜112では、データを読み込む前に、AccessoryManagerが接続されているかを再確認しています。ここで接続されていなかった場合はそのままイベントは終了します。
行114では、availableメソッドで、現在受信バッファの中にあるデータ数をチェックし、0でないかを確認しています。そして次の行で、データ数分の格納用配列を作っています。(今気が付きましたが、行114と行115で2回available()を実行するのは無駄ですね。)
行116で、格納用配列dに受信データを入れています。
このままだと、先にも説明しましたとおり、符号あり数になっているので、先頭の255は−1と表現されてしまいます。電文だとこれでは扱いづらいので、行119〜121で 8ビット符号あり−>32ビット符号あり に変換しています。(コメントでは符号なしINT(32ビット)と書いてありますが、符号ありです。すいません。)
行125で、先頭の3バイトを判定して、AGB65−ADCからの返信かどうか一応チェックしています。AGB65シリーズの場合はMP3再生や、DCモータ駆動など、いろいろな機能をもったモジュールがありますが、帰ってくる電文形式は同じで、モジュールID(2バイト目)を確認して、なんのモジュールからの返信かを判別することができます。
行126,127で、センサーデータ格納用配列sdを作り、結果をコピーしています。
行129〜132で、先頭4つ分のセンサーデータをTextViewに表示させています。
さいごに
現在、自作ロボの頭脳部分がAndroidスマートフォンな二足歩行ロボを作っています。これにセンサーを組み込んで自律動作などが可能になるのではと考えています。
このロボットで2012.7.15のわんだほーろぼっとかーにばるに参加予定です。わんだほーは、非常にゆるーい二足歩行ロボット大会で、作ったばかりのロボットを実験してみるには最適です。
また、このような移動ロボットではなく、今回の実験で使ったようにスマホのACアダプタを使用して、定位置でログを取りクラウドにデータを上げるセンサーシステムなどができるかもしれません。
次は音声認識でサーボを動かしてみます。
2012年7月6日
|