python-peripheryを使ってみる

SPI温度計(BMP280)

ディジタル温度計はいくつかありますが、BMP280/BME280は i2c/SPI の両方で使えるちょっと変わったディジタル温度計です。

前回、i2c での使い方を紹介しましたが、今回は SPI での使い方を紹介します。
BMP280は4ピン仕様(i2c専用)と6ピン仕様(i2c/SPI兼用)のモジュールが有りますが、
SPIで使うときは6ピン仕様のモジュールを使う必要が有ります。

6ピン仕様のモジュールのピンマーキングは向って左から
SDO CSB SDA SCL Gnd Vcc
となっていますが、SPIで使う場合
MISO CS MOSI CLK Gnd Vcc
となります。
BMP280 Host
Vcc 3V3
GND GND
SCL SPI-SCLK
SDA SPI-MOSI
CSB SPI-CS
SDO SPI-MISO

左からBMP085(i2c専用) BMP280(i2c専用) BMP280(i2c/SPI兼用)


Pythonコードは、こ ちらで公開されているC言語のコードをpython-peripheryに移植しただけです。
BMP280のサンプルは圧倒的にi2cを使ったサンプルが多いのですが、
BitBang-SPI(ソフトウェアSPI)での使い方を紹介している貴重なページです。
python-peripheryのコードはこ ちらで 公開しています。
起動時の引数でSPIデバイスファイルを指定します。
RaspberryPiで使うときは「--device /dev/spidev0.0」を指定します。

C言語をPythonに移植する場合、Pythonには符号付整数の考え方が無いので、少し注意が必要です。
BMP280は0x88から0x9Fのレジスターにキャリブレーションデータを格納していますが、
一部のデータは16ビット符号付整数値です。
移植後のコードではc_short()関数を使って16ビット符号付整数値に変換しています。
$ python3 bmp280-spi.py --help
usage: bmp280-spi.py [-h] [-d DEVICE] [-m MODE] [-s SPEED] [-p PRINT]

optional arguments:
  -h, --help            show this help message and exit
  -d DEVICE, --device DEVICE
                        device file name
  -m MODE, --mode MODE  spi mode
  -s SPEED, --speed SPEED
                        spi clock speed
  -p PRINT, --print PRINT
                        print debug

$ python3 bmp280-spi.py --device /dev/spidev0.0
device=/dev/spidev0.0
mode=0
speed=1000000
print=0
chip_id = 0x58 BMP280
Check Register
Read calibration data
-----------------------
Chip ID     : 0x58
Temperature : 24.52 C
Pressure    : 1024.49 hPa
-----------------------
Chip ID     : 0x58
Temperature : 24.52 C
Pressure    : 1024.5 hPa
-----------------------
Chip ID     : 0x58
Temperature : 24.52 C
Pressure    : 1024.45 hPa
-----------------------
Chip ID     : 0x58
Temperature : 24.51 C
Pressure    : 1024.49 hPa
-----------------------
Chip ID     : 0x58
Temperature : 24.52 C
Pressure    : 1024.5 hPa



このモジュールはソフトウェアSPI(Bit Banging SPI)でも使うことができます。
任意のピンを使うことができます。
BMP280 Host
Vcc 3V3
GND GND
SCL SPI-SCLKのGPIO
SDA SPI-MOSIのGPIO
CSB SPI-CSのGPIO
SDO SPI-MISOのGPIO

python-peripheryのコードはこ ちらで 公開しています。
起動時の引数で使用するGPIOポートを指定します。
$ python bmp280-softspi.py --help
usage: bmp280-softspi.py [-h] [--sclk SCLK] [--mosi MOSI] [--cs CS] [--miso MISO] [--print PRINT]

optional arguments:
  -h, --help     show this help message and exit
  --sclk SCLK    spi sclk gpio
  --mosi MOSI    spi mosi gpio
  --cs CS        spi cs gpio
  --miso MISO    spi miso gpio
  --print PRINT  print debug

$ python bmp280-softspi.py --sclk 14 --mosi 15 --cs 17 --miso 18
sclk=14
mosi=15
cs=17
miso=18
print=0
chip_id = 0x58 BMP280
Read calibration data
-----------------------
Chip ID     : 0x58
Temperature : 25.24 C
Pressure    : 759.41 hPa
-----------------------
Chip ID     : 0x58
Temperature : 24.55 C
Pressure    : 1023.71 hPa
-----------------------
Chip ID     : 0x58
Temperature : 24.56 C
Pressure    : 1023.74 hPa
-----------------------
Chip ID     : 0x58
Temperature : 24.57 C
Pressure    : 1023.7 hPa

全く同じ条件でi2/HardwareSPI/SoftwareSPIの3つのセンサーを同時に使って見ました。
温度は絶対精度(±1℃)の範囲内に収まっています。
Temperature : 24.22 C

Temperature : 24.73 C

Temperature : 24.22 C

気圧は絶対精度(±1hPa)よりも少し誤差が有りました。
Pressure    : 1022.89 hPa

Pressure    : 1023.67 hPa

Pressure    : 1024.5 hPa

おしまい