MPU-6050 Temperatura, Accelerometro e Giroscopio

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! 😀