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