3
1

More than 1 year has passed since last update.

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

Posted at

 前回、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を動かしました。

名称未設定-15909baa.png

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

2021-11-11.png

気圧センサ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);   
}
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1