↑ 当局の実験室内の気圧表示

画像上のLEDが光っているのは、
LPS25Hセンサーモジュールです
PICキット 周辺モジュールの用意

NO-01 14ピンCPU基板(PIC16F1823)

NO-12 LCD表示器 AQM1602

NO-15 I2Cバス増設モジュール

NO-21 LPS25H大気圧センサモジュール

以上の4種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。



↑ 14ピンCPUモジュール
  PIC16F1823が差し込まれています



↑ I2Cバス増設モジュール

  画像左側が電源分岐
  画像右側がSCL/SDAライン分岐
  画像上側にある半端なピンは
  プルアップピンです。
  この基板上ではプルアップしていません
14ピンPIC16F1823CPUモジュール

今回はI/OピンにI2Cバスとして2本使用します。
8ピンPICでも構成できますが、8ピンも14ピンもPIC本体価格が変わらないので、
14ピンPIC 16F1823を使用します。

温湿度センサ及びLCD表示には、このI2Cバスで接続します。
それぞれスレーブアドレスが違いますので、パーティーを組めます。
バスアクセスにはPIC内蔵MSSPモジュールを使用して、送受信を行います。
I2CバスはRC0がSCL、RC1がSDAとなります。
これをI2Cライン分配モジュールに接続し、そこからセンサとLCDに分岐します。

PIC16F1823機能設定

・システムクロックは内部発振および4XPLLで32MHZ
・I/Oピンはすべてデジタルで、RC0-1は入力設定
・RA4-5は出力設定とし、LEDモジュール駆動可能です。

プログラム(すべてアッセンブラです)
・MSSP低レベルルーチンはVer0.2aを使用しています。
 それ以前のバージョンでは、うまく動作しません
・LCDドライバルーチンは、AQM1602用を使用しています。
 5V用にコントラスト値を設定しています。
 3.3Vの電池駆動とするには、この値を変更します。
・メインプログラム
 1秒おきにセンサにアクセス、そして演算およびLCDに表示とを行っているだけです。
 割込み等は使用していません。

※ 画像はHDC1000の物を使い回しています m(__)m

↑ NO-21 大気圧センサモジュール



↑ 秋月電子 AE-LPS25H

これを基板上のICソケットに挿入
NO-21 LPS25H大気圧 センサモジュール

これは秋月電子のAE-LPS25H使用しています。
このままでは使いづらいので、8ピンICソケットに挿入する形をとっています。

主な仕様
 260hPa~1260hPa 計測精度±1hPa
 0℃~65℃ 計測精度±2℃

ピン配置
① VDD 1.7~3.6V(絶対最大定格4.8V)
② SCL
③ SDA
④ SDO スレーブアドレスの下位ビット決定
⑤ CS  VDDに接続するとI2Cとなる、SPIの場合はチップセレクト
⑥ NC  無接続
⑦ INT1 インタラプト1
⑧ GND


↑ 全体構成画像

NO-12のLCDは見ずらいので、
NO-14のLCDを代りに接続してます

LCD画面設計

2行ありますので、上段が大気圧表示にしようします。
温湿度センサがあれば、下段が温湿度表示とします

 ATM XXXX.XX hPa   計15桁
 TMP  -XX.XX℃     計15桁

温度表示は分解能はあるので、気圧に合わせて小数点以下2位まで表示しています。
しかし、精度は悪いので、小数点以下の存在意義はあまりありません。
また、100の位は内部で演算はしていますが、LCD表示はしません。

※補足
画像および実際の構成はNO-14のLCDを使用していますが、
プログラムはNO-12 AQM1602を想定して作成されています
PICキットシリーズ用
LPS25H大気圧計プログラム

ソースファイル

 16F1823_LPS25H_01.asm

HEXファイル

 16F1823_LPS25H_01.hex
ソースファイル 補足

詳細はソースファイルを見て頂きたく思います。

(1)MSSP・I2Cマスタモード低レベルルーチン Ver0.2a
  HDC1000の時とほとんど変わらないのですが・・・
  当初、何故かセンサー アクセスルーチンがうまく動作しませんでした。
  きっちりと規定に沿ったアクセスをしないと、すぐ受信待ちループしてしまう様でした。
  よって、PICマニュアルをよく読み、細部を見直したつもりです・・・
  結果、何とか安定してアクセスできるようになりました。
  バージョンはマイナーチェンジのため、Ver0.2aとしています。
  まだまだI2Cバスの仕様を満たしていないのは今まで道理です。

(2)LPS25H 大気圧センサ アクセスルーチン
  初期設定で単発測定(データ長24bit)としています。
  計測は約1秒間隔でセンサに対して測定指令を出しています。
  センサは多機能で、自動間欠測定やFIFOを使用した平均値出力、その他等
  結構高機能で、ちゃんと設定すると、素晴らしい気圧計や高度計となるようです。
  ついでですが、温度データも受信しています。
  温度データは16bitで、さらにおまけ的扱いの様です・・・

(3)演算およびLCD表示(ほぼメインルーチン)
  LCD表示ルーチンはHDC1000と全く同じで、ここでは省きます。
  メインの気圧データ計算は簡単でGOOD!です (^^♪
  それはただ、単純測定しかしていないからですが・・・

  おまけの温度データ処理では、ビットシフトでは割り切れない除算が出てきます。
  どう対処しようかと一瞬悩んだのですが、当局はただのアマチュアです。
  余計なプライドは邪魔者以外何物でもありません。よって、当局レベルに合わせて?
  小学校時代から慣れ親しんだ筆算方式での16bit除算ルーチンを作る事に、
  何も準備要らずの単純イメージでプログラムできるのがGOOD・・・ (-_-;)
  ソースコードを読むと、多分笑っちゃいます・・・
  その他は今までの16bitおよび32bit符号無整数演算ルーチンを使い回しています。
  小数点以下の処理もHDC1000の時のルーチンを使い回しています。
  送信されてくる16bitのデータを見ると、100℃の位も存在します。
  演算はしていますが、表示の段階でカットしています。
  そもそも、100℃以上0℃以下で、センサがデータを送信してくるのかどうかを、
  実験として確認していません。
  データシートをさらっと読んでみても、温度については気圧の説明と違い、
  各種条件等あまり記載されておらず、投げやりな感じですしね。


結果および感想

敬老の日の連休にプログラミングを行っていました・・・
その時2日間はしっとりと雨天でしたが、気圧計は1012hPa~1013hPaを指しています。
高校の教科書では、1013hPaが1気圧と記憶していますが、常に少々低めでした。
画像の様に快適な気温と気圧の環境下でプログラムできました。
センサに手を近づけると、そそくさに温度が変動します。
その後、数日連続運転していたのですが、段々と気圧が上昇して来たなと観察していたら、
1020hPaを超えていたので、外を見ると 快晴でした。
当地では冬になると常に1000hPaを下回る日々となるのかと予想していますが・・・
何か無線室に1台あっても良さげだし、毎日ちらっと観測するのも楽しそうかな?
と言う訳で、常設用機器として作ってみたくなりました。

その他
今回も過去に作成したルーチンの組合せで、すぐできると思ったのですが・・・
結局、MSSPと演算ルーチンはあちこち見直しする羽目になりました・・・
その過程で、演算ルーチンでのバグも結構発見しました・・・

気圧・温度共に小数点以下は計測のたびに変動します。
特に通電開始時は変動大きく、連続通電で、割と安定してくるようです。

当初はHDC1000とのコラボで、気温・湿度・気圧表示の他に何かやろうか・・・、
と楽しみながらプログラミングしていたら、だらだらソースコードが長くなり、
突然アッセンブルエラーが出まくり焦りましたが、PICメモリオーバーが原因でした、
結局、ここではLPS25H気圧計としてシンプルなプログラムとしましたです。
PICキットシリーズ用
LPS25H大気圧計プログラム
XC8版ソースファイル

 16F1705_LPS25H_01.c


 LPS25Hv1.h
 LPS25Hv1.c

 AQM1602v1h
 AQM1602v1.c

 MSSP02b.h
 MSSP02b.c
追記 2017年03月

レベルコンバータPCA9306がI2Cバスにぶら下がっていると、AQM1602の動作が不確実になる場合がある事が判明しました
原因が解り次第追記します

↑ 原因考察
これはI2Cバスの負荷が重すぎる(プルアップ抵抗値が低い、他)のが原因と思われます。
それらの原因によりバス上のパルス波形の変形でデータ通信がうまく行かなくたったと思われます。

追記 2017年03月25日

アッセンブラソースからXC8用に移植してみました。
動作環境は上記アッセンブラ版と同じなのですが・・・
都合により、PIC16F1705に差し替えての動作と変更になりました。
PIC16F1823ではメモリ不足でコンパイルできません。
当初、コンパイルエラーの理由が解らず、少し悩みました・・・
メモリ不足の大きな原因はprintf()関数を使用したためです。
また、PIC16F1705はPPSレジスタ設定を行わないとMSSPが使えません。
ここもPIC16F1823と違う所ですが、高機能化の代償でしょうか。
簡単な設定ですが、詳細はCソースファイルを参照してください
制御関数の詳細は、PICキットモジュール紹介欄を参照してください

MPLAB XIDEの設定(コンパイラのオプション設定)について
XC8はデフォルトでDOUBLEは24bit浮動小数点となっている様です。
それは実際にエミュレータのWATCHで24bitなのを確認しています。
これを32bit浮動小数点にして使っています。
指定方法は、ダッシュボード左上アイコンの「Project Properties」を開きます。
「Categories」からXC8をクリックし、「Additional Options」に、
「--DOUBLE=32」と記載します。
この方法で良いのかは不明ですが・・・ (^_^;)
エミュレータで32bitになっているのは確認しています。
ところで、24bitのままでも気圧値は演算部分のエラーは出ずに処理していますし、
LCDにちゃんと表示されている様に見えます・・・
合っているのかどうかは不明ですが。

ソースプログラムについて
メイン関数だけでは動作しません。
MPLAB XIDEのプロジェクト(画面左上)で、

「Header Files」には、下記の3ファイルを登録
AQM1602v1.h
LPS25Hv1.h
MSSP02b.h

「SourceFiles」 には、下記の4ファイルを登録
16F1705_LPS25H_01.c
AQM1602v1.c
LPS15Hv1.c
MSSP02b.c

以上を設定のうえ、コンパイルしてください
エラーが沢山出ますが、(^_^;) ちゃんとビルドおよび動作確認しています。
当局のCプログラミングの経験がほぼ無いので、あちこち間違いがあるためと思われますが、判明し次第追記します。
戻る  実験・製作の記録TOPへ戻る