IMG_1899

Raspberry piで大気圧センサーMPL115A1を使う

ここではRaspberry piで秋月電子で買える大気圧センサーモジュールを使ってみます.
I2Cインターフェイスに対応したMPL115A2もありますが今回はSPIインターフェイスに対応したMPL115A1を使います

IMG_1899

スクリーンショット 2013-12-14 6.13.23

事前にRaspberry piでSPI通信を行うための設定を済ませておきます.

今回はPythonでプログラムを組んでみました。
このデバイスではデバイスごとのばらつきを補正するための補正係数を内部に持っています。それら補正係数を読み出した上で大気圧を算出します。他のセンサーと比較して複雑な計算処理が必要になるという事で使いこなしは少々面倒です.Google検索で見つかる同様の使いこなしについての記事を見渡してもその計算はいろいろと工夫されているのがうかがえます.ここでは出来るだけデバイスのアプリケーションノートにそった形で作っています.


import spidev
import time
import math
#main
spi_ch = 0
spi = spidev.SpiDev()
spi.open(0,spi_ch)
spi.max_speed_hz=(100000)

msb = spi.xfer2([0x88,0x00])
lsb = spi.xfer2([0x8a,0x00])
a0=(msb[1]<<8)|lsb[1]
if a0 >> 15:
     a0 = ~a0
a0int= (a0>>3)& 0b111111111111
a0fract = (a0 & 0b111)/8.0
a0val = a0int + a0fract*(0.1** int(math.log10(a0fract)+1))
print a0val    
if a0>>15:
     a0=-a0val
else:
     a0 = a0val
print 'a0',a0

msb = spi.xfer2([0x8c,0x00])
lsb = spi.xfer2([0x8e,0x00])
b1 = (msb[1]<<8)|lsb[1]
if b1 >>15:
     b1 = ~b1
b1int= (b1>>13)& 0b11
b1fract = (b1 & 0b1111111111111)/8191.0
b1val = b1int + b1fract*(0.1** int(math.log10(b1fract)+1))
if b1 >> 15:
     b1=-b1val
else:
     b1=b1val
print 'b1',b1

msb = spi.xfer2([0x90,0x00])
lsb = spi.xfer2([0x92,0x00])
b2 = (msb[1]<<8)|lsb[1]
if b2 >>15:
     b2 = ~b2
b2int= (b2>>14)& 0b1
b2fract = (b2 & 0b11111111111111)/16383.0
b2val = b2int + b2fract*(0.1** int(math.log10(b2fract)+1))
if b2>>15:
     b2=-b2val
else:
     b2 =b2val
print 'b2',b2

msb = spi.xfer2([0x94,0x00])
lsb = spi.xfer2([0x96,0x00])
c12 = (msb[1]<<8)|lsb[1]
c12 >>= 2
c12value = c12 / 4194304.0
c12 = c12value
print 'c12',c12

print
values=[]
for i in range(10):
     spi.xfer2([0x24,0x00])
     time.sleep(0.003)
     padcm=spi.xfer2([0x80,0x00])
     padcl=spi.xfer2([0x82,0x00])
     padc = ((padcm[1]<<8) | padcl[1])
     tadcm=spi.xfer2([0x84,0x00])
     tadcl=spi.xfer2([0x86,0x00])
     tadc = ((tadcm[1]<<8)| tadcl[1])
     padc >>= 6
     tadc >>= 6
     c12x2 = c12*tadc
     a1 = b1 + c12x2
     a1x1 = a1*padc
     y1 = a0 +a1x1
     a2x2 = b2*tadc
     pcomp =y1+a2x2
     pressureValue = (pcomp *65.0/1023.0+50)*10 # hPa
     print "%d:pressure:%0.2f hPa"%(i,pressureValue)
     values.append(pressureValue)
sum = 0.0
for i in range(len(values)):
     sum += values[i]
ave = sum/len(values)
print"average pressure: %0.2f hPa"%ave

実行するとコンソールには補正係数の計算途中も表示されます。不要な場合はコメントアウトまたは削除して構いません。測定ばらつきを吸収するために10回測定値の平均を最後に表示するようにしています.単位は天気予報でもなじみのあるヘクトパスカル(hPa)です。

上手く動作すれば、天気予報でみる気圧と同じ様な値が出てくるはずです.気圧は標高にも左右されそしてセンサーの周りの気圧変化にも非常に敏感です.センサーの近くで息を吹きかければそれも気圧の変化を及ぼします.正確な測定値を期待する場合には設置場所にも配慮する必要が有ります.

定点観測する事で気圧の変化のトレンドを知ることができます.たとえば低気圧の通過に伴ってセンサーの出力結果も値が上下するのが分かるはずです.大気圧の測定は気圧の変化のあくまで結果(現在の事象)であり、そこから未来の天気を予報をするのは難しいと思います.測定結果と同時に天候の様子を記録し、それぞれの相関を観察するのも面白いでしょう。天気が急速に変化する時には大気圧も急激に変化していきます。台風の通過では気圧が普段よりも一層低い値を示します.

Raspberry piを使えば測定結果をその都度メールで発信したり、Twitterでtweetしたり、GoogleDocのスプレッドシートに記録したりと、応用範囲はずっと広がります。ぜひ挑戦してみてください.