I2C通信で気圧センサーを読む(Grove Beginner Kit For Arduino検証報告)

Grove Beginner Kit For Arduino(以下、Beginner Kit)検証報告の6番目です。前回の記事はこちらです。
hirocom777.hatenadiary.org

I2C通信

今回はI2C通信で接続されているデバイスについて紹介したいと思います。まず、I2C通信について読み解いていきましょう。

f:id:HiroCom777:20200916222642j:plain
I2Cとは通信インターフェースの一種で,クロックに同期させてデータの通信を行う同期式シリアル通信のひとつです。CPUボードへのスケッチの書き込みやシリアルモニターとの通信に使用している通信は非同期式です。非同期式と同期式の違いはタイミングを合わせるクロックの有無で、I2C通信は同期用クロックのタイミングに合わせて通信が実行されます。また、通信を実行するデバイスはマスタとスレーブという役割に分かれます。一つのマスタに複数のスレーブを割り当てることができます。Beginner Kitでは、CPUボードがマスタ、モニターやセンサーがスレーブの役割となります。接続のイメージは以下の通りです。

f:id:HiroCom777:20200916221539j:plain

通信にはクロック(SCL),データ入出力(SDA)の2本の信号線を用います。CPUボードではSCLには18番ピン(A4)SDAには19番ピン(A5)が使用され、クロックは必ずマスタから出力されます。クロックの周波数はデフォルトで100kHzです。
また、通常I2C通信ではSCL、SDAそれぞれの信号にはプルアップ抵抗(抵抗を通して5V接続)を接続しますが、ArduinoではCPU内部でこの処理をします。

通信はマスターを中心に各スレーブに対して行われます。複数あるスレーブを識別するために各スレーブには個別のスレーブアドレスが割り当てられていて、マスターはスレーブアドレスを指定して各デバイスと通信を行います。Beginner Kitでは、以下の様にスレーブアドレスが割り当てられています。

OLED ディスプレイ 0x78
気圧センサ 0x77
3軸加速度計 0x19

"0x"っていうのは16進数ってことです。これらの値は予めデバイスに割り当ててあって同じ値のデバイスはI2C通信の中で混在することが出来ません。デバイスによっては予備のアドレスに切り替えることが出来るものもあります。

マスター、スレーブ間の通信はマスターによるスレーブアドレスの指定から始まって決まったルールで進められていくのですが、Beginner Kit上での通信はデバイス用のモジュールに任せることでスケッチの記述は簡易なものになっています。

気圧センサ

 それでは気圧センサを使用したスケッチをご紹介したいと思います。

//#include <Wire.h>
#include "Seeed_BMP280.h"
BMP280 bmp280;
void setup() {
  Serial.begin(9600);
  bmp280.init();
}
void loop() {
  Serial.print("Temp: ");
  Serial.print(bmp280.getTemperature());
  Serial.println("℃");
  Serial.print("Press: ");
  Serial.print(bmp280.getPressure() / 100);
  Serial.println("hPa\n");
  delay(1000);
}

ArduinoでI2C通信を使用するには"Wire"という標準モジュールが必要になります。先頭の #include<Wire.h> で使用できるようになります。でも、コメントアウトしていますよね。実は、以下でインクルードする Seeed_BMP280.h の中に記述されているので記述する必要もないのです。I2C通信では"Wire"を使うって事だけ覚えておいてください。

気圧センサ―も温湿度センサー同様、専用のモジュールをインストール必要があります。以下でダウンロードできます。ArduinoIDEのメニュー スケッチ⇒ライブラリをインクルード⇒.ZIP形式のファイルをインストール と進んでダウンロードしたファイルを開いてください。

GitHub - Seeed-Studio/Grove_BMP280

2行目の #include "Seeed_BMP280.h" でモジュールを使えるようになります。以後、BMP280 bmp280;でbmp280に気圧センサーを割り当てて、 bmp280.init();で初期化。以下のメソッドでセンサーから値を取得します。

bmp280.getTemperature()
 実を言うと、気圧センサーでも温度を測定することが出来ます。温度だけ(湿度がいらない)場合は温湿度センサーよりもこちらを使った方がいいかもしれません。

bmp280.getPressure()
 気圧を取得します。単位はPaパスカル)です。天気予報などでおなじみの単位hPa(ヘクトパスカル)にするには100で割ります。

尚、スレーブアドレスの指定がスケッチに見当たりませんが、こちらも Seeed_BMP280.h の中に記述されています。

以上がI2C通信を使用したセンサーのスケッチ例です。モジュールがしっかりしていれば、簡単ですよね!!

残りのモジュール

 いかがでしたでしょうか。残りは3軸加速度計とOLED ディスプレイですね。やはり手ごわいのが残りましたか・・・頑張ります!!
hirocom777.hatenadiary.org


Arduino Grove Beginner Kit For Arduinoの連載記事はコチラからどうぞ!!