感震センサで揺れを記録する 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値、最新データなど、たくさんの測定されたデータ、計算されたデータを読み出します。