11.セマフォとミューテックス TOPへ

12.Bluetooth通信


NXTの特徴として、Bluetooth通信があります。 Bluetooth通信とは短距離無線通信技術の一つであり、また無線通信の規格の一つです。 このBluetooth通信は などの特徴を持ち、現在でも携帯電話などの様々な携帯端末に用いられているものである。
このBluetoothには様々なヴァージョンや規格があり、NXTのBluetoothはVer.2.0であり高速化機能に対応しています。 また、Bluetoothのクラス(通信距離・電波強度を定める規格)はClass2で通信距離は10mまでは保障されています。 実際に通信する場合では障害物の有無にも依りますが、40〜50m程度まで通信可能です。
ここではそのBluetooth通信とNXT同士でBluetooth通信を行うプログラムについて学習します。


1.Bluetoothの接続

まずは、NXT同士をBluetooth通信で接続しましょう。接続はこのページを参照してください。 ここではPort2に接続したものとして説明します。
接続が確認されたら、プログラムの学習を行います。


2.Bluetoothの送信プログラム

まず最初にマスターからスレーブへ数字の1から10までを1秒おきに送信するプログラムを作成します。
次のプログラムを作成してください。ここでは bluetooth1.c とします。 但し、このプログラムはマスター側のNXTへダウンロードしてください。
bluetooth1.c
#include "nxtlib.h"

task main(){
	int i;

	CheckBT(SLAVE2);
	for(i=1;i<=10;i++){
		SendBTMsg(SLAVE2, i);
		nxtDisplayCenteredTextLine(2,"Sending %2d",i);
		wait1Msec(1000);

		if(i >= 10) i = 0;
	}
}

今回新たに用いたAPIなどについて解説します。

CheckBT(SLAVE2)
指定されたポートとの接続を確認するAPIです。
引数には接続したポートを指定します。 マスターの場合はMASTER、スレーブの場合はSLAVEの後ろにポート番号を付けます。 今回はSLAVE2としたため、スレーブの2番ポートの接続を確認します。
この関数は nxtlib.h に記述されています。

SendBTMsg(SLAVE2, i)
指定されたポートにデータを送信するAPIです。
第1引数には送信するポートを指定します。指定方法はCheckBTと同じです。
第2引数には送信するデータを指定します。送信可能なデータ型はint型です。 ただし、-58151はポートの接続確認に用いるため送信できません。
この関数は nxtlib.h に記述されています。

このようにして、送信プログラムを記述します。 CheckBT関数は必ず記述しなければならない関数ではありませんが、念のために送信前に記述しておく方が良いでしょう。


3.Bluetoothの受信プログラム

上記の送信プログラムに対応した受信プログラムを作成します。ここでは受信したデータを画面に表示するプログラムを作成します。
次のプログラムを作成してください。ここでは bluetooth2.c とします。
bluetooth2.c
#include "nxtlib.h"

task main(){
	int data=0;

	while(true){
		data = RecieveBTMsg();
		nxtDisplayCenteredTextLine(3,"Recieve %2d",data);
		wait1Msec(100);
	}
}

このプログラムと上記のプログラムを動かしてみてください。 マスター側のLCDに表示されている数字とスレーブ側で表示されている数字が等しく、またほぼ同じタイミングで変わるのが分かると思います。
つまり、2台のNXT間で通信が行われていることが確認されたのです。

それでは今回新たに用いたAPIなどについて解説します。

data = RecieveBTMsg()
Bluetooth通信のデータを受信し、それを返す関数です。引数は必要なく、戻り値はint型となっています。
データが受信されるまで待機する動作を行うため、値が返ってきたときに処理が終了します。
この関数はnxtlib.hに記述されています。

このようにして、Bluetooth通信を用いたプログラムを行うことができます。
NXTのBluetooth通信では、スレーブ<->マスター間の通信のみで、スレーブ同士での通信を行うことはできません。


4.課題

マスターからスレーブへの通信とスレーブからマスターへの通信を1秒ごとに切り替えるプログラムを作成しなさい。 この時、マスターからの通信なのかスレーブからの通信なのかを区別できるような工夫をしなさい。

【注意】
この課題だけでなく、Bluetooth通信を双方向(マスター⇔スレーブ)で行う場合には、 『初めに受信する側のプログラムを先に起動させる』必要があります。
これを行わないとBluetoothが受信動作で止まってしまう可能性があります。
また、プログラムを中断した後に再開させた場合においても同様に止まる可能性があります。

但し、これは双方向通信を行う場合のみで、片方向通信(マスター⇒スレーブ、スレーブ⇒マスター)の場合は、どちらから起動しても基本的に受信動作で止まってしまうことはありません。 また、プログラムの中断を行っても片方向通信の場合は止まることはありません。

【対処法】
上記のようにBluetoothの送受信動作が止まってしまった場合には、送受信双方のNXTの電源を一旦切ります。 そして再度電源を入れてBluetoothの接続を行ってからプログラムを動かしましょう。
プログラムの開発では、構文エラーかBluetoothによるものなのかを判断するために、送信の前後にデバッグ用の表示等をさせると良いでしょう。




11.セマフォとミューテックス TOPへ