感震センサで揺れを記録する M5Stack編 (5) 記録された値

 これまで、感震センサ形D7Sの各種レジスタの状態やモードを読み取ったり変更するスケッチを作ってきました。今回は、このセンサの記録したSI値などを読み出します。たくさん記録されています。

読み出すデータの種類

(1) 地震関連データ(地震中。地震が止まると値は0)

 SI値(0x2000、0x2001);取得できる値0x0000~0xFFFFで、10で割るとkineという単位になる 。

 2軸合成最大加速度PGA(0x2002、0x2003);取得できる値0x0000~0xFFFFで、整数の値でgalという単位になる 。

(2) 地震終了後、地震の過去5回分の各データが記録されている。最新データ1が一番直近のデータ。各データは2バイト。
 0x3000...はレジスタのアドレス。

 最新データ1
 (0x3000、0x3001);X軸の加速度オフセット
 (0x3002、0x3003);Y軸の加速度オフセット
 (0x3004、0x3005);Z軸の加速度オフセット
 (0x3006、0x3007);温度
 (0x3008、0x3009);SI値
 (0x300A、0x300B);PGA

 上記のデータ・セットが、全部で5セットある。

 最新データ2(0x3100~0x310B)

 最新データ3(0x3200~0x320B)

 最新データ4(0x3300~0x330B)

 最新データ5(0x3400~0x340B)

(3) SI値の大きな値から5回分の各データが記録されている。SI上位データ1が最大値。各データは2バイト。
 0x3500...はレジスタのアドレス。

 上位データ1
 (0x3500、0x3501);X軸の加速度オフセット
 (0x3502、0x3503);Y軸の加速度オフセット
 (0x3504、0x3505);Z軸の加速度オフセット
 (0x3506、0x3507);温度
 (0x3508、0x3509);SI値
 (0x350A、0x350B);PGA

 上記のデータ・セットが、全部で5セットある。

 上位データ2(0x3600~0x360B)

 上位データ3(0x3700~0x370B)

 上位データ4(0x3800~0x380B)

 上位データ5(0x3900~0x390B)

(4) 初期設置時のデータ。0x3500...はレジスタのアドレス。

 (0x4000、0x4001);X軸の加速度オフセット
 (0x4002、0x4003);Y軸の加速度オフセット
 (0x4004、0x4005);Z軸の加速度オフセット
 (0x4006、0x4007);温度
 (0x4008、0x4009);X軸加速度値の最大値
 (0x400A、0x400B);Y軸加速度値の最大値
 (0x400C、0x400D);Z軸加速度値の最大値
 (0x400E、0x400F);X軸加速度値の最小値
 (0x4010、0x4011);Y軸加速度値の最小値
 (0x4012、0x4013);Z軸加速度値の最小値
 (0x4014);今後SI値計算に使用する軸

(5) 最新オフセット・データ

 (0x4100、0x4101);X軸の加速度オフセット
 (0x4102、0x4103);Y軸の加速度オフセット
 (0x4104、0x4105);Z軸の加速度オフセット
 (0x4106、0x4107);温度
 (0x4108、0x4109);X軸加速度値の最大値
 (0x410A、0x410B);Y軸加速度値の最大値
 (0x410C、0x410D);Z軸加速度値の最大値
 (0x410E、0x410F);X軸加速度値の最小値
 (0x4110、0x4111);Y軸加速度値の最小値
 (0x4112、0x4113);Z軸加速度値の最小値
 (0x4114);今後SI値計算に使用する軸

(6) 自己診断データ

 (0x4200、0x4201);自己診断前のX軸の加速度値
 (0x4202、0x4203);自己診断後のX軸の加速度値
 (0x4204、0x4205);自己診断前のY軸の加速度値
 (0x4206、0x4207);自己診断後のY軸の加速度値
 (0x4208、0x4209);自己診断前のZ軸の加速度値
 (0x420A、0x420B);自己診断後のZ軸の加速度値
 (0x420C、0x420D);温度
 (0x420E、0x420F);結果(正常;0、異常;1)

全部読み出すスケッチ

 前回までのスケッチに追加して、すべてのレジスタの内容を読み出します。

#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;offset, bit2;selftest, bit1;INT1, bit0;INT1) " + String(readData8(0x10,0x02)));

//mode initialize
writeCommand8(0x10, 0x03, 0x02);
Serial.println("Initialized Mode Register");

//read mode
Serial.println(" mode (1;normal, 2;initial pos, 3;offset, 4;selftest) " + String((readData8(0x10,0x03) & 0x07),BIN) );

//read CTRL
Serial.println(" CTRL (bit7:0, bit6-4;0;default , bit3;axis(0,1,2,3,4), bit2-0:0?) " + String(readData8(0x10,0x04)));

//read Clear Command
Serial.println(" Clear default0 (bit7-bi4:0?, bit3;set, bit2;ofset, bit1;self, bit0;quark) " + String(readData8(0x10,0x05)));
Serial.println("\n------------------");

Serial.println("Initial Installation data");
for (byte i=0; i<21; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x40,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("latest Offset data");
for (byte i=0; i<21; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x41,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("self-Diagnosis data");
for (byte i=0; i<21; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x42,0x00+i),HEX) + " , ");
}

Serial.println("\n------------------");

Serial.println("Now earth data");
for (byte i=0; i<4; i+=1) {
Serial.print(String(i) + ": " + String(readData8(0x20,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("New 1 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x30,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("New 2 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x31,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("New 3 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x32,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("New 4 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x33,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("New 5 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x34,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("SI 1 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x35,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("SI 2 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x36,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("SI 3 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x37,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("SI 4 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x38,0x00+i),HEX) + " , ");
}
Serial.println();

Serial.println("SI 5 data");
for (byte i=0; i<12; i+=1) {
Serial.print(String(i,HEX) + ": " + String(readData8(0x39,0x00+i),HEX) + " , ");
}
Serial.println();
}

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();
}

void writeCommand8(uint8_t regH, uint8_t regL, uint8_t val){
//setting up i2c connection
Wire.beginTransmission(D7S_address);
//write register address
Wire.write(regH);
delay(10);
Wire.write(regL);
delay(10);
//write data
Wire.write(val);
delay(10); //delay to prevent freezing
uint8_t status = Wire.endTransmission(true);
}

 実行結果です。この時点では、読み出した内容が正しいのかどうかは検証できていません。

前へ

回すだけ (2) スケッチ

次へ

感震センサで揺れを記録する M5Stack編 (6) 温度