気圧センサーを操作する

Raspberry Piにi2c-toolsをインストールしたので、これを使ってコマンドラインから気圧測定をしてみよう。前ページのi2cdetectコマンドで確認したように、「0x5c」に気圧センサーがあるはずなので、以下のように入力する。1行を入力したらEnterキーを押し、それを繰り返す。

sudo i2cset -y 1 0x5c 0x20 0x90
sudo i2cget -y 1 0x5c 0x0f
sudo i2cget -y 1 0x5c 0x28
sudo i2cget -y 1 0x5c 0x29
sudo i2cget -y 1 0x5c 0x2a

1行目のコマンドは、1秒ごとに測定を行うという指示だ。2行目のコマンドを入力、実行すると、「0xbb」と返答がある。LPS331に付属する資料を読むと、LPS331は0x0fというレジスタ(メモリの一種)を読み出すと、0xbbを返す仕様だ。3行目から5行目を実行すると、それぞれ16進数の値が得られる。

気圧センサーのLPS331がRaspberry piから認識されている場合は、コマンドを入力。認識されていない場合は、前ページに戻って確認のこと。2行目で「0x0f」レジスタを読み取ると、返ってくる値は「0xbb」となるはず。3行目から5行目の結果は、実行時の気圧によって異なる

ここでWindows PCの電卓アプリケーションを使って、上記のコマンドで得られた結果から、気圧を計算してみよう(今回はWindows 7かWindows 8.1の電卓を使用)。電卓を起動したら、メニューバーの「表示」-「プログラマ」でプログラマモードに切り替える。

次に「16進」のラジオボタンをクリックし、上記の3行目から5行目の結果を電卓に入力だ。入力の順序は、5行目の結果(0x2aの値)、4行目の結果(0x29の値)、3行目の結果(0x28の値)となる。「0x」は16進数を意味するので、今回の場合は「3ec222」と入力する(電卓のアルファベットは大文字なので「3EC222」と表示)。

Windowsの電卓で気圧を計算。まずプログラマモードにして、左の「16進」ラジオボタンを押してから、Raspberry Piのコマンド入力で得られた数値を入力

「10進」ラジオボタンを押して10進数に変換してから、MSボタンをクリック

続いて「10進」のラジオボタンをクリックしたのち、「MS」(メモリストア)をクリックだ。さらに、電卓のメニューバーで「表示」-「関数電卓」に切り替えて、「MR」(メモリリコール)をクリック。先ほどMS(メモリストア)した「4112930」という値が呼び出されたら、「/」「4096」「=」と入力して「4096」で割り算する。今回の結果は「約1004」で、 これが計測時の気圧、約1,004hPa(ヘクトパスカル)だ。

関数電卓モードにして、MRボタンを押し、/4096=と押せば、コマンド入力時の気圧が表示される。今回は1004.1333hPaとなった

ここまで終わったら、再び上記のコマンドを3つ実行してみよう(3行目から5行目)。おそらく、さっきと数字が違うはずだ。これは現在地の気圧が変化したというより、センサーのふらつきだ。あまり気にしなくてよい。

気圧は刻々と変わるし、センサーの誤差もある。今回の設定だと毎秒計測なので、2回目の計測(コマンド実行)では1回目と数値が異なるのが分かるだろう

これをシェルスクリプトで書いてみたのが下のプログラムだ。実行すると気圧が表示される。なお、実行するためには、あらかじめ「bc」というモジュールを「sudo apt-get install bc」コマンドでインストールしておく必要がある。シェルスクリプトの動かし方は、本連載の第2回を参照のこと。

「sudo apt-get install bc」コマンドを実行して、「bc」モジュールをインストール

下記のシェルスクリプトを実行した結果。「1005.56」(hPa)が、実行時の気圧だ

#!/bin/bash
# LPS331動作テスト
WHO_AM_I=`sudo i2cget -y 1 0x5c 0x0f`
if [ $WHO_AM_I != "0xbb" ]; then
  echo "device NG"
  exit 1
fi

### set active mode
sudo i2cset -y 1 0x5c 0x20 0x90

### read pres data
PressOut_XL=`sudo i2cget -y 1 0x5c 0x28`
PressOut_L=`sudo i2cget -y 1 0x5c 0x29`
PressOut_H=`sudo i2cget -y 1 0x5c 0x2a`

RawDatHex=`echo "0x${PressOut_H:2:2}${PressOut_L:2:2}${PressOut_XL:2:2}"`
RawDatDec=`printf %d $RawDatHex`
echo "scale=2;$RawDatDec/4096" |bc

### set power down
sudo i2cset -y 1 0x5c 0x20 0x00