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

 前回、記録されている値を全部読み出しましたが、正しく読み出せているかは不明です。温度というデータがいろいろな項目にあるので、これらを表示します。このセンサの動作温度範囲は-30~70℃です。

取得した温度データ

 データシートから、温度が保存されている項目をピックアップしました。

  • SI計算中の温度値 n1_main_t_ave~n5_main_t_ave(0x3006、0x3106、0x3206、0x3306、0x3406) 0x8000~0x7FFF (-3276.8~3276.7)*
  • SI計算中の温度値 m1_main_t_ave~m5_main_t_ave(0x3506、0x3606、0x3706、0x3806、0x3906) 0x8000~0x7FFF (-3276.8~3276.7)*
  • 初期設置時の温度値 offset_set_t_ave(0x4006) 0x8000~0x7FFF (-3276.8~3276.7)*
  • 現在のオフセット値を算出したときの温度値 offset_recent_t_ave(0x4106) 0x8000~0x7FFF(-3276.8~3276.7)*
  • 自己診断時の温度値 selftest_t_ave(0x420c) 0x8000~0x7FFF(-3276.8~3276.7)* 

  *小数点以下第1位固定

 温度データのフォーマットはすべて同じであることがわかりました。

スケッチ

 前回、記録したデータを読み出すスケッチを温度だけを読み出すように変更しました。
 「初期設置時の温度値 offset_set_t_ave(0x4006)」の項目では動作確認のために、16ビット・データの読み出しと8ビットずつ2バイトを読み出したときの値を表示します。どちらも、小数点第1位は0です。したがって、ほかの最新データなどは整数だけを表示しました。

#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: " + String(readData16(0x40,0x06)));
Serial.println(" Initial Installation data:H " + String((int)(readData8(0x40,0x06)<<8)));
Serial.println(" Initial Installation data:L " + String(readData8(0x40,0x07)));

Serial.println("latest Offset data: " + String(readData16(0x41,0x06)/10.0));
Serial.println("self-Diagnosis data: " + String(readData16(0x42,0x0c)/10.0));
Serial.println("\n------------------");

Serial.println("New1: " + String(readData16(0x30,0x06)/10));
Serial.println("New2: " + String(readData16(0x31,0x06)/10));
Serial.println("New3: " + String(readData16(0x32,0x06)/10));
Serial.println("New4: " + String(readData16(0x33,0x06)/10));
Serial.println("New5: " + String(readData16(0x34,0x06)/10));
Serial.println();
Serial.println("SI1: " + String(readData16(0x35,0x06)/10));
Serial.println("SI2: " + String(readData16(0x36,0x06)/10));
Serial.println("SI3: " + String(readData16(0x37,0x06)/10));
Serial.println("SI4: " + String(readData16(0x38,0x06)/10));
Serial.println("SI5: " + String(readData16(0x39,0x06)/10));
}

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

uint16_t readData16(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 again
return readData16(regH, regL);
}
//request 2 byte
Wire.requestFrom(D7S_address, 2);
//return the data
return (Wire.read() << 8) | 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);
}

 実行例です。SI値の2番目の値は異常な値です。原因は不明です。

 そのほかは妥当な温度が表示されます。センサを指でつまむと38度などが表示されました。専用のセンサではなくセンサの横にあるCPUの内蔵温度計を読み出しているのかもしれません。通常、温度センサを指でつまんでも、36℃を超えることはほとんどありません。

すべての値を読み出す

 前回、データの上位8ビットだけを読み出しました。今回温度が正常に読み出せたので、各値も2バイト分を読み出して表示します。

#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(" 0 2 4 6 8 A C E 10 12 14");

Serial.println(" Initial Installation data");
for (byte i=0; i<20; i+=2) {
Serial.print( String(readData16(0x40,0x00+i),HEX) + " ");
}
Serial.println(String(readData8(0x40,0x14),HEX));

Serial.println(" latest Offset data");
for (byte i=0; i<20; i+=2) {
Serial.print(String(readData16(0x41,0x00+i),HEX) + " ");
}
Serial.println(String(readData8(0x41,0x14),HEX));

Serial.println(" Self-Diagnosis data");
for (byte i=0; i<14; i+=2) {
Serial.print(String(readData16(0x42,0x00+i),HEX) + " ");
}
Serial.println(String(readData8(0x42,0x0e),HEX));

Serial.println("\n------------------");
Serial.println(" Now earth data SI & PGA");
for (byte i=0; i<4; i+=2) {
Serial.print(String(readData16(0x20,0x00+i),HEX) + " ");
}
Serial.println();

Serial.println(" New 1 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x30,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" New 2 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x31,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" New 3 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x32,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" New 4 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x33,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" New 5 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x34,0x00+i),HEX) + " ");
}
Serial.println();

Serial.println(" SI 1 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x35,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" SI 2 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x36,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" SI 3 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x37,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" SI 4 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(0x38,0x00+i),HEX) + " ");
}
Serial.println();
Serial.println(" SI 5 data");
for (byte i=0; i<12; i+=2) {
Serial.print(String(readData16(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();
}

uint16_t readData16(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 again
return readData16(regH, regL);
}
//request 2 byte
Wire.requestFrom(D7S_address, 2);
//return the data
return (Wire.read() << 8) | 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度目の実行例です。一度目のNow earth dataのSIとPGAはどちらも0で、センサを手で動かしながら、2度目を実行しました。

前へ

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

次へ

走るだけ (1) タミヤ工作セット71201のI/O