感震センサで揺れを記録する M5Stack編 (3) Wireライブラリ

 Arduino IDEではI2Cの通信をWireライブラリを利用します。M5StackではGrove-Aポート(I2C)を制御するライブラリが別途用意されています。

 最初に、回路図でI2Cバスを確認します。Grove-Aポートの情報はありませんでした。
 こちらのドキュメントには、下記のように書かれています。

ESP32 Chip GPIO22 GPIO21
Grove A SCL SDA

 したがって、I2Cバスは1系統だけだとわかります。

Wireライブラリ

 Arduino IDEでI2Cバスを利用するとき、Wireライブラリを使います。最初に、

#include <Wire.h>

とライブラリを利用することを記述します。setup()内で、

Wire.begin();

とし、利用を始めます。

 Arduinoはマスタで、センサなどのスレーブに対して読み書きを行います。スレーブに書き込みするときは、

Wire.beginTransmission(スレーブ・アドレス);
 Wire.write(レジスタやポインタのアドレス。8ビット);
Wire.endTransmission();

 一般的なやり取りは8ビット単位で行います。もしレジスタが16ビットなら、8ビットを2回送ります。

Wire.beginTransmission(スレーブ・アドレス);
 Wire.write(レジスタやポインタの上位アドレス。8ビット);
 Wire.write(レジスタやポインタの下位アドレス。8ビット);
Wire.endTransmission();

 スレーブ・デバイスからのデータの読み取りは、

Wire.requestFrom(スレーブ・アドレス, バイト数);

でバイト数分、バッファ?に入っているので、必要なバイト数分、

Wire.read();

で読み出します。

 詳しくは、こちらの記事を参照してください。

 リピーテッド・スタート・コンディションが必要なスレーブ・デバイスのときは、Wire.endTransmission(false);と記述すれば、ストップ・コンディションをスキップできます。

Wire.beginTransmission(スレーブ・アドレス);
  Wire.write(レジスタのアドレス);
Wire.endTransmission(false);
Wire.requestFrom(スレーブ・アドレス, 2);

感震センサ形D7Sをアクセス

 このセンサは、電源を入れると「通常モード」に遷移します。このモードから、次の三つに遷移できます。それぞれのモードが終了すると、通常モードに戻ります。

  • 自己診断
  • オフセット取得
  • 初期設置

 どのモードになっているかは、三つの状態レジスタで知ります。

状態 アドレス 名称 R/W 初期値 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0x1000 State R 0x00 - - - - - state[2:0]
0x1001 AXIS_
State
R 0x02 - - - - - - axis_
state[1:0]
0x1002 Event R 0x00 - - - - event_
offset
event_
selftest
event_
collapse
event_
shut

state(現在の状態);0x00:通常モード、待機中、0x01:通常モード 待機中以外(主に地震処理中)、0x02:初期設置モード、0x03:オフセット取得モード、0x04:自己診断モード

axis_state(現在のSI値計算使用軸);0:YとZ、 1:XとZ、2:XとY
(※)SI 値は水平2軸方向の加速度値から算出する。

event_offset(オフセット取得結果情報);0:正常 1:異常

event_selftest(自己診断結果情報);0:正常 1:異常

event_collapse(INT1ピンACTIVE情報(倒壊における遮断信号));0:デフォルト、1:倒壊における遮断信号ON

event_shut(INT1ピンACTIVE情報(地震における遮断信号)); 0:デフォルト、1:地震における遮断信号ON

スケッチ

 状態レジスタのState、AXIS_State、Eventを読み出します。
 readData8()は、オムロンのサンプルを参考にした8ビット・データを読み出す関数です。

#include <M5Stack.h>
#include <Wire.h>
#define D7S_address 0x55

void setup() {
M5.begin();
Serial.begin(9600);
Serial.println("\n\nStarting D7S communications (it may take some time)...");
Wire.begin();

//read state
Serial.println("State (0;Normal wait, 1:Normal notwait) " + String(readData8(0x10,0x00)));

//read AXIS state
Serial.println("AXIS (0;YZ, 1;XZ, 2;XY ) " + String(readData8(0x10,0x01)));

//read event
Serial.println("Event (bit3 , bit2;INT1 bi1;self bit0;offset) " + String(readData8(0x10,0x02)));
}

void loop() {
// put your main code here, to run repeatedly:
}

uint8_t readData8(uint8_t regH, uint8_t regL){
//setting up i2c connection
Wire.beginTransmission(D7S_address);

//write register address
Wire.write(regH);
delay(10);
Wire.write(regL);
delay(10);

//send RE-START message
uint8_t status = Wire.endTransmission(false);

//if the status != 0 there is an error
if (status != 0)
{
//retry
return readData8(regH, regL);
}

//request 1 byte
Wire.requestFrom(D7S_address, 1);

//read the data
return Wire.read();
}

実行結果

 M5Stackのサイドにある赤い電源スイッチを一度押すとリセットがかかり、再度実行します。何度かリセットしました。最初にごみが表示されている理由は不明です。

前へ

感震センサで揺れを記録する M5Stack編 (2) 加速度センサ

次へ

感震センサで揺れを記録する M5Stack編 (4) 設定変更