Por Qué la Detección de Movimiento Pertenece a Cada Tag de Activos

La mayoría de las implementaciones de BLE tag rastrean la ubicación, pero la ubicación sola no indica si un palé fue dropped, una caja se volcó, o un instrumento de alto valor vibró en la plataforma de un camión durante seis horas. Agregar un acelerómetro al tag lo transforma de un beacon pasivo a un nodo sensor activo—uno que puede detectar eventos de impacto, clasificar patrones de movimiento, y despertar el MCU solo cuando algo realmente ocurre.

El desafío de ingeniería no es seleccionar un IC acelerómetro (eso es un ejercicio de hoja de cálculo). Es diseñar la cadena de interrupciones, la lógica de umbral de impacto, el presupuesto de potencia, y el filtro de falsos positivos para que el tag informe eventos reales sin agotar su batería o inundar el gateway con noise.

Este artículo recorre el camino completo de señal: desde la selección de silicio hasta algoritmos de detección, arquitectura de interrupciones, codificación de datos, y calibración—con números reales en cada paso.

Selección de IC Acelerómetro: Lo Que Realmente Importa

Los tags de activos de baja potencia no necesitan IMUs de 16-bit a 20 kHz. Necesitan acelerómetros de 8–12-bit que duerman a <1 µA y se despierten con umbrales programables. Comparación de los ICs relevantes:

Parámetro ST LIS2DH12 ADI ADXL362 Bosch BMI270 TDK ICM-42670-P
Resolución 8/10/12-bit 12-bit 16-bit 16-bit
Rango (g) ±2/4/8/16 ±2/4/8 ±2/4/8/16 ±2/4/8/16
Corriente (activo) 5–11 µA 0.2 µA (movimiento) 4.8 µA 6.6 µA
Corriente (sleep) 0.5 µA 10 nA 3 µA 2 µA
Detección de actividad integrada Sí (INT1/INT2) Sí (awake/inact) Sí (any-motion) Sí (wake-on-motion)
Interfaz SPI / I²C SPI SPI / I²C SPI / I²C
Package LGA 2×2×1 LGA 3×3×1.05 LGA 2.5×3×0.83 LGA 2.5×3×0.76
Precio (1K) $0.58 $3.85 $1.20 $1.55

Para tags de activos, ST LIS2DH12 es la selección pragmática por defecto: modos programables 8/10/12-bit, dos pines de interrupción, detección de click/double-click integrada, y 0.5 µA standby. A $0.58 en cantidad apenas afecta el BOM. El ADXL362 con 10 nA sleep es impresionante, pero su interfaz SPI-only y precio de $3.85 lo hacen una selección niche para diseños de ultra baja potencia donde el MCU duerme a sub-µA y no se puede tolerar ni 0.5 µA del acelerómetro.

Criterios de selección que los datasheets no suelen enfatizar:

  • Granularidad de umbral: LIS2DH12 umbral de actividad es 1 LSB = 16 mg a ±2 g / 12-bit. ADXL362 es 3.9 mg/LSB. Para detección de impacto a 1–2 g, ambos son suficientes.
  • Latencia de interrupción: La detección de actividad integrada se activa en 1–3 períodos de muestra. Si se samplea a 1 Hz para inactividad, eso es 1–3 segundos—no suficientemente rápido para impacto. Se necesita un path de alta velocidad separado.
  • Profundidad FIFO: LIS2DH12 tiene FIFO de 32 muestras. BMI270 tiene FIFO de 128 muestras. FIFOs más grandes permiten al MCU burst-read waveformas de impacto sin mantener SPI activo durante el evento.

Modos de Detección de Movimiento y Sus Aplicaciones

El firmware del BLE tag típicamente ejecuta tres modos de detección simultáneamente en diferentes ejes de umbral:

1. Actividad / Inactividad (Detección de Presencia)

Propósito: Detectar si el activo taggeado está estacionario o en transit. Esto drivea mode-switching—el intervalo de advertising baja de 1000 ms a 100 ms cuando el activo se mueve.

Configuración LIS2DH12:

  • Umbral de actividad: 0.5 g (32 mg/LSB × 16 ≈ 512 mg)
  • Duración de actividad: 1 sample a 1 Hz (trigger inmediato)
  • Umbral de inactividad: 0.08 g
  • Duración de inactividad: 30 samples a 1 Hz (30 segundos de quietud)

Impacto en potencia: El acelerómetro corre a 1 Hz (5 µA) mientras el MCU duerme. Cuando la actividad se activa, el MCU se despierta y cambia el radio BLE a advertising rápido.

2. Detección de Caída Libre

Propósito: Detectar drops—palés levantados por grúa y liberados, instrumentos caídos de benches.

La señal es todos tres ejes cerca de zero simultáneamente. Umbral de free-fall LIS2DH12: setear actividad a ≤0.2 g en todos los ejes, duración ≥2 samples a 200 Hz (10 ms). A 200 Hz el acelerómetro consume ~11 µA—aceptable solo si se mantiene la detección de free-fall activa durante ventanas de manejo conocidas.

Complicación práctica: Un tag montado en la esquina de una caja experimenta 0.6 g de gravity resting en un eje durante orientación normal. Cuando la caja se volca, ese eje shifta pero no va a zero. Free-fall solo funciona para objetos que realmente se vuelven airborne. Para la mayoría de escenarios logísticos, la detección de impacto es más reliable.

3. Click Single / Double (Detección de Tap)

Propósito: Interacción de usuario—double-tap para confirmar handoff de activo, single-tap para requestar un ping de ubicación.

La detección de click integrada LIS2DH12 maneja esto sin involvement del firmware:

  • Umbral de click: 1.2 g (más alto que actividad para evitar false triggers de vibración de truck)
  • Límite de tiempo de click: 80 ms (ventana para un tap)
  • Latencia double-click: 400 ms (tiempo entre primer y segundo tap)
  • Interrupción en INT1 para single click, INT2 para double click

Este modo corre a 400 Hz (~11 µA) solo durante una ventana de tiempo configurable (ej.: primeros 30 segundos después de un button press o evento de proximity del gateway). Otherwise el acelerómetro se mantiene a 1 Hz.

Detección de Impacto: El Verdadero Problema de Ingeniería

Los eventos de impacto son los más difíciles de detectar reliably porque comparten características espectrales con vibración, door slams, y forklift bumps. El signal processing es simple—exceeder un umbral—pero la selección de umbral y la lógica de confirmación no lo son.

Selección de Umbral por Aplicación

Escenario Pico Típico (g) Umbral Recomendado Ventana de Detección
Drop de paquete (30 cm, hard floor) 15–30 8 g 5 ms
Bump de palé (forklift) 3–6 2.5 g 50 ms
Vibración de truck (road) 0.5–1.5 1.5 g (con confirmación) 100 ms
Tip-over de instrumento en shelf 2–4 2 g 20 ms
Drop de laptop bag 10–20 6 g 10 ms

Insight clave: el umbral solo es insuficiente. Un bump de forklift a 4 g looks como un drop de paquete para un simple threshold detector. Necesitas criterios de confirmación:

  • Confirmación de duración: Eventos de impacto más cortos que la ventana de detección se ignoran. Un pico de 4 g lasting 2 ms es vibración; un pico de 4 g lasting 40 ms es un bump.
  • Correlación de ejes: Impactos reales producen spikes correlados en múltiples ejes. Vibración random típicamente peaks en un eje (el alineado con la direction de vibración). Computar mag = sqrt(x² + y² + z²) y requerir mag > threshold.
  • Ventana de quiet pre/post: Antes y después del evento, requerir mag < 0.5 × threshold por al menos 2 períodos de sample. Esto elimina vibration trains donde múltiples peaks crossan el umbral en sucession rápida.

Reducción de Falsos Positivos

Cada engineer de deployment ha visto el mismo problema: un tag montado en un doorframe de warehouse informa 300 "impactos" por día porque la door vibra cuando trucks pasan. Stack de filtros en capas:

Capa 1: Gate de Magnitude + Duración

Requerir mag > threshold AND duration > min_window. Elimina 80% de falsos positivos de peaks de vibración que crossan el umbral pero no sustain.

Capa 2: Correlación de Ejes

Computar r = min(x, y, z) / max(x, y, z) en el peak. Impactos reales producen r > 0.3. Vibración directional produce r < 0.15. Aplicar solo para umbrales below 4 g—above 4 g, cualquier peak es casi certainly real.

Capa 3: Debounce Temporal

Después de un impacto confirmado, suprimir further detections por un cooldown configurable (default: 60 segundos). Previene un impacto físico de generar 5 reports cuando el object bounces. Ajustar cooldown por aplicación:

  • Instrumentos delicados: 5 segundos (catch each bounce)
  • Palés industriales: 120 segundos (un report per handling event)

Capa 4: Gate de Contexto

Habilitar detección de impacto solo cuando condiciones de contexto se cumplen:

  • Tag en transit (detección de actividad = moving)
  • Tag near zona de loading (gateway RSSI > −60 dBm)
  • Ventana de tiempo (detección de impacto solo durante business hours)

Comparación de Tasas de Falsos Positivos

Stack de Filtros Tasa de True Positive Tasa de False Positive (warehouse env)
Umbral solo 95% 30/día
+ Gate de duración 93% 8/día
+ Correlación de ejes 90% 2/día
+ Debounce temporal 88% 0.5/día
+ Gate de contexto 85% <0.1/día

Calibración: Making Umbrales Match Reality

Umbrales de datasheet son teóricos. Cada tag real necesita calibración per-unit:

  • Offset zero-g: LIS2DH12 spec permite ±40 mg per axis después de PCB mount. En un tag CR2032-powered con battery directly above el acelerómetro, solder reflow y PCB flex pueden shift offsets a ±80 mg.
  • Error de sensibilidad: ±1.5% a ±2 g range. A un umbral de impacto de 4 g, eso es ±60 mg de uncertainty—no critical, pero afecta la accuracy de classification de severity.
  • Cross-axis sensitivity: Up to 1% (axis X respondiendo a axis Y input). Para detección magnitude-based, negligible. Para análisis per-axis, matters.

Procedimiento de Calibración Two-Point

En la línea de producción, calibrar cada tag en dos orientations:

  1. Posición level (tag flat en granite plate): Read todos three axes. Expected: X=0, Y=0, Z=+1 g (o −1 g dependiendo de orientation). Computar offsets: offset_x = x_measured − 0, offset_y = y_measured − 0, offset_z = z_measured − 1.0.
  2. Posición inverted (tag flipped): Read Z axis again. Expected: Z = −1 g. Computar sensitivity: sens_z = (z_level − z_inverted) / 2.0. Ratio 1.0 / sens_z gives el scale correction factor.

Store offsets y scale factors en flash. Firmware runtime aplica: x_corrected = (x_raw − offset_x) × scale_factor. Esto toma 12 bytes de flash (3 offsets + 3 scale factors como float16) y reduce uncertainty de umbral de ±80 mg a ±5 mg—suficiente para distinguir un bump de 2 g de uno de 2.5 g.

Deployment Checklist

Antes de deployar tags con motion sensing en producción:

  • Validar umbrales on-site: Mount tags en assets reales en el environment actual. Record 24 horas de raw data. Set umbrales a 2× el maximum background vibration peak.
  • Test variability de mounting: Try 5 positions de mounting diferentes. Verify que detección magnitude-based es consistent regardless de orientation.
  • Profile tasa de false positives: Run por 7 días con detection logging pero no reporting. Count false positives. Adjust filter stack hasta FP rate < 1/día.
  • Measure impacto en battery: Deploy 10 tags con motion sensing enabled y 10 without. Compare battery voltage después de 30 días. Target: diferencia < 5%.
  • Plan firmware updates: Umbrales y filter parameters deben ser GATT-writable. Deploy con defaults conservativos, luego tune remotely basado en data collected.
  • Document axis mapping: Record qué accelerometer axis maps a qué direction física para cada configuration de mounting. Esto determina la accuracy de classification de direction de impacto.

El motion sensing en BLE tags no es una feature que se bolt-on—it's un signal-processing pipeline que requiere calibración, filtering, y power management desde day one. Pero done correctamente, transforma un location beacon en un condition-monitoring sensor con menos de 5% de impacto en battery—y eso es un tradeoff que cada asset-tracking engineer debería take.