3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

mrubyで気圧を測ってみた

Last updated at Posted at 2018-04-18

蟹さんでI2Cが使えるようになったので、手元にあったFreescale社製のMPL115A2を試してみました。MPL115A2は以前秋月電子で購入しましたが、現在は販売されていないようです。SPIの方はまだ取り扱っているようです。

I-04596.JPG

ネットを検索するとMPL115A2のページはたいていfloatで計算していますが、蟹さんはmrubyをMRB_WITHOUT_FLOATでビルドしてlibmをリンクしていないのでfloatが使えません。

いろいろ調べてみたところ、アプリケーションノート How to Implement the Freescale MPL115A Digital Barometer AN3785(Rev 6, 6/2012)の最後の方にfloatを使わないCコードがありました。これをmrubyにポートしてみました。

流れはこんな感じです。Cのコードではshortからintの変換で係数値の符号を移しているのですが、16ビットの半分越えてたらマイナスにするコードを入れてあります。

def calculatePCompShort(padc, tadc, a0, b1, b2, c12)
  if a0 >= 0x8000 then
    a0 = a0 - 0x10000
  end
  if b1 >= 0x8000 then
    b1 = b1 - 0x10000
  end
  if b2 >= 0x8000 then
    b2 = b2 - 0x10000
  end
  if c12 >= 0x8000 then
    c12 = c12 - 0x10000
  end
  padc = padc >> 6
  tadc = tadc >> 6
  c12x2 = (c12 * tadc) >> 11
  a1 = b1 + c12x2;
  a1x1 = a1 * padc
  y1 = (a0 << 10) + a1x1
  a2x2 = (b2 * tadc) >> 1
  pcomp = (y1 + a2x2) >> 9
  return pcomp
end

a0 = rtl.i2cread(MPLADDR, 0x04) << 8 | rtl.i2cread(MPLADDR, 0x05)
b1 = rtl.i2cread(MPLADDR, 0x06) << 8 | rtl.i2cread(MPLADDR, 0x07)
b2 = rtl.i2cread(MPLADDR, 0x08) << 8 | rtl.i2cread(MPLADDR, 0x09)
c12 = rtl.i2cread(MPLADDR, 0x0a) << 8 | rtl.i2cread(MPLADDR, 0x0b)

rtl.i2cwrite(MPLADDR, 0x12, 0x00)

padc = rtl.i2cread(MPLADDR, 0x00) << 8 | rtl.i2cread(MPLADDR, 0x01)
tadc = rtl.i2cread(MPLADDR, 0x02) << 8 | rtl.i2cread(MPLADDR, 0x03)

pcomp = calculatePCompShort(padc, tadc, a0, b1, b2, c12)
pressure = ((pcomp * 1041) >> 14) + 800

kpa =  (pressure >> 4).to_s + "." + (((pressure & 0xf) * 1000) / 16).to_s

hPaではなくてkPaなんでちょっと分かりにくいですが、float無しに処理できます。

ThingSpeakに投げるようにしてみました。実際のコードはmpl115a2.rbというファイルでrtlbm-mrubyのsamplesの下に入れてあります。

https(TSL)では証明書の有効期間をチェックするために現在の時間が必要で、上のスクリプトではrtl.sntp(ntpaddr)とntpサーバに問い合わせてローカルの時間を合わせています。

スクリーンショット(2018-04-18 15.50.32).png

MATLAB Visualizationsでグラフ化してみたところいくつか異常値がはいっていておそらくI2Cの読み取りエラーと思われます。とりあえずMATLABで異常値を省いてグラフ化してみました。

スクリーンショット(2018-04-19 11.22.37).png

同じ時間帯の気象庁のデータをMjoGraphでグラフ化してみました。

graph.png

気象庁のデーターは海面気圧で、蟹さんが拾ってるのは実測値なので、数値は違いますが、傾向は一致しているようなので、大きく間違えている事はないと思われます。

自分のところのMPL115A2は電源投入後すぐは、ちょっと低めの数字になってしまうような傾向があるようです。1時間くらいすれば安定するようです。

このセンサーは温度のadcを持っていますが、気圧の係数用のもので、気温を測定することはできないようです。

12時台に直射が入り込むところに置いたところこんなグラフになりました。気温が上がって気圧の数値が狂ってしまうためと思われれます。

スクリーンショット 2020-01-04 6.51.42.png

MPL3115という製品もあってこちらは3V仕様ですが、MPL115は5Vでも使えてちょっと珍しいのですが、BMP180などに比べると一世代前という感じがします。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?