PICキット マイコン実験シリーズ 「大気圧計の製作」
PICキット 周辺モジュールの用意
NO-01 14ピンCPU基板(PIC16F1823)
NO-12 LCD表示器 AQM1602
NO-15 I2Cバス増設モジュール
NO-21 LPS25H大気圧センサモジュール
以上の4種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
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
今回は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 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
これは秋月電子の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
LCD画面設計
2行ありますので、上段が大気圧表示にしようします。
温湿度センサがあれば、下段が温湿度表示とします
ATM XXXX.XX hPa 計15桁
TMP -XX.XX℃ 計15桁
温度表示は分解能はあるので、気圧に合わせて小数点以下2位まで表示しています。
しかし、精度は悪いので、小数点以下の存在意義はあまりありません。
また、100の位は内部で演算はしていますが、LCD表示はしません。
※補足
画像および実際の構成はNO-14のLCDを使用していますが、
プログラムはNO-12 AQM1602を想定して作成されています
2行ありますので、上段が大気圧表示にしようします。
温湿度センサがあれば、下段が温湿度表示とします
ATM XXXX.XX hPa 計15桁
TMP -XX.XX℃ 計15桁
温度表示は分解能はあるので、気圧に合わせて小数点以下2位まで表示しています。
しかし、精度は悪いので、小数点以下の存在意義はあまりありません。
また、100の位は内部で演算はしていますが、LCD表示はしません。
※補足
画像および実際の構成はNO-14のLCDを使用していますが、
プログラムはNO-12 AQM1602を想定して作成されています
ソースファイル 補足
詳細はソースファイルを見て頂きたく思います。
(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℃以下で、センサがデータを送信してくるのかどうかを、
実験として確認していません。
データシートをさらっと読んでみても、温度については気圧の説明と違い、
各種条件等あまり記載されておらず、投げやりな感じですしね。
詳細はソースファイルを見て頂きたく思います。
(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気圧計としてシンプルなプログラムとしましたです。
敬老の日の連休にプログラミングを行っていました・・・
その時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
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プログラミングの経験がほぼ無いので、あちこち間違いがあるためと思われますが、判明し次第追記します。
レベルコンバータ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プログラミングの経験がほぼ無いので、あちこち間違いがあるためと思われますが、判明し次第追記します。