imu_lsm6dsox.ino

Arduino Nicla Vision · Fichier : imu_lsm6dsox.ino · Langage : Arduino · Usage : Lire accélération et gyroscopes de l’IMU

L’IMU 6 axes LSM6DSOX de la Nicla Vision s’ouvre en trois lignes avec la bibliothèque Arduino_LSM6DSOX : accélération en g et vitesse angulaire en °/s, prêtes pour la détection de choc, l’inclinaison ou le geste. Le point d’entrée de tout projet mouvement.

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 est soudée à demeure. Un câble USB pour la console série à 115200.

Câblage

Aucun câblage : l’LSM6DSOX est sur le bus I2C interne de la carte, invisible de l’extérieur.

Fonctionnement

IMU.begin() détecte la puce ; les lectures sont non-bloquantes (accelerationAvailable puis readAcceleration). L’échantillonnage série à 5 Hz garde la console lisible.

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

Calculer l’inclinaison par atan2 sur ax/az, détecter le choc par seuil sur la norme, ou envoyer les 6 axes en BLE vers un téléphone.

imu_lsm6dsox.ino

// IMU LSM6DSOX embarquée (accéléro + gyro 6 axes).
// Bibliothèque : Arduino_LSM6DSOX (Gestionnaire de libraries).

#include <Arduino_LSM6DSOX.h>

void setup() {
  Serial.begin(115200);
  while (!Serial) { ; }
  if (!IMU.begin()) {
    Serial.println("IMU absente — vérifier la carte");
    while (1) { ; }
  }
  Serial.print("Accéléro : "); Serial.print(IMU.accelerationSampleRate());
  Serial.println(" Hz");
}

void loop() {
  float ax, ay, az, gx, gy, gz;

  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(ax, ay, az);   // en g (1 g = 9.81 m/s²)
  }
  if (IMU.gyroscopeAvailable()) {
    IMU.readGyroscope(gx, gy, gz);      // en degrés/s
  }

  static unsigned long t = 0;
  if (millis() - t > 200) {
    t = millis();
    Serial.print("ax="); Serial.print(ax);
    Serial.print(" ay="); Serial.print(ay);
    Serial.print(" az="); Serial.print(az);
    Serial.print(" gz="); Serial.println(gz);
  }
}

← Retour à la fiche