Raspberry Pi Pico Wで温湿度気圧計を作る①

# 目次
[1.前回のまとめ](#1前回のまとめ)
[2.ディジタル大気圧センサーモジュール](#2ディジタル大気圧センサーモジュール)
[3.Raspberry Pi Pico WとI2C通信する](#3raspberry-pi-pico-wとi2c通信する)
[4.コーディング](#4コーディング)
[5.まとめ](#5まとめ)

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

# 2.大気圧センサーモジュール
前回の記事でも紹介した[MPL115A2使用大気圧センサーモジュールキット(I2C) Ver.2](https://akizukidenshi.com/catalog/g/gK-18146/)を使用します。
仕様は[秋月電子通商](https://akizukidenshi.com/catalog/)さんが掲載している取扱説明書で確認。
![MPL155A2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/3ff0ea44-d174-7488-af17-fb981c3f7a1c.jpeg)


# 3.Raspberry Pi Pico WとI2C通信する
まずは改めてRaspberry Pi Pico Wのピンアサインを[公式サイト](https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html)で確認する。
![Raspberry Pi Pico Wのピンアサイン](https://www.raspberrypi.com/documentation/microcontrollers/images/picow-pinout.svg)
Raspberry Pi Pico WのI2Cは2系統あるらしいが、こだわりはないのでI2C0を使用する。
また、同じI2C0でも複数ピンが存在するが、これもこだわりがないのでデフォルトの6番ピンのGP4と7番ピンのGP5を使用する。（ややこしい）
3.3V電源は36番ピンからとり、Groundも8か所あるGNDのどこからでも取れるので3番ピンに接続することにした。（多すぎて選べない！ジャムの法則）

次は[MPL115A2](https://akizukidenshi.com/catalog/g/gK-18146/)のピンアサインを確認する。
![MPL115A2-ピンアサイン2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/0b24bac0-0a32-68d8-2f39-6e49d0732a1f.jpeg)
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)で大気圧と標高を測定して見ます](http://zattouka.net/GarageHouse/micon/Arduino/Pressure/Pressure2.htm)

そして出来上がったのがこちら。
![MPL115A2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/434075ff-a32b-39e0-9142-52e767a589d9.jpeg)
![20230924_192637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/8167fc31-0a43-10db-013d-d587b2a1b80a.jpeg)

# 4.コーディング
MPL115A2のマニュアルを日本語訳してくださっている奇特な方がいらっしゃったのでとりあえず目を通してみる。
参考：[小型のデジタル気圧計 MPL115A2・MPL115A1を制御する](http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/MPL115A2cnt/MPL115A2cnt.html)
ちょっと私にはレベルが高すぎて解読しきれなかったので、Raspberry Piで実装した方のコードを参考にする。
参考：[大気圧センサー(MPL115A2)を使う](http://make.bcde.jp/raspberry-pi/%E5%A4%A7%E6%B0%97%E5%9C%A7%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BCmpl115a2%E3%82%92%E4%BD%BF%E3%81%86/)
あとはsmbusをmachineに読み替えてクラス化したものがこちら。

```python: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
```
```python: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))
```
```bash:shell
>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
air pressure : 1015.597
>>> 
```
見事成功！
ちなみに現在の気圧を[tenki.jp](https://tenki.jp/)で調べると直近で1015.3hPaなのでかなり近い値が出ている。

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