モーションセンシングがすべての資産タグに必要な理由

ほとんどのBLEタグの導入は位置追跡を目的としていますが、位置だけではパレットが落下したか、箱が横倒しになったか、高価な機器がトラックの荷台で6時間振動していたかを知ることはできません。タグに加速度センサーを追加することで、パッシブなビーコンからアクティブなセンサーノードへと変換されます——衝撃イベントの検出、動作パターンの分類、そして実際に何かが発生した時だけMCUを唤醒することが可能になります。

エンジニアリングの課題は加速度センサーICの選択(それはスペッドシートの作業です)ではなく、割り込みチェーン、衝撃閾値ロジック、電力予算、誤検出フィルターの設計です——タグがリアルイベントを報告しつつ、バッテリーを消耗させず、ゲートウェイをノイズで溢れさせないようにする設計です。

本記事ではシリコン選定から検出アルゴリズム、割り込みアーキテクチャ、データエンコーディング、キャリブレーションまで——各段階で実際の数値を示しながら——完全な信号パスを解説します。

加速度センサーIC選定:実際に重要なこと

低消費電力資産タグは16ビット20 kHzのIMUを必要としません。1 µA未満でスリープし、プログラマブル閾値で唤醒する8–12ビット加速度センサーが必要です。重要なICに絞った比較表:

パラメータ ST LIS2DH12 ADI ADXL362 Bosch BMI270 TDK ICM-42670-P
分解能 8/10/12ビット 12ビット 16ビット 16ビット
測定範囲 (g) ±2/4/8/16 ±2/4/8 ±2/4/8/16 ±2/4/8/16
消費電流 (アクティブ) 5–11 µA 0.2 µA (モーション) 4.8 µA 6.6 µA
消費電流 (スリープ) 0.5 µA 10 nA 3 µA 2 µA
内蔵動作検出 あり (INT1/INT2) あり (awake/inact) あり (any-motion) あり (wake-on-motion)
インターフェース SPI / I²C SPI SPI / I²C SPI / I²C
パッケージ LGA 2×2×1 LGA 3×3×1.05 LGA 2.5×3×0.83 LGA 2.5×3×0.76
価格 (1K) $0.58 $3.85 $1.20 $1.55

資産タグではST LIS2DH12が実用的なデフォルト選択です:プログラマブル8/10/12ビットモード、2つの割り込みピン、内蔵クリック/ダブルクリック検出、0.5 µAスタンドバイ。1K数量で$0.58なのでBOMへの影響はほぼありません。ADXL362の10 nAスリープは魅力的ですが、SPIのみのインターフェースと$3.85の価格により、MCU自体がsub-µAでスリープし、加速度センサーの0.5 µAも許容できない超低消費電力設計向けのニッチ選択となります。

データシートでは強調されない重要な選定基準:

  • 閾値粒度:LIS2DH12動作閾値は1 LSB = ±2 g / 12ビットで16 mg。ADXL362は3.9 mg/LSB。1–2 gでの衝撃検出には両者とも十分です。
  • 割り込みレイテンシ:内蔵動作検出は1–3サンプル周期で発火。1 Hzで非アクティブをサンプリングする場合、1–3秒——衝撃には遅すぎます。別の高速パスが必要です。
  • FIFO深度:LIS2DH12は32サンプルFIFO、BMI270は128サンプルFIFO。大型FIFOはイベント中にSPIをアクティブに保たずにMCUが衝撃波形をバーストリード可能にします。

動作検出モードとその用途

BLEタグファームウェアは通常、異なる閾値軸で3つの検出モードを同時に実行します:

1. アクティビティ / インアクティビティ(存在検出)

目的:タグ付けされた資産が静止しているか輸送中かを検出。これによりモードスイッチングが行われます——資産が移動中はアドバタイズ間隔が1000 msから100 msに低下します。

LIS2DH12の設定例:

  • アクティビティ閾値:0.5 g (32 mg/LSB × 16 = ~512 mg)
  • アクティビティ持続時間:1 Hzで1サンプル(即時トリガー)
  • インアクティビティ閾値:0.08 g
  • インアクティビティ持続時間:1 Hzで30サンプル(30秒の静止)

電力影響:加速度センサーは1 Hz(5 µA)で稼働し、MCUはスリープ状態。アクティビティが発火するとMCUが唤醒し、BLEラジオを高速アドバタイズに切り替えます。

2. 自由落下検出

目的:落下の検出——クレーンで吊り上げられ放出されたパレット、ベンチから落とされた機器。

特徴は3軸すべてが同時にゼロ付近になること。LIS2DH12自由落下閾値:全軸で≤0.2 gにアクティビティを設定、200 Hzで≥2サンプルの持続時間(10 ms)。200 Hzでは加速度センサーは~11 µAを消費——既知の取扱い期間中のみ自由落下検出をアクティブにする場合のみ許容可能です。

実際の問題:ボックスの角にマウントされたタグは、通常の向きで一軸に0.6 gの静止重力を感じます。箱が傾くとその軸はシフトしますがゼロになりません。自由落下は空中に真正に浮いた物体のみで有効です。ほとんどの物流シナリオでは衝撃検出(次節)がより信頼性が高いです。

3. シングル / ダブルクリック(タップ検出)

目的:ユーザーインタラクション——ダブルタップで資産引き渡し確認、シングルタップで位置情報ピング要求。

LIS2DH12内蔵クリック検出はファームウェアの介入なしで処理します:

  • クリック閾値:1.2 g(トラック振動による誤トリガーを回避するためアクティビティより高い)
  • クリック時間制限:80 ms(タップのウィンドウ)
  • ダブルクリックレイテンシ:400 ms(最初と2回目のタップ間の時間)
  • INT1でシングルクリック、INT2でダブルクリックの割り込み

このモードは設定可能な時間ウィンドウ(例:ボタンプレスまたはゲートウェイ近接イベント後の最初30秒)中のみ400 Hz(~11 µA)で稼働します。それ以外は加速度センサーは1 Hzを維持します。

衝撃検出:本当のエンジニアリング課題

衝撃イベントは振動、ドアの衝撃、フォークリフトの接触と同じ周波数特性を持つため、最も確実に検出が困難です。信号処理はシンプル——閾値を超えること——ですが、閾値の選定と確認ロジックはシンプルではありません。

アプリケーション別閾値選定

シナリオ 典型的ピーク (g) 推奨閾値 検出ウィンドウ
パッケージ落下(30 cm、硬い床) 15–30 8 g 5 ms
パレット衝撃(フォークリフト) 3–6 2.5 g 50 ms
トラック振動(道路) 0.5–1.5 1.5 g(確認付き) 100 ms
機器棚の転倒 2–4 2 g 20 ms
ラップケース落下 10–20 6 g 10 ms

重要な洞察:閾値だけでは不十分です。フォークリフトの4 g衝撃はシンプルな閾値検出器にはパッケージ落下と同じに見えます。確認基準が必要です:

  • 持続時間確認:検出ウィンドウより短い衝撃イベントは無視。2 msの4 gピークは振動、40 msの4 gピークは衝撃です。
  • 軸相関:実際の衝撃は複数軸に相関したスパイクを生成します。ランダム振動は通常一軸(振動方向に整列した軸)でピークになります。mag = sqrt(x² + y² + z²)を計算し、mag > thresholdを要求します。
  • 前後静穏ウィンドウ:イベント前後で少なくとも2サンプル期間にmag < 0.5 × thresholdを要求。これにより複数ピークが閾値を連続して超える振動トレインを排除します。

衝撃検出ファームウェアフロー

状態: ACCEL_IDLE (1 Hz, MCU sleeping)
  INT発火 → ACCEL_ACTIVE
    → 200 Hzに切り替え
    → 50 msでFIFOリード (10サンプル)
    → サンプルごとにmagnitudeを計算
    → max_mag > IMPACT_THRESH の場合:
        → 持続時間確認(閾値以上のサンプル)
        → 前後静穏ウィンドウ確認
        → 確認済みの場合:
            → ピークmagnitude、持続時間、軸分布を記録
            → BLE唤醒、衝撃イベントパケット送信
            → 5秒後にACCEL_IDLEに戻る
        → その他:誤検出、ACCEL_IDLEに戻る
    → その他:アクティビティトリガー、高速アドバタイズ再開

200 Hzバーストは50 msのみ持続。バースト中の消費電流:加速度センサー11 µA + MCUアクティブ3 mA × 50 ms = 0.15 mAs/イベント。100イベント/日でも15 mAs/日——BLEアドバタイズと比較して無視可能です。

割り込み駆動アーキテクチャ:電力予算の基盤

タグの電力予算はMCUとラジオがスリープ状態に留まる時間によって決まります。割り込み駆動設計は加速度センサーがハードウェアウォッチドッグとして機能することを意味します:

割り込みルーティング(LIS2DH12)

INTピン 機能 MCUアクション 加速度センサー速率
INT1 アクティビティ / クリック / 自由落下 MCU唤醒、ステータスリード 1 Hz(デフォルト)→ 400 Hz(クリックウィンドウ)
INT2 インアクティビティ / FIFOウォーターマーク なし(インアクティビティ)またはバーストリード(FIFO) 1 Hz

MCU(例:nRF52832)はRAM保持ありで1.2 µA(System OFF)、RAM保持なしで0.6 µA(System OFF)でスリープします。LIS2DH12は1 Hzで5 µA。合計スタンドバイ:~6 µA。

イベントトリガー電力状態

状態 持続時間 消費電流 エネルギー (µC/event)
ディープスリープ 連続 6 µA
アクティビティINT → MCU唤醒 + ステータスリード 5 ms 3 mA 15
衝撃検出バースト 50 ms 3 mA + 11 µA ~151
BLEアドバタイズ(高速、100 ms間隔) 5 s 8.5 mA avg 42,500
BLEアドバタイズ(低速、1000 ms間隔) 連続 ~12 µA avg

CR2032(220 mAh、2.9–3.0 V使用可能)での場合:

  • 低速アドバタイズのみ(1000 ms):~2.4年
  • モーショントリガー高速アドバタイズ(100イベント/日、各5 s):~2.1年
  • 衝撃検出 + レポート(20衝撃/日):~2.0年

モーションセンシングのオーバーヘッドは総バッテリー寿命の5%未満です。BLEラジオが依然として支配的な消費源です。

データエンコーディング:衝撃データをアドバタイズパケットにパックする

衝撃を検出したBLEタグはイベントタイプ、ピークmagnitude、持続時間、およびオプションで軸分布を報告する必要があります。標準BLEアドバタイズパケットの使用可能ペイロードは31バイト(フラグと長さヘッダー後)です。衝撃イベントを効率的にエンコードする方法:

カスタムManufacturer-Specificデータフォーマット

Byte 0-1: Company ID (0xFFFFでテスト、生産では登録)
Byte 2:   データタイプフラグ
          0x01 = モーションステータス(アクティビティ/インアクティビティ)
          0x02 = 衝撃イベント
          0x03 = 自由落下イベント
Byte 3:   イベントサブタイプ / 深刻度
          衝撃: 0x01=軽微 (2-4g), 0x02=中程度 (4-8g), 0x03=重大 (>8g)
Byte 4-5: ピークmagnitude (0.01 g単位, uint16)
          例: 4.56 g → 0x01C8 (456)
Byte 6-7: イベント持続時間 (0.5 ms単位, uint16)
          例: 38 ms → 0x004C (76)
Byte 8:   軸分布ビットマップ
          Bit 0: X軸支配
          Bit 1: Y軸支配
          Bit 2: Z軸支配
          Bit 3: 多軸(相関)
          Bit 4-7: 予約済み
Byte 9:   イベント時温度 (°C, 符号付き, 0.5°C分解能)
Byte 10:  バッテリーレベル (0-100%)

完全な衝撃レポートで合計11バイト。2バイトフラグと2バイト長さヘッダーで15バイト——31バイト制限内に余裕があります。残りのスペースには位置コンテキスト用の標準UUID/major/minorを搭載できます。

誤検出削減:有用と無用の違い

すべての導入エンジニアが同じ問題を見ています:倉庫ドア枠にマウントされたタグがトラック通過時のドア振動で1日300回の「衝撃」を報告します。レイヤードフィルタースタック:

レイヤー1:Magnitude + 持続時間ゲート

前述のように:mag > threshold AND duration > min_windowを要求。これにより閾値を超えるが持続しない振動ピークの80%の誤検出を排除します。

レイヤー2:軸相関

ピークでr = min(x, y, z) / max(x, y, z)を計算。実際の衝撃はr > 0.3を生成(複数軸にエネルギー分散)。方向性振動はr < 0.15を生成(一軸支配)。このフィルターは4 g未満の閾値のみに適用——4 g以上ではほぼすべてのピークが本物です。

レイヤー3:時間デバウンス

確認された衝撃後、設定可能なクールダウン期間(デフォルト:60秒)中にさらに検出を抑制。これにより物体が弾む際に1つの物理衝撃が5つのレポートを生成するのを防止。アプリケーション別のクールダウン調整:

  • 精密機器:5秒(各弾みを捕捉)
  • 工業パレット:120秒(取扱いイベント1回につき1レポート)

レイヤー4:コンテキストゲート

コンテキスト条件が満たされた場合のみ衝撃検出を有効化:

  • タグが輸送中(アクティビティ検出 = 移動中)
  • タグが積載ゾーン近傍(ゲートウェイRSSI > -60 dBm)
  • 時間ウィンドウ(営業時間中のみ衝撃検出)

誤検出率比較

フィルタースタック 真陽性率 誤検出率(倉庫環境)
閾値のみ 95% 30/日
+ 持続時間ゲート 93% 8/日
+ 軸相関 90% 2/日
+ 時間デバウンス 88% 0.5/日
+ コンテキストゲート 85% <0.1/日

完全スタックからの10%の真陽性損失は主にデバウンスフィルターによる急速連続衝撃(物体の弾み)の漏れです。アプリケーションで各弾みが必要な場合、デバウンスを5秒に減らし、~1誤検出/日を受け入れます。

キャリブレーション:閾値を現実に合わせる

データシート閾値は理論値です。実際のタグは各ユニットのキャリブレーションが必要です:

  • ゼロgオフセット:LIS2DH12仕様はPCB搭載後±40 mg/軸を許容。CR2032駆動タグでバッテリーが加速度センサー直上にある場合、リフローとPCB曲げでオフセットが±80 mgまでシフト可能。
  • 感度誤差:±2 g範囲で±1.5%。4 g衝撃閾値では±60 mgの不確定性——重大ではないが、深刻度分類精度に影響。
  • クロス軸感度:最大1%(軸Xが軸Y入力に応答)。magnitude基準検出では無視可能。軸別分析では重要。

2点キャリブレーション手順

生産ラインで各タグを2つの向きでキャリブレーション:

  1. 水平位置(タグを定盤上に平坦に配置):3軸すべてをリード。期待値:X=0, Y=0, Z=+1 g(向きにより−1 g)。オフセット計算:offset_x = x_measured − 0, offset_y = y_measured − 0, offset_z = z_measured − 1.0
  2. 反転位置(タグを反転):Z軸を再度リード。期待値:Z = −1 g。感度計算:sens_z = (z_level − z_inverted) / 2.0。比率1.0 / sens_zがスケール補正係数を与えます。

オフセットとスケール係数をフラッシュに保存。ランタイムファームウェアはx_corrected = (x_raw − offset_x) × scale_factorを適用。これには12バイトのフラッシュ(3オフセット + 3スケール係数をfloat16として)が必要で、閾値の不確定性を±80 mgから±5 mgに削減——2 g衝撃と2.5 g衝撃を区別するのに十分です。

導入:マウント、向き、環境

マウント向きが重要

加速度センサーは重力を1 gの一定ベクトルとしてリードします。タグが箱面に垂直にマウントされている場合、一軸が静止時に~1 gをリードします。その軸の衝撃は0からではなく1 gから始まります。これは:

  • magnitude基準検出(mag = sqrt(x²+y²+z²))は向き非依存——合計加速度は常に重力成分を正しく含みます。
  • 軸別閾値検出は向き依存——静止オフセットを考慮するか、静止オフセットを差し引く必要があります。

ベストプラクティス:常にmagnitude基準閾値を使用。軸別データは分類(衝撃が垂直か水平か?)に有用ですが、初期検出には適しません。

環境振動レベル

環境 典型振動 (g RMS) 周波数範囲 推奨衝撃閾値
オフィス / ラボ 0.01 1–20 Hz 1.5 g
小売店 0.05 5–50 Hz 2.0 g
倉庫フロア 0.1–0.3 10–100 Hz 2.5 g
輸送中トラック 0.3–0.8 5–200 Hz 3.0 g + 持続時間ゲート
船舶 / 鉄道 0.5–1.2 0.5–30 Hz 4.0 g + 軸相関
建設現場 1.0–2.0 2–500 Hz 5.0 g + フルフィルタースタック

同じタグを複数環境に導入する場合、衝撃閾値をBLE GATT書き込みで設定可能にします。プロビジョニングアプリがタグをスキャン、導入コンテキストをリード、適切な閾値 + フィルター設定を書き込みます。

実導入チェックリスト

モーションセンシングタグを生産導入する前の確認事項:

  • 現地閾値検証:実際の環境で実際の資産にタグをマウント。24時間の生データを記録。閾値を最大背景振動ピークの2倍に設定。
  • マウント変動テスト:5つの異なるマウント位置で試行。magnitude基準検出が向きに関係なく一貫していることを確認。
  • 誤検出率プロファイル:検出ロギングのみ(レポートなし)で7日間稼働。誤検出を計数。フィルタースタックを調整してFP率 < 1/日。
  • バッテリー影響測定:モーションセンシング有効10台と無効10台を導入。30日後にバッテリー電圧を比較。目標:差異 < 5%。
  • ファームウェア更新計画:閾値とフィルターパラメータはGATT書き込み可能であるべき。保守的なデフォルトで導入し、収集データに基づいてリモート調整。
  • 軸マッピング文書化:各マウント構成で加速度センサー軸が物理方向にどうマッピングされるかを記録。これは衝撃方向分類精度を決定します。

BLEタグのモーションセンシングは後付けする機能ではなく——初日からキャリブレーション、フィルタリング、電力管理を必要とする信号処理パイプラインです。しかし正しく実行すれば、位置ビーコンを状態監視センサーに変換し、バッテリー影響5%未満で実現できます——これはすべての資産追跡エンジニアが受け入れるべきトレードオフです。