LSM9DS1

  • Il modulo inerziale LSM9DS1 è integrato nell'Arduino Nano 33 BLE Sense e pertanto si può usare solo con tale scheda.
  • Il datasheet è accessibile qui (scaricato) o qui (fonte originale).
  • Per l'uso dei sensori su questa scheda è necessario installare la libreria omonima. Si può fare in due modi:
    • Il modo più comodo per perdere meno tempo con gli studenti in laboratorio è copiare i file Arduino_LSM9DS1.h, LSM9DS1.h e LSM9DS1.cpp nella cartella del progetto, quella in cui è presente anche il file .ino. Poi il progetto sarà portabile a tutti i computer senza ulteriore setup necessario. I tre file sono già presenti nei tre progetti di esempio per accelerometro, giroscopio e magnetometro.
    • Altrimenti basta andare in Strumenti -> Gestione librerie, cercare "LSM9DS1" ed installare "Arduino_LSM9DS1". Bisognerà però ripetere questa azione su ogni computer su cui si vuole usare il progetto.
  • Per interagire con la libreria all'interno del codice bisogna includerla con #include "Arduino_LSM9DS1.h". La documentazione della libreria è disponibile qui.
  • All'interno del setup(), per inizializzare la connessione con il modulo, si usa IMU.begin().

Magnetometro con calibrazione iniziale

Progetto di esempio: magnetometro_calibrazione

// include la libreria che mette a disposizione l'oggetto IMU
#include "Arduino_LSM9DS1.h"

// le variabili che contengono i dati di calibrazione, accessibili sia dal setup() che dal loop()
float mx, my, mz;

// il numero di misurazioni di cui fare la media per ottenere i dati di calibrazione (e' piu'
// comodo riutilizzare una variabile costante invece che scrivere "20" dappertutto)
const int MISURAZIONI_CALIBRAZIONE = 20;

void setup() {
  // inizializza il seriale
  Serial.begin(9600);
  while (!Serial);

  // inizializza il LSM9DS1
  IMU.begin();

  // il codice qui sotto calcola i dati di calibrazione e li salva in mx, my ed mz,
  // sulla base della media di MISURAZIONI_CALIBRAZIONE misurazioni iniziali

  // inizializza mx, my ed mz a 0, per sicurezza
  mx = 0;
  my = 0;
  mz = 0;
  // questo e' un ciclo for: la variabile i, che conta le misure effettuate, inizialmente e' 0;
  // prima di ogni iterazione viene controllato se i e' minore di MISURAZIONI_CALIBRAZIONE, e se non
  // lo e' si esce dal ciclo
  for (int i = 0; i < MISURAZIONI_CALIBRAZIONE; ) {
    // le misurazioni sono a 20Hz, quindi piuttosto lente rispetto alla velocità di esecuzione di
    // codice dell'Arduino, pertanto bisogna controllare se sono arrivati dei dati prima di leggerli
    if (IMU.accelerationAvailable()) {
      float x, y, z;
      IMU.readMagneticField(x, y, z);
      mx = mx + x;
      my = my + y;
      mz = mz + z;
      // quando e' avvenuta una misurazione, incrementa i di 1
      i = i + 1;
    }
  }
  // per ottenere la media divide per MISURAZIONI_CALIBRAZIONE
  mx = mx / MISURAZIONI_CALIBRAZIONE;
  my = my / MISURAZIONI_CALIBRAZIONE;
  mz = mz / MISURAZIONI_CALIBRAZIONE;
}

void loop() {
  // le misurazioni sono a 20Hz, quindi piuttosto lente rispetto alla velocità di esecuzione di
  // codice dell'Arduino, pertanto bisogna controllare se sono arrivati dei dati prima di leggerli
  if (IMU.magneticFieldAvailable()) {

    // crea le variabili x, y e z, inizialmente senza alcun valore
    float x, y, z;

    // legge il valore del campo magnetico lungo x, y e z nelle tre variabili x, y e z
    // (unita' di misura: uT/microTesla)
    IMU.readMagneticField(x, y, z);

    // sottrae i valori di calibrazione iniziali per ottenere una misurazione relativa
    x = x - mx;
    y = y - my;
    z = z - mz;

    // scrive sulla seriale una linea contenente i tre valori letti separati da uno spazio, così
    // che si possano visualizzare col Plotter Seriale
    Serial.print(x);
    Serial.print(" ");
    Serial.print(y);
    Serial.print(" ");
    Serial.println(z);
  }
}
  • Fornisce misurazioni ad una frequenza di 20Hz.
  • Riesce a leggere valori di campo magnetico da a , con una precisione di .
  • Fornisce i dati nell'unità di misura , ovvero microTesla.

Il progetto in questa cartella fa una calibrazione iniziale del magnetometro, così da rimuovere il campo magnetico terrestre ed altre interferenze dalle misurazioni. È quindi una buona idea tenere il sensore fermo durante l'esecuzione del programma, così che i dati di calibrazione restino validi. Se non si vuole questo tipo di calibrazione iniziale, si puo' usare il progetto magnetometro invece.

Più informazioni sul magnetometro sono disponibili nel tutorial ufficiale di Arduino.

Orientazione