Tutorial: Acelerômetro MPU6050 com Arduino 206

Nesse módulo GY-521 você tem em uma mesma placa um acelerômetro e um giroscópio de alta precisão, tudo isso controlado por um único CI, o MPU6050:

Acelerometro e Giroscopio GY-521 MPU-6050

O CI MPU6050 (datasheet), além dos dois sensores, tem embutido um recurso chamado DMP (Digital Motion Processor), responsável por fazer cálculos complexos com os sensores e cujos dados podem ser usados para sistemas de reconhecimento de gestos, navegação (GPS), jogos e diversas outras aplicações. Outro recurso adicional é o sensor de temperatura embutido no CI, que permite medições entre -40 e +85 ºC.

Pinagem e endereçamento do MPU6050

A comunicação com o microcontrolador usa a interface I2C, por meio dos pinos SCL e SDA do sensor. Nos pinos XDA e XCL você pode ligar outros dispositivos I2C, como um magnetômetro por exemplo, e criar um sistema de orientação completo. A alimentação do módulo pode variar entre 3 e 5v, mas para melhores resultados e precisão recomenda-se utilizar 5v.

MPU-6050 Pinagem

O pino AD0 desconectado define que o endereço I2C do sensor é 0x68. Conecte o pino AD0 ao pino 3.3V do Arduino para que o endereço seja alterado para 0x69. Essa mudança permite que você tenha dois módulos MPU-6050 em um mesmo circuito.

Acelerômetro MPU6050 com Arduino e Display LCD 20×4

Vamos utilizar um Display LCD 20×4 para mostrar os valores lidos do MPU6050 em conjunto com um Arduino Uno. Nas duas primeiras linhas do display, além da temperatura no canto superior direito, temos os valores de X, Y e Z para o Acelerômetro, e nas duas últimas linhas os valores de X, Y e Z para o giroscópio. O potenciômetro de 10 K serve para ajuste do contraste do display:

Circuito Arduino e MPU-6050

Programando Arduino com MPU6050

O programa envia os dados tanto para o LCD como para o serial monitor, e utiliza apenas as biblioteca Wire para ler os dados da interface I2C e LiquidCrystal para enviar os dados para o display. Observe no circuito acima que utilizamos um mini-protoboard para conectar o MPU6050 e deixá-lo separado do display, para facilitar a movimentação do sensor e observar a alteração dos valores mostrados.

//Programa : Teste MPU6050 e LCD 20x4
//Alteracoes e adaptacoes : MakerHero
//
//Baseado no programa original de JohnChi

//Carrega a biblioteca Wire
#include<Wire.h>
//Carrega a biblioteca do LCD
#include <LiquidCrystal.h>

// Inicializa o LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Endereco I2C do MPU6050
const int MPU=0x68;  
//Variaveis para armazenar valores dos sensores
int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup()
{
  Serial.begin(9600);
  //Inicializa o LCD
  lcd.begin(20, 4);
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B); 
  
  //Inicializa o MPU-6050
  Wire.write(0); 
  Wire.endTransmission(true);
    
  //Informacoes iniciais do display
  lcd.setCursor(0,0);
  lcd.print("Acelerometro");
  lcd.setCursor(0,2);
  lcd.print("Giroscopio");
}
void loop()
{
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  //Solicita os dados do sensor
  Wire.requestFrom(MPU,14,true);  
  //Armazena o valor dos sensores nas variaveis correspondentes
  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)
  Tmp=Wire.read()<<8|Wire.read();  //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  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)
  
  //Envia valor X do acelerometro para a serial e o LCD
  Serial.print("AcX = "); Serial.print(AcX);
  lcd.setCursor(0,1);
  lcd.print("X=");
  lcd.print(AcX);
  
  //Envia valor Y do acelerometro para a serial e o LCD
  Serial.print(" | AcY = "); Serial.print(AcY);
  lcd.setCursor(7,1);
  lcd.print("Y=");
  lcd.print(AcY);
  
  //Envia valor Z do acelerometro para a serial e o LCD
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  lcd.setCursor(13,1);
  lcd.print("Z=");
  lcd.print(AcZ);
  
  //Envia valor da temperatura para a serial e o LCD
  //Calcula a temperatura em graus Celsius
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);
  lcd.setCursor(13,0);
  lcd.print("T:");
  lcd.print(Tmp/340.00+36.53);
  
  //Envia valor X do giroscopio para a serial e o LCD
  Serial.print(" | GyX = "); Serial.print(GyX);
  lcd.setCursor(0,3);
  lcd.print("X=");
  lcd.print(GyX);
  
  //Envia valor Y do giroscopio para a serial e o LCD  
  Serial.print(" | GyY = "); Serial.print(GyY);
  lcd.setCursor(7,3);
  lcd.print("Y=");
  lcd.print(GyY);
  
  //Envia valor Z do giroscopio para a serial e o LCD
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  lcd.setCursor(13,3);
  lcd.print("Z=");
  lcd.print(GyZ);
  
  //Aguarda 300 ms e reinicia o processo
  delay(300);
}

Se você prefere visualizar os dados no serial monitor, terá uma saída como essa:

MPU-6050 Serial Monitor

Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

206 Comentários

  1. Boa tarde, estou com um projeto em que a aplicação consiste em medir uma desaceleração ou um impacto. Alguém com mais conhecimento no assunto, poderia me ajudar??

  2. Eu montei o MPU6050 com o arduíno UNO e os valores tanto do giroscópio e do acelerômetro ficam oscilando com o dispositivo parado. Ele consegue captar os dados de aceleração e deslocamento, mas há muita oscilação. As soldas estão de a acordo. Montei um segundo MPU6050 e dá a mesma situação. O que pode ser? Obrigado!

  3. Vinicius, estou com uma aplicação para medir vibração, você acredita que o MPU seja um bom sensor para ler?
    E quais parâmetros eu deveria analisar, os Acx Acy e Acz?

    Obrigado!

    1. Olá!

      Acredito que sim, faria a análise baseada na variação da aceleração, que são os parâmetros Acx, Acy e Acz.

      Abraços!
      Vinícius – Equipe MakerHero

      1. Perfeito! E deixa eu te perguntar, como eu posso mudar o range do MPU? Pra 16g por exemplo

        1. Você pode incluir estas linhas aqui entre as linhas 29 e 31 do código:

          //Configura a escala do acelerômetro
          Wire.beginTransmission(MPU);
          Wire.write(0x1C); //endereço registrador ACCEL_CONFIG
          Wire.write(0x18); //escreve 00011000 no registrador ACCEL_CONFIG (escala +-16g)
          Wire.endTransmission(true);

          Abraços!
          Vinícius – Equipe MakerHero

  4. Show de bola. Uma pergunta, como consigo pegar os ângulos de cada eixo ?

    1. Olá Henrique,

      Para obter os ângulos é preciso realizar alguns cálculos. Aqui há um post (em inglês) explicando um pouco: https://www.geekmomprojects.com/gyroscopes-and-accelerometers-on-a-chip/

      Abraços!
      Vinícius – Equipe MakerHero

  5. Estou tentando simular o controle de um joystick com um potenciômetro digital e um mpu6050 você saberia quais são os valores máximo e mínimo que são recebidos pelos potenciômetro e acelerômetro.

    1. Olá,

      Em termos de valor no código a saída máxima do MPU6050 é 32767, que se traduz, dependendo da configuração em 2000°/s no giroscópio e 16g no acelerômetro.
      Quanto ao potenciômetro digital teria que ver a folha de dados dele.

      Abraços!
      Vinícius – Equipe MakerHero

  6. Eu to usando só o acelerômetro e usando o monitor serial pra ver os dados, mas to recebendo o valor -1 em todos os eixos e a Tmp também não altera. O que pode ser?

    1. Olá!

      Tente utilizar o exemplo em Arquivo -> Exemplos -> Wire -> i2c_scanner e verifique se o módulo está sendo reconhecido no monitor serial.

      Verifique também se as soldas dos pinos nos módulos não estão tocando umas nas outras.

      Abraços!
      Vinícius – Equipe MakerHero

  7. Olá! meu giroscópio não tá funcionando, os valores tanto de x, y e z ficam sempre estagnados em 225.

    1. Olá Laisa!

      Para confirmar você pode tentar utilizar esta biblioteca aqui: https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050

      Mas dá a impressão de um problema com o giroscópio.

      Abraços!
      Vinícius – Equipe MakerHero

  8. Como faria para poder gravar esses dados do acelerometro num cartão SD? ja tentei fazer mas não consegui, se puderem me dar essa ajuda fico grato.

    1. Olá Jackson!

      Temos este post aqui: https://www.makerhero.com/blog/cartao-sd-com-arduino/ e este outro aqui: https://www.makerhero.com/blog/datalogger-com-arduino-cartao-sd/
      mostrando como fazer a gravação de dados para o cartão SD e um data logger com data e hora das medições.

      Abraços!
      Vinícius – Equipe MakerHero

  9. Uma série de informações foram omitidas podendo levar diversos leitores a crer que seus sensores possuem algum mal funcionamento, para quem busca resposta:
    • Primeiramento os valores retornados pelo sensor é em bits, é necessário a conversão de acordo com a faixa de operação do sensor.
    • Como não configurado no sensor durante a inicialização a faixa de operação padrão é 2G (gravidade), para obter a resposta correta do acelerometro é necessário dividir o valor obtido por 16384 para obter seu respectivo valor em G, caso queira obter em m/s² basta multiplicar o resultado por 9.80 que irá obter a resposta em m/s²
    Outras escalas de operação e sua respectiva conversão são:
    ±2G 16384 LSB/G
    ±4G 8192 LSB/G
    ±8G 4096 LSB/G
    ±16G 2048 LSB/G

    • Como ocorre no acelerometro, o giroscópio támbem necessita de ter o seu valor convertido, lembrando que o valor padrão é ±250 °/s, segue a tabela:
    ± 250 °/s 131 LSB/°/s
    ± 500 °/s 65.5 LSB/°/s
    ± 1000 °/s 32.8 LSB/°/s
    ± 2000 °/s 16.4 LSB/°/s
    Para obter o resultado em radianos por segundo basta realizar a conversão multiplicado o valor obtido por 0,0174533.

    • Para selecionar as respectivas faixas de funcionamento do sensor seria necessário faze-lá durante a inicialização do sensor nos registradores 0X1B para o Giroscópio e 0x1C para o Acelerômetro.

    As mudanças feitas se encontram no código abaixo:

    Serial.print(“AcX:”); Serial.print(AcX/16384*9.80665); Serial.print(“, “);
    Serial.print(“AcY:”); Serial.print(AcY/16384*9.80665); Serial.print(“, “);
    Serial.print(“AcZ:”); Serial.print(AcZ/16384*9.80665); Serial.print(“, “);

    Serial.print(“GyX:”); Serial.print(GyX/131*0.0174533); Serial.print(“, “);
    Serial.print(“GyY:”); Serial.print(GyY/131*0.0174533); Serial.print(“, “);
    Serial.print(“GyZ:”); Serial.print(GyZ/131*0.0174533); Serial.print(“, “);

  10. Gostaria de uma informação sobre esta placa.
    Se colocá-la em uma base totalmente nivelada, qual a menor medida que ela pode efetuar. Por exemplo levantando 0,1 mm em um dos cantos, ele mediria está diferença?

    1. Olá Ivan,

      Isso vai depender também do tamanho da base. Se ela for relativamente grande em comparação com o módulo, ele não será capaz de detectar.

      Abraço!
      Rosana – Equipe MakerHero

  11. Muito bom o artigo, bem explicado. Só tenho uma dúvida, esses valores que são exibidos no monitor serial, em cada eixo, representam a aceleração naquela direção, mas esse valor é um parâmetro de proporção em relação à uma referência? Ou já é um valor em m/s2?

    1. Olá Tiago!

      Os valores estão relacionados a faixa de aceleração escolhida (±2, ±4, ±8, ±16g).

      Abraço!
      Rosana – Equipe MakerHero

  12. Boa Noite 🌙!!! Adilson.
    Sou leigo no assunto, e estou tentando montar um acelerometro MPU 6050 com display Módulo Serial I2C para Display LCD Arduino.
    O objetivo é medir impacto. Poderia me ajudar?

  13. Olá! Excelente post, muito didático.

    Poderiam me ajudar com um problema?
    Estou usando um MPU-6050 para medir vibrações, mas ele satura em uma valor, por exemplo 2,2 m/s^2.
    Tentei mudar o range para 16g e continua com um mesmo ponto em que não ultrapassa.
    Como a fonte de vibração me fornece um valor fixo de 9,81g, esperava que com 16g ele pudesse medir normalmente, mas isso não acontece.

  14. alguem consegue me ajudar, preciso que o giroscopio me de um valor de 0 à -90 e de 0 à 90 com um numero de 5 em 5….
    agradeço desde já. Obs. no lcd

  15. Boa tarde Amigo!
    Você sabe me informar como posso fazer pra usar dois ou mais desse sensor em apenas um Arduino Mega 2560?

    1. Diego,

      Você vai fazer a conexão normalmente nos pinos SDA e SCL, como o MEGA possui dois de cada desses pinos, é para funcionar sem problemas.

      Abraços!
      Diogo – Equipe MakerHero

  16. Por que utilizamos neste exemplo a biblioteca Wire.h? e não a MPU6050? e caso eu queira utilizar um display com comunicação I2C teria como? sou iniciante!

  17. Ola! gostaria de saber se com os dados do sensor, ´possivel obter um oscilografia de um equipamento girante, (motor), em relação a viração de trabalho.
    Para isso preciso entender melhor o que significa os valores referentes aos acelerometros.

  18. Boa Noite,
    Tenho um Arduino Uno com GPS Shield V1R3, eu tenho um trabalho para fazer, que é fazer do google earth para Datum PT-TM06 ou então ter programa para o ide, para ter coordenadas de portugal, e poder transpor para autocad mas com este tipo de coordenadas, Será que alguém me pode ajudar?

  19. boa tarde, estou fazendo um carrinho e estou querendo utilizar o mpu6050 para estabilizar ele. a utilizaçao seria para medir se o carrinho se moveu para esquerda ou para direita. sabe me informar se consegui fazer esse tipo de mediçao com o MPU6050?

    1. Abner,

      É possível sim, através do código 🙂

      Abraços!
      Diogo – Equipe MakerHero

  20. muito bom o seu artigo, estou iniciando agora nesse ramo, e ja estou com ideias de aplicações na educação básica, para crianças de 12 anos acima, eles são muito espertos, iremos começar com laçamento de foguetes com garrafas pts e vamos colocar um acelerometro no foguete paa nos dar os dados.

  21. Como consigo extrair os dados para o excel e montar um gráfico do acelerômetro e do giroscópio?

    1. Olá Felipe,

      Dê uma olhada nesse tutorial https://www.makerhero.com/blog/datalogger-com-arduino-cartao-sd/
      Nele você vai ver como extrair os dados para um txt. O txt pode facilmente ser exportado para o Excel.

      Abraço!
      Rosana – Equipe MakerHero

  22. Meu amigo, você me ajudou muito, vou colocar os créditos em meu trabalho acadêmico, na semana da física, para um reconhecimento do seu trabalho.

    1. Olá,

      É muito bom saber que nosso trabalho te ajudou 😀

      Abraço!
      Rosana – Equipe MakerHero

  23. É normal o giroscopio não ser tão preciso??? Qual modulo ou oq posso fazer para ele n oscilar tanto?

    1. Olá Marcos,

      Na verdade, o giroscópio usado nesse projeto possui alta precisão devido ao conversor analógico digital de 16-bits para cada canal. Você pode aumentar o delay do processo para obter respostas em intervalos maiores.

      Abraço,
      Rosana – Equipe MakerHero

  24. Tenho um projeto de foguete e neste projeto temos que medir a altura que o foguete de garrafa pet com sensores, neste sensor, iremos utilizar um para ir calculando a altura até o ponto final. Qual modulo ou sensor eu utlizo, se há algum codigo pode me mandar?

    1. Olá Davi!

      O MPU 6050 é uma opção, mas sugiro um mais potente, como:

      https://www.makerhero.com/produto/acelerometro-e-giroscopio-9-eixos-10-dof-mpu-9250-com-bmp180/

      Abraços!

      André – Equipe MakerHero

    1. Olá Amanda!

      Seria extremamente parecido. O endereço provavelmente seria diferente, e os comandos acredito que não sejam os mesmos.

      Abraços!

      André – Equipe MakerHero

  25. O meu fica tudo “-1” e “36.53” de temperatura sempre. O que faço??
    Obrigado desde já

    1. Olá Bruno!

      Parece ser mau contato. Você pode verificar as conexões e ver se o problema continua?

      Abraços!

      André – Equipe MakerHero

  26. SErá que daria a partir desse estudo introduzir uma lâmpada estrobo para fazer um balanceador.

    1. Olá Claudio!

      Teria que ver como ficaria o acionamento dela a partir do arduino, mas acho que é possível.

      Abraços!

      André – Equipe MakerHero

  27. Salve

    Problema con il mio LCD 128X64non rieco a far cominicare con MPU6050 (Questo tuo Progetto MPU6050 e LCD 20×4)

    possibile avere suggerimento come risolvere

    Grazie

    1. Ciao Luigi!

      Hai provato i due dispositivi separatamente?

      Suggerisco innanzitutto di far funzionare lo schermo LCD, quindi l’MPU per poi unire i due in un unico progetto.

      A presto
      André – Squadra MakerHero

  28. Boa tarde. Estou usando o mesmo código e os valores do giroscópio estão variando muito. É necessário tratar esses dados? A captura de tela do monitor serial foi feita com o sensor em repouso? Estou desconfiado que o módulo tenha vindo com defeito.

    1. Olá Gabriel!

      Os dados realmente variam, mas ficam em torno do apresentado no serial monitor. Você deixou seu sensor em repouso?

      Pode ser problema no sensor mesmo.

      Abraços!

      André – Equipe MakerHero

  29. Como faço para conectar 5 sensores flex que devem ir nas portas analógicas e o MPU que utiliza as portas A5 e A4?

    1. Olá Jonathan!

      Você pode usar um MUX (multiplexador) ou um conversor analógico digital:

      https://www.makerhero.com/produto/sensor-de-corrente-dc-ina219-i2c/

      ou

      https://www.makerhero.com/produto/conversor-analogico-digital-4-canais-ads1115/

      Abraços!

      André – Equipe MakerHero

  30. O meu giroscopio esta dando valor maiores que 360. Será q pode ter queimado algo na hora de soldar? E mesmo com o giroscopio parado ele fica variando o valor

    1. Olá Marcos!

      Isso é em todos os eixos ou só em um?

      Abraços!

      André – Equipe MakerHero

  31. Olá. Eu compilei o código proposto. Porém os resultados aparecem apenas “-1”. Como proceder? O que pode estar errado. Mas o meu acelerômetro não é o mesmo do modelo.

    1. Olá Heloísa!

      Você precisa utilizar a biblioteca própria para o seu acelerômetro.

      Abraços!

      André – Equipe MakerHero

  32. Muito legal o povo perguntando sobre as unidades de medida, o giroscópio até concordo que é meio esquisito (graus por segundo) mas o acelerômetro é em “g” sendo 1g (G ou g-force) a aceleração da gravidade da Terra (~9,81m/s²), então considere 16g o limite deste sensor (ou aprox. 156,96m/s²).

    Quando um carro veloz faz um circuito de 0 a 100km/h, na verdade está medindo a aceleração, pois é a velocidade [km/h] por tempo [s], (sendo que a velocidade já é espaço [kilometros] em um determinado tempo [hora], então o tempo fica ao quadrado como unidade de medida resultante na aceleração).

    Agora considere um Bugatti Veyron (2006) [https://en.wikipedia.org/wiki/List_of_fastest_production_cars_by_acceleration] com a marca de 2.5 segundos para 0-100km/h ou 11,1 m/s² (aprox. 1,13g).

    Em 16g teríamos:
    g[m/s²] = (dV)[m/s] / (dT)[s]
    (Convertendo km/h em m/s: 1000 m / 3600 s/h)
    16g[m/s²] = (100 – 0)[km/h] * (1000 m / 3600 s/h) / dT[s]
    dT[s] = 100[km/h] * (1000 m / 3600 s/h) / 156,96[m/s²]
    (unidade dividido pela mesma unidade vai cancelar a unidade)
    dT[s] = 100[km/h] * (1000 m / 3600 s/h) / 156,96[m/s²]
    dT[s] = 0,177[s]

    Ou seja, se um carro (ou foguete nesse caso!) fizesse de 0 a 100km/h em cerca de 177 mili segundos [ms] então estaria fazendo uma aceleração de 16g! (https://www.engineeringtoolbox.com/acceleration-d_1393.html).

    O corpo humano de um piloto treinado pode aguentar cerca de 8g, ou até um pouco mais segundo outras fontes (http://www.businessinsider.com/how-pilots-survive-inhuman-levels-of-g-force-2014-11).

    Mas um inseto pode fazer 400g em um salto!!! (http://www.sciencefocus.com/qa/whats-highest-g-force-insect-can-survive).

    Todas informações estão na internet, pesquise! E não se esqueça: o buscador Google é seu amigo! 😉

  33. É realmente muita falta de consideração do fabricante do MPU6050! Qual é o melhor RTC da atualidade, com compensação de temperatura? O DS3231 (ou DS3232) que pode substituir parcialmente o antigo DS1307, sendo que eles tem o endereço 0x68. Então usar dois MPU6050 impede a utilização do RTC e vice versa, tantos endereços disponíveis e parece que só existe esse 0x68 :p

    1. Corrigindo, datasheet Pag 26 “Auxiliary I2C Bus Modes of Operation – The I2C Master can be configured to read up to 24 bytes from up to 4 auxiliary sensors. A fifth sensor can be configured to work single byte read/write mode.”

  34. Bom dia, estou fazendo um trabalho de monitoramento de vibração de motores de indução.
    Estou querendo usar o MPU6050, irei utilizar a aceleração para ver a vibração, os valores dado pelo mpu sao em que valores.

  35. Caro amigo, boa tarde.. é possível você me fornecer um sistema deste montado e funcionando? Muito obrigado..

  36. Olá ,

    Gostaria saber qual é a unidade que o Giroscópio dá ? Se é em graus ou não ?

    1. Digital-output X-, Y-, and Z-Axis angular rate sensors (gyroscopes) with a user-programmable full-scale range of ±250, ±500, ±1000, and ±2000°/sec (https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf) degree per second (https://whatis.techtarget.com/definition/degree-per-second)

  37. Boa noite, esse acelerômetro funciona com a raspberry pi3?

    1. Bom dia Bruno,

      Funciona sim. 🙂

      Abraço!

      Adilson – Equipe MakerHero

      1. Voce acha possivel criar um bicoptero (drone com 2 motores) sendo possível que ele apenas va para cima e para baixo utilizando um comando via bluetooth atraves de um mini controle remoto?

        1. Olá Bruno!

          Acredito que sim.

          Abraços!

          André – Equipe MakerHero

  38. ADILSON, BOA NOITE, PRECISO DE UM DESSES COM MEDICAO DE INCLINACAO E GIRO, APENAS DUAS INFORMACOES E COM TECLAS PARA ZERAR AS MEDIDAS, NAO ENTENDO DISSO, MAS PRECISO FAZER UMA FERRAMENTA DE MEDICAO DESSES DOIS ITENS E COLOCAR UMA BASE MAGNETICA, PRECISO DE ALGUEM QUE DESENVOLVA PARA MIM ESSA FERRAMENTA, COMPRO 1000 POR ANO NO MINIMO, TENS COMO FAZER OU ME INDECAR? SEGUE MEU EMAIL [email protected], AGUARDO CONTATO, FORTE ABRACO… ADILSON TAMBEM… FONE 47 988430100

    1. Procure uma montadora, pesquise na internet, eu comprei placas módulos de RF433 da Felitec e gostei muito. Boa sorte!

  39. Estou utilizando o programa acima e conectei assim como na imagem, no entanto, meu serial monitor apenas printa o seguinte resultado “AcX = -1 | AcY = -1 | AcZ = -1 | Tmp = 36.53 | GyX = -1 | GyY = -1 | GyZ = -1
    “. Além disso, meu display acende mas não apresenta os resultados. Utilizei outros programas que vi na internet mas também não funciona, em alguns casos o serial monitor fica em branco e não apresenta resultados. Saberiam dizer o motivo desse problema?

  40. Olá nesse projeto vocês usam u display de 4 por 16 ,será que eu poderia usar um display de 2 por 16 .

    Obrigado

  41. Os valores recebidos em relação ao giroscópio são os graus por segundo ou os graus de giro. Se for os graus por segundo teria como mostrar como conseguir os graus. Grato

  42. O código altera alguma coisa para usar a placa Arduino Nano? Não irei usar LCD.

  43. Vocês têm algum projeto para análise de vibração com o uso de acelerômetro?

  44. Boa tarde, estou com um problema nos valores do acelerômetro e do giroscópio… Mesmo mantendo o MPU fixo, o range que tem entre a saída dos dados a cada segundo é muito alto, tem muita discrepância. Como resolvo isso?

  45. Gostaria de saber em qual parte do código que está declarada as portas A5 e A4 para leitura do I2C. E como posso modificar essas portas, pois gostaria de ler os valores do sensor através de outras portas.

  46. Boa tarde, gostaria de utilizar o acelerometro em outra porta analogica, como a 0 e 1. como faço para alterar?

  47. Boa noite
    Estou querendo ligar 2 MPU6050 num mesmo arduino. Isto é possível?

    Obrigado

  48. Gostaria de entender os endereços comentados (0x3b e 0x6b), e se existem outros que podem ser considerados durante a programação.

  49. boa noite, iniciei agora nesse mundo arduino. gostaria de ajuda para fazer um projeto igual ao do video usando um arduino nano V#,0 e um giroscopio MPU 6050
    POR FAVOR ME AJUDEM.

    https://www.youtube.com/watch?v=oWeTnQHuyuk

  50. Prezados,

    comprei algumas placas GY-521 (MPU6050) da MakerHero e estou tentando, sem sucesso, reproduzir os testes apresentados neste post. Os números devolvidos pelo MPU6050 não fazem sentido e ao mover a plaquinha seu comportamento também não faz sentido.

    Passei um I2C scanner e a placa é encontrada (0x68) sem problemas. Estou um pouco confuso sobre os resistores pull-up para 3.3V na placa GY-521, enquanto a conexão com o Arduino usa nível lógico 5,0V. Não seria necessário usar um conversor de nível lógico, mesmo alimentando com 5V? Ouvi dizer que algumas placas tem o resistor pull-up com valor diferente de 4.7k, o que acarretaria problemas.

    O que eu poderia estar fazendo errado? A comunicação I2c está funcionando perfeitamente (testada com outros sensores). Troquei a placa GY-521 por outra e o problema persiste.

    Obrigado pela atenção.
    Marcelo.

  51. Olá Gutenberg. Vc pode me ajudar?

  52. Prezado Adilson, boa noite.
    Olha, estou engatinhando com o Arduíno.

    Gostaria de esclarecer uma dúvida. Nas recomendações gerais, há referências à voltagem de 5V e a alimentação entre 7 e 12 V.

    Pergunto: 5V seria a tensão operacional interna (padrão, digamos) e a alimentação externa entre 7 e 12V?
    E se eu resolver trabalhar unicamente com a tensão fornecida pela USB do meu micro?

    Outra coisa, os acelerômetros de vocês.

    Não há informações sobre taxa de aquisição: 100 pts/s, 1000 pts/s, ec (Hz).
    A questão mais complicada, nesse caso, parece ser a aquisição, em termos de armazenamento, dessas informações dos sensores, concorda?

    Aquisitando-se a 1000 Hz durante 5 minutos, os arquivos ficam enormes, o que pré-supõe o armazenamento.

    Um display de tela pouco serve para qualquer atividade mais arrojada de engenharia. Alguma sugestão?

    Atenciosamente,

    LEduardo

  53. Olá

    É possível usar essa mesma biblioteca para usar esse acelerometro com o ESP07, programando na interface Arduino?
    Obrigado

  54. Prezados, consigo melhorar a velocidade de leitura do sensor ? Atualmente pelo serial monitor consigo ler em média 360 vezes por segundo, consigo melhorar esse valor ?

    1. O datasheet diz que a taxa de leitura máxima do giroscópio é de 8 kHz, e a do acelerômetro de 1 kHz. Com taxa de leitura maior, é provável que os dados apresentem ruído significativo, mas isso pode ser resolvido usando um filtro passa-baixa.
      Se você usar o modo DMP, aí a taxa máxima é de 200 Hz.

      1. @Gutenberg
        Muito Obrigado pelas respostas!
        Nestes códigos que você disponibilizou em comentários anteriores consigo então chegar somente a 200hz certo? como são baseados na biblioteca do MPU, acredito que o código original de exemplo também seja limitado a 200Hz. Já esse código aqui do Blog, utilizando a biblioteca Wire, consigo chegar a 1kHz ?
        Caso seja isso mesmo poderia me explicar como configurar essa opção ? Necessito de pelo menos leituras de 500Hz para minha aplicação, os dados vou tratar depois atraves de Banco de Dados.

        1. Isso mesmo, usando DMP, como no código que mostrei em outros comentários, a frequência máxima de leitura é de 200 Hz.

          Se você fazer apenas a leitura dos dados raw (sem processamento), isto é, sem usar o DMP, então dá pra ler ambos os sensores a 1 kHz. Não sei dizer se é possível usar o código aqui do blog para fazer isso, pois ainda não usei o MPU6050 dessa maneira.

          Mas tenho um palpite: alterar a penúltima linha do código (delay(300), atraso de 300 ms) para delay(2). Não sei se o programa vai funcionar bem, mas se funcionar, provavelmente você terá os 500 Hz de leitura. Se ficar muito diferente dos 500 Hz, use a função delayMicroseconds(2000) no lugar de delay(2) e ajuste o atraso até obter a frequência desejada.

          Se o programa não funcionar, elimine o máximo possível das funções Serial.print(), pois elas tomam bastante tempo, e coloque o baldrate da serial bem alto (115200, 230400…). Tente rodar o programa sem usar os códigos do LCD, pois essas funções também podem ser lentas. Se mesmo assim não funcionar, aí vai ser preciso recorrer ao datasheet do MPU6050.

          1. Muito Obrigado pelos esclarecimentos!
            Fiz um teste desse código acima, sem o delay() e com a função millis() para saber o tempo de leitura, mais o máximo foi 360 leituras, sem nada de LCD.

            Oque preciso é de resolução dentro de 1 segundo, para gerar uma senoide mais precisa.

            Rafael Gianesini
    2. Pode ser que a velocidade de leitura esteja baixa por causa da velocidade do barramento I2C. Se a ligação do MPU até o Arduino não for muito longa, você pode alterar o barramento para a velocidade máxima. Para fazer isso, acrescente TWBR = 12; após Wire.begin();. Se não funcionar, pode ser preciso acrescentar um resistor pull-up na ligação SDA e CLK de 4.7K-2.2K, mais ou menos. (+Info: http://www.gammon.com.au/i2c)

      Como você precisa de uma velocidade relativamente alta, talvez não vai dar certo se a biblioteca Serial estiver sendo usada, pois ela é muito lenta. Esse pode ser outro fator causador de problemas.

      1. Entendi, vou fazer os testes.
        A ideia principal não é utilizar a biblioteca serial, mais sim o ethernet w5100 junto da biblioteca MySql para efetuar um insert dentro do banco de dados, oque eu penso que pode ser mais lento do que o Serial, neste caso pensei em criar um log (.csv ou .txt) dentro do cartão de memoria após a leitura (Leitor de cartão do W5100) e depois enviar o arquivo para o meu PHP que vai ler e inserir no banco de dados.

        1. Você já está tentando o INSERT? Isso, sim, vai ser lento, não?!

          1. Sim, realmente o INSERT fica lento, montei um código que faz as leituras e grava em um arquivo .txt e depois eu acesso ele como se fosse um FTP pelo Ethernet Shield. Agora estou com problemas relacionado ao fluxo do código: Eu preciso gerar um arquivo para cada leitura, porem o código de criar o arquivo roda dentro do void setup() e não dentro do void loop() logo eu não consigo associar mais de uma leitura a arquivos diferentes.

            Rafael Gianesini
          2. Pra quem estiver tentando fazer o mesmo que eu, o máximo que consegui foram 500 leituras/segundo gravando um eixo de cada vez em um Array, e fazendo a inserção no BD via acesso cliente por método Post para uma pagina PHP que faz a inserção! Média de 10 segundos para p processo todo ser feito.

            Rafael Gianesini
          3. @Rafael Gianesini, você poderia disponibilizar o código que você criou para gravar os arquivos em .txt?

        2. Boa tarde, Rafael!

          Você poderia disponibilizar o código que você criou para gravar os arquivos em .txt?

  55. Bom dia,
    Prezados estou utilizando o acelerômetro MPU6050 em um trabalho da faculdade onde utilizarei os dados de aceleração dos 3 eixos.

    Nas informações do datasheet do sensor é informado que o mesmo possui um range de detecção de aceleração +-2, +-4, +-8 e +-16g. Como faço para definir essa precisão? Tem alguma linha de código que preciso inserir para atribui-la?

    Desde já agradeço e parabéns ao tópico!

    1. Na biblioteca desse módulo, os limites (range) do MPU é definido dentro da função initialize() através das funções setFullScaleAccelRange() para o acelerômetro e setFullScaleGyroRange() para o giroscópio. Assim, se você está fazendo o uso da biblioteca MPU6050.h, basta chamar a função setFullScaleAccelRange(x) após a chamada de initialize(), onde x é o range de 2g (MPU6050_ACCEL_FS_2) a 16g (MPU6050_ACCEL_FS_16) do acelerômetro.

      Se você está acessando o MPU sem o uso de sua biblioteca, como no caso do código fornecido nesta página, aí o processo é um pouco mais complexo, pois será preciso adaptar e simplificar algumas funções de outras bibliotecas.

  56. Prezados, sou iniciante no mundo Arduíno e vi que o MPU6050 mede temperatura, porém, entendo que seja apenas a temperatura ambiente. Um dos fatores do projeto que preciso desenvolver, envolve a medição de temperatura “corporal” de pequenos animais. Sabendo que a fiação entre os sensores e o microcontrolador será roída por eles (além do risco de choque elétrico ao spécimen) gostaria de saber dos Srs se conhecem algum sensor que possa medir a temperatura a curta distância, sem que precise estar fixado ao corpo do animal (que ficará em uma pequena gaiola). Desde já agradeço pelas dicas/orientações.

  57. Olá, estou querendo usar este sensor para controlar um patch de MAX, como é uma aplicação musical preciso de latencia muito baixa.
    Saberia me informar o tempo que precisa para efetuar um loop completo?, neste caso usaria só o Giroscopio.

    Obrigado.

  58. Bom dia, tive o mesmo problema que um comentário anterior, recebo somente respostas igual a -1. Já verifiquei todas as conecções e inclusive troquei os jumpers, no entanto o problema continuou. Pode ser algum problema com o acelerômetro?

    1. Para que o endereço do MPU seja 0x68 a porta ADO deve estar ligada ao GND.

    2. Estou com o mesmo problema, você conseguiu resolver?
      já verifiquei a ligação esta toda correta.

      Este e o meu Sensor
      https://www.sparkfun.com/products/11028

      Obrigado!

      1. Resolvido

        Tem um pino nesse componente VIO foi só ligar ele ao VDD(3,3V) que funcionou.

  59. la aceleración en q unidades de fuerza las da?

  60. Boa tarde. Como eu faço para ligar mais de dois mpu6050 juntos? Digo no mesmo arduino? Se alguem pder me ajudar agradeço…

    1. Daez Felipe Ribeiro, blz?? Cara esse módulo só possui duas opções de endereço na comunicação I2C, então vc só consegue ligar dois módulos em um mesmo Arduino.

      1. Você pode ligar 2 módulos por barramento, isso é numa porta i2c, mas você pode utilizar mais portas como i2c, logo, pode ligar varios sensores numa arduino, mas claro, que você precisa desenvolver a comunicação para essas portas

  61. Olá, gostaria de saber como faço para converter os valores dos eixos do giroscópio para graus? Desde já, muito obrigada.

    1. Primeiro vc tem que saber o offset do seu sensor (cada sensor é diferente), isto é, os valores que o seu sensor mostra quando está em repouso na posição horizontal. Para isso use o seguinte arquivo depois de já ter conectado o sensor no arduino (é necessário instalar a biblioteca MPU6050: https://www.dropbox.com/s/xqaf18n665frhpi/MPU6050.zip): https://www.dropbox.com/s/h91r1tl0h9cj462/MPU6050_calibration.ino

      Anote esses valores (3 para o acelerômetro e mais 3 para o giroscópio).

      Para encontrar os ângulos do acelerômetro e do giroscópio use o arquivo abaixo. Nele vc encontrará todas as equações (algumas são bem longas). Não se esqueça de substituir os 6 valores encontrados anteriormente nas linhas 74-79. https://www.dropbox.com/s/jt1fdv52c20eope/Acc_Gyro.ino

      Fazendo por esse método haverá drift (desvio) significativo nos dados do giroscópio após alguns segundos. A melhor maneira de lidar com isso é usar o DMP (Digital Motion Processor) do MPU-6050 para processar todos os dados e cálculos. A estabilidade e precisão são MUITO maiores! Para isso use esses arquivos (dados.h e DMP_NoLib.ino): https://www.dropbox.com/sh/clmmfed7zqz028d/AADSIz32dD0goQif0pNA0tw4a

      Novamente, substitua os 6 offsets encontradados anteriormente nas linhas 102-107 no arquivo DMP_NoLib.ino.

      (Mais informações você encontra em outros comentários mais antigos abaixo)

  62. Estou procurando algo mais simples e barato, para detectar o movimento de um dedo, tem?

    1. Dependendo da aplicação, as chaves do tipo “tilt switch” resolve, como as de mercúrio.

  63. Bom dia MakerHero, estou fazendo um trabalho de conclusão de curso utilizando o MPU6050 , gostaria de esclarecer uma duvida com você. Quando trabalho com o acelerômetro ele me retorna valores do tipo “AcX = 30728 | AcY = 820 | AcZ = 5732”, o que são esses dados, como interpretá-los?

    Grato,

    Wallas Fernandes.

  64. Boa noite, como faço para baixar o programa? estou com um aqui e usando essa programação esta dando erro

  65. Olá,

    É possível que seja enviado estes dados ao computador utilizando algum componente bluetooth?
    Caso a resposta seja sim, é possível que tais dados sejam interpretados pelo computador e tratados como comandos de teclas?

    Excelente trabalho!

    Abraço.

  66. Olá, estou realizando um projeto e desejo que um led acenda para determinados valores que o sensor possuirá conforme ele muda, é possível realizar esse processo

  67. Estou enfrentando um problema com o sensor quando o mesmo imprime os valores da angulação e da aceleração, na verdade só imprime -1, não sei o que pode estar acontecendo. Se puderem ajudar! Desde de já, muito obrigada.

    1. Já vi isso acontecer quando o MPU6050 não está conectado corretamente.

      1. Descobriu o que foi? o meu também esta travado nesses dados e as ligações estão corretas

        1. Descobri sim, no meu caso, foi uma soldagem ruim nos pinos.

    2. tm estou com o msm prolema

    3. Você deve ter invertido os pinos A4 e A5… fiz essa bobagem… fiz os testes no protoboard e montei corretamente. Ai fiz uma placa, soldei tudo, e so recebia -1… fui conferir, inverti esses pinos!

    4. Estou com esse mesmo problema, vc conseguiu resolver?

  68. Olá a todos, estou tentando utilizar o MPU6050 e enviar o valor do ângulos depois de usar o arquivo de calibração, para um display 16×2. Mais todo vez ele estoura o FIFO ou para de responder. Alguém pode me ajudar?

    Grato desde já.

  69. Bom dia,
    Fizemos a montagem especificada acima e mesmo utilizando o código fornecido, ao imprimirmos os valores no monitor serial temos que todos os valores de aceleração resultam igual a -1 e a temperatura igual a 36,5. O que está acontecendo?

    1. Bom dia Marcelo,

      Verifique se a comunicação entre o módulo e o Arduino está ok, e confirme o endereço I2C. Você pode usar o I2CScanner para verificar se essa comunicação está ok: http://playground.arduino.cc/Main/I2cScanner

      Abraço!

      Adilson – Equipe MakerHero

  70. Ola Felipe!
    Sou iniciante, ainda não sei muito !

    1 )) Estou fazendo um projeto de um carrinho, e nele pretendo utilizar um controle bluetooth com acelerômetro e giroscópio. No qual voce move o controle e o carrinho se movimenta.

    – bluetooth (HC 05 ou HC 06)
    – Arduino Uno R3 (MEGA328P)
    – Modulo acelerimetro e giroscopio MPU 6050

    Como me indica utilizar a biblioteca do MPU6050 ?!
    Tenho que calibrar em ângulos ?
    Pesquisei bastante já, e vejo as pessoas se enrolando muito na hora de usar a biblioteca desse sensor.

    2)) O carrinho terá somente duas rodas.
    Vai ser um carrinho também equilibrado por outro giroscópio e acelerômetro, pra que ele se mantenha “em pé” com somente duas rodas.
    Como faço pra utilizar ele também dessa forma ?

    Obrigada qualquer ajuda !

  71. Equipe MakerHero neste vídeo como faço para que o motor de passo gire MAIS angulo que o acelerômetro.
    Não sei aonde alterar no código para que isso ocorra.
    att,
    EDSON

    https://www.youtube.com/watch?v=KOfuubvrtRw

    1. Minha duvida também é semelhante a esta.
      Como faço para aumentar a velocidade do motor (aceleração) conforme vou girando o sensor e mudando seu angulo ?!

  72. Queria uma ajuda de como ligar a mpu 6050 e um barometro bmp180 na arduino uno. Posso ligar um no A5eA4 e o outro no A3eA2?

    1. Ambos devem ser ligados no A4 (SDA) e A5 (SCL) do Arduino Uno. Talvez vc se pergunte como o Arduino escolhe qual deles se comunicar, e a resposta é pelo endereço de cada um. Esse endereço pode ser visto como uma espécie de endereço IP em uma rede de computadores (no caso, a rede seria do tipo I2C), onde todos os computadores estão ligados entre si, mas cada um deles possui endereço IP único. Veja mais informações sobre I2C aqui: http://www.arduinobr.com/arduino/i2c-protocolo-de-comunicacao/

      No caso do MPU6050, o endereço mais usado por ele é o 0x68, e o BMP180 usa o endreço 0x77. Caso vc use bibliotecas, esses endereços não precisam ser colocados no seu código, pois as bibliotecas já os possuem internamente.

  73. Boa tarde, vi uma instrução sobre converter os valores lidos em inclinação angular. Gostaria de saber como faço pra converter os valores do acelerometro em m/s2 ? Obrigado

  74. Olá! Quantos destes acelerômetros posso ligar no arduino UNO?
    Obrigado!

    1. Boa tarde Carlos,

      Esse módulo permite que você selecione 2 endereços, assim você consegue ligar apenas dois acelerômetros no Arduino, utilizando o barramento I2C.

      Abraço!

      Adilson – Equipe MakerHero

  75. Olá, É possivel enviar as informaçoes deste modulo via wireless para o arduino?

  76. Olá,

    Nesta configuração o pino de interrupção não está sendo usado, é mesmo possível usar o módulo MPU6050 sem o uso deste pino??

    Obrigado.

    1. Bom dia Rafael,

      É possível sim. Nos testes usamos o módulo sem conectar esse pino.

      Abraço.

      Adilson – Equipe MakerHero

  77. Olá, Como substitur? Valores obtidos: Your offsets: 861 1096 1396 45 -1 42

    – – -Codigo original- – –
    AcX = AcX – 1398;
    AcY = AcY – 962;
    AcZ = AcZ + 1117;
    GyX = GyX + 57;
    GyY = GyY + 35;
    GyZ = GyZ – 26;

    1. Sim, é demorado mesmo pra encontrar os valores dos Offsets. Vc pode alterar a quantidade de amostras na linha 52 (int buffersize=3000;) do arquivo MPU6050_calibration.mpu. Quanto mais amostras, melhor será a média.

      Para adicionar esses valores ao seu código, é só substituí-los nas respectivas funções. Por exemplo, o offset do acelerômetro no eixo x foi 861, procure pela função setXAccelOffset() e coloque esse número como parâmetro da função (ou seja, entre os parênteses). Então vai ficar assim: setXAccelOffset(861).

      Faça o mesmo para as outras 5 funções: setYAccelOffset(1096), setZAccelOffset(1396), setXGyroOffset(45), setYGyroOffset(-1) e setZGyroOffset(42).

      1. Obrigado, consegui. Agora, tenho mais uma dúvida, como posso ligar dois usando a mesma placa, sei que uso os mesmos pinos A0 A1 SCL SDA, mas minha preocupação é quanto ao endereço de cada MPU-6050, tem como eu predefinir?

  78. Parabéns pelo trabalho Filipe. Irei citar o seu trabalho em minha monografia do curso de Eng. de Controle e Automação.
    Porém nos meus testes aqui me parece que você inverteu o giroscópio X com o giroscópio Y, confere?
    Quando movo o mpu-6050 apenas em uma direção (X ou Y), o acelerômetro correspondente se modifica corretamente, porém o giroscópio de outra direção que indica a velocidade angular. Você pode confirmar isso?

    O que fiz foi inverter a leitura (GyX no lugar de GyY e vice versa):

    GyY = Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
    GyX = Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)

    Abraços

  79. Gutemberg ou MakerHero, não estou conseguindo ter bons resultados com o MPU… Algum de vcs poderia me ajudar?

    1. Olá Pedro, qual é o problema? A saída está muito instável ou tem um tempo de resposta muito elevado?
      Diga mais sobre seu problema e, se possível, sobre seu projeto.

  80. olá felipe da uma olhada neste video se puder e me diz se posso utilizar este acelerometro para a mesma função ou preciso de outro modulo e se voces possuem ele para venda pode ser??

    https://www.youtube.com/watch?v=OwZRRxfRanE

    Se alguem souber algo a respeito tambem por favor podem dar dicas..

    1. Boa tarde Leonardo,

      Você pode tentar com um dos três modelos que nós comercializamos:

      GY-80 – https://www.makerhero.com/pd-123084-sensor-gy-80-10-dof-acelerometro-giroscopio-magnetometro-barometro.html
      MPU-6050 – https://www.makerhero.com/pd-10fd9f-acelerometro-e-giroscopio-3-eixos-6-dof-mpu-6050.html
      MMA7361 – https://www.makerhero.com/pd-6b8a9-acelerometro-de-3-eixos-mma7361.html

      Não podemos garantir o funcionamento como no vídeo, pois não testamos nessa configuração, mas os três modelos vendidos são bem precisos.

      Abraço.

      Adilson – Equipe MakerHero

  81. boa tarde, como faço para transformar esses dados em angulos???
    obrigado.

    1. Primeiro vc tem que saber o offset do seu sensor (cada sensor é diferente), isto é, os valores que o seu sensor mostra quando está em repouso na posição horizontal. Para isso use o seguinte arquivo depois de já ter conectado o sensor no arduino (é necessário instalar a biblioteca MPU6050.h): https://www.dropbox.com/s/h91r1tl0h9cj462/MPU6050_calibration.ino

      Anote esses valores (3 para o acelerômetro e mais 3 para o giroscópio).

      Para encontrar os ângulos do acelerômetro e do giroscópio use o arquivo abaixo. Nele vc encontrará todas as equações (algumas são bem longas). Não se esqueça de substituir os 6 valores encontrados anteriormente nas linhas 74-79. https://www.dropbox.com/s/jt1fdv52c20eope/Acc_Gyro.ino

      Fazendo por esse método haverá drift (desvio) significativo nos dados do giroscópio após alguns segundos. A melhor maneira de lidar com isso é usar o DMP (Digital Motion Processor) do MPU-6050 para processar todos os dados e cálculos. A estabilidade e precisão são MUITO maiores! Para isso use esses arquivos (desconsidere as pastas): https://www.dropbox.com/sh/clmmfed7zqz028d/AADSIz32dD0goQif0pNA0tw4a

      Novamente, substitua os 6 offsets encontradados antes nas linhas 101-106 no arquivo DMP_NoLib.ino.

      Se vc quiser ver esses dados graficamente use o Processing. A pasta ProcessingGrafic (link anterior) contém o arquivo do Processing e as instruções.

      1. Se por ventura, na minha aplicação, o MPU6050 originalmente não fica na posição horizontal, mas sim levemente inclinado, eu devo rodar o programa MPU6050_calibration.ino com ele na posição levemente inclinada (como no meu caso) ou ainda sim eu devo rodar esse programa com ele na horizontal?

        1. Na teoria, tanto faz: vc pode calibrá-lo na posição de uso ou na “posição-padrão” de referência, que é a horizontal. Na prática, vai ser muito mais simples para efetuar os eventuais cálculos envolvidos se vc usar a posição horizontal como referência.

          Com o programa MPU6050_calibration.ino vc encontra os valores que serão repassados ao DMP do MPU6050 para informá-lo qual é a posição de referência. Só isso. Fica muito mais simples pra vc entender os ângulos se a posição horizontal for usada como referência. Quando o MPU já estiver na posição de uso é só deixá-lo em repouso por algum tempo e anotar os valores encontrados (quaternions/ângulos/euler).

          Antes de usar o programa, lembre-se de deixar o MPU em repouso por algum tempo em uma superfície livre de vibrações. Acredite, até o barulho da rua vai influenciar a saída do acelerômetro!

      2. Jovem, instalei as bibliotecas e compilei na minha placa Atmega 1280, mas no serial monitor não está mostrando valores e sim uns símbolos. Você saberia qual o erro ? pode ser que eu tenha instalado errado, mas já repeti o processo, segui os links indicados.

        1. Israel, basta que vc altere o “baud rate” do serial monitor para a 57600, que é o valor que eu usei na inicialização da serial.
          Veja a linha da função setup onde está escrito Serial.begin(57600). Esse valor (no caso 57600) deve ser colocado no serial monitor.

          1. Gutemberg, desculpa a demora no retorno mas eu verifiquei e está com o mesmo valor de 57600 e continua o erro. Estou com as bibliotecas instaladas e atualizadas e mesmo assim tenho esse “lixo” na saída do programa, se tiver ideia do que mais pode ser, ajuda. Valeu.

          2. Mano, consegui aqui, só mais uma pergunta, é normal demorar para pegar os valores de offset?

      3. Boa tarde, qndo eu uso o “MPU6050_calibration” eu devo pegar os valores do “Your offsets” ou do “Sensor readings with offsets”?

      4. Outra pergunta… o arquivo “DMP_NoLib.ino.” substitui o “Acc_Gyro.ino”? Ou devo usar ele depois de obter os ângulos? Desculpe a pergunta, é que comecei a usar o arduino/mpu6050 faz pouco tempo. Desde já obrigado

        1. Os valores que vc precisa são os do “Your offsets”. Os outros (“Sensor readings with offsets”) é só para mostrar que o resultado é próximo de zero (valor padrão do eixo Z é 16384) quando se inclui os offsets.

          Ah, esses arquivos funcionam de maneira diferente: o “DMP_NoLib.ino” usa processamento digital dos dados feito pelo próprio MPU6050, enquanto que no “Acc_Gyro.ino” o Arduino é o responsável por fazer esse processamento, e de forma aproximada. Recomendo a todos usar o primeiro arquivo (DMP_NoLib.ino), pois ele é mais rápido/estável/preciso, o drift é praticamente zero (veja meu primeiro comentário), não exige muito do Arduino e ainda não precisa que se instale nenhuma biblioteca nova (por isso as 710 linhas)!

          Para aqueles que vão usar esse arquivo (DMP_NoLib), os valores dos offsets devem ser substituídos nas linhas 99-104.

      5. Eu não consigo compilar o programa MPU6050_calibration.ino, provavelmente são as bibliotecas e que encontrei que devem estar desatualizadas. Onde posso encontrar essas bibliotecas que realmente funcionem? Obrigado.

  82. Ola filipe

    Sabe me dizer se tem como usar o mpu-6050 com um pic 16f887?Se sim, como eu posso fazer isso?

    1. Boa tarde Pedro,

      Achei algumas informações sobre a ligação do MPU-6050 ao PIC 16F877A neste link: http://www.sonsivri.to/forum/index.php?topic=59978.0

      Abraço

      Adilson – Equipe MakerHero

  83. Boa noite….

    Vi que pra poder trabalhar com dois módulos MPU eu teria que alimentar com 3.3Vcc o AD0 de um deles para que eu possa realizar a leitura deste no endereço 0x69.
    Aconteceu que eu preciso ler 4 módulos MPU iguais, tem alguma maneira de fazer isso?
    Obrigado!

    1. Oi Fabio,

      Aparentemente não, já que um módulo só consegue ter dois endereços: 0x68 ou 0x69.

      Abraço.

      Adilson – Equipe MakerHero

    2. Você pode fazer isso de duas formas:

      1) Usando um multiplexador de I2C (Tca9548a) ou dois multiplexadores simples (um para o SDA e outro para o SCL);

      2) Você pode conectar pinos digitais ao pino AD0 de cada um dos módulos MPU-6050 e mudar os valores para nível lógico alto daqueles que você não deseja fazer a leitura e deixar em nível lógico baixo somente o que você deseja fazer a leitura. Dessa forma, você lê somente de um endereço (0x68) e vai trocando os endereços dos módulos a seu critério para fazer a leitura dos demais.

      Caso você utilize um Arduino Due, que possui dois barramentos I2C (SDA0 e SCL0; e SDA1 e SCL1), você consegue utilizar os quatro de uma vez só, sem precisar fazer chaveamento. Em cada barramento você utiliza dois, com endereços diferentes.

  84. Olá

    Com esse acelerometro eu consigo obter um angulo de um eixo com precisão de 1 ou 2 casas decimais??

    1. Vai depender do Filtro que vc usar para “mesclar” os dados do Acelerômetro e do Giroscópio. Ainda não vi (nem fiquei sabendo de) um filtro com tal precisão. Sei que é possível suavizar a saída para que os valores não mudem bruscamente, mas isso faz com que se perca precisão….

      Dá pra obter os dados diretamente do DMP do MPU-6050. Pelos testes que já vi, essa é a opção mais precisa.

  85. Olá, estou com o mesmo problema descrito pelo Roger. Minha saída está como AcX = -1 | AcY = -1 | AcZ = -1 | Tmp = 36.53 | GyX = -1 | GyY = -1 | GyZ = -1 embora eu tenha as conexões feitas corretamente.

    Pode ser defeito do sensor?

  86. Como poderia escrever o código para usar o eixo Z em função calculada de uma distancia percorrida na direção vertical para cima ou para baixo ?

  87. Seria possível eu ligar esse módulo junto com o módulo i2c para display de lcd?
    Pois tenho um sensor desse e um módulo i2c para display de lcd.
    Eu poderia colocar os fios que vão do módulo e do sensor juntos? O SDA e o SCL.
    Obrigado.

    1. Boa noite,

      Não testamos nessa configuração, mas os dois módulos trabalham com I2C, logo você pode ligá-los no mesmo barramento (mesmos fios – SDA e SCL).

      Abraço.

      Adilson – Equipe MakerHero

      1. Bom dia, já consegui. utilizei um Scanner i2c e descobri o endereço de cada um, pois eles usam endereços diferentes.
        Obrigado.

  88. Como capturo o valor de x, y e z mpu 6050 (quais instruções cumprem esta função para arduino)?

    1. Boa noite Rodolfo,

      você já tem o valor de x, y e Z nas variáveis AcX, AcY e AcZ do acelerômetro, e em GyX, GyY e GyZ do giroscópio.

      Abraço.

      Adilson – Equipe MakerHero

  89. Ola, gostaria de saber mais algumas informações sobre estes valores da saída. Eles já estão em suas unidades de medida (m/s² e º/s) ou é necessário fazer alguma conversão?

    1. Boa noite Gabriel,

      Realmente não tenho essa informação, posso indicar um grupo de discussão exatamente sobre esse assunto :

      http://www.i2cdevlib.com/forums/topic/4-understanding-raw-values-of-accelerometer-and-gyrometer/

      Abraço.

      Adilson – Equipe MakerHero

  90. Bom dia , estou usando o mesmo sensor comprado aqui no MakerHero.
    Fiz a conexáo dos pinos como no exemplo:

    vcc -> 5v
    gnd -> ground
    SCL -> A5
    SDA -> A4

    Porém como resultado, esta saindo apenas os valores:

    AcX = -1 | AcY = -1 | AcZ = -1 | Tmp = 36.53 | GyX = -1 | GyY = -1 | GyZ = -1

    Acelerometro e Giroscopio fixados no -1.

    1. Encontrei a solucao!

      Estou utilizando o Arduino Mega 2560, e a conexao do SCL e SDA no arduino é nos pinos 20 e 21.

      Obrigado.

    2. Boa tarde Roger,

      Pode ser apenas um problemas de fiação/conexão. Se possível, tente soldar novamente a barra de pinos.

      Adilson – Equipe MakerHero

  91. Se fazer o giro em Z por exemplo mais de uma vez, o giroscópio detecta como no formato 360º apenas (0~360 e ao invés de 361 vai para 0 de novo)?

  92. Filipe! Você poderia ensinar a usar o filtro complementar para utilizar com o MPU 6050!!!

  93. felipe,

    muito bom , estou aprendendo muito sobre o Arduino, parabens.

    1. Obrigado Carlos !

      Abraço.

      Adilson – Equipe MakerHero

  94. Post muito bom!

    1. Valeu Thiago !

      Abraço.

      Adilson – Equipe MakerHero

  95. Parabéns pelo post.

    Tenho uma pequena dúvida, o que faz este dois comandos:

    Wire.requestFrom(MPU,14,true); e AcX=Wire.read()<<8|Wire.read();

    1. Boa tarde Marlon,

      Os dois comandos são utilizados em conjunto. O Wire.requestFrom solicita a informação do dispositivo, e o Wire.read lê (em bytes) essas informações.

      Você pode encontrar as informações sobre o comando Wire.requestFrom nesse link : http://playground.arduino.cc/Main/WireLibraryDetailedReference#requestFrom

      E sobre o wire.read, nesse link : http://arduino.cc/en/Reference/WireRead

      Abraço.

      Adilson – Equipe MakerHero

  96. Amigos,
    Estou usando um MPU6050 com UNO R3, no entanto os valores estão variando absurdamente com o sensor em repouso sobre a mesa, e ao move-lo os valores mantem as mesmas variações.

    Usando o código acima o resultado é este, há como corrigir?
    AcX = 5592 | AcY = -11256 | AcZ = 16908 | Tmp = 21.89 | GyX = -13827 | GyY = -1014 | GyZ = 1541
    AcX = 1392 | AcY = 5936 | AcZ = 2680 | Tmp = 21.57 | GyX = -15136 | GyY = -1119 | GyZ = -423
    AcX = 32767 | AcY = -9256 | AcZ = 13960 | Tmp = 21.52 | GyX = -11521 | GyY = -599 | GyZ = 1252
    AcX = -18888 | AcY = -3088 | AcZ = 32767 | Tmp = 21.75 | GyX = -12681 | GyY = -736 | GyZ = 847
    AcX = 7140 | AcY = -29048 | AcZ = 16880 | Tmp = 21.71 | GyX = -12129 | GyY = -174 | GyZ = 1044
    AcX = -5656 | AcY = 8280 | AcZ = 3176 | Tmp = 21.85 | GyX = -13091 | GyY = -545 | GyZ = 1254
    AcX = 7716 | AcY = 7864 | AcZ = 10044 | Tmp = 21.85 | GyX = -11706 | GyY = -813 | GyZ = 945
    AcX = 30728 | AcY = 820 | AcZ = 5732 | Tmp = 22.98 | GyX = -13821 | GyY = -657 | GyZ = 689
    AcX = -832 | AcY = -12592 | AcZ = -8152 | Tmp = 21.75 | GyX = -11632 | GyY = -987 | GyZ = 1001
    AcX = -7108 | AcY = -11228 | AcZ = 21484 | Tmp = 22.04 | GyX = -12388 | GyY = -440 | GyZ = 880
    AcX = 3356 | AcY = -13748 | AcZ = 8788 | Tmp = 22.46 | GyX = -13598 | GyY = -682 | GyZ = 1706
    AcX = 1844 | AcY = 20208 | AcZ = 24156 | Tmp = 23.02 | GyX = -12750 | GyY = -744 | GyZ = 803
    AcX = 11320 | AcY = -8320 | AcZ = 15124 | Tmp = 22.55 | GyX = -13243 | GyY = -723 | GyZ = 1670
    AcX = 6832 | AcY = -6568 | AcZ = 16192 | Tmp = 22.60 | GyX = -11558 | GyY = -432 | GyZ = 1285
    AcX = 1780 | AcY = -9128 | AcZ = 6828 | Tmp = 21.47 | GyX = -12534 | GyY = -751 | GyZ = 982
    AcX = 6532 | AcY = -9580 | AcZ = 9068 | Tmp = 24.48 | GyX = -12812 | GyY = -692 | GyZ = 1010
    AcX = -1408 | AcY = -28412 | AcZ = 18312 | Tmp = 22.88 | GyX = -14439 | GyY = -986 | GyZ = 1040
    AcX = 9072 | AcY = -4576 | AcZ = 4212 | Tmp = 22.27 | GyX = -12770 | GyY = -1370 | GyZ = 894
    AcX = 25172 | AcY = 6632 | AcZ = 20088 | Tmp = 21.61 | GyX = -12493 | GyY = -636 | GyZ = 316
    AcX = -3188 | AcY = -10860 | AcZ = 26876 | Tmp = 21.66 | GyX = -12954 | GyY = -505 | GyZ = 1659
    AcX = -3548 | AcY = 11628 | AcZ = 18724 | Tmp = 23.02 | GyX = -12603 | GyY = -850 | GyZ = 1895
    AcX = 2724 | AcY = 12300 | AcZ = 13660 | Tmp = 22.18 | GyX = -13962 | GyY = -664 | GyZ = 989
    AcX = -1168 | AcY = 2468 | AcZ = 11016 | Tmp = 24.39 | GyX = -13410 | GyY = -782 | GyZ = 1518
    AcX = 19528 | AcY = 1708 | AcZ = 2848 | Tmp = 23.17 | GyX = -12367 | GyY = -374 | GyZ = 958
    AcX = 16548 | AcY = 1728 | AcZ = 11164 | Tmp = 21.75 | GyX = -12370 | GyY = -605 | GyZ = 1399
    AcX = 3108 | AcY = -2616 | AcZ = 20304 | Tmp = 24.39 | GyX = -11932 | GyY = -358 | GyZ = 497
    AcX = 8988 | AcY = -1620 | AcZ = 24912 | Tmp = 23.59 | GyX = -12086 | GyY = -434 | GyZ = 1185
    AcX = -7736 | AcY = 17852 | AcZ = 10504 | Tmp = 23.12 | GyX = -12292 | GyY = -722 | GyZ = 928
    AcX = 3848 | AcY = -8220 | AcZ = 21896 | Tmp = 23.78 | GyX = -13299 | GyY = -954 | GyZ = 1676
    AcX = 9068 | AcY = -8152 | AcZ = 10288 | Tmp = 23.12 | GyX = -12810 | GyY = -213 | GyZ = 1349
    AcX = 7916 | AcY = 724 | AcZ = 22136 | Tmp = 24.20 | GyX = -11576 | GyY = -1028 | GyZ = 2035
    AcX = 7296 | AcY = 8792 | AcZ = 10356 | Tmp = 23.64 | GyX = -14234 | GyY = -335 | GyZ = 1390
    AcX = 19772 | AcY = -3516 | AcZ = 21296 | Tmp = 24.34 | GyX = -12840 | GyY = -877 | GyZ = 643
    AcX = 5080 | AcY = -1396 | AcZ = 17580 | Tmp = 23.68 | GyX = -12433 | GyY = -607 | GyZ = 1367
    AcX = 8980 | AcY = 476 | AcZ = 17156 | Tmp = 24.44 | GyX = -11452 | GyY = -572 | GyZ = 938
    AcX = 4860 | AcY = -8600 | AcZ = 22328 | Tmp = 23.64 | GyX = -12461 | GyY = -1118 | GyZ = 1331
    AcX = -6048 | AcY = -19860 | AcZ = 8496 | Tmp = 23.02 | GyX = -12196 | GyY = -658 | GyZ = 926
    AcX = -17636 | AcY = -13996 | AcZ = 14336 | Tmp = 23.82 | GyX = -12912 | GyY = 20 | GyZ = 729
    AcX = -3356 | AcY = 10744 | AcZ = 6120 | Tmp = 24.39 | GyX = -12348 | GyY = -460 | GyZ = 852
    AcX = 536 | AcY = -10832 | AcZ = 10608 | Tmp = 22.41 | GyX = -13759 | GyY = -900 | GyZ = 1171
    AcX = -2380 | AcY = -11908 | AcZ = 25248 | Tmp = 24.34 | GyX = -13036 | GyY = -752 | GyZ = 1128
    AcX = -11784 | AcY = -6988 | AcZ = 32040 | Tmp = 22.13 | GyX = -13674 | GyY = -613 | GyZ = 1149
    AcX = -8764 | AcY = -14952 | AcZ = 23348 | Tmp = 24.39 | GyX = -12041 | GyY = -426 | GyZ = 1379

    1. Boa noite Martini,

      Nos nossos testes essa variação não aconteceu. Você pode ter algum problema com o seu sensor.

      Adilson – Equipe MakerHero

    2. o meu deu o mesmo problema, alguma solução?

    3. Tenha em mente, que as entradas, analogicas são muito sensiveis, tente blindar os fios, use ferrite para amortecer.

  97. Olá. Eu compilei o código proposto. Porém os resultados aparecem apenas “-1”. Como proceder? O que pode estar errado.

    Obrigado.

    1. Boa noite Leandro,

      Se você estiver usando o mesmo acelerômetro do post, o MPU6050, reveja as conexões com o Arduino.

      Grato.

      Adilson – Equipe MakerHero

      1. Tbm estou com o msm problema , a resposta está com -1 e a ligação está correta, o que posso estar errando ?

      2. eu também estou com esse problema e conexões certas, o que pode ser?

        1. Olá Gustavo,

          Pode ser que seu acelerômetro tenha um endereço diferente. Dê uma olhadinha https://playground.arduino.cc/Main/I2cScanner/

          Abraço!
          Rosana – Equipe MakerHero

  98. Olá. Pra usar esse sensor com o PIC em 5V, preciso de um conversor de nivel para as linhas SDA e SCL?

    1. Bom dia Stephen,

      Esse módulo já trabalha com nível de sinal de 5V.

      Abraço.

      Adilson – Equipe MakerHero

  99. Como faz para os eixos X, Y e Z irem de 0 a 360º?

    1. voce conseguiu??
      a minha duvida é a mesma, preciso muito disso.

  100. Boa tarde,

    Eu comprei com vcs um MPU 6050, porém não estou conseguindo utilizar esse exemplo.
    Ele informa o seguinte erro:

    “error: ‘Wire’ was not declared in this scope”

    E o meu código está idêntico ao de vcs.

    Estou programando no Visual Studio usando Visual Micro, pois a minha IDE do Arduino parou de funcionar.

    Grato.

    1. Boa tarde Douglas,

      Esse programa utiliza a biblioteca WIRE para a comunicação I2C, que deve estar instalada na IDE.

      Abraço.

      Adilso – Equipe MakerHero

  101. Os tutoriais estão muito bons, mas acho que para melhorar poderia colocar uns vídeos, para dar uma ideia melhor do resultado final.

  102. Me parece que as leituras do acelerômetro esta invertida com os do giroscópio, estou com uma CI diferente, talvez seja isso.

  103. Muito bom estava precisando desse material.

    Depois poderia portar como utiliza os pinos XDA e XCL , pois tenho um magnetômetro e quero colocar os dois dispositivo no arduino .

    Obrigado.

    1. Boa tarde Felipe,

      Ainda não temos exemplos utilizando os pinos XDA e XCL para ligar outros dispositivos, mas você pode encontrar algumas informações relativas à interface I2C embutida no módulo, no datasheet do MPU-6050 à partir da página 26 :

      http://invensense.com/mems/gyro/documents/PS-MPU-6000A-00v3.4.pdf

      Abraço.

      Adilson – Equipe MakerHero

Trackbacks and Pingbacks

  1. […] Antes de mostrarmos o funcionamento do acelerômetro com ESP8266 NodeMCU, recomendamos a leitura do post Tutorial: Acelerômetro MPU6050 com Arduino. […]