google-site-verification: google3bd66dd162ef54c7.html

LPS331を使った気圧高度計の製作、不具合解決

 形としては一応完成したものの、特定の気圧で針の位置が大きくばたつく現象が出ていましたが、ようやく解決することが出来ました。

▼アナログ表示の高度計
気圧高度計

 原因はセンサーの値をCPUで読む時に、一部のデータは1サイクル前の値を読んでいたようです。具体的には気圧は3バイトの値で表現されていますが、最上位の1バイトは1回前の値を読んでいたようです。

 センサーの値が変になるのは1008hPa付近。ここで下位16ビットが全部ゼロになって桁上がりが発生しますが、この時に値の取得がミスっていたので大きな誤差となって見えていたということのようです。ちなみにこの現象は16hPa間隔で発生するはずです。

 もちろんそういうことが起こらないように、センサーはワンショットモードで動作させ、センサーの状態表示ビットを見て変換完了を確認してから値の読み取りを行っています。更にBDU(ブロックデータ更新)ビットを立ててデータの不一致が発生しないように設定していたのですが、実際には問題が起きてしまいました。

 で、そういう問題を起こす引き金になったのがセンサーから値を読み出すこのコード。
 long x;                             // データーは24ビット
 x = LPS331read(0x2A); // MSB
 x = LPS331read(0x29) | (x << 8);
 x = LPS331read(0x28) | (x << 8); // LSB

 データーはリトルエンディアンで入っているので、アドレスの上位から逆順に読み出して24ビットに合成しています。余分な変数を使わないので気に入っていたやり方です。でもこうやると真っ先に最上位を読むことになるのでセンサー側で値の準備が間に合わなかったようです。

 そこで以下のように書き直して、LSB側から順に読んで最後にまとめて合成するように変更することで問題は発生しなくなりました。
  long x, x1, x2, x3;
x1 = LPS331read(0x28);
x2 = LPS331read(0x29);
x3 = LPS331read(0x2A);
x = (x3 << 16) | (x2 << 8) | x1; // 合成

 こういうアクセス方法にしないとダメ!とか、データーシートのどこかに書いてあるんでしょうか。全部ちゃんと読んでないです。汗; 

 ただこれだけでは対策として心配なので、念のためにセンサーの変換完了確認ビットが立ってから1msのディレイを入れ、その後データーを読むように修正しています。

 ということで、気圧高度計のスケッチ20140419版、たぶんこれが最終版。

 ついでに、このスケッチで少し面白いことをやっているので解説しておきます。それはsetup()の中の下記の部分。
  if(digitalRead(7)==HIGH){       // CWがoffなら通常点灯(onならWeak Pull Upで点灯)
pinMode(13, OUTPUT); // 測定表示
}

 pin13はArduinoではおなじみのLEDで、このスケッチではセンサーの動作表示に使っています。LEDなので普通はOUTPUTにして使いますが、これをif文でパスさせるとデフォルトである入力ピンに設定されたままになります。

 プログラムの中でLEDを点灯させたい時は、あちこちでdigitalWrite(13,HIGH)とやっているわけですが、これが入力ピンにアサインされていた場合はWeakPullUpされることになり、この場合LEDはプルアップ抵抗に流れる電流で暗く点灯することになります。

 つまり、if文を一行追加するだけでプログラム全体のLEDの明るさを指定する機能を作り込むことができます。別のスイッチにもCW/CCW動作表示LEDのpinModeを操作するようにしているので、LEDの明るさのパターンをいろいろ選択できるようになっています。

 この方法ではLEDを全く点灯させないようにすることは出来ません。でもリセット時のボタンの押し方の組み合わせでLEDの明るさを簡単に暗くすることが出来るので、覚えておくと役に立つと思います。
関連記事

コメントの投稿

管理者にだけ表示を許可する

No title

返信ありがとうございます。

私は、前側のアドレスから順に一括して読み取っていたので、不具合に遭遇しなかった訳ですね。

MS5607はお値段高いのが難点ですが、うまくすれば扉の開け閉めで生じる気圧変化が観察できたり、面白いセンサです。(ステータス拾うのではなく、規定の時間待つ、というのが多々あるのが、今ひとつですけれども。)

多摩地区住人さん、おはようございます

すでにお使いになったかも知れませんが、気圧高度計の記事は、ブログの左側のカテゴリで、「アナログ高度計(LPS331AP) 」にまとめてあるので、こちらを使うと一覧の記事が読み易くなります。

URLだと下記になります。
http://radiopench.blog96.fc2.com/blog-category-31.html

ただ、カテゴリの分類は人によって受け止め方が違うので悩ましいです。 例えば、「Arduino」にするのか「気圧ロガー」とかです。

No title

ありがとうございます。

そちらを読ませて頂きます。
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード