Tutorial: Acelerômetro MPU6050 com Arduino

Tutorial: Acelerômetro MPU6050 com Arduino

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 : FILIPEFLOP
//
//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? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP !

6
Tutorial: Acelerômetro MPU6050 com Arduino
165 votos, 4.78 classificação média (95% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

118 Comentários

  1. fabio junio - 12 de julho de 2017

    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.

  2. Marcelo - 3 de julho de 2017

    Prezados,

    comprei algumas placas GY-521 (MPU6050) da Filipeflop 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.

  3. Juan - 2 de maio de 2017

    Olá Gutenberg. Vc pode me ajudar?

  4. Luiz Eduardo T Ferreira - 23 de abril de 2017

    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

  5. Neto Marin - 29 de março de 2017

    Olá

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

  6. Rafael Gianesini - 29 de março de 2017

    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 ?

    • Gutenberg - 29 de março de 2017

      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.

      • Rafael Gianesini - 31 de março de 2017

        @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.

        • Gutenberg - 1 de abril de 2017

          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.

          • Rafael Gianesini - 3 de abril de 2017

            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.

    • Gutenberg - 3 de abril de 2017

      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.

      • Rafael Gianesini - 3 de abril de 2017

        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.

        • Alexandre Magno - 8 de abril de 2017

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

          • Rafael Gianesini - 10 de abril de 2017

            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 - 4 de maio de 2017

            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.

  7. Filipe - 19 de março de 2017

    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!

    • Gutenberg - 19 de março de 2017

      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.

  8. Rogério - 5 de fevereiro de 2017

    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.

  9. Emiliano - 10 de janeiro de 2017

    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.

  10. Gustavo Henrique Botelho - 18 de dezembro de 2016

    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?

  11. DIANA LUCIA cortes ortiz - 13 de dezembro de 2016

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

  12. Felipe ribeiro - 6 de dezembro de 2016

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

    • Thassilo Jahn - 6 de dezembro de 2016

      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.

      • darKnight - 24 de fevereiro de 2017

        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

  13. Geanne - 21 de setembro de 2016

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

  14. Alexandre Magno - 30 de julho de 2016

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

  15. Wallas Fernandes - 27 de julho de 2016

    Bom dia Filipeflop, 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.

  16. ELLEN KAROLLINE DA SILVA - 26 de julho de 2016

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

  17. Leonardo - 19 de julho de 2016

    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.

  18. Felipe C. - 1 de julho de 2016

    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

  19. Geanne - 8 de junho de 2016

    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.

  20. Thassilo Jahn - 29 de maio de 2016

    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á.

  21. Marcelo Sousa - 7 de maio de 2016

    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?

  22. Lin - 3 de maio de 2016

    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 !

  23. EDSON - 29 de março de 2016

    Equipe FILIPEFLOP 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

  24. Gabriel - 24 de março de 2016

    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?

    • Gutemberg - 25 de março de 2016

      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.

  25. Raul Soares - 22 de março de 2016

    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

  26. Carlos Brito - 21 de março de 2016

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

    • Adilson Thomsen - 21 de março de 2016

      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 FILIPEFLOP

  27. daniel - 1 de fevereiro de 2016

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

  28. RAFAEL - 28 de janeiro de 2016

    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.

  29. Israel - 13 de dezembro de 2015

    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;

    • Gutemberg - 13 de dezembro de 2015

      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).

      • Israel - 16 de dezembro de 2015

        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?

  30. Vinícius Lage - 11 de dezembro de 2015

    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

  31. Pedro Brunetto - 6 de dezembro de 2015

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

  32. leonardo - 1 de outubro de 2015

    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..

  33. diogo - 1 de setembro de 2015

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

    • Gutemberg - 1 de setembro de 2015

      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.

      • Leonardo - 14 de setembro de 2015

        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?

        • Gutemberg - 15 de setembro de 2015

          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!

      • Israel - 25 de setembro de 2015

        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.

        • Gutemberg - 25 de setembro de 2015

          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.

          • Israel - 12 de dezembro de 2015

            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.

          • Israel - 13 de dezembro de 2015

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

      • Lucas - 17 de outubro de 2015

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

      • Lucas - 17 de outubro de 2015

        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

        • Gutemberg - 17 de outubro de 2015

          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.

      • Francisco Assis da Silva - 21 de abril de 2016

        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.

  34. Pedro Oliveira - 20 de agosto de 2015

    Ola filipe

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

  35. Fabio - 1 de julho de 2015

    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!

  36. Daniel - 30 de abril de 2015

    Olá

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

    • Gutemberg - 17 de junho de 2015

      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.

  37. Eduardo - 6 de abril de 2015

    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?

  38. Francisco Barros - 1 de abril de 2015

    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 ?

  39. Ricardo Gomes - 28 de março de 2015

    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.

  40. Rodolfo - 11 de março de 2015

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

  41. Gabriel - 9 de março de 2015

    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?

  42. Roger - 20 de fevereiro de 2015

    Bom dia , estou usando o mesmo sensor comprado aqui no Filipeflop.
    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.

  43. Wesley Matos - 19 de fevereiro de 2015

    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)?

  44. Victor - 9 de fevereiro de 2015

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

  45. carlos ribeiro - 21 de dezembro de 2014

    felipe,

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

  46. Marlon - 3 de dezembro de 2014

    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();

  47. Martini - 25 de novembro de 2014

    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

  48. Leandro Campos - 22 de novembro de 2014

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

    Obrigado.

  49. Stephen - 12 de novembro de 2014

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

  50. João Silva - 4 de novembro de 2014

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

  51. Douglas - 25 de outubro de 2014

    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.

  52. Rodrigo S - 6 de outubro de 2014

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

  53. rafael martins - 2 de outubro de 2014

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

  54. Felipe Cardoso - 30 de setembro de 2014

    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.

Deixe uma resposta