Getting pressure from Grove Barometer Sensor (HP206C) with micro:bit (python version)
手元にあった気圧センサ(HP206C)をmicro:bitとGroveシールドで試してみた。
micro:bitのブロックの拡張機能にgroveのものはあるが、この中には含まれていないので自分でI2Cの仕様を調べて取得するコードを書く必要がありそう。
気圧センサはいつか試そうと思って秋葉原で買っておいたもの。通信はI2Cでできる。ちょうど息子のmicro:bitのGroveシールドがあったので、ちょっと借りてつないでみた。
Groveシールドはこれ。
公式サイトやドキュメント、サンプルコード
- 公式の商品サイト
- 仕様書(上記サイトにリンクがある)
- サンプルコードはaruduino用ならあった
I2Cアドレス
I2Cアドレスは、仕様書には0XEC
とあるが、自分のデバイスの基板の裏にはI2C Address: 0X76
と印刷されており、実際このアドレスだとアクセスできた。
I2Cのコマンド
コマンド | ||
SOFT_RST | 0x06 | デバイスのリセット |
ADC_CVT | 010(3bit) + DSR(3bit) + CHNL(2bit) | DSR:計測したアナログ値をデジタル値に変換する精度。 4096(000), 2048(001), 1024(010), … ,128(101) CHNL: データ取得対象。気圧と温度(00), 温度のみ(01) |
READ_PT | 0x10 | 温度(24bit)と気圧(24bit) データの上位(MSB)が温度、下位(LSB)が気圧 |
READ_AT | 0x11 | 温度(24bit)と高度(24bit) |
READ_P | 0x30 | 気圧(24bit) |
READ_A | 0x31 | 高度(24bit) |
READ_T | 0x32 | 温度(24bit) |
ANA_CAL | 0x28 | SOFT_RSTよりも高速に再キャリブレーションをおこなうことができる。急速に環境が変化するような場合(測定精度に影響しやすい気温や電圧が大きく変化する環境とのこと)に高速に対応するために使う想定のものらしい。安定した環境では不要とのこと。 使うにはADC_CVTコマンドを送出する前に単にこのコマンドを送ればよい。 |
READ_REG | 10(2bit) + (6bitレジスタアドレス) | レジスタの読み込み。仕様書参照。 |
WRITE_REG | 11(2bit) + (6bitレジスタアドレス) | レジスタの書き込み。仕様書参照。 |
注意点
注意点としてハマったのが、micro:bit起動直後にデータを取得するコードを書いていて、待ちを入れることが重要だったこと。仕様書には、デバイスが計測したアナログ値をデジタル値に変換するさいに一定の時間がかかることが記載されている。また、かかる時間はADC_CVT
コマンドで設定した内容ごとに異なるため、それ以上の処理待ちを入れてやる必要がある。そのため特に起動直後だと変換が終わる前に取得すると、値が空になるなど取得できない。
pythonコード
シンプルに気圧だけを取得するコードはこんな感じになった。
- I2Cの初期化
SOFT_RST
コマンドを送りデバイスをリセットADC_CVT
コマンドでチャネル(CHNL)と変換精度(DSR)を設定- 変換にかかる時間以上待つ
READ_P
コマンドを送ってから3バイト取得- 3バイトを論理和して整数に変換
- 値は
Pa
のようなので100で割ってhPa
に変換
import utime
from microbit import *
i2c.init()
i2c.write(0x76, b'\x06') # SOFT_RST
cmd = 0x40 | 0b010 << 2 | 0b00 # ADC_CVT DSR=1024 CHNL=press&temp
i2c.write(0x76, bytes([cmd])) # ADC_CVT
utime.sleep_ms(35) # Conversion Time VS DSR (1024) = 32.8ms
i2c.write(0x76, b'\x30') # READ_P
data = i2c.read(0x76, 3) # read 3bytes
p = 0 | data[0] << 16
p = p | data[1] << 8
p = p | data[2]
hpa = p / 100 # hPa = 100Pa
display.scroll(str(hpa) + "hPa")
コメント
[…] micro:bitで気圧センサHP206Cを使ってみる python編手元にあった気圧センサ(HP206… […]