室内外、クローゼット内などの温湿度を集中モニターしたくなったので、多チャンネルのワイヤレス温湿度ロガーを作ることにしました。いつものPICマイコンです。今回、SDやら多CHデータ管理で連続メモリがほしくなりましたが、リニアアドレスになっていないPICの使い勝手の悪さを改めて実感。#そもそもPICは種類が多すぎます。ほとんど機能が同じなのに、なんであんなに種類があるんですかね。温度センサは数多ありますが、湿度センサを考えると限られてきます。校正が必要など、使いにくい面があります。ここではデジタル出力の温度&湿度センサを用いました。内容的には、単体湿度センサ+温度センサを組み合わせて校正したもののようです。いくつか候補があります。・SHT-11(高いので不採用)高精度が定評のようですが、いかんせん高い。1個2000円くらいします。ebayでも同じくらいします。今回は10個ほど用いるので、価格で却下です。このセンサは小さいのも魅力です。安価ですが、精度が今ひとつのようです。他サイトの製作者様情報では、特に電源電圧に精度が依存するようで、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%です。調達できますので香港の業者から10個購入しました。送料は請求されませんでした。入手したセンサにはAM2302とあり、またの名をRHT-03というようです。3.3Vから動作しますが、3.1Vくらいになると精度が悪化するか、応答しなくなりました。3.3Vを入れる必要がありそうです。Specification:送受信モジュールの選定315MHzASK通信モジュールを使用。aitendoで入手しました。送信機RF315-TX-5、@350円。受信機RF315-RXB12、@680円。このような送受信モジュールは何種類もあります。送受信ともに、3.3Vで動作するもの、受信機にクリスタルが載っているものを選定ポイントにしました。安定的な性能を考えると、クリスタルをもったものが有利なはずです。RF315-RXB12はSYN470RというICを使っていて、データシートをみると中間周波数を430kHzにとったシングルスーパーになっています。ところで、この受信モジュールの出力インピーダンスはかなり高いようです。PIC内蔵のプルアップを有効にすると、電源フルスイングできなくなりました。このせいで同じポートにぶら下げたプッシュスイッチに対して基板裏でプルアップする修正が必要となりました。ハード設計・製作アナログぽっい部分はないため、IOをCPUとつなぐだけという単純な回路設計になります。主要な部品はaitendo+秋月で調達、CRなどは手持ちを使用。送信機は電池駆動のため省電力管理は必要で、給電制御をしています。いつものEagleで回路・アートワークを設計。PCB(3回目)と、3回発注。元々は1回目で受信機基板を、2回目で送信機基板をOlimexに頼む予定ではいました。2回目、Olimexに発注しようとしたら、Olimexの受注がストップしてます。なんでも、受注パンクだとか。Vacationにいっている間に小口基板発注のバックオーダーを大量に抱えこんだみたいです。基板発注が増えてきたのでしょうが、確か7月末〜9月中の1ヶ月強Vacationで仕事を止めていたと思うので、さもありなんと思います。み$115.65/5枚。ここは高いので5枚としました。み$30.43/10枚。予備?として1枚多く作ってあるとの事前情報どおり、実際は11枚入っていました。PCBへ発注すれば良かった。Cartのほうが、ドリル位置、シルク位置精度は上で、シルク擦れも少ないように見えます。PCBも全く問題ないレベルです。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はリファレンスの一部でもあるので、浮かすとまずいのだろう。結局、昇圧コン常時作動とした。5uA)ので、スリープ中に切る必要性はさして大きくなかった。たいした消費電流でない(1mA程度)ため、IOポート直給電。仕様では待機中消費電流0uAとありますが、実際には1mA程度流れており全く仕様通りではありません。送信中20mA程度流れるため、IOポート直ではドロップが大きく、TRをかまして電源カット。・CPUスリープ測定・データ送信は周期的に行いますので、その間はセンサ、送信モジュール給電を止め、CPUもスリープ。スリープ中はウオッチドッグだけが起動しており、ウオッチドッグで起こされます。プルアップ抵抗に無駄な電流が流れないよう、ソフト的ケアは必要。分1回測定でもほぼ1年持ちそうな感触です。今回から、開発環境をX-IDE、コンパイラをXC8にしました。レシーバ側はコード量が多くなったので、PRO版にしないと収まりません。それでも90%程度になっています。PRO版コンパイラは評価期間を繰り返しで凌ぎます。ホビーなので、大目にみてもらいたいところです。ある程度のボリュームになってくると、バージョン管理なしでは辛くなってきます。Subversionで管理してます。通信この製作で重要かつめんどくさいのが通信フレームの設計です。低レベル(質が悪いのではなく、インテリジェントでないという意味)なので、単にシリアルデータを食わせれば良いというものではありません。任意のシリアルデータは1または0が連続する可能性があり、これはDCに近づきますが、ASK通信モジュールに食わせるデータはある範囲のデューティ比に入れておく必要があります。対策として連続した0、1に対しても必ず変化が生じるよう符号化します。簡単なマンチェスタ符号を使いました。これは、1を"01"に、0を"10"にします。2.フレーム同期フレーム同期で受信側のビットクロック周期と位相を合わせます。これはペイロードに先行する"10"の繰り返しパターン(プリアンブル、SFD(スタートフレームデリミタ))で行います。SFDの最後には"11"というビットパターンが存在し、これはマンチェスタ符号の例外となるため、データ開始を検知できます。プリアンブルはフレーム同期のほか、受信モジュールのAGC、データスライサを先行して安定化させる役割ももっています。同期のためのプリアンブルとSFD、それに続いてペイロード、チェックサムでフレームが構成されます。ペイロード32ビットとサム8ビットはマンチェスタ符号化され、80ビットぶんの長さを持ちます。ペイロード内容は以下の32ビットです。送信データが無い状況では受信データがランダムに出力されていますが、これで正常です。外来ノイズの微少なH/Lを受けてランダムに出力されているのです。最初のプリアンブル部分でAGCが落ち着いていっています。できるだけデータ部分はこのような時定数回路が落ち着いた後がいいと思います。受信データSFDの"11"ビットにノイズが出ています。(横軸4.2divあたり)このように受信途中にノイズが出ることが良くありますので、こういった部分の影響を減らす作りが必要になってきます。送信機は約1分ごとに計測、データ送信をしてきます。複数の送信機があるため、同じタイミングで送信してくると都度輻輳することとなります。そこで、送信タイミングを乱数により不定化し、連続輻輳の可能性を下げるようにしました。SDファイルシステムファイルシステムはGPSデータロガーを作成した時に作ったものをレベルUPして実装しています。レベルUP内容は、既存ファイルへの上書き・アペンド機能の追加です。簡易版なので、FAT16のみ、ルートディレクトリのみ対応、SDHC未対応、ファイル読み出し未実装、同時オープン1個と記録用として最小限の実装です。ファイルフォーマットはCSVです。グラフィックLCD16x2などのキャラクタ型では狭いため、128x64ドットのグラフィックLCDを使用。グラフ表示を考えましたが、結局文字しか表示してません。それでも20x8文字くらい出るので、大きさの割に結構情報量は多いです。3.3V駆動可能なものは意外に少なく、aitendoのDMG12864iを使用。1500円はちょっと高いですかね。ドライバはpicfun.comより入手したものを改造して使用。受信データをUSBシリアルで吐き出す機能を実装。boxに接続してデータをロギングすればWeb公開、スマホからの参照など応用できます。Libraryを使用。XC8ではそのままでは動かず、レジスタアドレス固定のおまじないが必要でした。以下のように、時刻、送信機ID、温度、湿度、バッテリ電圧を送ってきます。18:55:10,ID=9,T=13.3,H=58.1,V=2.9別体のエコノナビットデータ受信機とあわせて、RDBへの記録とネットからデータを見られるようにしています。個体差は0.5°C程度のよう。仕様(±0.5°C)通り。3%程度で、さすがに温度以上に個体差が出ますが、仕様(±2%)通り。これも悪くないと思います。湿度で±2%は相当正確だという印象があります。は暑い(2014/08/18)対して床下の温度はほぼ一定。違うので比較はできないが、似たような傾向を示している。バッテリ消耗1.100均Ni-MH充電池2ヶ月弱というところ。自己放電多いのでこんなもんか。100均アルカリ電池1年以上持った。4.eneloop単四(750mAh)7ヶ月強。急速に電圧が落ちるNi-XX系の特性5.富士通製Ni-MH(750mAh)6ヶ月半。若干eneloopより短いか6.eneloop単四(Panasonic)約7ヶ月(2014/9/7〜2015/4/12)センサ故障(2013/05/31)屋外送信機の湿度値異常。1%はどう考えてもおかしい。数時間かけて故障?徐々に壊れるのか?センサばらし。手前のセラミック板が湿度センサと思われる。テスタで測定するとオープン。