このページでは乾電池で駆動可能なXBee ZigBee の END DEVICE を使った温度・湿度・照度センサーの製作方法に関する情報を掲載しています。ハンダ付けに慣れていない人にもわかりやすく説明しています。
温度センサー、照度センサーはXBeeに直結します。しかし、湿度センサーはPICマイコン(PIC 12F683)を経由します。したがって、湿度センサーを搭載したい場合はPIC Kit 2などのライターや書き込むためのアダプタが必要です。(温度センサと照度センサのみで良い場合はPICライターは不要です。)
さらに、湿度センサー部にPICマイコンを使わずデジタルインタフェースでXBeeに直結する方法についても紹介します。
家中に設置するなど、より低価格に多くのセンサーを製作したい方は、「低価格ワイヤレス温度・湿度・照度センサー」も合わせて参照してください。
下図はZigBee 温度・湿度・照度センサーの基板パターン例です。左側にXBee、中央付近に湿度を測定するためのPICマイコンが実装されています。下部の中央(電源行12列目)に470uFのコンデンサを配置しています。XBeeの送受信中に照度センサ(J行30列目)や温度センサ(D行20列目)、PICマイコンのADC用の電源などの電圧変動を減らすために大きめのコンデンサを使用します。用途に合わせて調整してください。
乾電池での動作を想定しているので、XBeeの13番ピンON信号がHレベルの時だけPICが動作するようにしています。X-CTUを使用してXBeeをEND DEVICEに書き換え、CYCLIC SLEEP を設定します。
照度センサはXBeeの19番ピン(AD1)に接続しています。照度センサーの光電流は10kΩの抵抗(J行30列目)で電圧に変換されてXBeeのADC(A/D変換器)に入力されています。センサー部の出力インピーダンスが高く、ADCに電流が流れ込むと測定結果が不確かになる場合があるので、通常はオペアンプでインピーダンス変換することが多いのですが、XBee Series 2 (S2,S2B)については、直接、接続しても実力的に大きな問題は無さそうです。(精密な測定には適しません)。
温度センサLM61もXBeeの18番ピン(AD2)に直接接続しています。こちらも実力的には動作していますが、同様に出力インピーダンスが十分に低くは無いので誤差が生じる場合があります。
湿度センサHS-15Pの測定結果はPICから電圧(PWM)出力し、XBeeの17番ピン(AD3)に入力します。PICの電圧(PWM)出力を簡単なフィルタで平滑化しているだけなので測定結果は多少変動します。また、XBeeの3番ピン(DIN)に「測定データ用シリアル信号線」を接続して、PICで測定した温度値と湿度値をシリアルUARTデータとしてXBeeで送信することも可能です。PICの7番ピンから温度、湿度の順にアスキー(テキスト)のシリアルデータ(9600 8-N-1)を出力します。
ここでは下の写真のような「片面ガラス・ユニバーサル基板(ブレッドボード配線パターンタイプ)」を使用して製作します。この基板は秋月電子などで売られています。
ハンダ付けは高さの低い部品を優先します。まずはリード線などの余り(スズめっき導線)を使って基板パターンを配線します。写真のように表面にリード線を差し込んで裏側でハンダ付けします。ただし、ビニール線のハンダ付けは部品を避けて引き回すので最後にします。
基板の表面の左上(基板1行J列目)にはプッシュスイッチを実装します。このボタンの背面のマイナス電源ライン(-)パターン1行目と3行目間を(XBeeの20番ピンがGNDに接続されないように)カッターなどで切断しておく必要があります。下図は基板の裏側です。裏面なので表面の左上のスイッチは右上に位置することになります。
次に4つの抵抗をハンダ付けします。先に基板と水平に実装する抵抗をハンダ付けしてから、垂直に実装する抵抗(18kΩ)をハンダ付けします。
0.1μFのコンデンサをハンダ付けします。J行15列のコンデンサは予めリード線をラジオペンチなどで差し込みやすいようにフォーミングしてから実装します。
電解コンデンサ、フィルムコンデンサ、インダクタ、プッシュスイッチ、ICソケットをハンダ付けします。電解コンデンサ(B行1列目)のリード線の一部は予め熱収縮チューブなどを使用して絶縁しておきます。プッシュスイッチの右下の端子はJ行3列目の穴に入れないように内側に折り曲げてから実装します。
静電気に注意しながらICやFETなどの半導体部品やビニール電線をハンダ付けします。湿度センサと温度センサは後にケースに入れた時に外にはみ出るようになるべく高さを確保しておきます。下図の例では温度センサのリード線が短くてケースの内部に入ってしまいます。ケースの内部でも測定は可能ですが、回路の温度上昇の影響を受けて、若干、高めに測定されてしまいます。
また、XBeeモジュールを取り付けると左側のビス穴が使えなくなるので予めプラスチック製のナットを接着剤で固定しておきます。さらに、ビニール電線が傷ついて他の信号や電源とショートしないように耐熱テープや絶縁テープなどで保護しておくと安心です(XBeeで覆われる部分は、Xbee用ソケットのリード線がビニール電線を傷つけてしまう恐れがあります。)
XBeeモジュール用2mmピッチ→2.54mmピッチ変換基板をハンダ付けします。ここではSparkfun製のBOB-08276を推奨します。たまたま手持ちがなかったので、写真の例では他社製のレギュレータ付き変換基板からレギュレータを外して基板の長さを削って使用しています。
XBeeモジュールと湿度センサを取り付けてケースに入れれば完成です。写真のセンサーは赤外線リモコン送信機能を追加していますので、2個のPICが実装されています。(詳しくは、本ページ後半の応用編をご覧ください。)
XBeeを低消費電力で動作させるためには、購入時のZigBee Routerの状態からZigBee End Deviceに変更する必要があります。(Routerのままでも動作はします。)
End Deviceへの変更するにはX-CTUを使用してファームウェアを書き換えます。X-CTUの「Function Set」のファームウェアの種類の部分で「ZIGBEE END DEVICE AT」を選択します。X-CTUの使い方やファームウェアの変更方法「XBee ZigBee 基本編 ワイヤレス通信を始めよう」を参照してください。
一度、End Deviceに設定すると、XBeeはCYCLIC SLEEPモードで動作するようになりますので、以降はX-CTUとXBeeとの通信を行う直前にXBeeのリセットを押して、すばやくX-CTUを操作する必要があります。これは、CYCLIC SLEEPモードではXBeeの電源がOFF状態になる期間が発生するためです。また、XBeeをリセットすることで一定の時間だけXBeeを強制的に起動させることが出来ます。起動している期間はX-CTUのST値(Time before Sleep)で設定することが出来ます。初期値は5秒ですが慣れれば500ms(01F4)あたりに設定しても接続することが出来ます。
XBeeの設定はX-CTUを使用しなくても、シリアルやXBee親機からのATコマンドでも設定することが出来ます。しかし、普段はスリープとなっているEND DEVICEにATコマンドで設定するのは難しい場合がありますので、したがって、End Deviceの各種設定については、XBeeに予めX-CTUで設定しておくことをお勧めします。
以下にZigBee 温度・湿度・照度センサーにおける XBee ZigBee End Device のCYCLIC SLEEP設定例を示します。
AT
name
| 初期
| 例
| 説明
| SM
| Sleep Mode
| 0x04 | Cyclic 0x04 | Cyclic No Sleep(00)/Pin Hibernate(01)/Cyclic Sleep(04)/Cyclic Sleep Pin-Wake(05)の切り換え。Cyclic Sleep wakes on timer expiration.
| ST
| Time before Sleep
| 5000[ms] 0x01F4 | 500[ms] シリアルやRFの通信終了後、省電力モードに移行するまでの待ち時間[ms]。 | SP
| Sleep Period
| 32x10[ms] 0x07D0 | 20秒 ZigBeeデータ通信のための省電力モードの持続時間x10[ms]。RouterとCoordinatorは情報の最大保持期間。設定範囲は0020(320ms)〜0AF0(28sec)。 | SN
| Sleep Number
| 毎回起動 0x0003 | (20×3)秒毎 外部CPUを起動するまでの起動カウンタ。SP後に通信データが無い場合は省電力モードになり、それがSN回続くと外部On/Sleep pinへON信号(H)を出力する。(SP×SNの間隔で起動) | SO
| Sleep Options
| 0x00 | オフ 0x00 | オフ 0x02 - Wake for ST time on each cyclic wake (after sleeping for SP*SN) | 0x04 - Enable extended cyclic sleep (SP毎にポーリングしない) DH
| Destination Address High
| 0x00000000
| 0x0013A200
| 親機(宛先)の上位アドレスを指定する
| DL
| Destination Address Low
| 0x0000FFFF
| 0xXXXXXXXX
| 親機(宛先)の下位アドレスを指定する
| D1
| AD1/DIO1 Config.
| 0x02
| アナログ入力に設定
| D2
| AD2/DIO2 Config.
| 0x02
| アナログ入力に設定
| D3
| AD3/DIO3 Config.
| 0x02
| アナログ入力に設定
| PR
| Pull-up Resistor
| 0x1FFF
| 0x1FF1
| DIOポート1〜3のプルアップを禁止
| IR
| IO Sampling Rate
| 0x0000
| EA60 | 60秒 デジタルIO入力およびアナログADC入力値を指定した宛先に繰り返し送信する間隔。0x0000に設定していると送信しない。設定範囲は0032(50ms)〜FFFF(約65秒)。 | |
なお、前述のとおりEND DEVICEをX-CTUで読み込み/書き込みしようとすると、通信エラーが発生する場合があります。その場合は、リセットボタンを押してからST時間内にRead/Writeすると成功します。
本機用のソフトウェアは下記にまとめてあります。まず、本センサー(子機)から情報を収集する親機XBee用のソフトが必要です。当サイトで公開しているPCおよびH8マイコン用の「XBee 管理用ライブラリ ZB Coordinator API」を親機側のXBeeに使用することができます。XBee親機については「XBee ZigBee 基本編 センサネットワークを構築しよう」を参照してください。
親機で動作させるためには汎用的な「ATコマンド解析ツール for PC」を用いることができます。このアプリは「xbee_test (COM番号)」で起動します。その後、センサーのコミッショニングボタンを押せば、センサーから1分ごとに送られてきたデータをコンソールに表示します。最新版は「XBee 管理用ライブラリ ZB Coordinator API」の「xbeeCoord_XXX.zip」に含まれています。
本センサー(子機)内の湿度センサ測定用ファームウェアは下記からダウンロードしてPIC Kit 2などのPICライタでマイコンへ書き込みます。湿度センサなしでも温度センサと照度センサは動作します。
必須
実装先
| タイトル
| ソフト
| 備考
| ○
| 親機(PC)
| 管理用ライブラリ ZB Coordinator API
| 最新版(xbeeCoord_XXX.zip)をこちらからダウンロードください。
| ○
| 親機(PC)
| ATコマンド解析ツール for PC
| xbee_test.c
| 上記用の汎用サンプルアプリ
| △
| 本機PIC
| 湿度センサ測定用ファームウェア
| hum4pic.zip
| 本機に実装したPIC 12F683用
| −
| 本機PIC
| 上記のソースコード
| TestHS15.c
| 本機に実装したPIC 12F683用
| |
このセンサーで測定した値には誤差が含まれています。センサー単体の誤差、回路部品(抵抗やコンデンサ)による誤差、電圧変動による誤差、演算処理による誤差、経年劣化による誤差などがあります。また、想定できていない誤差もあり得ます。
これらの誤差を合計すると下表のように使い物にならない精度となることが分かります。しかし、すべてが同じ方向に変動する可能性は低いため、実力的には、このような大きな誤差が生じることは滅多にありません。
誤差
照度センサー
| 温度センサー
| 湿度センサー
| デバイスの精度※1
| ±50%
| ±3℃
| ±5%RH
| 回路部品※2
| ±5%
| 微小
| ±1%RH
| 電源電圧変動※3
| ±5%
| ±4℃
| ±5%RH
| 演算処理誤差
| 微小
| 微小
| ±1%RH
| 経年変化
| 不明
| ±0.2℃
| 不明
| 合計
| ±55%以上
| ±7℃以上
| ±12%RH以上
| |
これらの誤差を少しでも低減するには簡易的な補正(簡易較正)を行います。照度センサなら実際の照度との誤差を乗算します。温度センサや湿度センサは誤差を減算します。
ここで製作した機器は測定器ではありません。人命や健康に影響するような利用は出来ません。また、測定結果を利用する場合は、その利用方法に応じて適切な測定精度を保証する必要があります。具体的には誤差の低減策を講じたうえで、標準器との較正(校正とも言う)を行い、公的機関による較正証明書を受ける必要があります。
それらを承知の上で、市販の測定器や信頼性の高い測定による測定結果との簡易較正を行います。一例として、下図は製造元で較正済のSENSIRION社製の温湿度センサSHT-74との比較結果です。HS-15Pの測定結果に3%RHを加算して使用することで、誤差を改善することが出来ます。ただし、対象のHS-15Pは、あくまで私の保有する3個のHS-15Pです。新たに購入したHS-15Pに3%RHを加算するかどうかは測定してみなければ分かりませんが、電子工作を趣味で楽しむ範囲であれば3%RHの加算で問題ないでしょう。(保証はありません。)
当方サイトの情報および情報を元に製作した機器によっていかなる損害を被られた場合であっても、当方は一切の責任を負いません。自己責任でご利用下さい。
測定結果の出力は1分後
PICによる測定結果はスリープ解除後にシリアル出力するようにしています。これはXBeeの消費電力を少しでも控えるための工夫です。しかし、1分に1度の測定の場合、1分前の湿度を出力することになります。PICソフトの「go to sleep」と「SCI Output」を入れ替えれば、測定の直後に結果を出力するようになります。(測定に要した時間だけ、XBeeが起動している時間が長くなり、電池寿命が短くなります。)
電源コンデンサの容量
DCDCコンバータ後の電源コンデンサに470uFを使用していますが、温度や経年劣化によって470uFでは不十分になり、XBeeが起動と終了を繰り返してしまう場合があります。こういった場合は、コンデンサを交換するか容量を増大して対策します。ただし、容量を増やすとコンデンサが大きくなったり、リーク電流(コンデンサからの電流漏れ)による電池寿命への影響が発生する場合があります。
その他の節電方法として、送信出力レベル(Power Level)を下げる方法があります。X-CTUのウィンドウ内の「RF Interfaceing」内の「PL - Power Level」の値を小さくするとXBeeが送信するときの消費電力が下がるので、起動と終了を繰り返してしまう現象を止めることが出来る場合があります。ただし、送信電力が下がるので電波の到達範囲が狭くなり、離れた場所との通信が出来なくなる場合があります。
赤外線リモコン送信機能を追加する
温度や湿度の測定結果をもとにエアコンを自動運転するようなアプリケーションが考えられます。そのために、本センサー子機に赤外線リモコン送信機能を付与してみます。XBee用の赤外線リモコン送信機能については「XBee ZigBee 赤外線リモコン送信デバイスの製作方法」に記載しています。
下図は赤外線リモコン機能とセンサー機能をマージした基板パターン例図です。元のセンサーだけの基板図の右側にスペースが空いていたのは、このためです。
Arduinoで湿度を測定する温湿度ロガー
無線を使ったワイヤレスセンサーでは親機が必要です。一方、親機を必要としない(ワイヤレスではない)湿度センサーについては「Arduinoで湿度を測定する温湿度ロガー」に、Arduinoを使った湿度センサーの製作方法を記載しています。
SENSIRION SHT-11 SHT-71を直接XBeeに接続する
IC2インタフェースによく似たデジタルインタフェースを持つSENSIRIONの温湿度センサSHT-71をXBeeモジュールに直結したリモート子機XBeeセンサに対し、パソコン親機から子機XBeeモジュールのGPIOを制御する方法もあります。この方法はとても手軽な反面、スピードや通信量に課題があります。
親機にはパソコン、子機のXBeeモジュールに湿度センサ SHT-71のデジタルインタフェースを直結します。必要な信号は電源、GND以外に、SCL(I2Cクロック)、SDA(I2Cデータ)の信号をそれぞれ、XBeeの7番ピンと4番ピンに接続します。I2Cではプルアップ抵抗が必要です。これらの信号線と電源との間に10kΩ程度のプルアップ抵抗を接続します。100kΩなどの大きいプルアップ抵抗でも、ある程度、動くと思います。
サンプルプログラムでは以下のI2Cインタフェース用の関数をしています。このインタフェースに対応したxbee.cもサンプルに含まれています。
byte xbee_i2c_read(const byte *address, byte adr, byte *rx, byte len); 子機XBeeデバイス(リモート先)のI2Cから指定バイトの情報を読み取る関数 入力:byte adr I2Cアドレス /SHT 温度測定時0x01 湿度測定時0x02 入力:byte len 受信長、0の時は Sensirion SHT用2バイト受信 出力:byte *rx 受信データ用ポインタ port=11 DIO11 XBee_pin 7 SCL port=12 DIO12 XBee_pin 4 SDA XBeeハードウェア Sensirion SHT-11またはSHT-71をXBeeの1,4,7,10番ピンに接続する。 ピンはちょうど3つおきなので、引き出しやすいと思います。 XBee 1 -> SHT-71 2 (VCC) XBee 4 -> SHT-71 4 (SDA) XBee 7 -> SHT-71 1 (SCL) XBee10 -> SHT-71 3 (GND) |
以上のとおり、とても簡単にデジタルインタフェースのセンサーをXBeeに接続することが出来ます。しかし、その一方、温湿度の片方の取得に10秒程度の時間がかかる欠点があります。また、1回の測定で10秒以上の通信が続くので、多くの通信XBeeセンサが参加するXBeeネットワーク内では共存しにくかったり、消費電力についても大きくなります。したがって、通常は前述のようなPICやArduinoマイコンなどを使用し、「センサ→マイコン→XBee」のように接続し、マイコンで一次処理した結果をXBee通信します。
家中に設置するなど、より低価格に多くのセンサーを製作したい方は、「低価格ワイヤレス温度・湿度・照度センサー」も合わせて参照してください。