LIS2DW12 v2 Accelerometer
このライブラリは、STMicroelectronics社製LIS2DW12加速度センサを制御する機能を提供する組み込みクラスです。
Library usage requirements | |
---|---|
Type | I2C |
Name | LIS2DW12_V2 |
Version | 2020-12-10 |
Code size used | 3.7KB |
Resources used | I2C x 1, Timers x 1 |
関連資料
STMicroelectronics社製LIS2DW12加速度センサの詳細については、データシートを参照してください。
Abstracts
Methods()/Properties | Summary |
---|---|
new LIS2DW12() | LIS2DW12 インスタンスを作成します。 |
{LIS2DW12} Instance
Methods()/Properties | Summary |
---|---|
.write() | I2Cデバイスの指定したレジスタに1バイトのデータを書き込みます。 |
.read() | I2Cデバイスの指定したレジスタから1バイトのデータを読み込みます。 |
.readBuff() | I2Cデバイスの指定されたレジスタから指定された長さのデータを読み込みます。 |
.init() | センサを初期化します。 |
.measOn() | センサの電源を入れ、測定を開始します。 |
.measOff() | センサの電源を切ります。 |
.getFifoNum() | FIFOバッファに保存されているサンプル数を取得します。 |
.readFifo() | X、Y、Z軸の直線加速度測定結果を取得します。 |
.readFifoMaxAcc() | X、Y、Z軸の合成加速度最大値、およびそのサンプルの直線加速度値を取得します。 |
Details
new LIS2DW12(i2c)
LIS2DW12
インスタンスを作成します。
Instance Methods
.write(reg,data)
I2Cデバイスの指定したレジスタに1バイトのデータを書き込みます。
センサのレジスタに直接アクセスする場合に使用します。
Name | Type | Default | Summary |
---|---|---|---|
reg | number | MANDATORY | 対象レジスタ 設定範囲: 0x00~0xFF |
data | number | MANDATORY | 書き込みデータ 設定範囲: 0x00~0xFF |
return | boolean | - | true: 成功 false: 失敗 |
.read(reg)
I2Cデバイスの指定したレジスタから1バイトのデータを読み込みます。
センサのレジスタに直接アクセスする場合に使用します。
Name | Type | Default | Summary |
---|---|---|---|
reg | number | MANDATORY | 対象レジスタ 設定範囲: 0x00~0xFF |
return | number, undefined | - | 読み込んだデータ 読み込みに失敗した場合は undefined を返します。 |
.readBuff(reg,len)
I2Cデバイスの指定されたレジスタから指定された長さのデータを読み込みます。
センサのレジスタに直接アクセスする場合に使用します。
Name | Type | Default | Summary |
---|---|---|---|
reg | number | MANDATORY | 対象レジスタ 設定範囲: 0x00~0xFF |
len | number | MANDATORY | 読み込みデータ長(バイト) 指定可能な最大長は255バイトです。 |
return | ArrayBuffer, undefined | - | 読み込んだデータ 読み込みに失敗した場合は undefined を返します。 |
.init()
センサを初期化します。
このメソッドは、インスタンス作成後、はじめに呼び出す必要があります。
Name | Type | Default | Summary |
---|---|---|---|
return | boolean | - | true: 成功 false: 失敗 |
.measOn(odr,mode,bwfilter,fs,fds,lownoise)
センサの電源を入れ、測定を開始します。
各種加速度測定モードを選択することができます。詳細については、センサのデータシートをご参照ください。
Name | Type | Default | Summary |
---|---|---|---|
odr | number | MANDATORY | 出力データレート [ 設定値: High-Performance Mode時 / Low-Power Mode時 ] 1: 12.5 / 1.6 Hz 2: 12.5 / 12.5 Hz 3: 25 / 25 Hz 4: 50 / 50 Hz 5: 100 / 100 Hz 6: 200 / 200 Hz 7: 400 / 200 Hz |
mode | number | MANDATORY | Powerモード及び分解能 0: High-Performance Mode (14-bit) 1: Low-Power Mode 1 (12-bit) 2: Low-Power Mode 2 (14-bit) 3: Low-Power Mode 3 (14-bit) 4: Low-Power Mode 4 (14-bit) |
bwfilter | number | MANDATORY | フィルタ帯域幅 0: ODR/2 1: ODR/4 2: ODR/10 3: ODR/20 |
fs | number | MANDATORY | フルスケール 0: ±2g 1: ±4g 2: ±8g 3: ±16g |
fds | boolean | MANDATORY | フィルタタイプ true: ハイパスフィルタ false: ローパスフィルタ |
lownoise | boolean | MANDATORY | 低ノイズ動作モード true: 有効 false: 無効 |
return | boolean | - | true: 成功 false: 失敗 |
.measOff()
センサの電源を切り、消費電力を削減します。
Name | Type | Default | Summary |
---|---|---|---|
return | undefined | - | - |
.getFifoNum()
FIFOバッファに保存されているサンプル数を取得します。
センサのFIFOバッファーは、最大32サンプルの3軸加速度データを保存することができます。
したがって、戻り値のサンプル数が32
となった場合、一部のサンプルが上書きされ、データが失われた可能性があります。
データの損失を防ぐためには、最適な出力データレートの選択と分散的なアプリケーション処理を実装する必要があります。
Name | Type | Default | Summary |
---|---|---|---|
return | number | - | FIFOバッファに保存されているサンプル数 |
.readFifo(num)
X、Y、Z軸の直線加速度測定結果を取得します。
Name | Type | Default | Summary |
---|---|---|---|
num | number | MANDATORY | 読み出しサンプル数.getFifoNum() メソッドで取得したサンプル数以下である必要があります。 |
return | array | - | 3軸直線加速度値(g)を[ x[], y[], z[] ] 形式の2次元配列で返します。配列の要素は number 型です。読み出しに失敗した場合は、空の配列 [ [], [], [] ] が返されます。 |
.readFifoMaxAcc(num)
X、Y、Z軸の合成加速度最大値、およびそのサンプルの直線加速度値を取得します。
読み出したnum
サンプルデータのうち、3軸合成加速度値が最も大きいサンプルのデータを返します。
Name | Type | Default | Summary |
---|---|---|---|
num | number | MANDATORY | 読み出しサンプル数.getFifoNum() メソッドで取得したサンプル数以下である必要があります。 |
return | array | - | 3軸合成加速度値m (g)と3軸直線加速度値(g)を[m, x, y, z] 形式の配列で返します。配列の要素は number 型です。読み出しに失敗した場合は、3軸合成加速度値が -1 となります。 |
Usage Examples
Sample 1: 指数平滑法による連続測定
// IMPORTED LIBRARIES
// - LIS2DW12_V2
// Logging setup
log.setLevel(0,2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE, 0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
// I2C Configuration
var i2c;
if('nqBridge' in this){
if(nqEx.getBoardType()){
// Using NEQTO Bridge IO Board or NEQTO Bridge Digital IO Board.
nqEx.enI2CS(true);
nqEx.enI2CL(true);
}
i2c = new I2C(1);
} else if('nqSpresense' in this){
i2c = new I2C(0);
} else if('nqDiscovery' in this){
i2c = new I2C(1);
} else{
throw("Incompatible device.");
}
i2c.open(400000); // Baudrate: 400000
var lis2dw12 = new LIS2DW12(i2c);
var ready = lis2dw12.init();
var results;
var ewmaVals = []; // Smoothed results (Exponential Weighted Moving Average)
var prevVals = []; // Stored previous results
var isFirstRun = true;
var alpha = 0.5;
var count = 0;
var maxCount = 100;
var loopFlag = true;
if (!ready) {
print("Error: Unable to connect to LIS2DW12");
}
else{
// 100 Hz, High Perf, ODR/2, +-2g, Low pass filter, Low noise enabled
var ready2 = lis2dw12.measOn(5, 0, 0, 0, false, true);
if(!ready2) print('measOn unsuccessful');
else {
print('measOn successful');
while(loopFlag){
var num = lis2dw12.getFifoNum();
// print('accnum: '+num);
if(num == 32) print('Warning: Fifo buffer possible overrun!');
if(num!=0){
results = lis2dw12.readFifo(num);
for(var i=0; i<num; i++) {
if(isFirstRun){
isFirstRun = false;
print('| cnt | x | y | z | smx | smy | smz |');
print(`| ${count} | ${results[0][0].toFixed(2)} | ${results[1][0].toFixed(2)} | ${results[2][0].toFixed(2)} | { } | { } | { } |`);
count++;
} else {
for (var j = 0; j < 3; j++) { // 3-Axis X, Y, Z
if (ewmaVals.length < 3) { // Initial values for ewmaVals
ewmaVals[j] = results[j][0];
} else {
ewmaVals[j] = (alpha * prevVals[j]) + ((1-alpha) * ewmaVals[j]);
}
prevVals[j] = results[j][i];
}
print(`| ${count} | ${results[0][i].toFixed(2)} | ${results[1][i].toFixed(2)} | ${results[2][i].toFixed(2)} | ` +
`${ewmaVals[0].toFixed(2)} | ${ewmaVals[1].toFixed(2)} | ${ewmaVals[2].toFixed(2)} |`);
if(count++ >= maxCount){
loopFlag = false;
break;
}
}
}
}
}
}
lis2dw12.measOff();
}
i2c.close();
Sample 2: 衝撃検出
// IMPORTED LIBRARIES
// - LIS2DW12_V2
// Logging setup
log.setLevel(0,2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE, 0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
// I2C Configuration
var i2c;
if('nqBridge' in this){
if(nqEx.getBoardType()){
// Using NEQTO Bridge IO Board or NEQTO Bridge Digital IO Board.
nqEx.enI2CS(true);
nqEx.enI2CL(true);
}
i2c = new I2C(1);
} else if('nqSpresense' in this){
i2c = new I2C(0);
} else if('nqDiscovery' in this){
i2c = new I2C(1);
} else{
throw("Incompatible device.");
}
i2c.open(400000); // Baudrate: 400000
var lis2dw12 = new LIS2DW12(i2c);
var ready = lis2dw12.init();
var dateTime;
var results;
var highThreshold = 2.00; // Shock threshold engage
var lowThreshold = 0.50; // Shock threshold release
var detection = false;
var maxShock = [0, 0, 0, 0];
var maxShockTime;
var count = 0;
var maxCount = 100;
var loopFlag = true;
if (!ready) {
print("Error: Unable to connect to LIS2DW12");
}
else{
// 400 Hz, High Perf, ODR/2, +-16g, High pass filter, Low noise enabled
var ready2 = lis2dw12.measOn(7, 0, 0, 3, true, true);
if(!ready2) print('measOn unsuccessful');
else {
print('measOn successful');
while(loopFlag){
var num = lis2dw12.getFifoNum();
// print('accnum: '+num);
if(num == 32) print('Warning: Fifo buffer possible overrun!');
if(num!=0){
results = lis2dw12.readFifoMaxAcc(num);
if(!detection && results[0] > highThreshold){
print("Warning: Shock detected!");
detection = true;
if(maxShock[0] <= results[0]){
maxShock = results.slice();
maxShockTime = Date.now();
}
} else if(detection && results[0] < lowThreshold){
detection = false;
print(`[Max Shock] ${maxShockTime}, Magnitude: ${maxShock[0].toFixed(2)}, X: ${maxShock[1].toFixed(2)}, Y: ${maxShock[2].toFixed(2)}, Z: ${maxShock[3].toFixed(2)}`);
// loopFlag = false; // One-shock detection
var maxShock = [0, 0, 0, 0]; // Reset
}
}
}
}
lis2dw12.measOff();
}
i2c.close();