PICでI2C - 大気圧・温度センサーLPS331APの使い方
間違って記事を上書きしてしまったようなのでもう一度書きます。
と言っても何を書いていたのかよく覚えていないので前の記事とはちょっと内容が違うかも....
それからこのセンサーを“気象観測”的な目的で使う場合は「大気圧センサーLPS331APの正しい使い方」も読んでおいた方がいいと思います。“実用”目的でしたら
「PIC/I2C大気圧センサーLPS331APの測定値をSDカード(SPI)に記録する - はじめに」
を参考にしてください。
またLPS331APには後継機種(?)LPS25Hが出ています。
「海面更正気圧の計算結果を気象庁とくらべてみた - I2C大気圧センサーLPS25H+LPS331AP」
「I2C/SPI大気圧センサーLPS331APとLPS25Hの精度を比較する (1)」
「I2C/SPI大気圧センサーLPS25Hの使い方 - 1 - 実装」
なおサーミスタ温度計の話は「PICで作るお手軽サーミスタ温度計」に引っ越しました。
LPS331APの気圧計の精度が気になる方は
「台風18号による東京の気圧変化 2014/10/05-06」
「海面更正気圧を気象庁とくらべてみた - I2C大気圧温度センサーLPS331」
「I2C大気圧センサーLPS331の驚くべき分解能」
を御覧ください。なかなかの実力です。
温度計の精度が気になる方は
「温度センサー3種の精度比較(摂氏0度~40度編)」
「PICでI2C - 温度センサーLP331APとAM2321の精度比較」
「I2C大気圧センサーLPS331の分解能はほんとうに高いのか?(温度編)」
を参考にしてください。データシート上は±2度ですが、意外と正確です。
ただ30度を超えるあるいは5度を下回る温度では誤差が大きくなります。
使い方については私の記事より次の記事の方が役に立ちそうです (^^;;
「きむ茶工房ガレージハウス - 気圧センサー(LPS25H)で大気圧を測定して見ます」(PIC)
「きむ茶工房ガレージハウス - 気圧センサー(LPS331AP/LPS25H)で大気圧を測定して見ます」(Arduino)
-----
これパッケージはHCLGA-16Lというそうですが極小サイズです。もちろん秋月でDIP化してあるのを買ってきます。ピンも自分でハンダ付けする必要はなかったと思います。
写真の右下隅にある青いLEDが光っているのがLPS331AP(をDIP化したもの)です。
この写真じゃパスコンがつけてありますが、パスコンはDIP化基板の上についてました。不要です。
VSS,VDD,SCL、SDAの四つのピンはとうぜん接続するのですが、その他にCSピンをVDDに接続します。これでI2Cとして動作します。
またSAOピンはアドレスの選択用です。
SAO=>VDD 0x5D(0xba/0xbb)
SAO=>GND 0x5C(0xb8/0xb9)
どちらを選択してもいいわけですが、私の場合は0x5Cを選択すると温湿度センサーAM2321とアドレスがかち合うので必然的にVDDにつないで0x5Dの方にしています。そう言えばI2Cでアドレスが同じデバイスをいっしょに使うときのやり方をまだ記事にしてませんでした (^^;;
どうしても同じアドレスのデバイスを使う必要があるときは
「同じアドレスのI2Cデバイスを使う」
を参考にしていただければと思います(じつはもっととっても簡単なやり方があるのかもしれませんが、経験不足で....)
----
まずデータを取得するところはこんな感じです。
こうやったら取得できたというだけでこれが“適切”なコーディングかどうかはわかりません。
// LPS331APのデータを取り込む
ans = I2C_Start(LPS331_ADRES,RW_0);
if (ans == 0) {
I2C_Send(0x20) ; // レジスタ0x20(CTRL_REG1) へ書き込みます
I2C_Send(0x90) ; // 0x80 アクティブにする+0x10 1秒1回のレートで変換(下記参照)
}
I2C_Stop() ;
__delay_ms(100) ;
for( i=0x2c;i>0x27;i--){
ans = I2C_Start(LPS331_ADRES,RW_0);
if (ans == 0) {
I2C_Send(i) ; // センサーのデータは0x28~0x2cに格納されています。
ans = I2C_rStart(LPS331_ADRES,RW_1) ;
if (ans == 0) {
ip_LPS331[0x2c-i] = I2C_Receive(NOACK) ;
}
}
I2C_Stop() ;
}
センサのデータの格納は次の順番です。
PRESS_POUT_XL_REH
PRESS_OUT_L
PRESS_OUT_H
TEMP_OUT_L
TEMP_OUT_H
上でiを0x2cから0x28へ変化させているのはこのためです。
ところで今プログラムとデータシートを見比べたら見たら一回限りの変換だと0x20レジスタにセットするのは0x90じゃなくて0x80でよさそうです。また0xF0だと1秒間に25回データを取得できるような。じっさいにやってないのではっきり書けません。データシートで確認してからやってみてください。他にいろいろ設定ができます。データシートはよく読んでおいた方がよさそうです(2014.10.19)
----
データを取得したらそれから気圧と温度を計算するのですが、秋月のペラペラの説明書には温度の計算の仕方が書いてありません。これは秋月のページにもリンクがあるデータシートの方に書いてあります。面倒なのでプログラムを書いておきます。
XC8コンパイラ、ターゲットはPIC16F1938、float=32bit、double=32bitでやってます。
気圧は24bitなのでfloat=32bitが必要になるのですが、実際そこまでの分解能はなさそうなのでfloat=24bitでも十分でしょう。
-----
気圧
prs_LPS331 = getPrsLPS331(ip_LPS331+2);
float getPrsLPS331(int *ip)
{
float fp;
fp = ip[2]; // これはなくてもいいでしょう。
fp = fp/256.0 + ip[1]; // ip[2]を使わない場合ここは fp = ip[1]; となります。
fp = fp/16.0 + ip[0] * 16.0;
return fp;
}
最下位のip[2]を使うとfloat=24bitでは精度が足りません。float=32bitでのコンパイルが必要です。ただLPS331APの実質的な分解能はそこまでなさそうなのでip[0]とip[1]だけから気圧を計算するということでもよさそうです。これだとfloat=24bitでもいいですし、それでも0.06hPaくらいの分解能はあります。
-----
温度
プログラムにあるように得られたデータを480で割って42.5に足したものが温度です。データは2の補数になっています。
tmp_LPS331 = getTmpLPS331(ip_LPS331);
float getTmpLPS331(int *ip)
{
float fp;
fp = ip[0];
fp = fp*256.0+ip[1];
if(ip[0] & 0x80 ) {
fp -= 65536.0;
}
fp=42.5 + fp/480;
return fp;
}
------
例によって「きむ茶工房ガレージハウス - I2C通信の実験」にあるI2Cライブラリを使うことを前提に書いています。
=> “自前”のものも用意しました。
「I2Cのソース - PIC12F1822/16F1705/16F1938/18F26K22 - LCD(ACM1602)を例にして」
------
関連
「I2Cデバイス・アドレス一覧」
「同じアドレスのI2Cデバイスを使う」
「PICで平方根 - 白金薄膜抵抗で温度を測る」
「PICでI2C - 1 (温度計を作る)」
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
「PICでI2C - LCD(液晶)ディスプレイによる違い」
「I2C大気圧センサーLPS331の驚くべき分解能」
「炭素皮膜抵抗の温度係数を測定する話」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「ミニ恒温槽の作成に向けて - 1」
参考
「きむ茶工房ガレージハウス - PICの動かせ方入門はこちら - 16F1938覚書」
「きむ茶工房ガレージハウス - I2C通信の実験」
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
以上は予習として拝見していたのですが、とても参考になります。他にも勉強になる記事が多いです。
私の記事を読んでI2Cのセンサーを使って温度計とか気圧計とかそういうものを作りたくなった方も実際に作られるときはこちらを読まれた方がいいと思います。
関連
「I2C大気圧センサーLPS331の驚くべき分解能」
「I2C大気圧温度センサーLPS331 - 海面更正気圧を気象庁とくらべてみた」
「台風18号による東京の気圧変化 2014/10/05-06」
「台風19号による東京の気圧変化 2014/10/12-」
「PICでI2C - ADコンバーター・MCP3425の使い方」
「I2Cデバイス・アドレス一覧」
「PICで平方根 - 白金薄膜抵抗で温度を測る」
「PICでI2C - 1 (温度計を作る)」
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
「PICでI2C - LCD(液晶)ディスプレイによる違い」
「炭素皮膜抵抗の温度係数を測定する話」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「ミニ恒温槽の作成に向けて - 1」
« PICでI2C - 温度センサーLP331APとAM2321の精度比較 | トップページ | 熱電対の起電力の近似式 - 起電力と温度の相互変換 »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
この記事へのコメントは終了しました。
« PICでI2C - 温度センサーLP331APとAM2321の精度比較 | トップページ | 熱電対の起電力の近似式 - 起電力と温度の相互変換 »
コメント