« python3/micro:bit-micropython/CircuitPython用エディタ(mu-editor)をインストールする(linux版) | トップページ | CircuitPythonに温度センサーLM61CIZ(analog)を接続する »

2020年3月30日 (月)

CircuitPython/MicroPythonに気圧センサーLPS331AP(i2c)を接続する

2020/3/30

CircuitPython LPS331AP(i2c)

CircuitPython LPS331AP(i2c)

概要

CircuitPython/MicroPythonに以下の気圧センサーLPS331AP(i2c)を接続する。
(ホストPCとしてはubuntuを想定している)

LPS331AP 気圧センサモジュール(I2C/SPIタイプ)

接続

以下のように接続する。

Wiring:

LPS331AP Teensy4.0
1(GND) GND
2(SCL) D19(SCL)
3(SDA) D18(SDA)
4(SA0) 3.3V
5(CS) 3.3V
LPS331AP Teensy4.0
10(VDD_IO) 3.3V
9(VDD) 3.3V
8(GND) GND
7(INT1) NC
6(INT2) NC

SCL/SDAは、(モジュール内でPullUpしていないので)それぞれ10kΩでPullUpすること。
NC: None Connection
i2c-addressは、0x5d(93)になる。

該当モジュールのインストール

Module Install:

wget https://beta-notes.way-nifty.com/blog/files/lps331ap_cpy.py # copy related modules cp lps331ap_cpy.py CIRCUTPY/lib/

lps331ap_cpy.pyの内容:

# lps331ap_cpy.py # 2020/3/30: # modification for CircutPython/MicroPython # forked from the following source code: # http://lumenbolk.com/?p=814 class LPS331AP(object): """ # sample code # CircuitPython from lps331ap_cpy import LPS331AP from time import sleep import board import busio i2c = busio.I2C(board.SCL, board.SDA) i2c.try_lock() sensor = LPS331AP(i2c, address=0x5d) while True: press, tempe = sensor.press_tempe print('press: {0:.2f} tempe: {1:.1f}'.format(press, tempe)) print('') sleep(1) #----------------------------- # MicroPython from lps331ap_cpy import LPS331AP from time import sleep from machine import Pin, I2C i2c = I2C(1) sensor = LPS331AP(i2c, address=0x5d) while True: press, tempe = sensor.press_tempe print('press: {0:.2f} tempe: {1:.1f}'.format(press, tempe)) print('') sleep(1) """ def __init__(self, bus, address=0x5d): self.bus = bus self.address = address self.temp2 = bytearray(2) self.temp1 = bytearray(1) self.value = bytearray(1) def _write(self,regist,value): self.temp2[0] = regist self.temp2[1] = value #bus.write_byte_data(address, regist, value) self.bus.writeto(self.address, self.temp2) def _read(self,regist): self.temp1[0] = regist #value=bus.read_byte_data(address, regist) self.bus.writeto(self.address, self.temp1) self.bus.readfrom_into(self.address, self.value) ##bus.writeto_then_readfrom(self.address,self.temp1,self.value) #return value return self.value[0] def _read_16bit(self,registL,registH): value1 = self._read(registL) value2 = self._read(registH) value = (value2 << 8) + value1 return value def _read_24bit(self,registL,registH,registHH): value1 = self._read(registL) value2 = self._read(registH) value3 = self._read(registHH) value4 = (value3 << 8) + value2 value = (value4 << 8) + value1 return value @property def press_tempe(self): # air_pressure and temperature self._write(0x20,0x00) self._write(0x10,0x7a) self._write(0x20,0x84) self._write(0x21,0x01) while self._read(0x21): pass air_pressure = self._read_24bit(0x28,0x29,0x2a) temperature = self._read_16bit(0x2b,0x2c) # air_pressure_calc if air_pressure & (1<<23): air_pressure = -((air_pressure^0xffffff) + 1)/4096. else: air_pressure = air_pressure /4096. # temperature_calc if temperature & (1<<15): temperature = 42.5 - ((temperature^0xffff) + 1)/480. else: temperature = 42.5 + temperature/480. return air_pressure, temperature #--------------------------------------------------

CircuitPythonとMicroPythonに共通してあるi2c.writeto,i2c.readfrom_intoのみを使用しているので、両方に対応できている。

Demo Script(動作確認)

lps331ap_test.py

# CircuitPython from lps331ap_cpy import LPS331AP from time import sleep import board import busio i2c = busio.I2C(board.SCL, board.SDA) i2c.try_lock() sensor = LPS331AP(i2c, address=0x5d) while True: press, tempe = sensor.press_tempe print('press: {0:.2f} tempe: {1:.1f}'.format(press, tempe)) # for plotter of Mu-editor # tempe100 = 100*tempe # scaling # print('({0:.2f}, {1:.1f})'.format(press, tempe100)) sleep(1)

MicroPython(Nucleo)の場合

該当モジュールlps331ap_cpy.pyが、CircuitPython/MicroPython両方に対応しているので そのまま/flashに書き込むだけでパッチなどは必要ない。
動作確認をしていないが以下のようなコードになる:

Demo Script:

# MicroPython from lps331ap_cpy import LPS331AP from time import sleep from machine import Pin, I2C i2c = I2C(1) sensor = LPS331AP(i2c, address=0x5d) while True: press, tempe = sensor.press_tempe print('press: {0:.2f} tempe: {1:.1f}'.format(press, tempe)) # for plotter of Mu-editor # tempe100 = 100*tempe # scaling # print('({0:.2f}, {1:.1f})'.format(press, tempe100)) sleep(1)

デバイスなどの初期化以外はCircuitPythonのものと全く同じ。

参照情報

18 I2c通信で気圧,標高を取得しよう.(LPS331AP気圧センサ)

LPS331AP 気圧センサモジュール(I2C/SPIタイプ)
LPS331AP説明書
メーカーパンフレット
よくある質問とサポートのページ

LPS331AP datasheet

Turtorial Examples for CircuitPython(Teensy4.0)
Teensy4.0にCircuitPythonをインストールする

Turtorial Examples for Nucleo-MicroPytho
NUCLEO-F446REにMicropythonをインストールする(v2)

CircuitPython 5.0.x - I2C

python3/micro:bit-micropython/CircuitPython用エディタ(mu-editor)をインストールする(linux版)

以上

|

« python3/micro:bit-micropython/CircuitPython用エディタ(mu-editor)をインストールする(linux版) | トップページ | CircuitPythonに温度センサーLM61CIZ(analog)を接続する »

MicroPython」カテゴリの記事

CircuitPython」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« python3/micro:bit-micropython/CircuitPython用エディタ(mu-editor)をインストールする(linux版) | トップページ | CircuitPythonに温度センサーLM61CIZ(analog)を接続する »