このページでは乾電池で長期間の駆動が可能なXBee ZigBee の END DEVICE を使った低価格なワイヤレス温度・湿度・照度センサーの製作方法に関する情報を掲載しています。精度よりも低価格に抑えることを優先し、温度センサー、湿度センサー、照度センサーの全てをXBeeに直結した構造とします。また実用的に使える程度に精度を改善するために、実測に合わせて親機側で測定値を補正します。
もし、1台しか作らない場合は、ワイヤレス子機側により自由度が高いPICを使ったワイヤレス温度・湿度・照度センサー」や、精度の高いSensirionの湿度センサを使用した「デジタルインタフェースでXBeeに直結する方法」も合わせて参照してください。
また回路規模の縮小は低価格化だけでなく小型化にも寄与します。下図は秋月のパーツケースに太陽電池とリチウムイオン電池を組み込んだ例です。太陽電池とリチウムイオン電池は100円ショップで売られているキーホルダー型の小型LEDライトから取り外しました。このような環境発電で機器を動作させ続ける技術をエナジーハーベストやエネルギーハーベストと呼びます。
下図は低価格ワイヤレス温度・湿度・照度センサーの基板パターン例です。左側にXBee、中央付近に湿度を測定するための湿度センサーHS-15Pを実装します。またここでは温度センサにLM61BIZを照度センサはNJL7502Lを使用しました。
乾電池での動作を想定しているので、XBee ZBの13番ピンON信号がHレベルの時だけ各センサーに電源が入るようにしています。湿度センサHS-15Pは直流の電源電圧がかかると壊れるので、本子機のXBeeのファームウェアを「ZIGBEE END DEVICE AT」に書き換え、DIO/AD共用ポートのAD3を「アナログ入力」に設定してから接続します。また、XBee ZBのスリープモードはCYCLIC SLEEPでのみ動作させます。
DIO/AD共用ポートのAD3を「アナログ入力」に設定後、湿度センサHS-15PをXBee ZBの17番ピン(AD3)に接続します。XBee ZBの13番ピンON信号がOFFからONなるとコンデンサCを経由して約1Vの電圧が湿度センサHS-15Pに供給されます。湿度センサHS-15Pはコンデンサに充電された電荷のみで動作し、すぐに湿度センサの両端の電圧は0Vに戻ります。
当サイトの他のページでは湿度センサHS-15Pをコンデンサの充電時に湿度センサのインピーダンスを測定する手法を用いました。しかし、XBeeの電源がONしっぱなしになると湿度センサが壊れてしまいます。そこで、本ページではコンデンサの充電時では無く放電時に測定する回路に改良し、XBee ZBのON信号をそのまま用いれるようにしました。※部品点数も充電時測定と同じです。
温度センサLM61BIZはXBee ZBの18番ピン(AD2)に、照度センサNJL7502LはXBee ZBの19番ピン(AD1)に接続します。照度センサの光電流は10kΩの抵抗で電圧に変換されてXBee ZBのADC(A/D変換器)に入力します。
以下はワイヤレス子機側の部品リストです。1台あたり概ね3000円未満(約60%をXBeeモジュールが占める)と低価格に作成することが出来ます。
XBee ZBモジュールはPROではないXBee ZBモジュールを選択します。アンテナはケース等に応じて選択します。コンデンサ0.22uFは温度による容量変化が少ないものを使用します。通常のセラミックコンデンサで0.22uFの場合は、温度によって大幅に容量が変化しますので、なるべくオーディオ回路などで用いられるフィルムコンデンサなどを使用します。なお、XBee ZBの電源用のコンデンサ0.1uFについては汎用品でもかまいません。製作例ではXBeeピッチ変換基板に実装しています。
部品名
参考単価
| 数
| 参考価格
| 販売店
| XBee ZB モジュール
| 1700円
| 1個
| 1700円
| 秋月電子、スイッチサイエンス等
| 湿度センサHS-15P
| 500円
| 1個
| 500円
| 秋月電子
| 温度センサLM61BIZ
| 50円
| 1個
| 50円
| 秋月電子
| 照度センサNJL7502L
| 50円
| 1個
| 50円
| 秋月電子
| コンデンサ0.22uF
| 20円
| 1個
| 20円
| 各社・高精度品
| コンデンサ0.1uF
| 5円
| 1個
| 5円
| 各社・汎用品
| 抵抗100kΩ
| 1円
| 1個
| 1円
| 各社・汎用品
| 抵抗68kΩ
| 1円
| 1個
| 1円
| 各社・汎用品
| 抵抗10kΩ
| 1円
| 2個
| 2円
| 各社・汎用品
| 高輝度LED
| 10円
| 1個
| 10円
| 各社・汎用品
| プッシュスイッチ
| 10円
| 1個
| 10円
| 各社・汎用品
| XBeeピッチ変換基板
| 400円
| 1個
| 400円
| スイッチサイエンス他
| ブレッドボード基板
| 80円
| 1枚
| 80円
| 秋月電子
| 単3×2本用電池BOX
| 40円
| 1個
| 40円
| 各社・汎用
| 合計
| 2869円
| ※参考価格です
| |
親機にはArduinoかパソコンのいずれかを使用し、XBee PRO ZB モジュールを接続します。親機のXBee PRO ZBモジュールのファームウェアには「ZIGBEE COORDINATOR API」を使用します。(前述のとおり子機XBee ZBモジュールには「ZIGBEE END DEVICE AT」を使用します。)
親機にArduinoを用いる場合は、Arduino UNOとArduino Wireless Shield、DF ROBOT製キャラクタ液晶の3段重ねで使用します。パソコンの場合は、XBee USBエクスプローラを経由してXBee PRO ZBモジュールに接続します。詳しくは「センサネットワークを構築しよう」や「XBee ZigBee モジュールの種類」を参照ください。
ソフトウェア(親機用)は下記にまとめてあります。当サイトで公開しているArduino用もしくはPC用の「XBee 管理用ライブラリ ZB Coordinator API(XBeeライブラリ)」と下記の「sample16_hum.zip」を使用します。
実装先(親機)
タイトル
| ソフト
| 備考
| Arduino/PC
| 管理用ライブラリ ZB Coordinator API
| 最新版をこちらからダウンロードください。
| Arduino/PC
| サンプル16 湿度測定用のサンプルアプリ
| sample16_hum.zip
| ZIP内にアプリのみを収録
| PC
| サンプル16 湿度測定用のサンプルアプリ
| sample16_hum.c
| C言語ソースリスト
| |
「sample16_hum.zip」フォルダ内には「Arduino」フォルダと「PC」フォルダがあります。それぞれをXBeeライブラリのフォルダにコピーしてください。
例えばArduinoの場合、「C:\Users\xbee(ユーザ名)\Documents\Arduino\libraries\XBee_Coord\examples」フォルダ内に「sample16_hum」フォルダを作成し、その中に「sample16_hum.ino」を入れます。Arduino IDEを起動していた場合、一度、終了してArduino IDEを再起動します。スケッチを開くときはアイコン「↑」から「XBee_Coord」を選択し、「sample16_hum」を選択します。
当初、何も補正せずに測定を行ったときは非常に精度が悪く、60%の環境下で30%などの測定結果が得られました。原因はパルス駆動という特殊な使い方によるHS-15Pの特性上の問題やXBee側の処理時間の相違、電源回路の安定度、コンデンサの残留電荷やヒステリシスなど疑い始めると色々と出てくるでしょう。また、補正するにしても複合要因があると思うので、手間がかかります。
そこで、分かりにくい原因には目をつぶって、原理的に明確に(大幅に)変化する事象だけを管理して測定精度を高めることとします。ADC入力値が変化する要因は、@湿度、A温度、B電源電圧が主体ですので、A温度とB電圧を一定に保った状態で@実際の湿度とADC入力値との関係式を求めて補正することにします。
補正用の測定の場合のみACアダプタとレギュレータ搭載のXBee ピッチ変換基板を用いて電源を3.3Vに安定化して測定します。(補正用の測定の完了後は乾電池とレギュレータなしのXBeeピッチ変換基板に戻します。)
下図は温度が一定(30±0.5℃)の環境下での本機XBeeのアナログ入力ADC値(横軸)と、実際の湿度(縦軸)との関係を実測した結果です。1週間ほどの測定結果から必要な温度のサンプルを抽出し、同時刻における正確な湿度との関係をプロットしました。今回の場合、30±0.5℃となったのは約1万サンプル中2500サンプルほどでした。
縦軸の湿度リファレンス値はSensirion SHT-71での測定結果です。屋外で測定し、気象庁のホームページで公開されている過去の実績データをリファレンス値としても良いでしょう。横軸は本XBeeのアナログ入力のADC値です。xbee_result.ADCIN[3]で得ることが出来るので、測定結果をファイルに保存して1週間分を蓄積しました。
次に上記のサンプルから多項式を求めました。最も容易なのはエクセルの近似曲線機能を用いることです。グラフツールの「近似曲線」メニューから「その他の近似曲線オプション」を選択するとると「多項式近似」を選択することが出来ます。この時、「グラフに数式を表示する」にチェックを入れておくと、近似式を表示することが出来ます。また寄与率(R-2乗値と呼ぶらしい)も表示することが出来、このサンプルでは0.843となりました。0.9を大幅に切っているので測定用としては良い結果とは言えませんが、このところ普及しつつある中国Aosong製の湿度センサDHT11の測定精度を考えれば実用的(湿度の目安を得る目的)に使えそうです。
なお、エクセルの近似式表示では各係数の有効数字が少なすぎる問題があると思い込んでいる方も多いと思います。この場合、一旦、グラフで近似曲線で表示された係数を頼りに自分で精度を追い込むような作業を行うことで、データ分析について多少の知識を得ることが出来ます。もっと手軽に正確な係数を知りたいという方は、グラフ中に表示された近似式を選択して「選択対象の書式設定」から表示書式を「指数」に変更し、小数点以下の桁数の部分に欲しい桁数を入力してみてください。私自身がこの書式変更の方法を知ったのは上記のグラフを公開用に編集していた時です。きっと、前者の手段を用いている人が多いのではと思って、書かせていただきました。
while(1){ xbee_rx_call( &xbee_result ); switch( xbee_result.MODE ){ case MODE_GPIN: ADC = (float)xbee_result.ADCIN[3] / batt * 3.256; // ADC入力と電圧補正 Rs = 7.4396E-05*ADC*ADC - 1.2391E-01*ADC + 1.9979E+02; // インピーダンス換算 Rs += (Rs*35-13056)/64*temp/64; // 温度補正 hum = (5*Rs /16 *Rs + 44* Rs )/256 +20; // 湿度へ printf("Hum = %.1f[%%]\n",hum); break; case MODE_BATT: batt = (float)xbee_result.ADCIN[0] /1000.; printf("Batt = %.3f[V]\n",batt); break; } } |
このソースリストを用いて測定した結果を下図に示します。青が製作したXBee湿度センサ、赤がリファレンスとして使用したSensirionの湿度センサSHT-71です。室内にてエアコンの除湿運転を行い、湿度変化を比較していました。
前述のとおり1週間にわたる測定による湿度値とADC値との寄与率は0.85%で実際のサンプルも近似曲線からの乖離が見られました。とはいえ、せいぜい湿度値で3%程度の乖離であり、下図においても、そこそこの精度が確保できていることが分かりました。また、ボクの経験上、HS-15Pの個体の誤差がとても小さく抑えられていると思っていますので、例え、その後の精度低下で著しく異なるようなことにはならないと思います。もし簡単な回路追加や設定などで対策可能な方法が判明したら情報をアップデートいたいと思います。
以上は本節の冒頭に述べたA温度、B電源電圧を一定にした場合の結果です。温度や電圧は別途、測定して補正します。温度はHS-15Pのデータシートから求めた近似式を利用しました。方法は「温湿度ロガー・HS-15P」に簡単に記載しています。また、電源電圧の変化は、そのままADC入力値を補正しました。これらの補正については、サンプルプログラムを参照してください。
ブレッドボードで製作したワイヤレス温湿度センサーでが回路規模を小さくすることに成功しましたが、回路規模を小さくしたことで小型化を図ることも出来ています。そこで、ここでは秋月の小さなパーツケースに回路を入れてみました。
前半のブレッドボード例の回路との違いは太陽電池に関わる部分です。まず、バッテリにリチウムイオン電池を使用しました。XBee ZBモジュールと基板との隙間にポリイミドテープで絶縁して入れています。僅かにXBee ZBモジュール用のコネクタの幅よりも電池の方が大きいのでコネクタ側の中央付近を少しだけ削っています。下図の電池(左側のコイン型の部品)とコネクタが接触している部分を良く見ていただくと少し削れているのが分かると思います。
太陽電池(3722サイズ)とリチウムイオン電池(約60mAh)は100円ショップで売られているキーホルダー型のLEDライト(小型懐中電灯)を使用しました。太陽電池とバッテリとの間には逆流防止用のダイオード(BAT42)を挿入しています。電気二重層コンデンサ(1.0F 5V)は電池と並列にしてリチウムイオン電池をサポートします。
裏面には表面実装用のコミッショニングボタンを実装しました。使用時はケースの上から押します。また動作確認用のLEDは表面(上図・左側)に実装し裏面(下図・右上)の基板のビス穴からLEDの頭だけが見えるようにしました。これで表からも裏からも点灯状態を確認することが出来ます。
部品の実装位置にこだわったり、写真の下の中央あたりのXBeeモジュール10番ピンにおいて一点アースの規則を守ったので、配線パターンはきれいではありません。なお、信号線には一定の耐熱性をもったビニール線を使用しました。
なお、XBeeモジュールの動作間隔を6分などにすれば、電気二重層コンデンサだけで(リチウムイオン電池が無くても)良さそうに感じるかもしれません。しかし、例えばペアリングする時の人による操作期間の電力量や室内で使うにしても日光が射し込まない雨の日などを考慮すると何らかの電池があったほうが良いと考えました。このあたりは太陽電池での発電量などから個々の利用形態に合わせた適切なエネルギー設計が必要です。
ここからは作成した回路の組立設計です。あえて設計という文字を入れたのは回路設計と同じように組立に設計的な配慮が必要だからです。
まずは太陽電池の接着です。ここではXBee ZBモジュールに接着します。これは製作後もXBee ZBモジュールを取り外してX-CTUなどで設定を書き換える場合を想定したためです。太陽電池を基板やケースに接着してしまうと、XBeeモジュールが取り外しにくくなってしまいます。
太陽電池とXBeeモジュールとをポリイミドテープで絶縁保護し、XBee ZBモジュールの4隅で白光製のハックルー(マジック半田)を使って太陽電池を接着します。ハックルーで接着する部分にテープの端がかかるようにするとテープを剥がれにくくすることが出来ます。
ハックルーの代わりにホットメルトでも良いですが、一度、ハックルーを使うとホットメルトには戻れなくほど作業性が良いです。ホットメルトのような臭いや糸引きが少なく、接着後の硬度や融点も高く、絶縁性も優れています。秋月電子で取り扱っています。
ポリイミドテープは半田の熱にも耐えれる絶縁テープです。小さな電子回路が異常をきたした場合、一点に熱が集中してビニールテープを溶かしてしまい、絶縁が溶けて大きな事故(火災など)につながる場合があります。太陽電池とXBeeモジュールとの間の絶縁が溶けるとXBeeの電源がGNDとショートしてしまう懸念もあり、ポリイミドテープでの保護が必要です。ストロベリーリナックスやアマゾンで扱っています。
裏面のスパゲッティ状態の信号線も部品のリード線の半田付け部分などを避けて引き回し、基板に固定します。ハックルーやホットメルトで固定するのが一般的ですが、ここでは前述のポリイミドテープを用いました。
その理由はケースへの引火防止です。秋月パーツケースは良く燃えるポリプロピレン樹脂製で、しかもカーボンを含有していることから、引火しやすい材質です。そもそも動作する回路を収めるケースではありません。
そこで回路全体(センサー部分を除く)をポリイミドテープで保護し、回路部品が発火してもケースに引火しにくいように工夫しました。
ここで説明するまでも無いかもしれませんが、湿度センサと温度センサーの近くを開口しておく必要があります。温度センサを基板端に配置しているのもこのためです。また湿度センサと温度センサが近い方が湿度の補正の精度が高まると思います。パルス駆動の回路なので、部品の発熱はあまり考慮しなくて良いと思いますが、密閉による温度差には十分に留意する必要があります。
穴をあける際は文房具の穴あけパンチを使いました。しかし、穴位置の調整が難しく、少しずれてしまいがちです。また温度センサの部分は内側のベロと合わせて2か所の穴が必要で、これらを一致させるのも難しいです。他の方法としてカッターで切り開く方法もありますが、どちらかといえば多少ずれても穴あけパンチの方が見た目が良いです。
以上のような秋月ケースに入る小型のワイヤレス湿度センサの製作には一定の電子工作の経験や慣れが必要です。とくに、安全性に関わるノウハウが必要なので少なくとも以上の説明で回路図や設計図が頭に描けない方は経験不足につき、ブレッドボードでの実験に止めておいた方が良いと思います。
ここでは太陽電池で発電した電力を電池に貯めて電気二重層の電荷でXBeeを動かす一例について説明しました。ところで、これがエナジーハーベストと言ってもどこに技術要素があるのか分からないかもしれませんので最後にエネルギー設計について触れておきます。
エナジーハーベストにおいては、どのくらいの光エネルギーを1日にどれくらいの時間あて、どれだけの容量を蓄積し、1日の消費量をどの程度にするかなどのバランスを考慮したエネルギー設計が重要です。また、用途や環境・条件によって結果が異なってきますので、実態をつかむには実験を行う必要があります。そこで、机上で目途をつけておいて、ブレッドボードを使った実験で確認し、その結果をフィードバックするような手法を用います。
机上検討は、なるべくどんぶり勘定で多くのケースを想定して模索し、良さそうな複数の指針を設定するのが良いでしょう。どんぶり勘定の例を挙げます。例えば照度1万ルクスで効率20%、出力約3mW(1mA)くらいとします。1時間充電で1mAh・3V、千ルクスだと0.1mAhだとか。1Fの電気二重層で3V〜4Vの区間で充放電すると約0.3mAhとか。XBeeの動作電流50mAを千分の一(0.5秒/360秒)の頻度で動かすと0.05mAとか。
このくらいの粒度だと、これらを机上や頭の中で様々な組み合わせで検討することが出来ると思います。1万ルクス、千ルクスなのかという例を挙げたのは実際の照度が天気や時間帯、太陽電池の置き場所や置き方でも変わるからです。そもそも桁があっている程度の計算しか出来ないということです。
机上でつめたら、その後にブレッドボードで試作した回路で実験を行います。このセンサーだけでも実験ノート10ページを超える実環境での実験を行いました。このとき、前述のどんぶり勘定の仮定が生きてきます。実験との相違がどこにあるかをつかみ、再設計と実験を繰り返します。
その中の一つに電源回路にDCDCコンバータやMPPTを設計して実験してみました。DCDCコンバータの場合、照度が低下すると太陽電池のインピーダンスが下がりすぎて全く充電できない問題が発生しました。またPICで製作したMPPT回路は消費電力を下げることが難しく、途中で断念することになりました。私の製作例においては、ダイオードだけで充電するのが最もましな結果となった経緯があります。わずか0.1mAhの容量で動かす回路ですからMPPT回路に割ける電流はせいぜい数uA。ナノワットテクノロジーと言えどAD変換しつつPWMを常時出力する動作をuAオーダに抑えるのは難しそうです。
このワイヤレスセンサーを製作する前に、Arduinoを使った温度・湿度ロガーを製作しました。その際、各種のセンサーデバイスを比較しました。HS-15P DHT11 DHT22 RHT03 AM2302 SHT-11 SHT-71などを検討中の方は、「Arduino温湿度測定ロガー・湿度センサーの比較」を参照ください。