C基板サイズのコンパクトな気圧計をPICで作った

※記事内に商品プロモーションを含む場合があります

今まで様々な気圧計を作ってきました。
SCP1000と8ピンPICを使った気圧計
【関連】8ピンPICマイコンとSCP1000で気圧計を作った

次はArduinoベースで作りました。
【関連】Arduinoで作った気圧計・低消費電力の要・ソフト編

LPS25HとPIC16F1827を使った小型気圧計

LPS25HとPIC16F1827を使った小型気圧計

今回の気圧計は

  • UARTにより測定データを送信
  • WDTとSLEEPにより省エネ化

を目指します。

電源

C基板に乗るサイズなので搭載する電池は単4電池1個になります。

単4電池をHT7733Aを使用したモジュールにより3.3Vへ昇圧します。

電池1本からの昇圧なので効率が悪いです。

チョッパー式の昇圧はコイルに電荷を貯めて
元の電源+電荷を流す事で昇圧します。

昇圧する電圧が元の電圧の2倍以上だと効率が悪くなります。
(正確には元の電圧×2-ダイオードのVf)

コイルにはあまのじゃく特性があり、コイルに流れる電流を遮断すると
サージと言われる高電圧が発生しますがDCDCコンバータではサージも利用します。

コイルガンなどのコンデンサの充電に使われる昇圧回路
サージをメインに使って高圧コンデンサに充電しています。

DCDCコンバータの出力にはリップル除去用の電解コンデンサ。
電解コンデンサにはOSコンを使用。

OSコンは長寿命、低ESRなのでより高いリップル除去効果などが期待出来ます。

配線

2016-10-10_22-52-43

電源とI2C以外の配線は上の図の様にしました。

RA1にプルダウン抵抗と、VDD間にタクトスイッチ。

バッテリー電圧測定用に電池+とAN0間に10KΩの抵抗を入れます。

PICのGPIOにあるポート保護ダイオードなどによりVDDに
電流が流れてしまう可能性があります。

10KΩの抵抗で電流を制限しPICの電源がONにならない様にします。

極力電源ラインは錫めっき線で行い、I2Cなどの信号は
0.32mmのエナメル線で行いました。

抵抗やパスコンはチップ型のモノを使用し半田面に実装しました。

基板左下にあるピンヘッダは充電とシリアル出力(9600bps)の機能があり
充電端子からショットキーバリアダイオードを経由して単4電池に充電されます。

充電を制御する機能は一切無いので
ソーラーパネルなどで一時的に充電する様の端子です。

クロック周波数4Mhzにする事で省エネ化

今までは8MhzでPICを動作させていましたが
今回は省エネ化の為、4Mhzで動作させました。

クロック周波数変更時はUARTのボーレート設定などの
再設定が必要となります。

WDTとSLEEPによる省エネ化

PICの消費電力の削減にはスリープさせるのが一番。
しかし、普通にスリープさせると復帰せず寝たまま。

そこでArduinoでやったウォッチドッグタイマとスリープ
を使って省エネ化しました。

ウォッチドッグタイマ(WDT)の本来の使い方は
マイコン動作異常時のリセット。

正常動作時は一定化間隔にCLRWDT命令を実行し
WDTによるリセットが行われない様にします。

マイコンに異常が発生した時はCLRWDT命令が実行されないので
WDTによりリセットされます。

しかし、WDTの動作。
通常動作時にWDTが実行されるとリセットされますが
スリープ時にWDTが実行されると復帰します。

Arduinoの時も、今回もこれを使って省エネ化を行っています。

しかし、UARTでシリアル送信中にスリープに入ると文字化けが発生するので
delayなどで送信待ちをする必要があります。

省エネの効果はクロック周波数を下げるよりもスリープの方が高いです。

FIFOによる気圧値の安定化

気圧値は測定ノイズにより、時々気圧が飛ぶ事があります。

FIFOはLPS331には無かった機能で
測定データの平均化を行う機能です。

この気圧計では32個の測定値で平均を出しています。
出力データ速度が1hzなので約30秒で測定値が安定化します。

これにより、前にあったLPS331よりも安定した測定値になります。

LPS25Hのレジスタの設定などは、こちらのサイトの
LPS25H 日本語マニュアルがとても参考になります。
【参考】デジタル出力の気圧センサー LPS25Hを制御する

起動時にLPS25Hをソフトウェアリセット

LPS25Hの電源OFFの時間が短いとPICはOFFになっていますが、
LPS25Hには電荷が残っていて電源をONにすると測定値が異常なことがあります。

測定値が異常だと気圧値が4096hPaや700hPa以下の表示になります。

この気圧計では
気圧値が2000hPa以上か500hPa以下の場合は異常値とする事にしました。

500hPa以下は平地の街中ではありませんが、
富士山山頂だと約600hPa、エベレスト山頂だと300hPaぐらいになるそうです。

また気圧計動作中に半田面を触る事で時々異常値になります。
その場合にはdeleyで数秒待つ事でWDTによるPICのリセット。

起動時にLPS25Hのソフトウェアリセットで正常に表示される様になります。

気圧差、高度差計

2016-11-06_08-04-55

上段が気圧差、下段が高度差を表しています。

高度計を入れたいと思ったのですが計算が複雑でメモリが足らないのでムリ。

ボタン操作で気圧差&高度差計に移った時の気圧と時間が経過した後の
気圧差と高度差を表示する様にしました。

これが結構正確で、上にすると+で下の方にすると-となり
30センチぐらいから認識します。

ただし、FIFOによる平均化を行っているので30秒位経たないと
完全には反映されません。

気圧と高度の関係

標高によっても異なりますが、地表付近では8m上昇する事で1hPa気圧が下がります。
この気圧計では0.001hpaを8センチに換算して表示しています。

【参考】気圧・気温・標高のビミョーな関係
【参考】第2章 気象観測

山など標高の高い場所は、また変わるので要注意です。

ただし、高度だけで無く気象によっても気圧は変わるので
気圧変動が激しい時は当てになりません。

電池電圧監視

気圧計には電池電圧を表示出来る画面も用意。

メイン画面でも電池電圧により、一部表示を変えているので
電池の残りが少ないのがすぐ分かります。

電池にはeneloopを使うので過放電防止の為
電池電圧が0.9V以下になったら動作を停止します。

気圧傾向表示

本来はグラフにしたかったのですが
ArduinoのAtmega328Pのプログラムメモリは32KBに対して
PIC16F1828のプログラムメモリは4Kワード。

PI16F系は1ワード14bitらしいので計算すると7KB。

圧倒的にPIC16F1827の方が少ないので気圧傾向ぐらいしか
出来ませんでした。

PICでも容量が多いマイコンもありますが
足も増えるので止めました。

ピン数が増えるならArduinoを使った方がデバックも簡単で良いです。

気圧傾向は30分前と現在の気圧が1hPa以上増減している場合に
▼や▲で表示します。

しかし、測定間隔を1分にして袋に入れてテストした時は良かったのですが
実際にはなかなか傾向表示されません。

この機能はこのままにしておきたいと思います。

なにせ、プログラムメモリの使用率が99.9%なのでこれ以上の変更は出来ません。

気圧と気温の校正

LPS25Hの気圧と気温はズレています。

気圧は4.6hPaほど高く、気温は2℃ほど低く出力されていました。

気圧はiPhone6Sの気圧計で校正し
海面更正した気圧値が名古屋アメダスの気圧値のと差が
1hPa以下に概ねなっていたので合っていると思います。

気温は別の気圧計や、目覚ましの温度などを参考に校正しました。
【関連】自作気圧計の校正はiPhoneに合わせると良いかも

気圧はセンサの経年劣化によって変わる事があるので
時々アメダスの気圧値と比較して誤差が増えていないか確認します。

まとめ

LPS25Hは600円、SCP100に比べて3分の1の値段なので精度が悪いと思っていました。
しかし、気圧差は30センチぐらいから認識するので以外に精度が良かったです。

SCP1000はSPI接続でサイズが大きく、高価。
今後、気圧計を作る時はLPS25Hにしようと思います。

あと、気圧値は合っているか不安になるので5000円ぐらいで
校正値が分かるサービスがあれば良いのにと思う次第です。

消費電流は電源側で約1mA。
スリープ中は消費電流0.5mAなどと少ないのですが、
マイコンが動作する時にパルス的に数mA流れます。

電池のWhと消費電力を単純に割ると約37日動作する様です。

でも、実際の電池容量は表記よりも少ないですし
先月エネループプロの買ってきてそのまま使ってどれぐらい持つか
テスト中です。

なおソースは非公開ですが、上の説明で分かる方の為にHEXファイルを
置いておきます、これは校正無しバージョンです。

LPS25H+PIC16F1827気圧計HEX
拡張子がtxtになっているのでhexに変更してから書き込んで下さい。