<概要>
ここでは浅草ギ研製ロボット神経システムとWiMaster経由でAndrois端末につないでみます。
ロボット神経システムは浅草ギ研で製造販売しているサーボコントローラやセンサー入力ボード群で、1つのシリアル通信経路にいろいろな機能を数珠(じゅず)つなぎにでき、沢山の機能を組み合わせたり、自由に拡張したりするもので、自作ロボットの作成などに向いています。
Eclipse上で作成したAndroidのJavaアプリを圧縮したものがこちらになります。
WiMaster_testApp.zip
紹介動画
<ブロック図>
<接続図>
<プログラム説明>
ここでは、Android端末とWiMasterはすでにアソシエーションまで済んでいるとします。この操作についてはWiMasterの説明ページの<動作説明>の部分を参照願います。
通信はSocket通信で行います。
Androidndの場合、Socketクラスがあるのでこれを使います。
このページの冒頭に、Javaのプロジェクトファイルがあるのでダウンロードして解答してください。
画面イメージ
まず、起動時処理として、画面UIとタイマーを設定します。TextViewにセンサー値を表示させます。SeekBarでつまみを動かすとサーボが連動して動きます。タイマーはセンサーボード(AGB65-ADC)に対して周期的にセンサー読み取りコマンドを送るのに使います。
センサー表示はstatusText、シークバーはseekBar1、タイマーはtimerになり、起動時のonCreate内で設定しています。
画面が表示されるとき(onResume)にソケットを開き、画面が閉じたらソケットを閉じています。ソケットを開く部分は別スレッドで実行します。実際の接続処理はconnectメソッドで行っています。
connectメソッドの中身はこのようになっています。行109でソケットを開き、受信処理は行121〜129のループで行います。受信は、何か受信するたびにハンドラへバイト配列を渡しています。ハンドラの受信処理については後ほど説明します。soketから、受信用にinputstreamのin、送信用にoutputstreamのoutを生成しています。
Socketが開通したら送信は簡単で、outputstreamに対してwriteメソッドでバイト配列を渡し、flushメソッドで送信します。
シークバーの値が変化したときに、このようにしてサーボ位置を指定するコマンド(バイト列)を送信すると、AGB65-RSC2が反応して指定したサーボの位置を制御します。
シークバーとの連携や、RSC2に送るコマンドフォーマットについてはここでは詳しく説明しませんのでソースを参照願います。
センサーの値を読み取るには、まずセンサー読み取りコマンドを送る必要があります。周期的にセンサー値をアップデートしたいので、Timerを使って100mS置きに読み取るようにしました。
onCreateでタイマーを生成し、100mSごとにイベントが発生するようになっています。イベントが発生すると行52のtimerIntervalメソッドが呼び出されます。
255,120,1,1を送ると、ID=120に設定(デフォルト)されたAGB65-ADCが、16ポートある全ポートの電圧を読み取り、8bit値で返信します。返信フォーマットは
[255][ID(120-127)][バイト長(17)][命令(1)][P1結果][P2結果]...[P16結果]
のようになります。
AGB65-ADCから返信データが来ると、ハンドラにそのバイト列が渡されます。
WiFiComWhatは、行128でバイトデータを渡すときに、どのイベントからの通知なのかを知らせるものでintの定数(プログラムの先頭の方で定義してる)になっています。
handlerはイベントが来ると、何のイベントかを判断し、WiFiComWhatならデータを受け取ります。行225が受け取る部分で、dataに格納しています。行226〜231はデバック表示させているので、LogCatを立ち上げているとデータ受信毎にデータが見れます。
Javaの場合、8ビット長の符号なし変数、というものが無いので、受信したデータは符号付として扱われます。たとえば、AGB65のコマンドの先頭にはシンクロバイトの「255」が送られますが、Javaで受信すると符号付きなので「−1」と解釈されます。センサー値は0が一番低く、255が一番高い、という結果出力になりますのでこのままでは問題があります。ということで、この部分の変換や、センサー値だけを抜いて表示させる部分が次のようになります。
sensorValueは結果の8ビット値を、全16ポート分格納する変数です。行247でヘッダの2バイトを照合し、AGB65-ADC(ID=120)からの返信だった場合は、行250でヘッダ4バイトを除いて結果をsensorValueに格納します。
表示は行253〜254で行っています。先に説明したように受信データそのままでは符号付で表示されてしまうのでconvByteToIntというメソッドをつくり、符号なしにした上でint(32bit)変数に変換しています。
以上
|