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

 前回、感震センサ形D7Sの最初のスケッチでは、状態を表す三つのレジスタを読み出しました。ここでは、設定変更レジスタを読み書きします。

設定変更レジスタ

 データシートから、設定変更に使われるレジスタは、Mode、CTRL、Clear_Commandの三つがあります。

設定
変更
アドレス 名称 R/W 初期値 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0x1003 Mode R/W 0x01 - - - - - mode[2:0]
0x1004 CTRL R/W 0x40 - ctrl_axis[2:0] ctrl_
thresh
- - -
0x1005 Clear_
Command
R/W 0x00 - - - - clear_set
offset
clear_recent_
offset
clear_
selftest
clear_
quake

mode(現在のモード);0x01:通常モード、0x02:初期設置モード、0x03:オフセット取得モード、0x04:自己診断モード

ctrl_axis(SI値計算軸設定パターン);0:YZ軸、1:XZ軸、2:XY軸、3:自動軸切り替え(通常モード開始時初期設置モード自動移行による自動軸計算)、4:設置時軸切り替え(初期設置モード移行における自動軸計算)

ctrl_thresh(地震による遮断判定閾値);0:閾値レベルHIGH、1:閾値レベルLOW

clear_set_offset(初期設置データのメモリ・クリア);0:デフォルト、1:メモリ・クリア

clear_recent_offset(最新オフセット・データのメモリ・クリア);0:デフォルト、1:メモリ・クリア

clear_selftest(自己診断データのメモリ・クリア);0:デフォルト、1:メモリ・クリア

clear_quake(地震データのメモリ・クリア);0:デフォルト、1:メモリ・クリア

(※)メモリ・クリア=0が書き込まれる。

スケッチ

 設定変更レジスタのMode、CTRL、Clear_Commandを読み出します。
 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;offset, bit2;selftest, bit1;INT1, bit0;INT1) " + String(readData8(0x10,0x02)));

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

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

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サイドにある赤色のボタンを1回クリックするとリセットがかかります。何度かリセットしたときの様子です。

設定変更レジスタを書き換えるスケッチ

 上記は設定変更レジスタを読み出しただけです。今度はmodeレジスタの内容を変更します。

 writeCommand8()は、オムロンのサンプルを参考にした8ビット・データを書き込む関数です。
 readData8(0x10,0x03) & 0x07 の0x07は0b00000111のマスクです。上位ビットにデータシートに書かれている以外のデータが現れたので、modeデータだけを抽出します。

#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, 0x01);
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)));
}

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

実行

 0x01:通常モードを設定変更した実行例です。

 0x02:初期設置モードを設定しました。実行の結果modeは111=0x07という、データシートに書かれていない値が戻りました。次にリセットを掛けた直後にセンサを動かしたとき、10=0x02が戻りました。

 これらの設定がどういう目的で利用するのかは、データシートに書かれていますが、日本語は難解です。英語のデータシートはありません。

 次回は、SI値、最新データなど、たくさんの測定されたデータ、計算されたデータを読み出します。

前へ

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

次へ

ESP32活用① ESP32とブラウザでお話しする(5)LEDのON/OFFとI2Cの温度センサの測定結果をまとめて表示