多チャンネルワイヤレス温湿度ロガーの製作
新築し、 室内外、クローゼット内などの温湿度を集中モニターしたくなったので、多チャンネルのワイヤレス温湿度ロガーを作ることにしました。
(最小限ほしい機能)
・温度と湿度をモニターできる
・センサは無線式で、電池駆動とする
・センサは10台くらい増設できる
・SDカードへの長期間ロギング
(欲を出して)
・内蔵液晶にグラフ表示する
・USBでPCに接続する
早速ハード構成設計。いつものPICマイコンです。
今回、SDやら多CHデータ管理で連続メモリがほしくなりましたが、リニアアドレスになっていないPICの使い勝手の悪さを改めて実感。
#そもそもPICは種類が多すぎます。ほとんど機能が同じなのに、なんであんなに種類があるんですかね。
#次からは別のマイコンにしようか...
温度センサは数多ありますが、湿度センサを考えると限られてきます。
単体の湿度センサは安価なのですが、温度補償が必要、交流駆動、個々に校正が必要など、使いにくい面があります。
ここではデジタル出力の温度&湿度センサを用いました。内容的には、単体湿度センサ+温度センサを組み合わせて校正したもののようです。
いくつか候補があります。
・SHT-11(高いので不採用)
高精度が定評のようですが、いかんせん高い。1個2000円くらいします。ebayでも同じくらいします。今回は10個ほど用いるので、価格で却下です。
このセンサは小さいのも魅力です。
・DHT-11(精度がイマイチなので不採用)
500円以下と
安価ですが、精度が今ひとつのようです。他サイトの製作者様情報では、特に電源電圧に精度が依存するようで、5V以外では使えないとのこと。
センサには3.6V〜とあるんですけど。
(参考:http://nax9800.blog.fc2.com/blog-entry-44.html)
性能的に見送りですが、下記のDHT-22とシリアルフォーマットが同じなので、DHT-22入手までの開発用として1個購入しました。
湿度の分解能は1%です。
・DHT-22/AM2302/RHT-03(採用)
精度はまずまずのようです。湿度の分解能は0.1%です。国内では1個1000円くらいで販売されていますが、ebayでは3-4ドル
で調達できますので香港の業者から10個購入しました。
なぜか送料は請求されませんでした。
入手したセンサにはAM2302とあり、またの名をRHT-03というようです。
3.3Vから動作しますが、3.1Vくらいになると精度が悪化するか、応答しなくなりました。しっかり3.3Vを入れる必要がありそうです。
DHT-22 Technical Specification:
315MHzASK通信モジュールを使用。aitendoで入手しました。
送信機RF315-TX-5、@350円。受信機RF315-RXB12、@680円。
このような送受信モジュールは何種類もあります。
送受信ともに、3.3Vで動作するもの、受信機にクリスタルが載っているものを選定ポイントにしました。
ものによってはLC共振回路、超再生受信もあるようです。安定的な性能を考えると、クリスタルをもったものが有利なはずです。
RF315-RXB12はSYN470RというICを使っていて、データシートをみると中間周波数を430kHzにとったシングルスーパーになっています。
ところで、この受信モジュールの出力インピーダンスはかなり高いようです。PIC内蔵のプルアップを有効にすると、電源フルスイングできなくなりました。
このせいで同じポートにぶら下げたプッシュスイッチに対して基板裏でプルアップする修正が必要となりました。
アナログぽっい部分はないため、IOをCPUとつなぐだけという単純な回路設計になります。
主要な部品はaitendo+秋月で調達、CRなどは手持ちを使用。
送信機は電池駆動のため省電力管理は必要で、給電制御をしています。ここは後述。
いつものEagleで回路・アートワークを設計。基板製造はOlimex(1回目)、PCB Cart(2回目)、Fusin PCB(3回目)と、3回発注。
元々は1回目で受信機基板を、2回目で送信機基板をOlimexに頼む予定ではいました。が、2回目、Olimexに発注しようとしたら、Olimexの受注がストップしてます。
なんでも、受注パンクだとか。Vacationにいっている間に小口基板発注のバックオーダーを大量に抱えこんだみたいです。
基板発注が増えてきたのでしょうが、確か7月末〜9月中の1ヶ月強Vacationで仕事を止めていたと思うので、さもありなんと思います。
PCB Cart発注の送信機基板。送料込み$115.65/5枚。
ここは高いので5枚としました。
Fusion
PCB発注の送信機基板。送料込み$30.43/10枚。予備?として1枚多く作ってあるとの事前情報どおり、実際は11枚入っていました。
最初からFusion PCBへ発注すれば良かった。
左:Fusion PCB製、右:PCB Cart製。
あえて差を揚げるとPCB Cartのほうが、ドリル位置、シルク位置精度は上で、シルク擦れも少ないように見えます。
Fusion PCBも全く問題ないレベルです。
Olimexは今現在(13/04/23)でも受注が止まってますし、Olimexより断然安価なFusion PCBを今後使っていこうと思ってます。
ちょっとした追加費用で裏面シルクも出来るみたいです。
完成したセンサ送信機と受信機(ケース下半身実装)
センサ送信機のASK送信モジュールは裏面についています。送信モジュールはピンヘッダを反対にしてチップ部品面を内側にしました。
センサ送信機は電池駆動のため、電源管理が重要です。電池寿命目標は単四2本で1年間駆動です。
・昇圧コンバータ停止(逆効果:回路後で修正)
電池の終止電圧はだいたい0.8とか0.9Vで、2直列でも1.8Vくらいです。一方、センサは3.3V必要なので、昇圧コンを使用。
スリープ中はCPUのみなので1.8Vでも良く、昇圧コンを落として省電力化しようと思ったがうまくいかない。
昇圧コンはTO-92パッケージの3ピンもので、いわゆる「イネーブル」ピンがない。
そこで、昇圧コンのGNDをTRでON/OFF制御しようとしたが、かえって電流が増えることととなった。
OFF中は確かに止まって消費電流を減らせるが、ONした時の電流は逆に増える。これはしっかりGNDに固定しないと駄目だ。
GNDはリファレンスの一部でもあるので、浮かすとまずいのだろう。
結局、昇圧コン常時作動とした。
もともと昇圧コンの自己消費電流は非常に小さい(typ 5uA)ので、スリープ中に切る必要性はさして大きくなかった。
・センサ給電停止
測定中以外は給電停止。たいした消費電流でない(1mA程度)ため、IOポート直給電。
・送信モジュール給電停止
送信中以外は給電停止。仕様では待機中消費電流0uAとありますが、実際には1mA程度流れており全く仕様通りではありません。
送信中20mA程度流れるため、IOポート直ではドロップが大きく、TRをかまして電源カット。
・CPUスリープ
測定・データ送信は周期的に行いますので、その間はセンサ、送信モジュール給電を止め、CPUもスリープ。
スリープ中はウオッチドッグだけが起動しており、ウオッチドッグで起こされます。プルアップ抵抗に無駄な電流が流れないよう、ソフト的ケアは必要。
下記のとおり、 分1回測定でもほぼ1年持ちそうな感触です。
電流[mA] | サイクル時間[s] | 電流積[mAs] | 備考 | |
スリープ中 | 0.04 | 60 | 2.40 | 60秒待ち |
測定中 | 2 | 1.2 | 2.40 | ほとんどセトリング時間 |
送信機ON(キーアップ) | 3.2 | 0.112 | 0.36 | 112波 x 2ms x 1/2 |
送信機ON(キーダウン) | 18 | 0.112 | 2.02 | 112波 x 2ms x 1/2 |
上記SUM | 61.5 | 7.62 | ||
消費電流積[mAh] / 日 | 2.80 | |||
推定電池寿命[day] | 428 | アルカリ単四=1200mAhの仮定 |
今回から、開発環境をX-IDE、コンパイラをXC8にしました。
レシーバ側はコード量が多くなったので、PRO版にしないと収まりません。それでも90%程度になっています。
PRO版コンパイラは評価期間を繰り返しで凌ぎます。ホビーなので、大目にみてもらいたいところです。
ある程度のボリュームになってくると、バージョン管理なしでは辛くなってきます。Subversionで管理してます。
この製作で重要かつめんどくさいのが通信フレームの設計です。
今回利用した
ASK通信モジュールは
低レベル(質が悪いのではなく、インテリジェントでないという意味)なので、単にシリアルデータを食わせれば良いというものではありません。
1.符号化
任意のシリアルデータは1または0が連続する可能性があり、これはDCに近づきますが、ASK通信モジュールに食わせるデータはある範囲のデューティ比に入れておく必要があります。
対策として連続した0、1に対しても必ず変化が生じるよう符号化します。最も簡単なマンチェスタ符号を使いました。
これは、1を"01"に、0を"10"にします。ビット量が2倍に増える欠点がありますが、受信データは正常ならば"01"か"10"なので、"11"とか"00"が来たらエラーになったということがわかり
ます。
2.フレーム同期
フレーム同期で受信側のビットクロック周期と位相を合わせます。これはペイロードに先行する"10"の繰り返しパターン(プリアンブル、SFD(スタートフレームデリミタ))で行います。
SFDの最後には"11"というビットパターンが存在し、これはマンチェスタ符号の例外となるため、データ開始を検知できます。
プリアンブルはフレーム同期のほか、受信モジュールのAGC、データスライサを先行して安定化させる役割ももっています。
3.フレーム詳細
同期のためのプリアンブルとSFD、それに続いてペイロード、チェックサムでフレームが構成されます。
ペイロード32ビットとサム8ビットはマンチェスタ符号化され、80ビットぶんの長さを持ちます。
ペイロード内容は以下の32ビットです。
Name | Bit width | Contents |
ID | 4 | 送信機ID(00 〜 15) |
Batt volt | 4 | 電池電圧 (LSB=0.1V Offset=1.6V) (1.6〜3.1V) |
Temp | 12 | 温度 LSB=0.1℃ Signed |
Humidity | 12 | 湿度 LSB=0.1% Unsigned |
実際の波形例
CH1:送信データ CH2:受信データ CH3:受信AGC電圧 CH4:データスライサ比較電圧
送信データが無い状況では受信データがランダムに出力されていますが、これで正常です。
外来ノイズの微少なH/Lを受けてランダムに出力されているのです。
最初のプリアンブル部分でAGCが落ち着いていっています。
できるだけデータ部分はこのような時定数回路が落ち着いた後がいいと思います。
受信データSFDの"11"ビットにノイズが出ています。(横軸4.2divあたり)
このように受信途中にノイズが出ることが良くありますので、こういった部分の影響を減らす作りが必要になってきます。
ゼロスパンのスペアナ波形
4.多重化
送信機は約1分ごとに計測、データ送信をしてきます。複数の送信機があるため、同じタイミングで送信してくると都度輻輳することとなります。
そこで、送信タイミングを乱数により不定化し、連続輻輳の可能性を下げるようにしました。
ファイルシステムはGPSデータロガーを作成した時に作ったものをレベルUPして実装しています。
レベルUP内容は、既存ファイルへの上書き・アペンド機能の追加です。
簡易版なので、FAT16のみ、ルートディレクトリのみ対応、SDHC未対応、ファイル読み出し未実装、同時オープン1個と記録用として最小限の実装です。
ファイルフォーマットはCSVです。
16x2などのキャラクタ型では狭いため、128x64ドットのグラフィックLCDを使用。グラフ表示を考えましたが、結局文字しか表示してません。
それでも20x8文字くらい出るので、大きさの割に結構情報量は多いです。
3.3V駆動可能なものは意外に少なく、aitendoのDMG12864iを使用。1500円はちょっと高いですかね。
ドライバはpicfun.comより入手したものを改造して使用。初期化の方法はhttp://avr.paslog.jp/article/1252802.htmlを参考にしました。
代表的画面表示
個別表示・アラーム設定 | 一括表示 | セットアップ |
受信データをUSBシリアルで吐き出す機能を実装。
PCやLinux boxに接続してデータをロギングすればWeb公開、スマホからの参照など応用できます。
PIC側のUSBシリアルドライバはMicrochip Application Libraryを使用。XC8ではそのままでは動かず、レジスタアドレス固定のおまじないが必要でした。
CDCデバイスなので、Linuxに接続すると標準ドライバで対応され、/dev/ttyACMx から読み出せます。
以下のように、時刻、送信機ID、温度、湿度、バッテリ電圧を送ってきます。
# cat /dev/ttyACM0 2013/04/20 18:55:02,ID=0,T=17.7,H=47.3,V=2.6 2013/04/20 18:55:09,ID=1,T=16.7,H=59.3,V=2.9 2013/04/20 18:55:10,ID=9,T=13.3,H=58.1,V=2.9 |
別体のエコノナビットデータ受信機とあわせて、RDBへの記録とネットからデータを見られるようにしています。
センサ送信機10台を机上に並べ、個体誤差を調査
温度個体差
温度 個体差は0.5℃程度のよう。仕様(±0.5℃)通り。悪くないと思います。
湿度個体差
湿度個体差は3%程度で、さすがに温度以上に個体差が出ますが、仕様(±2%)通り。
これも悪くないと思います。湿度で±2%は相当正確だという印象があります。
温度変化
湿度変化
対して床下の温度はほぼ一定。
温度比較
湿度比較
場所が違うので比較はできないが、似たような傾向を示している。
1.100均Ni-MH充電池
2ヶ月弱というところ。自己放電多いのでこんなもんか。
2.
100均マンガン電池
約14週間。
3.
100均アルカリ電池
1年以上持った。(2014/08/07〜2014/08/23)
4.eneloop単四(750mAh)
7ヶ月強。(2014/01/23〜2014/09/06) 急速に電圧が落ちるNi-XX系の特性
5.富士通製Ni-MH(750mAh)
6ヶ月半。(2014/05/26〜2014/12/12) 若干eneloopより短いか
6.eneloop単四(Panasonic)
約7ヶ月(2014/9/7〜2015/4/12)
屋外送信機の湿度値異常。1%はどう考えてもおかしい。
故障に至る変化。数時間かけて故障?徐々に壊れるのか?
センサばらし。手前のセラミック板が湿度センサと思われる。テスタで測定するとオープン。
裏面。STマイクロのおそらくマイコンを搭載。型番不詳。
余剰送信機で代替え。センサ予備の購入が必要かもしれない。
ebayで購入。送料込みで1個4ドルくらいだったはず。前回と別の取引先と思いますが、今回もHong Kongからの発送です。
AOSONG というメーカ名刻印が追加されています。
格子の穴が若干大きくなった印象を受けるほか、中も白っぽくなっており、センサ面の基板もシリコンモールディングされているようです。
今回購入品 |
前回購入品 |
メーカ元箱に入っていました。
長穴は面倒で、今現在ハンドニブラが手元にないため先送りしてましたが、時間があったのでドリル+やすりで穴加工。(13/10/19)
液晶上にはアクリルをつけます。かなりすっきりした感じです。
左1号機、右2号機
2号機用の送信機(6台)
今回もセンサはebayで購入。例によってHongKongからの郵送です。
1mm厚のアクリルを切って、縁を裏側から黒色スプレーで塗装。
引き締まった感じになり、高級感が出ます。
アクリルの保護シートを塗装のマスキングとしましが、結構うまくいきました。
基板設計、ソース他(DesignMaterials.zip) ←ちょっと古いのでそのうち更新します。
個人利用に限り、断りなく使ってもらって結構です。
権利は放棄しません。再配布はご遠慮ください。
上記受信機基板の余りがあります。作ってみたい方は送料込み1000円でお譲りします。
タクトスイッチサブ基板の切り出しは制作者様でお願いします。Vカットは入っておりません。
なお、送信機基板の余りはありません。
[戻る]
Created: 2013/04/23
Updated: 2016/10/03