Arduino Nano R4の活用 ⑥ I2C LPS22HB Wire①
マイコンにはI2C(Inter-Integrated Circuit)バスというシリアル・インターフェースが備わっている製品が多いです。これは、2本の信号線で通信をでき、複数のデバイス(センサなど)をつないで使えるので使い勝手が良いです。比較的通信速度は遅く、近距離で利用することもあって、トラブルが少ないです。
読み方は、アイ・スクエアド・シーもしくはアイ・アイ・シーが使われます。アイ・ツー・シーも時々聞きます。
I2CバスにはWireライブラリが用意されています。
●環境
- Arduino IDE;2.3.5
- Windows11;24H2
- Arduino Nano R4 1.5.1 PCはマザーボードのUSBポートから直接つなぐ。
●2か所にI2Cインターフェースがある
このArduino Nano R4マイコン・ボードでは、二つのI2Cバスが用意されています。Arduino Uno 3では一つでした。同時代、Arduino Megaシリーズのように二つのI2Cバスが利用できるボードもありました。
この二つのI2Cバスは独立しています。Arduino Uno 3では2か所にI2Cバスをつなげられますが、一つのI2Cバスです。
●接続1
SDA(A4)、SCL(A5)のI2Cバスを利用します。このバスの電源は5Vです。写真では、前のLEDの接続が残っています。
I2Cバスに取り付けたのは気圧センサのLPS22HBです。
●LPS22HB
このセンサは、Adafruitから入手しました。Adafruitでは、Stemma QT/Qwiicボードと呼んでいます。コネクタを接続すると、電源のLEDが点灯します。
Arduino Nano R4マイコン・ボードとは、JST SH 4ピンのコネクタとオスのピンヘッダが付いたケーブルを使用しました。
SCLは黄色、SDAは緑色、3Vは赤色、GNDは黒色です。
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●気圧センサLPS22のおもなスペック
LPS22HBのデータシートはこのWebページから
- 電源電圧 1.7~3.6V
- 気圧測定範囲 260~1260hPa、確度;±1hPa、分解能;±0.1hPa
- 温度測定範囲 -40~+85℃、確度;±1.5℃
- インターフェース I2C(0~400kHz)、SPI(10MHz)
- スレーブ・アドレス 0x5d、裏面のAddrをショートすると0x5c
●スケッチ
Wireライブラリを用いてアクセスします。読みだしたのは気圧です。温度も読み出せますがここでは省略しました。
#include <Wire.h>
unsigned char LPS22HB_address = 0x5d;
byte result[3];
void setup() {
Wire.begin();
Wire.beginTransmission(LPS22HB_address);
Wire.write(0x10); Wire.write(0x10); //1Hz
Wire.endTransmission();
Serial.begin(9600);
delay(1000);
Serial.println("start ");
}
void loop() {
Wire.beginTransmission(LPS22HB_address);
Wire.write(0x28 | 0x80);;
Wire.endTransmission();
Wire.requestFrom(LPS22HB_address, 3);
result[0] = Wire.read();
result[1] = Wire.read();
result[2] = Wire.read();
float press = (result[2]<<16 | result[1]<<8 | result[0]) / 4096.0;
Serial.print(result[0]);Serial.print(" ");
Serial.print(result[1]);Serial.print(" ");
Serial.print(result[2]);Serial.print(" ");
Serial.println(" press= "+String(press,1)+"hPa");
delay(3000);
}
実行している様子です。