■ホビーロボット部品の製造・販売 
  モータコントローラ、センサ、音声、画像、無線モジュールなど、
■ホビーロボット制作記事のページ (各種マイコン、PCとの接続事例)
■特殊メイク、特殊材料の販売 ※特殊メイクのコーナーはこちらに移りました。
Top(お知らせ) 製品一覧 使い方とサンプルプログラムWebショップ リンク ブログ 会社案内
 Easy Robotics for all enthusiastic people!!!  ---HOBBY ROBOT PARTS SHOP ASAKUSAGIKEN---   Since 2003...


ロボット神経システムとAndroid端末をWiFiでつないでみる
 

<概要>

 ここでは浅草ギ研製ロボット神経システムと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)変数に変換しています。





以上







(C)Copylight 2003. 有限会社浅草ギ研 | 通信販売の法規(訪問販売法第8条)に基づく通信販売業者の表示