Come collegare e programmare l’accelerometro ADXL345 con Arduino

Il dispositivo ADXL345 è un accelerometro digitale a 3 assi (X, Y, Z) con una risoluzione a 13bit che permette di misurare inclinazioni inferiori a 1° e permette di misurare un’accelerazione fino a 16g. Possiamo sfruttare sia l’interfaccia SPI (con 3 o 4 cavi) sia I2C, infatti troviamo 8 pin, di cui 2 sono per l’alimentazione (Vcc e Gnd). Vedremo oggi come collegarlo ad Arduino Uno ed impostare correttamente lo sketch, scaricando anche l’apposita libreria. Potete acquistare questo dispositivo a circa 10€ su Amazon.

Specifiche

Iniziamo parlando di come alimentare l’ADXL345: possiamo fornire sia i 5V che i 3,3V, ma la tensione di lavoro è compresa nell’intervallo tra i 2,0V e i 3,6V. L’ADXL345 è adatto per applicazioni su dispositivi mobile, infatti misura l’accelerazione statica della gravità nelle applicazioni con rilevamento dell’inclinazione, nonché l’accelerazione dinamica risultante dal movimento o shock. La sua precisione è dovuta anche alla possibilità di impostare, in fase di programmazione, una minore o maggiore sensibilità all’accelerazione impostandola su diversi lavori ( ±2 g, ±4 g, ±8 g, ±16 g).



Collegamento

Come detto in precedenza, l’ADXL345 sfrutta sia l’interfaccia SPI che I2C, ma per semplicità ci adopereremo nella connessione I2C più semplice da eseguire e che ci permetterà, in futuro, di adoperare la SPI per collegare ad esempio display TFT.

ADXL345

Vi ricordiamo che potete adoperare anche Arduino Nano e che i pin A4 e A5 saranno adoperabili al posto dei pin SDA e SCL.



Codice

Per adoperare l’ADXL345 su Arduino sarà necessario ricorrere ad una libreria che potete scaricare QUI. All’interno troveremo uno sketch di prova per adoperare l’accelerometro che si apre con l’inserimento delle librerie ADXL345.h e Wire.h, inotre troviamo la dichiarazione dell’oggetto accel.


#include <Wire.h>
#include <ADXL345.h>

// ADXL345 accel(ADXL345_STD);      // indirizzo standard da impostare se SD0 è in HIGH

ADXL345 accel(ADXL345_ALT);            // indirizzo alternativo da impostare se SD0 è in LOW

Da notare che sarà necessario impostare un indirizzo in baso allo stato del SD0. Quanto questo è in HIGH imposteremo quello standard, altrimenti quello alternativo. Muovendoci nel VOID SETUP, oltre all’avvio del monitor seriale, possiamo impostare la velocità dei dati (data rate) da un minimo di 25 Hertz ad un massimo di 3200 Hertz e impostare la sensibilità dell’accelerazione (data range) da un minimo di 2g ad un massimo di 16g. Lasceremo le impostazioni di default che propongono un data rate di 200 Hertz e un data range di 16g.


// Data Rate
// - ADXL345_RATE_3200HZ: 3200 Hz
// - ADXL345_RATE_1600HZ: 1600 Hz
// - ADXL345_RATE_800HZ: 800 Hz
// - ADXL345_RATE_400HZ: 400 Hz
// - ADXL345_RATE_200HZ: 200 Hz
// - ADXL345_RATE_100HZ: 100 Hz
// - ADXL345_RATE_50HZ: 50 Hz
// - ADXL345_RATE_25HZ: 25 Hz
// - ...
if (!accel.writeRate(ADXL345_RATE_200HZ)) {
Serial.println("write rate: failed");
while(1) {
delay(100);
}
}

// Data Range
// - ADXL345_RANGE_2G: +-2 g
// - ADXL345_RANGE_4G: +-4 g
// - ADXL345_RANGE_8G: +-8 g
// - ADXL345_RANGE_16G: +-16 g
if (!accel.writeRange(ADXL345_RANGE_16G)) {
Serial.println("write range: failed");
while(1) {
delay(100);
}
}

Per concludere, nel VOID LOOP carichiamo i dati rilevati e li stampiamo nel monitor seriale. Potremmo fare anche a meno dell’IF/ELSE e usare da sola la funzione accel.update() per poi stampare sul seriale i dati forniti dalle funzioni accel.getX() per l’Asse , accel.getY() per l’Asse Y e accel.getZ() per l’Asse Z. Sollevando e muovendo l’ADXL345 vedremo a monitor cambiare i valori.


if (accel.update()) {
Serial.print ("X: ");
Serial.print(accel.getX());
Serial.print(" - ");
Serial.print ("Y: ");
Serial.print(accel.getY());
Serial.print(" - ");
Serial.print ("Z: ");
Serial.print(accel.getZ());
Serial.println(" ");
} else {
Serial.println("update failed");
while(1) {
delay(100);
}
}