MPU-6050 – Temp, Accel e Gyro

Ultimamente ho ricevuto molte mail e commenti su come utilizzare l’IC MPU-6050 solo per la lettura della Temperatura, Accelerometro o Giroscopio, escludendo le altre misure. In questo articolo scriverò alcuni sketch in modo da utilizzare l’IC MPU-6050 per lo scopo descritto sopra. Inoltre vi mostrerò come settare il range di misura dell’accelerometro e del giroscopio.

Se non avete letto l’articolo precedente sul MPU-6050 vi consiglio di leggerlo a questo indirizzo.

I collegamenti rimangono invariati, inizio postando lo sketch per leggere la 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 asse X, Y, 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 asse X, Y, 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);
}

Set Range Misura Accelerometro e Giroscopio

Come sicuramente voi saprete, il MPU-6050 può essere configurato in modo tale da poter scegliere il range di misura desiderato per la lettura dei dati dell’accelerometro e del giroscopio.

Leggendo il datasheet dei registri dell’integrato potrete notare a pagina 14 e 15 una breve descrizione dei parametri da utilizzare per settare il range di misura.

Il registro corrispondente alla configurazione del Giroscopio è il registro 1BMentre quello relativo alla configurazione dell’Accelerometro è il registro 1C.

Incominceremo ad analizzare il registro 1B :

gyro_config_1

Come noterete dall’immagine sopra, il registro è composto da 8bit (da bit0 a bit7). I bit che interessano a noi sono il bit4 e bit3. Nell’immagine seguente vengono illustrati i Range da poter settare, quindi impostando FS_SEL uguale a 0 (zero) avremo +-250 °/s ecc. Ovviamente i due bit di FS_SEL vanno configurati in binario, capirete meglio nello scketch di esempio.

gyro_config_2

Sketch

// 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 16 accedo al registro 1B ed in riga 17 scrivo il dato B0011000. Se notate bene prendendo il 3° e 4° bit, cioè ..11.. in decimale corrisponde a 3 e confrontandolo con la tabella sopra noterete che in questo modo il range viene impostato a +-2000 °/s.

Gli altri parametri da poter impostare sono:

  • B0000000
  • B0001000
  • B0010000
  • B0011000

Per il registro 1C vale la stessa cosa detta sopra:

accel_config_1 accel_config_2

Sketch

// 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 questo articolo, in ogni caso vi ringrazio per la lettura. Se avete problemi non esitate a lasciare un commento. A presto, ciao! :)

Ciao, se ti è piaciuto il mio blog e se qualche articolo ti è stato d\'aiuto, se te la senti e se vuoi, incentiva il mio lavoro offrendomi un caffè o qualunque altra cosa preferisci farmi ricevere. Cercherò di dare il meglio di me e di inserire articoli sempre più interessanti e utili 🙂
Clicca QUI per la donazione!