Guia sobre Temperatura, Acelerômetro e giroscópio no MPU-6050
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.
Conteudo
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.