i2cgetコマンドでLPS331APを使うスクリプト

 2016-02-28
お手軽に気圧データを得られるLPS331をお手軽なi2cgetコマンド経由でお手軽に使うお手軽スクリプト
 

get_press-temp.sh



  • 使い方
    実行するだけで、1行目に気圧、2行目に気温を出力する
    % ./get_press-temp.sh
    1013.22
    21.14

  • 設定・変数
    • I2C_ADDR 使用するLPS331APのI2Cスレーブアドレス

  • 16進数のハンドリング
    i2c_getコマンドで8bitずつ取得する。i2cgetコマンドは一回ずつSTOPビットを送信してくれるステキ仕様なので16bitでは読めない。(設定で変えられる??)
    気圧は24bit、気温は16bitを取得した後、sedコマンドで先頭の 0x を取り除いて、trコマンドで小文字を大文字に変換しておく(bcコマンドが小文字の16進数表記を受け付けないため)
    最後にbitの並びに注意して文字列連結して気圧をPHEX_VALUE、気温をTHEX_VALUEという変数に入れておく。

  • 気圧数値の計算
    bcコマンドで16進数で計算させ、10進数で出力してもらう。計算式はLPS331APのドキュメントにあるモノそのまま。

  • 2の補数のハンドリング
    気温データは2の補数で表現されているので変換が必要。
    まずbcコマンドで気温データが0x8000より大きいか?小さいか?で負数か正数かを判断させる。(最上位bitで判定できる)
    負数の場合は気圧データから0x10000を引いて実データを計算し(フルビット0xFFFF + 1を引く)、10進数で出力。
    正数の場合は特に計算せず、10進数で出力。
    得られた実データ(10進数)は、TDEC_VALUE変数に入れておく。

  • 気温数値の計算
    LPS331APのドキュメントに載っている計算式そのままを計算して完了。ただしbcコマンドの出力で 0.1 が .1 と表示されてしまうのでprintfコマンドで整形。気温は絶対値1以下の領域になることがあるので気圧よりもケアが必要。。。

  • リセットしておく
    センサーをI2Cバスに付けたり外したりしていたら、正常に通信が出来るが(←これがやっかい)、ワンショット変換が動作しない状態になったことがあったので、念のため、最後にソフトウェアリセットを入れておくことにした。



というわけで、トリアエズ簡単に値を見てみるときに使う用のスクリプトでした。
perlとか使えばもっと簡単だろうけど、shellscriptでやるのもまた乙なモノ。


注意が必要なのは、LPS331APは定期変換動作でエラータがある(特定の条件で変換されないらしい)ということと、2の補数のハンドリングと、bcコマンドの出力がゼロの整数部を表示しないという点。(下記)
% echo "0.123" | bc
.123
% echo "-0.123" | bc
-.123
なんでこういう仕様なんだろ??


 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/222-1ae2ed80
≪ トップページへこのページの先頭へ  ≫