[Archive] LIS2DW12 Accelerometer
このライブラリはアーカイブされており、サポートされなくなりました。LIS2DW12 加速度センサライブラリの最新バージョンは、こちらから入手できます。
LIS2DW12は、高性能、超低電力、3軸の加速度測定が可能なMEMSデジタル出力モーションセンサです。センサのプラグをNEQTO Bridgeに接続し、I2Cプロトコルを介してデータの読み取りと書き込みが可能です。LIS2DW12ライブラリは、加速度値をベクトルとして読み取るために必要な機能を提供します。
neqto.jsライブラリをインポートする方法については、このドキュメントを参照してください。
ハードウェアの接続
LIS2DW12センサを、NEQTO Bridgeの標準の短いケーブルI2Cポートに差し込みます。
ソフトウェアの接続
LIS2DW12ライブラリを使ってI2Cプロトコルを介してセンサと通信することができます。
主な機能
LIS2DW12 センサの主な機能は、いくつかの関数で提供されます。センサ読み取りモードに設定するsetAccFifoMode
、センサからFIFOサンプル数を取得するgetAccFifoNum
、加速度値を取得するgetAccValue
、加速度値のリストを取得する getAccValues
、最大加速値を取得するgetMaxAccValues
、加速度値の合計値を取得するgetSumAccValues
といった関数があります。
オブジェクト作成
全てのNEQTO I2Cライブラリは、同じ形式で作成されます。LIS2DW12は、コンストラクター関数の引数として渡されるI2C対応オブジェクトを使用して作成する必要があります。作成後、init()
関数を呼び出して初期化し、センサが値の読み取りを開始できるようにする必要があります。 これは1回だけ必要な作業です
関数
センサをFIFOモードに設定するための読み取りを行う前にsetAccFifoMode()
関数を呼び出す必要があります。
FIFOモードを設定した後、getAccFifoNum()
関数を呼び出してFIFOサンプル数を準備します。サンプルの数を取得した後、次の加速度値はgetAccValue()
の呼び出しで取得できます。 また、次のn個のサンプルはgetAccValues({numberSamples})
で取得できます。また、getMaxAccValues({numberSamples})
とgetSumAccValues({numberSamples})
呼び出しで、それぞれn個のサンプルの最大値、合計値を取得することもできます。
サンプルスクリプト
次に示すのは、LIS2DW12センサを使用した、加速度計が以前の最大加速度値よりも大きい最大加速の読み取り値を取得するたびにログを記録するスクリプト例です。
まず、インターフェースをオンにして、LIS2DW12センサ使用するためにI2Cデバイスオブジェクトを作成しています。
LIS2DW12ライブラリを使用してlis2dw
オブジェクトを作成し、センサを初期化してFIFOモードにし、読み取りを行う準備をします。
初期の最大値も設定され、起こり得るセンサ誤読のためにアサートカウンターがセットアップされます。
そして、メインループでLIS2DW12センサから準備が整ったサンプル数がgetAccFifoNum
を使用して読み取られ、返された値に応じて2つの操作フローが発生します。サンプルの準備ができていない場合、アサートカウンターが値を増加し、サンプルの準備ができているかどうか再びセンサがチェックされます。10回連続でサンプルが読み取れない場合、センサはリセットされます。サンプルの準備ができると、センサは以前のサンプル数から最大加速度値を読み取り、現在の最大値よりも大きい場合、現在の最大値を新しい最大値に更新して処理を抜けます。また、使用可能なサンプルの数が許可されている最大FIFOサンプルの数より大きい場合、センサはリセットされます。
このスクリプトは、LIS2DW12センサから新しい最大加速度の読み取り値を取得する毎にシリアルコンソールに出力します。
// IMPORTED LIBRARIES
// - LIS2DW12
// Logging setup
log.setLevel(2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.clear();
//Use standard interface of NEQTO IO board
nqEx.enI2CS(true);
nqEx.enI2CL(true);
//I2C Config
var baudrate = 400000;
var i2c = new I2C(1);
i2c.open(baudrate);
var lis2dw = new LIS2DW12(i2c);
lis2dw.init();
// Get LIS2DW12 sensor into FIFO mode ready to take readings
lis2dw.setAccFifoMode();
var assertCount = 0;
var maxP = -1;
var maxX = 0;
var maxY = 0;
var maxZ = 0;
while (1) {
var num = lis2dw.getAccFifoNum();
if (num == 0) {
assertCount++;
if (assertCount >= 10) {
// Reset sensor
lis2dw.setAccFifoMode();
assertCount = 0;
}
} else {
assertCount = 0;
var mVector = lis2dw.getMaxAccValues(num);
if (mVector[0] > maxP) {
maxP = mVector[0];
maxX = mVector[1];
maxY = mVector[2];
maxZ = mVector[3];
print("Accelerometer current max vector x,y,z values: " + maxX + ", " + maxY + ", " + maxZ);
}
if (num == lis2dw.getMaxFifoSamples()) {
lis2dw.log.warning("Sample overflow!");
lis2dw.setAccFifoMode();
}
}
}