Guia sobre Temperatura, Acelerômetro e giroscópio no MPU-6050

Tempo de leitura: 4 minutes

Ultimamente tenho recebido muitos e-mails e comentários sobre como usar o IC MPU-6050 apenas para leitura de temperatura, acelerômetro ou giroscópio, excluindo outras medidas. Neste artigo, escreverei alguns sketch para usar o IC MPU-6050 para os fins descritos acima. Também mostrarei como definir a faixa de medição do acelerômetro e do giroscópio.

Se você não leu o artigo anterior sobre o MPU-6050, recomendo que você leia  aqui.

As conexões permanecem inalteradas, começo postando o sketch para ler apenas a temperatura, excluindo os dados do acelerômetro e do giroscópio.

Temperatura

// Leitura de temperatura MPU-6050

#include<Wire.h>
const int MPU=0x68;  // Endereço I2C do MPU-6050
int16_t Tmp;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // registro PWR_MGMT_1
  Wire.write(0);     // definido como zero (ativa o MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU);
  Wire.write(0x41);  // começando com o registro 0x41 (TEMP_OUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,2,true);  // solicitar um total de 2 registros
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) e 0x42 (TEMP_OUT_L)

  // equação para temperatura em graus C da folha de dados
  Serial.print("Temperatuae: "); 
  Serial.print(Tmp/340.00+36.53); 
  Serial.println(" C "); 
 
  delay(333);
}

 

Acelerômetro do eixo X, Y, Z

Com este sketch será possível ler apenas os dados do acelerômetro.

// Leitura ACCEL MPU-6050

#include<Wire.h>
const int MPU=0x68;  // endereço I2C do MPU-6050
int16_t AcX,AcY,AcZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // registro PWR_MGMT_1
  Wire.write(0);     // definido como zero (ativa o MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // começando com o registro 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true);  // solicitar um total de 6 registros
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) e 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) e 0x40 (ACCEL_ZOUT_L)
  
  Serial.print("Acelerômetro: ");
  Serial.print("X = "); Serial.print(AcX);
  Serial.print(" | Y = "); Serial.print(AcY);
  Serial.print(" | Z = "); Serial.println(AcZ);
  
  delay(333);
}

 

Giroscópio de eixo X, Y, Z

Com este sletch será possível ler apenas os dados do giroscópio.

// Leitura MPU-6050 GYRO

#include<Wire.h>
const int MPU=0x68;  // endereço I2C do MPU-6050
int16_t GyX,GyY,GyZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // registro PWR_MGMT_1
  Wire.write(0);     // definido como zero (ativa o MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU);
  Wire.write(0x43);  // começando com o registro 0x43 (GYRO_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true);  // solicitar um total de 6 registros
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) e 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) e 0x48 (GYRO_ZOUT_L)

  Serial.print("Giroscópio: ");
  Serial.print("X = "); Serial.print(GyX);
  Serial.print(" | Y = "); Serial.print(GyY);
  Serial.print(" | Z = "); Serial.println(GyZ);
  
  delay(333);
}

 

Definir Acelerômetro e Giroscópio de Medida de Faixa

Como você certamente sabe, o MPU-6050 pode ser configurado de forma a poder escolher a faixa de medição desejada para a leitura dos dados do acelerômetro e do giroscópio.

Lendo o datasheet dos dos registros integrados, você notará nas páginas 14 e 15 uma breve descrição dos parâmetros a serem usados ​​para definir a faixa de medição.

O registro correspondente à configuração do giroscópio é o registro 1B. Já o referente à configuração do Acelerômetro é o registro 1C.

Começaremos a analisar o registro 1B:

Como você notará na imagem acima, o registro é composto de 8 bits (do bit0 ao bit7). Os bits que nos interessam são bit4 e bit3. A imagem a seguir mostra os intervalos que podem ser definidos, então definindo FS_SEL igual a 0 (zero) teremos + -250°/s etc. Obviamente os dois bits de FS_SEL devem ser configurados em binário, você entenderá melhor no scketch de exemplo.

Sketch

// MPU-6050 SET RANGE GYRO

#include<Wire.h>
const int MPU=0x68;  // endereço I2C do MPU-6050
int16_t GyX,GyY,GyZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // registro PWR_MGMT_1
  Wire.write(0);     // definido como zero (ativa o 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);  // começando com o registro 0x43 (GYRO_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true); // solicitar um total de 6 registros
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) e 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) e 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) e 0x48 (GYRO_ZOUT_L)

  Serial.print("Giroscópio: ");
  Serial.print("X = "); Serial.print(GyX);
  Serial.print(" | Y = "); Serial.print(GyY);
  Serial.print(" | Z = "); Serial.println(GyZ);
  
  delay(333);
}

Na linha 16 eu acesso o registro 1B e na linha 17 eu escrevo os dados B0011000. Se você notar bem pegando o 3º e 4º bit, isto é ..11 .. em decimal corresponde a 3 e comparando-o com a tabela acima você notará que desta forma a faixa é configurada para + -2000°/s.

Os outros parâmetros que podem ser definidos são:

  • B0000000
  • B0001000
  • B0010000
  • B0011000

Para o registro 1C, aplica-se o mesmo dito acima:

 

Sketch

// MPU-6050 SET RANGE ACCEL.

#include<Wire.h>
const int MPU=0x68;  // endereço I2C do MPU-6050
int16_t AcX,AcY,AcZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  / registro PWR_MGMT_1
  Wire.write(0);     // definido como zero (ativa o 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);  // começando com o registro 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) e 0x3C (ACCEL_XOUT_L)
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) e 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) e 0x40 (ACCEL_ZOUT_L)
  
  Serial.print("Acelerômetro: ");
  Serial.print("X = "); Serial.print(AcX);
  Serial.print(" | Y = "); Serial.print(AcY);
  Serial.print(" | Z = "); Serial.println(AcZ);
  
  delay(333);
}

Conclusão

Neste guia, mostrei como usar um MPU-6050 de formas direntes e uteis  com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esses MPU-6050. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.

Visits: 1 Visits: 1199420