内容
XBeeを使って、温度情報を無線でパソコンに送ります(下図)。温度は、「液晶を使った温度計」のLM60BIZの回路を使用します(液晶は使用しません)。
XBeeを2枚使い、XBee間が無線になります。XBeeの概要を下記に示します。詳しくは、「Google」などで調べてください。
・Digi international社のXBeeモジュールを使用し、簡単に無線通信が可能
・XBeeはアンテナ外付けや、アンテナ内蔵など多種あるが、今回は「XB24-ZB」というチップアンテナタイプを使用
・XBeeの電源、信号線のレベルは3.3Vなので、今回はSparkFun製の「XBeeエクスプローラ5Vマイコン用」という電圧変換基板を使用し、R8C/M12Aマイコン、RY-WRITER基板と接続
・「X-CTU」という専用ソフトで、XBeeを設定 ※必ずインストールが必要です
|
XBee基板 |
|
XBeeエクスプローラ5Vマイコン用 |
|
XBee基板+XBeeエクスプローラ5Vマイコン用+4ピンコネクタ |
ワークスペース
r8cm12a_com_temperature_100.zip
ファイルを解凍し、フォルダを「c:\worksapce」に入れてください。
回路
ブレッドボードの回路を下図に示します。
全体の接続回路を下図に示します。
ブレッドボード実装図
ブレッドボードの実装を下図に示します。
追加する部品
「液晶を使った温度計」の他に追加する部品を下表に示します。
XBeeの設定
X-CTUのインストール
XBee基板の設定は「X-CTU」という、専用のソフトで行います。「X-CTUダウンロードサイト」にアクセスします。「X-CTU」をダウンロード(下図)、インストールします。
XBee基板の結線
下図のように、パソコンとXBee基板を接続します。「XBeeエクスプローラ5Vマイコン用」は、5Vの信号でも接続できるように電圧を変換する基板です。
「XBeeエクスプローラ5Vマイコン用」と「RY-WRITER基板」間の4芯ケーブルの結線は、上記の「回路」を参照してください。
XBee基板の設定
1枚目のXBee基板に書き込む内容を設定します(下画面)。設定ができたら、「Write」ボタンをクリックして書き込みます。
相手のXBeeの番号は、書き込むXBee基板ではなく、もう1枚のXBee基板の裏にある番号です(下写真)。
XBee基板を交換します。2枚目のXBee基板に書き込む内容を設定します(下画面)。設定ができたら、「Write」ボタンをクリックして書き込みます。相手のXBeeの番号は、先ほど「ルーターAT」で設定を書き込んだ基板の番号です。
これで、それぞれのXBee基板同士が通信するよう、設定できました。同じ場所で、異なるXBee基板を使った通信を行う場合は、「PAN ID」を変えてください。
パソコンの設定
COMポートの送受信信号をやり取りできるソフトで、XBeeから送れてきたデータを受信、表示します。ここでは「TeraTerm」を使います。パソコンにインストールされていなければ、「窓の杜」などからダウンロード、インストールしてください。
TeraTermを立ち上げ、接続を「シリアル」、ポートはRY-WRITER基板の番号にします("Prolific USB-to-Serial Comm Port"と表示されているポートです)。
R8C/M12Aマイコンに4.5〜5.5Vを供給すると、XBee基板から温度情報が送られてきます。パソコン側のXBee基板でその情報を受信して、TeraTermに表示します。
※TeraTeamの立ち上げは、R8C/M12Aマイコンにプログラムを書き込んだ後にしてください。TeraTeamがRY-WRITER基板を使い、R8C Writerで書き込みができなくなります。
プログラムの説明
UART0の設定
init関数内でUART0を設定して、XBee基板へ送受信できるよう設定します。「UART0による通信」と同じ設定です。
/* UART0の設定 */
mstuart = 0; /* UART0を有効にする */
p15sel2 = 0; /* P1_5 = RXD0端子にする */
p15sel1 = 0;
p15sel0 = 1;
p14sel2 = 0; /* P1_4 = TXD0端子にする */
p14sel1 = 0;
p14sel0 = 1;
u0mr = 0x05; /* UARTモード8bit */
/* 1ストップビット,パリティなし */
u0c0 = 0x10; /* U0BRGカウントソース:f1 */
u0brg = 129; /* f1 / (bps*16) - 1 */
/* = 20*10^6/(9600*16)-1=129.2 */
te_u0c1 = 1; /* 送信許可ビット:送信許可 */
re_u0c1 = 1; /* 受信許可ビット:受信許可 */
main関数
AN7端子から温度のA/D値を読み込み、電圧に変換します。この電圧を100回、読み込みます。A/D値を読み込むだけならすぐに終わってしまうので、1回読み込む毎に5msの時間稼ぎをして、100回で0.5秒程度かかかるようにしています。
void main( void )
{
long vtmp, temp;
int i, j;
init(); /* 初期化 */
while( 1 ) {
// 温度を100回取得
vtmp = 0;
for( i=0; i<100; i++ ) {
// 電圧変換(5000mVなら、vtmp = 5000)
vtmp = vtmp + (long)get_ad7() * 5000 / 1023;
for( j=0;j<5000; j++ ); /* ウエイト 約5ms */
}
電圧(vtmp変数の値:0〜5000)を、温度に変換します。
0〜100℃で、temp変数は100℃のとき1000になります。
// 温度変換(100℃のとき、1000に変換)
temp = (vtmp - 241680) * 1000 / 356250;
tempの温度情報を、文字列に変換してUART0から出力します。
例えば、temp=123のとき、「+12.3゚C」と出力されます。
// 0℃以下か確認
if( temp < 0 ) {
temp = -temp;
put_uart0_str( "-" );
} else {
put_uart0_str( "+" );
}
// 上位3桁+"."+下位1桁表示+改行
put_uart0_num( temp / 10, 3 );
put_uart0_str( "." );
put_uart0_num( temp % 10, 1 );
put_uart0_str( "゚C\n" );
}
}
|