感震センサで揺れを記録する 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(スレーブ・アドレス); |
一般的なやり取りは8ビット単位で行います。もしレジスタが16ビットなら、8ビットを2回送ります。
Wire.beginTransmission(スレーブ・アドレス); Wire.write(レジスタやポインタの上位アドレス。8ビット); Wire.write(レジスタやポインタの下位アドレス。8ビット); Wire.endTransmission(); |
スレーブ・デバイスからのデータの読み取りは、
Wire.requestFrom(スレーブ・アドレス, バイト数); |
でバイト数分、バッファ?に入っているので、必要なバイト数分、
Wire.read(); |
で読み出します。
詳しくは、こちらの記事を参照してください。
リピーテッド・スタート・コンディションが必要なスレーブ・デバイスのときは、Wire.endTransmission(false);と記述すれば、ストップ・コンディションをスキップできます。
Wire.beginTransmission(スレーブ・アドレス); |
●感震センサ形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 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のサイドにある赤い電源スイッチを一度押すとリセットがかかり、再度実行します。何度かリセットしました。最初にごみが表示されている理由は不明です。