detection_choc.ino
Detector de impactos autónomo: cuando la norma del vector de aceleración supera 2 g, el LED rojo (pin 23) se enciende dos segundos y el evento se marca en consola. Ideal para vigilar un paquete, una máquina o una puerta forzada.
Hardware
Una Arduino Nicla Vision (STM32H7 M7+M4, 23×23 mm) con cámara GC2145, IMU LSM6DSOX, micrófono PDM, ToF (VL53Lx), módulo ESP32 Wi-Fi/BLE y LED RGB (LEDR/G/B). La placa sola; la IMU LSM6DSOX embarcada da aceleración a más de 100 Hz. Prueba: golpear la mesa bajo la placa.
Cableado
Sin cableado. Para un disparo externo, un accionador en un pin lógico del conector con alimentación aparte (pines lógicos de 3,3 V).
Funcionamiento
La norma sqrt(ax²+ay²+az²) en reposo vale ~1 g; un impacto la dispara por encima del umbral. El umbral de 2 g evita falsos positivos por vibración y el LED temporizado confirma visualmente.
Ejecución
Programación desde Arduino IDE (core ArduinoCore-mbed) por USB-C; librerías Camera, PDM, LSM6DSOX, WiFiNINA y ArduinoBLE.
Variantes
Bajar el umbral para más sensibilidad, contar impactos por hora, o despertar la placa con la interrupción de actividad de la IMU para la autonomía.
detection_choc.ino
// Choc-détecteur : si la norme de l'accélération dépasse 2 g,
// la LED rouge s'allume 2 s et l'événement est tracé.
#include <Arduino_LSM6DSOX.h>
unsigned long dernierChoc = 0;
void setup() {
Serial.begin(115200);
pinMode(LEDR, OUTPUT); // LEDR = broche 23 (macros du core)
if (!IMU.begin()) { while (1) { ; } }
Serial.println("Surveillance des chocs (seuil 2 g)");
}
void loop() {
float ax, ay, az;
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(ax, ay, az);
float norme = sqrtf(ax * ax + ay * ay + az * az);
if (norme > 2.0) { // 2 g = choc ou chute rapide
dernierChoc = millis();
Serial.print("CHOC norme=");
Serial.println(norme);
}
}
// LED à retour d'état : 2 s après le dernier choc
bool actif = millis() - dernierChoc < 2000;
digitalWrite(LEDR, actif);
delay(5); // ~200 Hz : assez rapide pour un choc
}