2
3

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 1 year has passed since last update.

目次

1.前回のまとめ
2.ディジタル大気圧センサーモジュール
3.Raspberry Pi Pico WとI2C通信する
4.コーディング
5.まとめ

1.前回のまとめ

houwouです。
前回の初投稿でRaspberry Pi Pico WのLチカが無事に成功しました。
今回は気圧センサで遊んでみようと思います。

2.大気圧センサーモジュール

前回の記事でも紹介したMPL115A2使用大気圧センサーモジュールキット(I2C) Ver.2を使用します。
仕様は秋月電子通商さんが掲載している取扱説明書で確認。
MPL155A2.jpg

3.Raspberry Pi Pico WとI2C通信する

まずは改めてRaspberry Pi Pico Wのピンアサインを公式サイトで確認する。
Raspberry Pi Pico Wのピンアサイン
Raspberry Pi Pico WのI2Cは2系統あるらしいが、こだわりはないのでI2C0を使用する。
また、同じI2C0でも複数ピンが存在するが、これもこだわりがないのでデフォルトの6番ピンのGP4と7番ピンのGP5を使用する。(ややこしい)
3.3V電源は36番ピンからとり、Groundも8か所あるGNDのどこからでも取れるので3番ピンに接続することにした。(多すぎて選べない!ジャムの法則)

次はMPL115A2のピンアサインを確認する。
MPL115A2-ピンアサイン2.jpg
VDDには3.3Vを供給、CAPは1μFの電解コンデンサをかませて接地、GNDはそのまま接地、SHDNは3.3Vを供給(接地でシャットダウンできるらしいが不要)、RSTはI2C通信を使用不可にする場合は接地とあるので何も接続しない、NCは不要、SDAとSCLはそれぞれRaspberry Pi Pico WのSDAとSCL(今回はGP4とGP5)に接続。

先に結論を言うとこれではうまくいかなかった。
どうやらRSTに3.3Vを供給したほうが良いらしい。
参考:気圧センサー(MPL115A2)で大気圧と標高を測定して見ます

そして出来上がったのがこちら。
MPL115A2.jpg
20230924_192637.jpg

4.コーディング

MPL115A2のマニュアルを日本語訳してくださっている奇特な方がいらっしゃったのでとりあえず目を通してみる。
参考:小型のデジタル気圧計 MPL115A2・MPL115A1を制御する
ちょっと私にはレベルが高すぎて解読しきれなかったので、Raspberry Piで実装した方のコードを参考にする。
参考:大気圧センサー(MPL115A2)を使う
あとはsmbusをmachineに読み替えてクラス化したものがこちら。

mpl115a2.py
from time import sleep_ms

class MPL115A2(object):
    def __init__(self, i2c):
        self.i2c = i2c
 
    def convert_coefficient(self, msb, lsb, total_bits, fractional_bits, zero_pad):
        data = (msb << 8) | lsb
        period = float(1 << 16 - total_bits + fractional_bits + zero_pad)
        if (msb >> 7) == 0:
            result = float(data / period)
        else:
            result = -float(((data ^ 0xFFFF) + 1) / period)
     
        return result
     
    def air_pressure(self):
        address = 0x60
     
        self.i2c.writeto_mem(address, 0x12, b'/x01')
        sleep_ms(3)
     
        data = self.i2c.readfrom_mem(address, 0x00, 12)
        block = []
        for i in data[:]:
            block.append(i)
     
        a0 = self.convert_coefficient(block[4], block[5], 16, 3, 0)
        b1 = self.convert_coefficient(block[6], block[7], 16, 13, 0)
        b2 = self.convert_coefficient(block[8], block[9], 16, 14, 0)
        c12 = self.convert_coefficient(block[10], block[11], 14, 13, 9)
     
        padc = (block[0] << 8 | block[1]) >> 6
        tadc = (block[2] << 8 | block[3]) >> 6
     
        c12x2 = c12 * tadc
        a1 = b1 + c12x2
        a1x1 = a1 * padc
        y1 = a0 + a1x1
        a2x2 = b2 * tadc
        pcomp = y1 + a2x2
     
        pressure = (pcomp * 65 / 1023) + 50
        hpa = pressure * 10
     
        return hpa
main.py
from machine import I2C, Pin
from mpl115a2 import MPL115A2

i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=100000)
mpl115a2 = MPL115A2(i2c)

air_pressure = mpl115a2.air_pressure()
print("air pressure : " + str(air_pressure))
shell
>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
air pressure : 1015.597
>>> 

見事成功!
ちなみに現在の気圧をtenki.jpで調べると直近で1015.3hPaなのでかなり近い値が出ている。

5.まとめ

私自身頭痛持ちだったりするので手軽に気圧がわかるのはありがたい!
何より無事に実装できてよかったです。
次は同様の手順で温湿度計の実装をしていきます。

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?