MPU-6050 Temperatura, Accelerometro e Giroscopio

Indice
Ultimamente ho ricevuto molte mail e commenti su come utilizzare l’IMU MPU-6050 solo per la lettura della Temperatura, Accelerometro o Giroscopio, escludendo le altre misure. In questo articolo mostrerò alcuni sketch che permettono di utilizzare l’IMU MPU-6050 per lo scopo descritto sopra. Inoltre descriverò come modificare il fondo scala dell’accelerometro e del giroscopio.
Se non hai letto l’articolo precedente sul MPU-6050 ti consiglio di leggerlo a questo indirizzo.
I collegamenti rimangono invariati, inizio postando lo sketch per la lettura della sola temperatura, escludendo i dati dell’accelerometro e del giroscopio.
Temperatura
// MPU-6050 Lettura Temperatura
// www.giuseppecaccavale.it
#include <Wire.h>
const int MPU = 0x68; // I2C address of the MPU-6050
int16_t Tmp;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x41); // starting with register 0x41 (TEMP_OUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 2, true); // request a total of 2 registers
Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
//equation for temperature in degrees C from datasheet
Serial.print("Temperature: "); Serial.print(Tmp / 340.00 + 36.53); Serial.println(" C ");
delay(333);
}
Accelerometro assi X, Y e Z
Con questo sketch sarà possibile leggere solo i dati dell’accelerometro.
// MPU-6050 Lettura ACCEL
// www.giuseppecaccavale.it
#include <Wire.h>
const int MPU = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // request a total of 6 registers
AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Serial.print("Accelerometer: ");
Serial.print("X = "); Serial.print(AcX);
Serial.print(" | Y = "); Serial.print(AcY);
Serial.print(" | Z = "); Serial.println(AcZ);
delay(333);
}
Giroscopio assi X, Y e Z
Con questo sketch sarà possibile leggere solo i dati del giroscopio.
// MPU-6050 Lettura GYRO
// www.giuseppecaccavale.it
#include <Wire.h>
const int MPU = 0x68; // I2C address of the MPU-6050
int16_t GyX, GyY, GyZ;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x43); // starting with register 0x43 (GYRO_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // request a total of 6 registers
GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
Serial.print("Gyroscope: ");
Serial.print("X = "); Serial.print(GyX);
Serial.print(" | Y = "); Serial.print(GyY);
Serial.print(" | Z = "); Serial.println(GyZ);
delay(333);
}
Configurazione fondo scala Accelerometro e Giroscopio
L’MPU-6050 permette la configurazione del fondo scala sia per l’accelerometro che per il giroscopio. Consultando il datasheet dei registri dell’IMU, è possibile leggere, a pagina 14 e 15, una breve descrizione sul registro 27 e 28 che corrispondono ai registri da scrivere in modo da modificare il fondo scala.
Il registro corrispondente alla configurazione del Giroscopio è il registro 1B. Mentre quello relativo alla configurazione dell’Accelerometro è il registro 1C.

Come si può notare dall’immagine sopra, il registro è composto da 8 bit (da bit0 a bit7). I bit che interessano a noi sono il bit4 e bit3, che insieme formano 4 possibili soluzioni. Nell’immagine seguente vengono illustrati i possibili fondo scala da poter impostare, quindi impostando FS_SEL (bit4 e bit3) uguale a 0 (0b00) avremo +-250 °/s di fondo scala.

Sketch configurazione fondo scala Giroscopio
// MPU-6050 SET RANGE GYRO
// www.giuseppecaccavale.it
#include <Wire.h>
const int MPU = 0x68; // I2C address of the MPU-6050
int16_t GyX, GyY, GyZ;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
delay(100);
Wire.beginTransmission(MPU);
Wire.write(0x1B);
Wire.write(B00011000);
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x43); // starting with register 0x43 (GYRO_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // request a total of 6 registers
GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
Serial.print("Gyroscope: ");
Serial.print("X = "); Serial.print(GyX);
Serial.print(" | Y = "); Serial.print(GyY);
Serial.print(" | Z = "); Serial.println(GyZ);
delay(333);
}
In riga 18 si accede al registro 1B e in riga 19 si scrive il dato B0011000. Analizzando il numero binario, si nota che il 3° e 4° bit, cioè ..11.. in decimale corrispondono a 3, ciò vuol dire che il fondo scala verrà impostato a +-2000 °/s.
Gli altri fondo scala possono essere impostati tramite i seguenti valori binari:
- B0000000
- B0001000
- B0010000
- B0011000
Per il registro 1C vale la stessa cosa detta sopra.


Sketch configurazione fondo scala Accelerometro
// MPU-6050 SET RANGE ACCEL.
// www.giuseppecaccavale.it
#include <Wire.h>
const int MPU = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
delay(100);
Wire.beginTransmission(MPU);
Wire.write(0x1C);
Wire.write(B00011000);
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // request a total of 6 registers
AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Serial.print("Accelerometer: ");
Serial.print("X = "); Serial.print(AcX);
Serial.print(" | Y = "); Serial.print(AcY);
Serial.print(" | Z = "); Serial.println(AcZ);
delay(333);
}
Spero vi sia piaciuto l’articolo, in ogni caso vi ringrazio per la lettura. Se avete problemi non esitate a lasciare un commento. A presto, ciao! 😀