このページはXBee ZigBee 用の表示デバイスの製作方法に関するメモです。XBeeで送られてきたテキストを表示します。
このデバイスはXBeeネットワークの子機(End DeviceまたはRouter)として動作します。ここではネットワーク子機のハードウェアの製作方法とソフトウェアについて説明しています。子機とは別に、別途、テキストを送信するための親機が必要です。親機の製作方法については「センサネットワークを構築しよう」を参照していただき、親機からテキストを送信する際の関数は当ページ内の「テキストメッセージ送信 関数」を使用して親機側のプログラムを製作します。(子機側は配布しているソフトをそのまま使用すれば動作しますのでプログラムの改造は親機側です。)
なお、このページではH8マイコンを使用しますが、Arduinoを用いた同様の製作例を「家中どこでも情報表示(M2M子機の製作)」で紹介していますので、そちらも参照ください。
以下の写真は本ページで紹介するXBee ZigBee LCD 表示デバイスの製作例です。
主要な部品は 秋月のH8 Tiny(AKI-H8/3694F or 3664F QFP タイニーマイコンキット)と、XBee、そして、下図のスイッチサイエンスのXBeeの載る基板です。
この基板はXBee用の2mmピッチの穴が始めからあけられています。値段が500円と内容に対して高めですが、変換基板の値段と仕上がりを考えて購入してみました。付属品はXBee用ソケットだけです。秋月のXBee変換基板のような3.3VレギュレータやLEDがついていないので、さらにコスト高になります。少し得したのはアンテナ部分にランドやパターンが無いので、XBeeのアンテナの性能がフルに発揮できると思います。(秋月の変換基板はアンテナ部にパターンあり)
さっそく、XBee用の2mmピッチのピンソケット、H8マイコン用の26ピンソケットなどの部品をハンダ付けします。実装例として両面の写真を下図に示します。このとおりに製作する必要はありません。
主要な配線について説明します。XBeeのDIN信号をH8のTXDに、DOUT信号をRXDに、ON/SLEEP信号をH8のIOQ0に接続します。XBeeは3.3V、H8は5Vで動かしているので、DINはダイオードで保護しています。したがって、XBee側でプルアップが必要です。DOUTとON/SLEEPは直結です。H8のVIHは仕様上3.5Vですが、3.3Vでも特に不具合なく動作していると思います。(気になる方はトランジスタ等で正しく電圧変換してください。)
XBee用の3.3VレギュレータはLDO(低損失)タイプの500mAのものを使用しました。秋月の変換基板の付属品が150mAなので、XBee PROで安定して使いたかったなどの理由をつけて差をつけました。
H8 マイコンAKI-H8/3694FまたはAKI-H8/3664Fを取り付ける前にシリアルとXBeeから受け付けるようにするためにRS-232Cドライバ(IC2)を外す必要があります。ただし、H8タイニーI/O(アイ・オー)ボードなどを使ってソフトを書き込んでいる場合はRS-232Cドライバを外すと書き込みが出来なくなるので、先にソフトを書いておく必要があります。
また、この例では安定化された5.0Vを入力することを想定していますので、H8マイコンボード上のJP1のパターンをカットして5Vレギュレータを無効にしています。
RS-232Cドライバを外した後でソフトの書き込みが必要になった場合は、XBeeを取り外した状態で、H8マイコンボードのCN2の18番ピン(RXD)と19番ピン(TXD)をUSBシリアル変換ICなどに接続してソフトを書き込んでください。書き込み時は通常通りJP2とJP3をショートする必要があります。
ハードウェア μP H8 3664 / 3694 以下のいずれか ・AKI-H8/3664BP(SDIP)タイニーマイコンキット ・AKI-H8/3664F(QFP) タイニーマイコンキット ・AKI-H8/3694F(QFP) タイニーマイコンキット LCD 16文字×1行:S10551D 16文字×1行:DMC16117A 8文字×2行:ACM0802C−NLW−BBH 表示アドレス 1〜8文字:0x00〜0x07 9〜16文字:0x40〜0x47 XBee XBee ZigBee Series 2 (S2,S2B) Firmware = END DEVICE AT AKI-H8 液晶モジュール (CN1) (HD44780搭載) ━━┓ ┏━━━━━┓ ┯ 5V ┃P50 ┃ ┃ | 14┠→─────┨DB4 Vdd┠───●┘ ┃P51 ┃ ┃ | 15┠→─────┨DB5 ┃ < ┃P52 ┃ ┃ ┌→> 16┠→─────┨DB6 VLC┠─┘ < 10k ┃P53 ┃ ┃ | 17┠→─────┨DB7 DB0-3┠─┐ | ┃P54 ┃ ┃ | | 18┠→─────┨E R/W┠─● | ┃P55 ┃ ┃ | | 19┠→─────┨RS Vss┠─●─●┐ ┃ ┗━━━━━┛ ┯┿┯ (CN2) XBee ━━┓ ┏━━━━━┓ ┯ 3.3V ┃RXD DOUT┃ ┃Vdd | 18┠←─────┨2 1┠──┘ ┃TXD 抵抗 DIN┃ ┃ 19┠→─□□──┨3 ┃ ┃IRQ0 分圧 ON┃ ┃GND 20┠←─────┨13 10┠──┐ ┃ ┃ ┃ ┯┿┯ 抵抗分圧 Series 10K + Shunt 15k |
レベルLED、警告LED、ブザー、赤外線リモコンの送受信機能を付与することが出来ます。それぞれのH8マイコンへの接続先ポートは以下の通りです。
レベルLEDはLED0〜9の10段階です。警告LEDや赤外線LEDは高輝度のものを使用します。ブザーはタイマー出力端子であるTMOV端子に接続します。赤外線リモコン受信用のモジュールは電源と信号を接続します。LEDや赤外線受信モジュールを直接、接続する場合はソースのままで動作しますがバッファなどを入れた場合は論理を調節してください。(実験用としてはこのままの接続でも動作しますが、出力はH8の電流オーバになる可能性があり、入力はH8のVIHに足りないと思います。)
ブザーは圧電スピーカを使用しています。こちらも実験用としてH8からの直接ドライブになっていますので電流オーバになっている可能性があります。また、本機が床に落下するなどの大きな衝撃があると圧電素子が発電してH8に高圧がかかりH8マイコンを破壊してしまいますので衝撃には十分に注意してください。大音量が必要な場合はバッファ回路の追加も必要です。
/* H8マイコン用 ポート設定 */ #define LED0_OUT IO.PDR1.BIT.B0 // P10(CN1 20) LED0(Green) #define LED1_OUT IO.PDR1.BIT.B1 // P11(CN1 21) LED1(Green) #define LED2_OUT IO.PDR1.BIT.B2 // P12(CN1 22) LED2(Green) #define LED3_OUT IO.PDR1.BIT.B5 // P15(CN2 21) LED3(Green) #define LED4_OUT IO.PDR1.BIT.B6 // P16(CN2 22) LED4(Green) #define LED5_OUT IO.PDR8.BIT.B0 // P80(CN2 9) LED5(yellow) #define LED6_OUT IO.PDR8.BIT.B1 // P81(CN2 10) LED6(yellow) #define LED7_OUT IO.PDR8.BIT.B2 // P82(CN2 11) LED7(yellow) #define LED8_OUT IO.PDR8.BIT.B3 // P83(CN2 12) LED8(red) #define LED9_OUT IO.PDR8.BIT.B4 // P84(CN2 13) LED9(red) #define LED_OUT_PRT IO.PDR8.BIT.B7 // P87(CN2 16) LED(警告用) #define IR_OUT IO.PDR8.BIT.B5 // P85(CN2 14) 赤外線LED #define IR_VCC IO.PDR8.BIT.B6 // P86(CN2 15) 赤外線受信モジュール用電源 #define IR_IN IO.PDR1.BIT.B7 // P17(CN2 23) 赤外線受信モジュール用信号入力 #define IR_IN_OFF 1 // 赤外線センサ非受光時の入力値 #define IR_IN_ON 0 // 赤外線センサ受光時の入力値 #define IR_OUT_OFF 0 // 赤外線センサ非発光時の入力値 #define IR_OUT_ON 1 // 赤外線センサ発光時の入力値 (CN2) ━━┓ ┃ Diode ┃ ┌──┨<───┐ ┃ | | ┃ | 圧電スピーカ | ┃TMOV |┏━━━━━┓| 7┠→─┨┠─●┨ |○| ┠●─┐ ┃ 22uF ┗━━━━━┛ ┯┿┯ |
レベルLEDや警告LED、ブザーを制御するには「ESCコード0x1B(27)」に続いて制御コマンド1バイトと制御値1バイトを親機から本機(子機)へ送信します。制御コマンドはLED制御が「L」とブザー制御が「B」です。制御値は「0」〜「9」で、「0」がオフです。レベルLEDの10段階目は「A」で設定します。警告LEDは「F」でON(点滅)し、「E」でOFF(消灯)します。LEDコマンドは、一度、受けると継続的に点灯もしくは点滅します。ブザーはブザー音の回数です。コマンドを受けた時だけ鳴ります。ほかにもチャイム音「C」、アラート音「A」があります。なお制御コマンドはアスキーコードで、制御値はアスキーコードでもバイナリ値でも動作するようになっています。
赤外線リモコン信号を本機が受信すると、本機(子機)から親機へバイナリ値を送信します。今のところ本機からの送信は赤外線リモコンだけなので識別子はありません。また終了コードもありませんので赤外線リモコンのコマンドを続けて受けた場合は親機側での判別が必要です。
赤外線リモコン信号を本機から送信する場合は、親機から本機(子機)へ「ESC」「I」「R」に続いて、信号長(bytes)、信号(バイナリ)を送信します。本機が赤外線を送出後に親機へ同じ信号を応答します。機器が動作しなかった場合に赤外線の区間でエラーが発生したのかXBeeの区間でエラーが発生したのかが分かるようにしています。バージョンによっては応答しないものもありますが、ソース内の「これを省略するとxbeeからの受信データをxbeeへ送信」と記載の部分を検索して設定を変更していただけます。
コマンド | バイナリ | 内容
[ESC][L][0]
| 0x1B 0x4C 0x00
| レベルLED OFF
| [ESC][L][1]
| 0x1B 0x4C 0x01
| レベルLED 1個点灯
| [ESC][L][5]
| 0x1B 0x4C 0x05
| レベルLED 5個点灯
| [ESC][L][A]
| 0x1B 0x4C 0x0A
| レベルLED 10個点灯
| [ESC][L][E]
| 0x1B 0x4C 0x0E
| 警告LED OFF(消灯)
| [ESC][L][F]
| 0x1B 0x4C 0x0F
| 警告LED ON(点滅)
| [ESC][B][1]
| 0x1B 0x42 0x01
| ブザー 1回
| [ESC][B][3]
| 0x1B 0x42 0x03
| ブザー 3回
| |
ご注意
これらの応用コマンドについては特定用途向けに開発中のものにつき、バージョンによって実装の有無や動作内容が異なる場合があります。また、現在はコマンドの再送やエラー検出は行っていませんので、通信エラーが発生すると子機側で意図と異なった状態が継続する場合があります。
当サイトで公開している「XBee 管理用ライブラリ ZB Coordinator API」にH8マイコン用のソフトウェア「xbee_lcd_ed.c」と「xbee_lcd_ed.mot(AKI-H8/3694F用)」が含まれていますので、H8マイコンに書き込みます。3664用はビルドしなおしてください。開発環境はH8用ZB Coordinator APIと同じです。
本機(子機)のXBeeはRouterかEnd Deviceにします。End Deviceの場合、XBeeがスリープに入るとH8もスリープに入るようになっています。
さて、表示を行うには本機(子機)以外に親機が必要で、親機に実装したソフトウェア ZB Coordinator API から本機へテキストのメッセージを送ります。親機へ実装するソフトウェアライブラリxbee.cにはテキスト送信のために以下の関数を用意しています。
親機側 テキストメッセージ送信 関数 (xbee.c)
void xbee_address(const byte *address);
byte xbee_putch( const char c );
byte xbee_putstr( const char *s );
void xbee_disp_hex( const unsigned char i );
void xbee_disp_1( const unsigned int x );
void xbee_disp_2( unsigned int x );
void xbee_disp_3( unsigned int x );
void xbee_disp_5( unsigned int x );