Arduino IDEでRaspberry Pi Picoを動かす I2Cバス


 前回、Arduino IDEでRaspberry Pi Picoが使えるようになりました。とりあえず、I2Cバスを使います。

I2Cscanner

 C:\Users\ユーザ名\AppData\Local\Arduino15\packages\arduino\hardware\mbed_rp2040\2.5.2\variants\RASPBERRY_PI_PICO
の中に、pins_arduino.hがあります。I2Cは、

// Wire
#define PIN_WIRE_SDA        (6u)
#define PIN_WIRE_SCL        (7u)

と書かれているので、GPIO6にSDA、GPIO7にSCLをつなぎます。手元にあったAdafruit STEMMA QTのLPS25HBボードをつなぎ、I2Cscannerを動かしました。

 正しく0x5dを見つけました。

気圧センサLPS25HB

 おもなスペックです。

  データシート

  • 動作電圧 3.3V(デバイスは1.7~3.6 V)
  • 測定範囲 260~1260hPa
  • 確度 ±0.1hPa(25℃)、±1hPa(0~80℃)
  • インターフェース SPI、I2C。I2C用プルアップ抵抗は実装
  • スレーブ・アドレス 0x5d。SDOピンの設定で0x5cも設定できる

スケッチを書く

 気圧のデータは、3バイト24ビットです。PRESS_OUT_H (2Ah)、 PRESS_OUT_L (29h)、PRESS_OUT_XL (28h)を読み出し、4096で割るとhPaの値になります。

 1Hzの繰り返しで気圧データを読み出します。電源が入ったのち、パワーダウン・モードになっているので、測定できるモードに変更します。この二つの設定は、「CTRL_REG1」(0x20)に0x90を書き込むことで実現します。

 気圧データの低いアドレス28hから3バイトを読み出しますが、0x28 | 0x80の形で読まないと、正しいデータが読めません。

#include <Wire.h>

#define LPS25HB_address 0x5d

uint8_t readbuffer[3];
float press;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("start");
  Wire.beginTransmission(LPS25HB_address);
    Wire.write(0x20);Wire.write(0x90);
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(LPS25HB_address);
    Wire.write(0x28 | 0x80);
  Wire.endTransmission();
  Wire.requestFrom(LPS25HB_address, 3);
  readbuffer[0] = Wire.read();
  readbuffer[1] = Wire.read();
  readbuffer[2] = Wire.read();
  press = ((uint32_t)readbuffer[2] << 16 | (uint16_t)readbuffer[1] << 8 | readbuffer[0]) / 4096.0;
  Serial.print("\nPress ");  Serial.print(press);  Serial.println("hPa ");
  delay(2000);   
}