detection_choc.ino

Arduino Nicla Vision · Fichier : detection_choc.ino · Langage : Arduino · Usage : Détecter un choc et allumer la LED rouge

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
}

← Retour à la fiche