11.音を鳴らす
TOP

12.赤外線通信について

 この項ではRCX 間での赤外線通信の方法について説明していきます。RCX間で赤外線通信を用いて情報をやりとりすることで、複数のRCXでの協調動作を行わせることが可能となります。
 brickOSでは、独自の赤外線通信規格により、文字列を送信することも可能ですが、この項では純正ファームウェアとも通信可能なデータを一つづつ送るRCX間赤外線通信の利用方法について説明していきます。
ただし、brickOS では、char 型のデータ(すなわち1バイトデータ)を一つづつ送るのに対し、標準ファームウェアでは、データを整数型(すなわち2バイト)で送るため、brickOS / 標準ファームウェア間で赤外線通信を行う場合は、このことを考慮したプログラミングが必用となります。

1.信号送信

 まず最初に、文字『a』(ASCIIコード:97)と『b』(ASCIIコード:98)を3秒おきに交互に送信するプログラムを作成してみます。また、この後のプログラムで受信側では受け取った信号をLCDに表示させます。
ここでは作成ファイル名をirc_send.cとします。
作成したプログラムirc_send.c
#include<conio.h>
#include<unistd.h>
#include<lnp/lnp.h> //  link networking protocol function is inclued

tid_t t_stop;

int stop(){ // rcx stop function
        int stopchar;
        stopchar=getchar();
        if(stopchar==KEY_RUN){
                cputs("stop");
                killall(20);
        }
        return 0;
}

int main(int argc,char **argv){
        t_stop=execi(&stop,0,NULL,20,DEFAULT_STACK_SIZE);
        char sendmsg;
        cputs("send");
        while(1){
        	sendmsg='a'; // set message
        	send_msg(sendmsg); // send message
        	cputs("sn a");
        	sleep(3);
        	sendmsg='b'; // set message
        	send_msg(sendmsg); // send message
        	cputs("sn  b");
        	sleep(3);
        }
        return 0;
}
 『send_msg()』が文字を送信する関数であり、引数は文字型(char型)です。また、このような赤外線通信関連の関数は『lnp.h』に記述されています。

2.信号受信

 次に、赤外線信号を受信するようなプログラムを作成してみます。送る文字や動作は先ほどと同様とします。
ここでは作成ファイル名をirc_get.cとします。
作成したプログラムirc_get.c
#include<conio.h>
#include<unistd.h>
#include<lnp/lnp.h> // link networking protocol function is inclued

tid_t t_stop;

int stop(){ // rcx stop function
        int stopchar;
        stopchar=getchar();
        if(stopchar==KEY_RUN){
                cputs("stop");
                killall(20);
        }
        return 0;
}

int main(int argc,char **argv){
        char getmsg[4];

        t_stop=execi(&stop,0,NULL,20,DEFAULT_STACK_SIZE);

        while(1){
                getmsg[0]=get_msg(); // get message
                cputs(&getmsg);
        }
        return 0;
}
『get_msg()』が文字を送信する関数であり、引数はなし、戻り値は文字型(char型)です。
送信側、受信側で同時にプログラムを実行してみてください。LCDに『A』、『b』が交互に表示されるはずです。

3. get_msg() の動作

 ここで、get_msg()関数に注目して見ましょう。下にlnp.h内のget_msg()を示します。
//! read received message from standard firmware
extern inline unsigned char get_msg(void)
{
   clear_msg();
   wait_event(msg_received, 0);
   return lnp_rcx_message;
}
 get_msg()関数の動作は次の通りです。まず、clear_msg()関数で受信バッファに格納された赤外線信号を消去、つぎにウェイクアップ関数msg_receivedにより信号を受信するまで待ち、受信後、lnp_rcx_message変数内に書き込まれた赤外線信号を返す。これらの関数や変数はget_msg()だけでなく、ユーザーが使うこともできます。

では、これらを使って先ほどと同じ動作をするプログラムを作ってみます。 次のプログラムを作成してください。ここでは作成ファイル名をirc_get2.cとします。
作成したプログラムirc_get2.c
#include<conio.h>
#include<unistd.h>
#include<lnp/lnp.h> // link networking protocol function is inclued

wakeup_t irc_wakeup(wakeup_t data); // ir message check

int main(int argc,char **argv){
        char getmsg;

        while(1){
                clear_msg();
                wait_event(&irc_wakeup,0);
                cputs(&lnp_rcx_message);
        }
        return 0;
}

wakeup_t irc_wakeup(wakeup_t data){ // ir message check
        return lnp_rcx_message!=0;
}
 内容としては、get_msg関数と同じ動作をユーザープログラムで書いただけですが、これを用いて応用することができます。たとえば、ウェイクアップ関数のウェイクアップする条件を上記では『0以外が入る』としましたが、『a』という信号だけが欲しいときには、条件を『aが入る』とすると、受信する信号が『a』でない限りウェイクアップせず、他のプログラムがCPUが効率的に利用することができるようになります。

4.課題

 『irc_get.c』と『irc_send.c』を用いて、briskOS 搭載の RCX 同士で赤外線通信の動作を確認をした後、 送受信タスクをマルチタスク化して、2つの RCX で相互に送受信を行い、受信したデータをコンソールに出力するプログラムを作成して下さい。

5.まとめ

 この章では赤外線通信について学びました。ここではbrickOS対brickOSでしたが、標準ファームウェア対brickOSでも通信は可能です(ただし、最初に述べた型の違いに注意)。ここではbirckOS独自の赤外線通信については触れませんでしたが、それを用いると標準のそれよりももっと高度な通信が可能となります。機会があったらぜひやってみてください。
11.音を鳴らす
TOP