<概要>
ここではArduinoをWiMaster経由でAndroid端末につないでみます。
<注意>
ここでご紹介するプログラムはあくまでもサンプルプログラムとなります。個別のご質問などにはお答えできませんのでご了承下さい。
機種やOSのバージョン違いや環境の違いなどにより動作しない可能性もあります。また、今後のOSバージョンアップなどに対しての動作も定かではありません。
<ブロック図>
Arduinoからは一定周期でセンサー読み取り値(8bit値)が送信されつづけます。マイコンボードが0x01を受信するとLEDを点灯、0x00で消灯します。
<接続図>
Arduino側接続詳細
■シリアル通信部
それぞれ、TXをRXへ、RXをTXへつなぎます。今回、Arduino側のシリアルポートはハードウェアシリアルポートを使いました。
■LED
LEDはアノードを13番端子、カソードを電流制限抵抗経由でGNDにつないでいますので、13をHiにするとLEDが点灯し、Loにすると消灯します。
■センサー
今回はセンサーダミーとしてスライドボリュームをつけてみました。電圧変化型のセンサーなら同じように値を読み取ることができます。
<Arduino側プログラム説明>
開発環境はArduinoIDE-1.0.5を使いました。
送信、受信、両方のデモを行うため、センサー値を送信し、受信した値によりLEDを点灯させるプログラムを作りました。
const int LED=13;
int rsvData = 0;
int sensorVal = 0;
void setup()
{
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop()
{
// 受信処理
if(Serial.available() > 0){
rsvData = Serial.read();
if(rsvData == 1){
digitalWrite(LED, HIGH);
}else if(rsvData == 0){
digitalWrite(LED, LOW);
}
}
//センサー読み取り〜送信
sensorVal = analogRead(0);
Serial.write(sensorVal);
//ウェイト delay(100);
}
■setup
WiMasterの通信速度は標準で9600bpsなので、シリアルを9600bpsに設定しています。また、13番ポートをLEDに割り当てて出力設定にしています。
■受信
Serial.available( )で受信しているか調べて、1バイト以上受信していたらrsvData変数に入れます。それを確認して1ならLEDポートをHigh(LEDが点灯)、0ならLow(LEDが消灯)にしています。
■センサー読み取り〜送信
analogRead関数で読み取った値をSerial.Writeで送信しているだけです。次のウェイト関数で100mS待ちますので、100mS間隔でセンサーデータが送られることになります。
<Android側プログラム説明>
ここでは、Android端末とWiMasterはすでにアソシエーションまで済んでいるとします。この操作についてはWiMasterの説明ページの<動作説明>の部分を参照願います。
通信はSocket通信で行います。
Androidndの場合、Socketクラスがあるのでこれを使います。
Eclipse上で作成したAndroidのJavaアプリを圧縮したものがこちらになります。
WiMaster_test_Android4.zip
画面イメージ
画面レイアウトはXMLで記述しています。詳細はソースを参照願います。センサーデータは一番上に表示され、「LED ON」ボタンを押すと0x01が送信、「LED
OFF」ボタンを押すと0x00が送信されます。
■画面部
起動時に画面を構成しているところが次の部分です。
■Socket開通部
次に今回のポイントである、ソケット通信の部分を説明します。
画面が表示されるとき(onResume)にソケットを開き、画面が閉じたらソケットを閉じています。ソケットを開く部分は別スレッドで実行します。実際の接続処理はconnectメソッドで行っています。
connectメソッドの中身はこのようになっています。
Socketクラスのインスタンスsocketにsocket=new Socket(ip,port);でソケットを開いています。ipはString型で、WiMaster購入時についてくる紙に書かれたIPを指定します。"0.0.0.0"のように指定します。portも購入時の紙に書いてあるポート番号を指定します。
その後、ソケット開通をisConnected()で確認し、受信ループを作っています。この受信ループは、先のonResume内で別スレッドで構成されていますので、メインスレッドとは別にこのループが動きます。受信ループ内では、ループ毎に受信バッファから読み込み、読み込みバイト数が0以下でなかったら(なにか受信されてたら)データをイベントハンドラに渡します。このとき、何のイベントかを識別するためにWiFiComWhat定数をセットしています。
■受信
イベントハンドラ部では、来たイベントがWiFiComWhatであったら、画面に表示させています。画面表示部はchkRcvData(
)で処理させています。
chkRcvData( )では、来たデータの先頭1バイトを符号なしintに変換し、TextViewのインスタンスであるsensorTextに表示させています。
■送信
ボタンを押してデータを送る部分を説明します。
まず、ボタンを押すと、ボタンクリックのイベントが動きます。
それぞれのボタンを識別して0x01か0x00を送っています。
送信は、byte[]配列を、outputStreamのインスタンスoutに、writeメソッドを使って渡しているだけです。これでデータが送信されます。
iPhoneでも同じようにソケット通信で、同じハードウェアを動かすことができます。WiMasterのページのサンプルプログラムの節、他のデバイスでの例を掲載しています。
以上
|