detection_choc.ino
Détecteur de choc autonome : la norme du vecteur accélération dépassant 2 g, la LED rouge (broche 23) s’allume deux secondes et l’événement est horodatés sur la console. Idéal pour surveiller un colis, une machine ou un portail forcé.
Matériel requis
Une Arduino Nicla Vision (STM32H7 double cœur M7+M4, 23×23 mm) avec caméra GC2145 2 MP, IMU LSM6DSOX, micro PDM, capteur ToF (famille VL53Lx), module sans fil ESP32 (Wi-Fi/BLE) et LED RGB (LEDR=23, LEDG=24, LEDB=25). La carte seule ; l’IMU LSM6DSOX embarquée fournit l’accélération à plus de 100 Hz. Un testeur : taper la table sous la carte.
Câblage
Aucun câblage. Pour un déclencheur externe, un actionneur sur une broche logique du connecteur avec alim séparée (broches 3,3 V logiques).
Fonctionnement
La norme sqrt(ax²+ay²+az²) au repos vaut ~1 g ; un choc la propulse au-delà du seuil. Le seuil 2 g évite les faux positifs dus aux vibrations, et la LED à retour temporisé confirme visuellement.
Exécution
Programmation via Arduino IDE (core ArduinoCore-mbed, target NICLA_VISION) sur le port USB-C ; bibliothèques Camera, PDM, Arduino_LSM6DSOX, WiFiNINA et ArduinoBLE fournies.
Variantes
Descendre le seuil pour la sensibilité, compter les chocs par heure, ou réveiller la carte en低功耗 via l’interruption d’activité de l’IMU pour l’autonomie.
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
}