⛰️

Raspberry pi picoとBME280で標高測定

2023/12/16に公開

TKです。こんにちは。
この記事は、Social Databank Tech Blog Advent Calendar 2023の16日目です。

Raspberry Pi Picoとセンサーを使用して標高(海抜)を計測するお話を書きます。

前置き

早速ですが皆さんに質問です。

今自分がいる場所の標高をご存知ですか?

少し前にとあるTV番組で話題になりましたが
「長野県民は家や職場の標高が言える」
という特技ネタがあります。
そして私は都内に住んでこそいますが長野県生まれ長野県育ち、生粋の長野県民です。

つまり私には職場の標高を把握する義務があります。
※ないです

しかしAppleWatchのように標高が測れるガジェットはもっていません......
職場の標高がわからず右往左往していたそんな時、偶然にも気圧が測定できるセンサーとラズパイが転がっていたのを発見。
自分で作ってみることにしました。

どうやるのか

標高を測定する方法はいくつかありますが、今回は気圧を使用して標高を測定します。
高度が高くなるにつれて大気圧が減少するため、測定された気圧の値を用いて標高を推定できます。

今回使用する計算式は以下の式です。

h = \left( \left( \frac{P_0}{P} \right)^{0.1903} - 1 \right) \times \frac{(T + 273.15)}{0.0065}

P = 測定気圧
P_0 = 海面気圧
T = 気温

海面気圧は気象庁の観測データ(詳細版)を使用します。

用意する物

  • マイコン
    • Raspberry Pi Pico
      ラズパイの小さいやつ
  • センサー
    • BME280
      気温・湿度・気圧が測れるセンサー(が載ったモジュール)。
  • その他
    • PC(今回はMacを使用します)
    • ブレッドボード
    • ジャンパ線

開発環境構築

※VSCodeでも開発できますが、モジュール用ライブラリのインストールが非常に楽だったのでThonnyで進めます。

1. Thonnyのインストール

詳細は割愛します。ここからインストールできます。

2. Raspberry Pi PicoでMicroPythonを使えるようにする

公式サイトのDrag-and-Drop MicroPythonの項目にしたがってuf2ファイルを転送します。

3. Thonny上でRaspberry Pi Picoを指定する

以下の設定をします
Setting -> Interpreter
-> 「Which kind of interpreter should Thonny use for runnning your code?」
-> 「MicroPython (Raspberry Pi Pico)」

Setting -> Interpreter
-> 「Port or WebREP」
-> 「Board in FS mode @ /dev/(ラズパイのデバイス名)」

4. 使用するモジュール用ライブラリのインストールをする

本来このようなセンサーモジュールを使用する場合、データシートを読んでメモリアドレスの0x○○から0x○○にデータが入っているのかを確認してキャリブレーション定数を取得して・・・といった作業が必要です。
しかし先人達が用意してくれたライブラリを使用することで簡単に数行のコードでデータを取得できます。
感謝しながら使わせていただきましょう。

Tools -> Manage Packages... -> 検索欄に「micropython_bme280」と入力 -> Install

配線をする

Raspberry Pi Picoのピン配置は以下になります。

これを実際に配線すると

ジャンパの色については許してください......

コードを書く

今回書いたコードは以下です。


from machine import I2C, Pin
import bme280
import utime

# 海面気圧 P0 (hPa)
SEA_LEVEL_PRESSURE = 1010

# I2Cインスタンスの作成
i2c = I2C(0, scl=Pin(1), sda=Pin(0))

# BME280センサーのインスタンス化
bme = bme280.BME280(i2c=i2c)

# 標高を計算する関数
def calculate_altitude(pressure_hpa, temperature_c):
    # 温度をケルビンに変換
    temperature_k = temperature_c + 273.15
    # 標高の計算
    return ((((SEA_LEVEL_PRESSURE / pressure_hpa) ** 0.1903) - 1) * temperature_k) / 0.0065

while True:
    # センサーから気圧、温度、湿度を読み取る
    temp, pressure, humidity = bme.read_compensated_data()

    # hPa単位に変換
    pressure_hpa = pressure / 25600

    # 標高を計算
    altitude = calculate_altitude(pressure_hpa, temp / 100)

    # 測定値を出力
    print("Pressure: {:.2f} hPa, Altitude: {:.2f} meters, Temperature: {:.2f} C, Humidity: {:.2f}".format(pressure_hpa, altitude, temp / 100, humidity / 1024))

    # 5秒待機
    utime.sleep_ms(5000)



いざ測定

測定していきます。まずは標高(海抜)が判明している箇所で測定します。
国土地理院地図を使用して会社前の標高を計測したところ2.3mでした。

ここで測定すると

いい感じに近い値が表示されています。
では弊社オフィスがある11Fに移動してみます。

いい景色ですね。
ここで測定すると

それっぽい値が出てますが正直この値が正しいのかわかりませんね....
そこで同じオフィスにいたAppleWatch装着者に確認すると

同じような値ですね。
他のAppleWatch装着者にも確認しましたが±3mの範囲内でした。
これはなかなか精度よいのではなかろうか。

まとめ

このセンサーのおかげで自分がいる場所の標高がわかるようになりました。
これで安心して長野県出身者を名乗っていけそうです。

電子工作については素人でしたがなかなか楽しかったです。
ブレッドボードを使うことで半田付けなどのハードルを飛び越えて配線できるのもいいと思いました。

明日の記事はSDBの筆頭Vimmerであるkesojiさんの記事第二弾です。
乞うご期待!

おまけ

外での測定の様子


ちょっと恥ずかしかったです

ソーシャルデータバンク テックブログ

Discussion