O acelerômetro está presente em diversos dispositivos nos dias de hoje. No celular ele responsável por informar a rotação, assim como em alguns joysticks. Portanto, vamos aprender a utilizar o acelerômetro MPU6050 para podermos fazer projetos interessantes.
O que é um acelerômetro
O acelerômetro é um dispositivo capaz de medir a aceleração de um objeto. Isto é, ele sabe qual é a direção e sentido da aceleração do objeto.
Os smartphones utilizam um acelerômetro em conjunto com um giroscópio para monitorar a orientação da tela. Outros aparelhos utilizam o acelerômetro para diversas funções, como o controle do wii que eu já expliquei neste post.
Existem sensores que utilizam diferentes propriedades físicas para fazer essas medições. Um tipo de acelerômetro é o piezoelétrico. Dentro desse tipo, existe um cristal que sofre uma força quando o objeto se movimenta. E, de acordo com as leis de Newton, força é igual a massa vezes a aceleração. Com isso, uma carga elétrica é gerada proporcional à aceleração. E durante a leitura dos sinais, essa carga elétrica é traduzida de volta para aceleração.
Se quiser entender melhor sobre a piezoeletricidade, leia o post sobre.
MPU6050
O MPU6050 (imagem abaixo) é um acelerômetro e giroscópio capaz de medir a aceleração e rotação nos três eixos coordenados (x,y,z).
Ele se comunica por I2C, que é um tipo de comunicação que utiliza apenas 2 canais (fios). Nestes dois canais, é possível conectar uma quantidade muito grande de dispositivos, e cada um utiliza um endereço específico.
Um desses canais (um fio) é responsável por transmitir e receber dados. O outro canal (fio) é responsável por fornecer o clock (controla a velocidade e sincronismo da comunicação). No caso da placa acima, o SCL é o pino do clock e o SDA o pino de transmissão e recepção dos dados.
Esse sensor possui um buffer de 1024 bytes que armazena os dados das medições. Se os dados forem medidos, o MPU coloca os valores dentro do buffer e envia um sinal pelo pino INT (interrupção).
Por meio do pino AD0 é possível mudar o endereço da placa, selecionando 0x68 ou 0x69 (essa é a forma como os endereços aparecem). Com isso, é possível conectar dois desses sensores ao mesmo tempo e comunicar com eles sem dar conflito. Pois, senão, os dois teriam o mesmo endereço e assim ocorreriam conflitos na comunicação. O padrão é utilizar o endereço 0x68, que é quando o pino AD0 está recebendo sinal de nível baixo (GND).
Por fim, os pinos XDA e XCL servem para conectar outro dispositivo que se comunica com I2C e controlá-lo a partir do MPU 6050 (complicado de fazer).
Vale mencionar que os pinos do MPU6050 tem um limite máximo de tensão de 3,46V. Exceto o Vcc, pois o circuito possui um regulador de tensão de 5V para 3,3V. Então, é preciso ter cuidado na hora de montar o circuito.
Circuito com um MPU6050
Vou utilizar um Arduino UNO, o qual opera em 5V, mas vou utilizar também um conversor de nível lógico para adequar os valores de tensão para o sensor. Se você for usar um Arduino que opere em 3,3V, poderá fazer a montagem sem o conversor de nível ligando os pinos diretamente.
Enfim, adiante está a ligação completa do sensor para evitar qualquer problema durante a utilização dele.
O Vcc conecta no 5V e o GND no GND. E é preciso alimentar o conversor de nível lógico também. No lado “High” dele (HV), alimente com 5V e GND e, no lado “Low” dele (LV), alimente com 3,3V e GND.
Além disto, conecte um pino bidirecional (TXI) no pino SDA do MPU6050 e o outro lado deste pino (TXO) no pino analógico A4. Agora, conecte um pino unidirecional (RXO – pode ser bidirecional também) no pino SCL do sensor e o outro lado deste pino (RXI) no pino analógico A5. Os pinos analógicos 4 e 5 do Arduino são justamente os pinos utilizados para comunicação I2C.
Por fim, o pino AD0 não precisa ser conectado no GND, pois por padrão o endereço I2C do MPU6050 já é 0x68. Mas ele pode ser alterado ligando o pino em 3,3V.
Observação
Quando comprei o MPU6050 cheguei a usar o Arduino UNO para comunicar com ele. Entretanto, devido a falta de atenção e de informação, não sabia que os pinos do sensor eram sensíveis ao 5V, então realizei a ligação abaixo:
O circuito mostrado abaixo não é recomendável.
O sensor funcionou, consegui ler os dados dele e controlá-lo sem problemas. Pelo menos era o que parecia, mas a comunicação parava de responder depois de um tempo que o programa estava rodando.
Gastei horas pesquisando o problema e até achei que era mau contato da ligação. E fui descobrir tempos mais tarde que o problema era de incompatibilidade de tensão dos pinos. Mas até que eu descobrisse, utilizei bastante o MPU6050 com a ligação acima e ele continuou funcionando. Não sei se ele estragou alguma coisa, pois não tenho outro para comparar os sinais.
Enfim, se você for seguir o mesmo caminho, siga por sua conta e risco.
Programação
Código base
Peguei o código de exemplo deste site e adicionei comentários para facilitar o entendimento de como o Arduino extrai os dados do sensor. Basicamente o Arduino inicia a comunicação no endereço do sensor, faz um “pedido” de leitura de 14 registradores (contem os dados medidos) e armazena em variáveis. Por fim, o código manda imprimir cada variável separadamente.
Para ter uma boa visualização dos dados, abra o plotter serial (gráfico) ao invés do monitor serial.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | // Codigo adaptado de: Usuário do Arduino JohnChi #include<Wire.h>//Biblioteca para comunicação I2C const int MPU_addr=0x68; //Endereço do sensor int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; //Variaveis para pegar os valores medidos void setup(){ Wire.begin(); //Inicia a comunicação I2C Wire.beginTransmission(MPU_addr); //Começa a transmissao de dados para o sensor Wire.write(0x6B); // registrador PWR_MGMT_1 Wire.write(0); // Manda 0 e "acorda" o MPU 6050 Wire.endTransmission(true); Serial.begin(9600); //Inicia a comunicaçao serial (para exibir os valores lidos) } void loop(){ Wire.beginTransmission(MPU_addr); //Começa a transmissao de dados para o sensor Wire.write(0x3B); // registrador dos dados medidos (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // faz um "pedido" para ler 14 registradores, que serão os registrados com os dados medidos 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) //Agora escreve os valores no monitor serial Serial.print("AcX = "); Serial.print(AcX); Serial.print(" | AcY = "); Serial.print(AcY); Serial.print(" | AcZ = "); Serial.print(AcZ); Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //Equação da temperatura em Cº de acordo com o datasheet Serial.print(" | GyX = "); Serial.print(GyX); Serial.print(" | GyY = "); Serial.print(GyY); Serial.print(" | GyZ = "); Serial.println(GyZ); delay(333); } |
Interpretação dos valores medidos
Os valores lidos estarão sempre na faixa de -32768 e +32767. Agora, o que esses valores irão representar depende da escala escolhida. A escala pode ser escolhida alterando os registradores de configuração do sensor (consultar datasheet).
A escala padrão da aceleração é de +/- 2g, sendo que g é a força g (equivale a aproximadamente 9,8 m/s²). E para a rotação, a escala padrão é de +/- 250 graus/segundo. Portanto, o valor de +32767 para a aceleração, representa 2g e -32768 representa -2g. Os valores intermediários são lineares. Isto é, a metade de +32767 representa 1g.
Repare que também há uma leitura de temperatura, mas ela, dentro do código, já está sendo convertida para graus celsius.
Obs.1: Se o sensor estiver para cima apoiado em uma mesa horizontal, a aceleração em z será cerca de 16300, que corresponde a 1g. Isto se deve à gravidade da terra.
Obs.2: Como na vida real nada é perfeito, as leituras com o acelerômetro parado em uma mesa horizontal terão pequenas variações devido à vibrações que vêm de todo lugar possível (carro passando na rua, alguém esbarrando na mesa, a própria vibração do ar etc).
Dois sensores MPU6050
Circuito
A ligação com os dois acelerômetros será exatamente a mesma, com a diferença que o AD0 de um fica conectado no GND (nível baixo) e o AD0 do outro fica no 3,3v (nível alto). Isso serve para garantir que o endereço I2C dos dois seja diferente. No primeiro caso é 0x68 e no segundo 0x69.
Circuito
Leia os comentários para entender os passos do código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include<Wire.h>//Biblioteca para comunicação I2C const int MPU1 = 0x68; // Endereço do sensor 1 const int MPU2 = 0x69; // Endereço do sensor 2 int16_t AcX1,AcY1,AcZ1,Tmp1,GyX1,GyY1,GyZ1; //Variaveis para pegar os valores medidos int16_t AcX2,AcY2,AcZ2,Tmp2,GyX2,GyY2,GyZ2; //Variaveis para pegar os valores medidos void setup(){ Wire.begin(); // Inicia a comunicação I2C Wire.beginTransmission(MPU1); //Começa a transmissao de dados para o sensor 1 Wire.write(0x6B); // registrador PWR_MGMT_1 Wire.write(0); // Manda 0 e "acorda" o sensor 1 Wire.endTransmission(true); Wire.beginTransmission(MPU2); //Começa a transmissao de dados para o sensor 2 Wire.write(0x6B); // registrador PWR_MGMT_1 Wire.write(0); // Manda 0 e "acorda" o sensor 2 Wire.endTransmission(true); Serial.begin(9600); //Inicia a comunicaçao serial (para exibir os valores lidos) } void loop(){ // Sensor 1 Wire.beginTransmission(MPU1); //Começa a transmissao de dados do sensor 1 Wire.write(0x3B); // Registrador dos dados medidos (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU1,14,true); // Faz um "pedido" para ler 14 registradores, que serão os registrados com os dados medidos AcX1 = Wire.read()<<8|Wire.read(); AcY1 = Wire.read()<<8|Wire.read(); AcZ1 = Wire.read()<<8|Wire.read(); Tmp1 = Wire.read()<<8|Wire.read(); GyX1 = Wire.read()<<8|Wire.read(); GyY1 = Wire.read()<<8|Wire.read(); GyZ1 = Wire.read()<<8|Wire.read(); Wire.endTransmission(true); // Se der erro tente tirar esta linha // Sensor 2 Wire.beginTransmission(MPU2); // Começa a transmissao de dados do sensor 2 Wire.write(0x3B); // Registrador dos dados medidos (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU2,14,true); // Faz um "pedido" para ler 14 registradores, que serão os registrados com os dados medidos AcX2 = Wire.read()<<8|Wire.read(); AcY2 = Wire.read()<<8|Wire.read(); AcZ2 = Wire.read()<<8|Wire.read(); Tmp2 = Wire.read()<<8|Wire.read(); GyX2 = Wire.read()<<8|Wire.read(); GyY2 = Wire.read()<<8|Wire.read(); GyZ2 = Wire.read()<<8|Wire.read(); Wire.endTransmission(true); // Se der erro tente tirar esta linha // Agora escreve os valores no monitor serial // Sensor 1 Serial.print("AcX1 = "); Serial.print(AcX1); Serial.print(" | AcY1 = "); Serial.print(AcY1); Serial.print(" | AcZ1 = "); Serial.print(AcZ1); Serial.print(" | Tmp1 = "); Serial.print(Tmp1/340.00+36.53); // Equação da temperatura em Cº de acordo com o datasheet Serial.print(" | GyX1 = "); Serial.print(GyX1); Serial.print(" | GyY1 = "); Serial.print(GyY1); Serial.print(" | GyZ1 = "); Serial.println(GyZ1); // Sensor 2 Serial.print("AcX2 = "); Serial.print(AcX2); Serial.print(" | AcY2 = "); Serial.print(AcY2); Serial.print(" | AcZ2 = "); Serial.print(AcZ2); Serial.print(" | Tmp2 = "); Serial.print(Tmp2/340.00+36.53); // Equação da temperatura em Cº de acordo com o datasheet Serial.print(" | GyX2 = "); Serial.print(GyX2); Serial.print(" | GyY2 = "); Serial.print(GyY2); Serial.print(" | GyZ2 = "); Serial.println(GyZ2); delay(500); } |
Aplicações
O limite de aplicações é a imaginação, mas posso citar alguns exemplos interessantes:
- Fazer um algoritmo para detecção de gestos utilizando o acelerômetro em uma luva.
- Com a aplicação acima é possível ligar uma lâmpada, um ventilador ou qualquer outra coisa apenas com gestos.
- Detectar a rotação de um objeto.
- Detectar se o objeto está em queda.
- Medir a distância deslocada ou a velocidade com base na aceleração.
Descobrindo distância com acelerômetro
Oi, boa tarde! Você poderia informar como ficaria o código para usar dois acelerômetros MPU6050 ao mesmo com o arduino mega 2560?
Olá. Posso sim. Te mandei o código pelo e-mail com algumas observações importantes.
Boa Noite!
Primeiramente gostaria de elogiar o conteúdo aqui postado.
Seria possível compartilhar o código para 2 giroscópios em placa de arduíno uno?
Obrigada!
Boa noite, poderia mostrar o código para dois acelerômetro com uno?
Obrigado
Boa noite. Claro! Enviei no seu email um código de exemplo.
Olá, boa noite! Primeiramente meu agradecimento a todas as explicações, muito bom. Estou trabalhando em uma possível aplicação que você propôs a detecção de gestos. Você teria algo para compartilhar a esse respeito? Obrigado
Olá, Gabriel. Muito obrigado pelo elogio! Não cheguei a mexer com nenhum algoritmo específico deste tipo de aplicação, mas há um tempo tinha visto um vídeo muito que explica uma forma de fazer a detecção de gestos com o MPU6050. Clique aqui se deseja vê-lo (o vídeo é em inglês). Tem também este projeto aqui sobre detecção de gestos, mas ele é muito simples e não aborda a parte de detectar gestos mais complexos.
Fábio boa tarde,
Preciso ligar 4 acelerômetros e 4 dht11 em um Arduino mega.
Consegue me ajudar? Principalmente na parte de cabeamento.
Abraço,
Ricardo
Boa noite, Ricardo
Posso ajudar sim, mas antes tenho que fazer uma observação: o acelerômetro utiliza a comunicação I2C, isto é, existe um barramento onde todos os dispositivos são conectados e cada um recebe um endereço. Se dois dispositivos possuírem o mesmo endereço, pode haver um erro na comunicação. No caso do acelerômetro, existe a possibilidade de alterar o endereço entre 0x68 e 0x69. Portanto, a princípio, só existe a possibilidade de utilizar 2 acelerômetros por barramento I2C.
Uma solução seria utilizar dois Arduinos, sendo que dois acelerômetros estão conectados no primeiro e dois no segundo. Aí basta um Arduino retirar os dados do outro para ter os valores dos 4 acelerômetros.
Outra solução que TALVEZ funcione seria utilizar os pinos auxiliares do acelerômetro, os pinos XDA e XCL. Ex: Um acelerômetro é ligado nos pinos XDA e XCL de outro acelerômetro com endereço 0x68. E você faz o mesmo para o terceiro acelerômetro, conectando ele no acelerômetro com endereço 0x69. Entretanto, não consegui achar na internet como acessar um dispositivo que está conectado nos pinos XDA e XCL do acelerômetro.
Uma terceira solução seria utilizar o Arduino Due, que possui dois barramentos I2C independentes. Neste caso, daria para ligar dois acelerômetros em cada barramento.
Em relação ao dht11, pelo que pesquisei, basta ligar o pino de dados em qualquer pino digital e fazer a leitura a partir do pino conectado. Então bastaria ligar os 4 dht11 em 4 pinos digitais. Não parece ter muito mistério.
Enfim, posso ter perdido algum detalhe sobre os acelerômetros, mas expus as soluções que encontrei. Espero ter ajudado!
Abraço,
Fábio
Parabéns pelo site! É muito esclarecedor e didático!!! Infelizmente eu ainda não conhecia, mas estou feliz agora que conheço 🙂
Iniciei meus trabalhos com Arduíno ano passado, em Abril, com o objetivo de automatizar minha irrigação, bombeamento de água e outras coisinhas na área ambiental e agro-ecológica, mas não sabia nada a respeito, era totalmente leigo, a única vantagem que eu tinha entre os leigos é uma graduação de engenharia ambiental, na qual tive uma breve introdução à linguagem C++, o que me ajudou muito a entender de cara os códigos, e também todos sensores associados a variáveis ambientais me são familiares, de resto, ZERO. O site de vcs é incrivelmente rico em informações, eu estaria bem adiantado se tivesse visto a uns 6 meses atrás… Obrigado por compartilharem conhecimento, é disso que o nosso país precisa!!!
Abs
Samuel Vaz
Caramba Samuel, não sei nem como te agradecer por este comentário fantástico! Sinceramente, eu fico muito feliz em obter esse tipo de retorno positivo e saber que o conteúdo do site te proporcionou um bom nível de aprendizado. Comentários assim me deixam motivado a continuar a escrever 🙂 . Espero continuar trazendo conteúdos de qualidade que possam te ajudar.
Grande abraço!
Fabio, bom dia !
Excelente contudo parabéns, que continue assim divulgado seus projetos.
Tenho uma duvida.
Exite algum algorítimo do acelerômetro para a utilização de objetos em quedas livres ,bruscas , ou quando houver alguma batida. ( tipo testes de colisão )
Bom dia, Vinicius. Muitíssimo obrigado, e pode deixar que continuarei divulgando sim!
Respondendo sua duvida, existe sim, desde algoritmos mais simples até mais complexos (envolvendo rede neural).
Para o caso da detecção de queda livre, a aceleração resultante percebida pelo acelerômetro é nula durante esta situação. Isso se da por conta de que, na queda livre, a velocidade resultante é constante devido ao arrasto do ar e a aceleração resultante é nula. Com isto, você pode criar um algoritmo simples que verifique se a somatória das três acelerações está abaixo de 1g para, então, detectar a queda. Existem alguns detalhes que você deve observar para não confundir a queda com outros acontecimentos. Para entender melhor esta parte, sugiro a leitura deste artigo, que mostra um sistema para detecção de queda utilizando um acelerômetro.
Para o caso de ocorrer alguma colisão, você poderia utilizar uma abordagem contrária a deste post: ao invés de calcular a integral, calcular a derivada da aceleração. Isso porque, em uma colisão, a aceleração sofre uma grande variação repentina. Portanto, se a derivada, que é a própria variação, for muito grande, quer dizer que provavelmente o objeto colidiu. Este site aqui, mostra uma análise da aceleração em alguns casos interessantes (subindo/descendo escada, durante uma colisão, em queda livre). Portanto, sugiro dar uma olhada nos gráficos para entender como a aceleração se comporta para cada situação diferente.
Fabio,seu site e excelente, rico em informações. Parabéns pela iniciativa! Por favor, continue nos ajudando!!! Por gentileza, vc teria ou saberia indicar algum projeto do acelerômetro para identificar a inclinação de algum objeto?! Qdo o objeto alterar a inclinação, com a ajuda do acelerômetro haveria um sinal de aviso… Muito obrigado!
Muito obrigado, Andre! Fico muito feliz com seu retorno positivo, e pode ficar tranquilo que continuarei ajudando sim.
Respondendo sua pergunta: existem algumas formas diferentes de obter a inclinação do acelerômetro. A mais simples delas é por meio da própria aceleração. Vamos supor que seu acelerômetro está parado na mesa sem estar inclinado. Quando isso ocorre, o eixo z irá medir 1g (~16.384) e os demais eixos medirão valores próximos de 0, pois a força da gravidade está atuando apenas no eixo z e não há mais forças atuando no sensor. Se você vira o acelerômetro de cabeça para baixo, o eixo z irá medir -1g (~-16384). Agora, se você inclinar o acelerômetro à 90º na direção do eixo x, o acelerômetro indicará um valor de -1g ou +1g no eixo x e 0 nos demais eixos. Se o eixo x estiver apontando para cima, o valor será +1g e -1g para o contrário. Enfim, para descobrir isso é só fazer alguns testes para identificar qual lado é o eixo x e qual é o y e qual é a orientação para eles medirem valores positivos ou negativos. De qualquer forma, este método é útil para quando o objeto está parado, pois se ele está caindo ou se movendo, a análise anterior não é necessariamente verdade. E não dá para obter um valor preciso do ângulo de inclinação desta forma.
Uma outra maneira de resolver seu problema, que é um pouco mais complexa, é utilizar o giroscópio e ir contabilizando a variação angular. Para você ter uma ideia de como fazer isto, veja este vídeo.
Olá Fabio. Estou iniciando estudos em arduino em possives aplicaçoes em minha pesquisa. achei seu esquema bastante explicativo e didático. Gostaria de saber se com a sua implementação seria possivel fazer a leitura de uma das variáveis (eixo x acelerometro) e converter essa leitura em um arquivo de audio, para ser trabalhado por outros softwares. Se possivel, como eu poderia modificar o codigo? Como eu poderia fazer para controlar a sensibiidade do acelerometro. Agradeço desde já a atenção e desejo sucesso para você.
Olá. Muito obrigado pelo comentário, Victor!
Acredito que seja possível sim, mas não é uma tarefa nada simples. Infelizmente não posso te ajudar neste problema, pois não tenho conhecimento nesta parte de criação de arquivo de áudio. Entretanto, acredito que o primeiro passo seja obter os dados do Arduino no computador. Este post aqui mostra uma forma de se fazer isto. O segundo passo seria pegar esses dados e criar o arquivo de áudio (que é a parte que eu não tenho conhecimento). E em relação à sensibilidade do acelerômetro, você quer dizer alterar a escala de leitura para +-4g ou +-8g?
Boa tarde Fábio, estou fazendo um estudo e estou com duvida de desenvolver a programação poderia me ajudar??? o estudo consiste em verificar o deslocamento em y de uma laje quando ela recebe impactos suscetivos de pessoas, por exemplo uma aula de dança em cima de uma laje ela se deforma um pouco para baixo, você teria algum modelo de programação que poderia me ajudar??
Espero que me ajude obrigada.
Boa tarde, Juliana. Posso ajudar sim!
Então, para resolver o seu problema, recomendo dividí-lo em duas etapas inicialmente (talvez você já tenha feito isso, mas só para garantir…):
1_ Análise dos sinais:
É imprescindível que você faça diversas medições da aceleração nos 3 eixos na situação que você explicitou. Isto é, coloque uma acelerômetro na laje (na posição definitiva) e simule os impactos para observar como a aceleração se comporta em cada eixo. Este processo é útil para você saber o que fazer na programação. Entretanto, podemos intuir que as pancadas irão gerar picos consecutivos no eixo y, já que ele está paralelo as forças aplicadas à laje. Mas pode ser que algum outro eixo apresente um certo padrão também, o que pode facilitar a programação.
2_ Programação:
Depois de entender o comportamento da aceleração quando ocorrem os impactos, você pode criar uma lógica para detectá-los. Esta parte pode ser feita de diversas formas diferentes. De qualquer forma, se o objetivo for verificar apenas picos no eixo y, você pode fazer um código parecido com o que fiz no post para acender a luz batendo palmas (https://mundoprojetado.com.br/acender-luz-batendo-palmas-arduino/). O código basicamente detecta dois picos consecutivos para tomar uma ação.
Espero ter ajudado! Qualquer dúvida que surgir no código, me envie por e-mail (mundoprojetado@gmail.com) que eu te ajudo melhor com a lógica de programação.
Boa noite, estou fazendo um TCC e preciso colocar dois MPU 6050, teria como me auxiliar ?
Boa tarde, Guilherme. Tem sim, você precisa de ajuda em que exatamente? No circuito, na programação…?
Boa Noite Fabio, muito obrigado por dividir o seu conhecimento!!! Estou tentando utilizar o acelerometro mpu6050 em uma placa de Mega 2560 e os dados dos eixos ficam todos negativo e a temperatura não oscila. como devo proceder??
Boa noite, Kleber. Por nada, fico feliz que gostou do post!! Bem… isto pode ser tanto problema de circuito quanto de código, mas imagino que seja do circuito, pois as ligações mostradas no post servem apenas para o Arduino UNO. No caso do Mega, você deve ligar o SDA no pino digital 20 e o SCL no pino 21. Os demais pinos do acelerômetro não alteram. Enfim, aguardo seu retorno para saber se este é mesmo o problema.
Olá poderia me mandar o código para usar 2 acelerômetros , grato
Olá, Anderson. Te mandei por e-mail.
Olá Fabio, tudo bom? Eu realmente adorei o seu post sobre o acelerômetro, me ajudou bastante, me esclareceu muito sobre o assunto. Eu queria saber como utilizá-lo para medir a velocidade com base na aceleração, pois estou projetando um robô e queria utilizar o acelerômetro para este fim. Estou utilizando motores DC 3A 6V, para a locomoção do robô; também queria saber se há possibilidade de interação do acelerômetro com um display lcd. Desde já agradeço muito!
Olá, Murilo. Agradeço o comentário e fico feliz em saber que o post te ajudou! Respondendo suas perguntas: eu fiz um post mostrando como obter o valor de distância a partir da aceleração do acelerômetro. E, no meio deste processo, a velocidade também é obtida. Recomendo dar uma lida no post, pois lá sua dúvida está respondida de forma abrangente.
Sobre a integração com o display lcd, é possível sim, basta obedecer as ligações do display e do acelerômetro para não conflitarem (o que é improvável de acontecer). No caso do acelerômetro, ele utiliza os pinos A4 e A5 para comunicação e, no caso do display lcd, ele utiliza outros pinos (pinos digitais). Para entender como fazer a ligação com o display, recomendo este post.
Enfim, qualquer dúvida que surgir, pode voltar a perguntar!
Bom dia, vc pode me enviar o código do arduino pra identificar queda de um objeto
Boa noite, Elisangela. Infelizmente eu não tenho este código pronto, mas, assim como disse ao Vinícius no outro comentário, posso te dar uma dica e deixar um artigo de referência para você criar o seu próprio código:
Durante a queda livre, a aceleração resultante percebida pelo acelerômetro é nula. Com isto, você pode criar um algoritmo simples que verifique se a somatória das três acelerações está abaixo de 1g para, então, detectar a queda. Esta é a explicação simplificada do algoritmo, mas sugiro você dar uma lida neste artigo para entender outros pontos.
Boa tarde
Primeiramente gostaria de parabenizar pelo texto e pelo site, muito didático.
Estou tentando fazer medições de vibração e temperatura utilizando 04 acelerometros MPU6050 e dois arduinos UNO. É possivel realizar a medição com esses componentes?
Poderia me dar um auxilio na programação as ser utilizada e no esquema de montagem dos componentes?
Boa noite, Everton. Muito obrigado pelos elogios!! Então, é possível sim, mas cada Arduino Uno seria capaz de se comunicar com no máximo 2 MPU6050 e você teria que criar uma forma de fazer os dois Arduinos comunicarem entre si (caso seja necessário). Enfim, eu acabei de atualizar o post adicionando um tópico sobre como utilizar dois sensores no mesmo Arduino, então dê uma olhadinha, pois o circuito que você implementará é o mesmo que está na imagem do post. Observe também o código que coloquei para fazer a leitura dos dois. Espero que assim você tenha um panorama sobre como será a ligação do seu circuito. Qualquer coisa pode voltar a perguntar.
Bom dia, como vai? Teria algum exemplo de código para o uso do acelerômetro para medir vibrações em estruturas para vc me enviar?
Boa noite, Matheus. Vou bem e você? Infelizmente não tenho nenhum tipo de código assim. O próprio código do post deve servir para esta aplicação que você quer.
BOM DIA FABIO
COMO PODERIA FAZER PARA LER A ROTAÇÃO NO EIXO Z. IMAGINE QUE O MPU ESTEJA PARADO SOBRE UM PINO, E QUE EU ESTEJA GIRANDO SOBRE ESTE PINO, QUE SERIA O EIXO Z. COMO PODERIA FAZER PARA LER ESTE ANGULO DE ROTAÇÃO? PORQUE NESTE CASO, A FORÇA DE GRAVIDADE SOBRE ELE NÃO MUDA PARA QUALQUER DIREÇÃO QUE EU MOVA….
Boa noite, Carlos!
Se eu entendi corretamente seu problema, o seu MPU está girando ao redor do eixo z.
Realmente, pegar a rotação pela gravidade não seria possível neste caso, mas seria pegando o valor da variação da rotação (radianos/segundo) e transformando ele em graus (ou apenas radianos). Com isto, a solução do seu problema seria algo parecido com o que foi feito neste post, onde o sinal da aceleração foi integrado duas vezes para obter a distância. No seu caso, você teria que integrar uma vez a variação do ângulo (radiano/segundo) para obter apenas o ângulo (radianos ou graus).
Enfim, para não “reinventar a roda”, recomendo dar uma olhada neste site e neste vídeo.
Boa noite! Fabio
estou pesquisando aplicações do acelerometro para medir impactos, pode me ajudar?
Boa tarde, Maurício!
Eu não tenho experiência com isto, mas posso tentar te ajudar sim. Qual seria sua(s) dúvida(s)?
Parabéns Fábio, muito bom. Estava mesmo precisando de um exemplo com 2 sensores. Percebi que o giroscópio, diferentemente do acelerômetro, sempre retorna os valores pra zero quando você mantém o sensor parado, independente da posição. Tentei acrescentar neste exemplo seu a biblioteca MPU6050, como vem no exemplo “GetAngle” dela, porém não consegui. Os valores do giroscópio sempre retornam.
Seria possível dar alguma dica de como resolver isso? Obrigado.
Muito obrigado, Junior! Na realidade, o giroscópio retorna apenas dados de variação angular º/s (graus por segundo). Por isso, quando o MPU6050 está parado, o valor lido é 0 (º/s). E, para obter a inclinação com ele, o processo é um pouco mais trabalhoso. Este vídeo mostra um exemplo deste processo. Uma forma mais direta de obter o ângulo é utilizando os valores de aceleração e aplicando eles em uma fórmula. Qualquer coisa, retorne o contato. Espero ter ajudado!
Boa noite Fabio,
Vou realizar um trabalho na universidade sobre detecção de vibrações em rolamento de motores. Este código que vc postou seria suficiente para isto?
Quanto ao plotter serial, seria possível voce enviar uma imagem de como é apresentada as vibrações no gráfico?
Boa noite, Joel. Bem, sou leigo no assunto da mecânica para te dar uma resposta assertiva. Possivelmente é o suficiente, pois o código fornece a aceleração nos três eixos espaciais (x, y e z) além das rotações. Mas seria interessante você gravar estes dados para analisá-los e processá-los com calma e uma forma de fazer isto é com o software Processing.
Sobre o plotter serial, as acelerações são apresentadas mais ou menos desse jeito (a escala pode ser diferente).
Boa noite Fábio!
Estou trabalhando em um projeto usando o MPU6050, porém, com finalidade um pouquinho diferente da que ele é usualmente utilizado. Gostaria de conversar com vc para trocar experiência.
Bom dia, Andreia! Sem problemas. Podemos trocar mensagens por e-mail: mundoprojetado@gmail.com
como eu consigo saber se o modulo que eu tenho é 5v ou 3.3v?
Olá, Guilherme. É altamente provável que seu módulo suporte só até 3,3V nos pinos de comunicação (SDA e SCL). Entretanto, o módulo permite que você o alimente com 5V, pois ele tem um regulador de tensão (se for o mesmo módulo da imagem do post).
Boa tarde Fábio, excelente post! Só tenho uma dúvida: como faço para alterar a escala de atuação do acelerômetro de 2g para um valor maior (3g,4g..)? Muito obrigado.
Bom dia, Rubens. Muito obrigado! Para fazer isso, você precisa alterar um registrador específico (registrador 28) do MPU6050. Eu recomendo você utilizar uma biblioteca para fazer esta mudança, pois normalmente as bibliotecas possuem uma função para isso. Não conheço uma biblioteca específica para indicar, mas vale a pena dar uma olhada na da Adafruit.
Este foi, literalmente, o melhor e mais completo post sobre esse sensor que encontrei disponível na internet, parabéns pelo conteúdo.
Muito bom ‘ouvir’ isso, Tiago. Muito obrigado pelo comentário!
Aproveitando o ensejo… Eu fiz uns testes aqui e parece que vou ter que aumentar a escala do acelerômetro para 4g. Eu vi que fizeram essa pergunta e fui na fonte que você recomendou mas n~;ao entendi muito bem como faz. Você poderia me dar uma dica? Desde já agradeço
Sem problemas. A fonte que você está se referindo é a biblioteca da Adafruit? Se sim, após instalar ela dentro da própria IDE do Arduino, é só aplicar o seguinte comando pra mudar a escala:
mpu.setAccelerometerRange(MPU6050_RANGE_4_G);
Se quiser aumentar pra +-8g, é só mudar o parâmetro pra MPU6050_RANGE_8_G e assim em diante. Espero ter ajudado.
Olá Fábio! Sim a fonte que me refiro é a biblioteca. Eu baixei e instalei a biblioteca, pela IDE do arduino. Ela já está dentro da pasta Libraries e quando incluo no programa ela é reconhecida (aparentemente) porque não retorna nenhum erro de lib.
Mas a linha de comando que você mencionou não é reconhecida, não muda de cor como uma função, apenas fica a frase na cor preta, aí quando eu compilo aponta “mpu. does not a name type” Esse é o erro que não estou entendendo :/ valeu 🙂
Olá, Tiago. Entendi o problema. Acredito que é porque você precisa criar a instância da biblioteca com o comando “Adafruit_MPU6050 mpu;” (fora do void setup). Na realidade, é mais fácil você abrir um código de exemplo que a biblioteca fornece, pois ele já vai conter todos os comandos necessários pra fazer o MPU6050 funcionar corretamente. Na IDE do Arduino, é só ir em “Arquivo”->”Exemplos”->”Adafruit_MPU6050″ ou algo assim. Veja o exemplo “basic_readings”, pois ele contém também o comando para mudança de escala.
Valeu meu amigo agora funcionou!! Abração e muito obrigado novamente
Show de bola, Tiago! Por nada. Abraço!
Boa noite, estou fazendo um TCC, e um dos funcionamentos do mesmo é detectar acidentes automobilísticos, então caso o carro vire(capote, direita, esquerda, frente) o dispositivo detectaria e caso ocorra um impacto grande(o plano é ser um impacto próximo ao necessário para se ativar um airbag que é quando o carro esta a uns 30km/h) o dispositivo também detecte.
Porem essa segunda parte, a do impacto, eu não estou conseguindo fazer . Utilizarei um acelerômetro.
Tem alguma dica?
Boa noite, Alexandre. O ideal seria descobrir como as medições de aceleração se comportam em uma batida. Para ter uma ideia, você pode tentar plotar os valores de acelerações pelo “Plotter Serial” e “simular” a batida batendo o sensor na sua mão ou em algum objeto. De toda forma, eu chutaria que as acelerações aumentam e diminuem bruscamente em uma batida. Se for isso mesmo, o seu código teria que chegar que se as acelerações subiram acima de um certo limiar e caíram num intervalo de tempo curto. Sugiro utilizar a função millis() para detectar se o intervalo é curto ou não. Espero ter ajudado.
Otimo Conteudo! Estou fazendo meu TCC, utilizando 3 mpu 6050, cada um conectado a um Esp32, e os 3 enviando os valores de aceleração e giro para um outro Esp32. Estou usando o EspNow para comunicação, minha dificuldade agora é conseguir plotar no matlab esses valores como se fossem posições da perna. A ideia é usar o toolbox do Peter Corke
Muito obrigado, Luiz! Caramba, que ideia bacana. Infelizmente não vou conseguir te ajudar, porque não sei mexer com o EspNow e nem com o toolbox que você mencionou. De toda forma, boa sorte no seu projeto!
Ola você poderia me ajudar como faço para converter os dados lidos pelo sensor mpu6050
Em graus
+20 e -20
Para um projeto plataforma estabilizadora
Olá, Robson. Posso ajudar sim. Essa conversão envolve umas fórmulas um pouco complicadinhas. Neste link você encontra um código de exemplo com as fórmulas para os ângulos dos três eixos. E este outro link tem uma explicação detalhada da teoria da conversão de aceleração para ângulo. Para você conseguir valores bem exatos, é recomendável que seu código aplique calibração do MPU6050.
Muito obrigado pelas dica
Vou usar em um projeto.
Plataforma estabilizadora
Como este
https://youtu.be/_MMIIiywwX0
mpu6050
Sem problemas! Esses projetos de balanceamento automático são bem legais. Inclusive, acho que o próximo post do site vai ser como criar um robô pêndulo invertido seguindo essa ideia.
Boa tarde Fabio,
Tentei utilizar sua programação mas infelizmente não funcionou, gostaria de saber se é possível me ajudar.
Abraços
Boa tarde, Michel. Que pena, mas posso ajudar sim. Pra isso, preciso saber como foi feita sua ligação: se usou ou não conversor de tensão; se vc usou um Arduino UNO ou outra plaquinha; se você usou o código que está no post ou outro alterado. Qualquer coisa, pode me enviar o código ou a foto da ligação por email (mundoprojetado@gmail.com).
Boa tarde, tudo certo? Cara, amei tanto teu projeto que quero fazer um parecido para apresentar como TCC, porém estou com dúvida na montagem dele. Como você ligou o GND do arduino com o GND do acelerômetro e do conversor de nível? E com somente um MPU é possível descobrir a posição em X e Y de um objeto em movimento? Desde já agradeço.
Boa noite, Gabriel. Tudo certo e com você?
No caso, liguei o GND do MPU6050 diretamente no pino GND do Arduino. E também liguei um fio conectando o GND do conversor de nível em um pino GND do Arduino. Como o conversor tem 2 GNDs (pro nível alto e baixo), você precisa ligar os dois no GND do Arduino.
Sobre sua segunda dúvida, é possível descobrir a posição com apenas um acelerômetro sim. Aqui no site tem um post a respeito disso que exemplifica com 1 eixo, mas adianto que o processo não é muito preciso não, ainda mais para longas distâncias. Mas quem sabe você não descobre um jeito de melhorar essa precisão. Se descobrir, não esqueça de compartilhar aqui hehe
Boa sorte no seu TCC!
Boa tarde, Fábio. Muito obrigado por compartilhar o seu conhecimento. Estou tendo alguns problemas com duas MPUs que comprei. A primeira achei que tinha algum defeito, mas ao pegar a segunda, apresentou o meu comportamento e agora lendo o seu post, pode ser que tenha alguma relação com os primeiros testes que eu fiz. Estou montando um drone com arduino, mas o teste de calibragem da MPU falha, pois não detecta a presença da MPU, pois valida nos endereços default para o módulo que são 0x68 e 0x69. Rodei um sketch de teste e o endereço que detectou como padrão foi o 0x72 (com ado em high 0x3f). Não sei se tem relação, mas não usei nenhum módulo para conversão do vcc de 5 para 3.3v, pretendo testar depois se isso poderia interferir de alguma forma no endereçamento da MPU.
Olá, Rafael. Por nada! A princípio, o endereço não tem relação com a conversão da tensão dos pinos de dados. Encontrei online um outro caso parecido com o seu em que o MPU6050 reportou o endereço 0x72. Nesse mesmo site o pessoal levanta a possibilidade de ser um chip falsificado, mas a pessoa que reportou o erro disse que resolveu o problema alterando o endereço usado pela biblioteca, de 0x68 para 0x72.
Oi pessoal como faço para pegar os dados em milissegundos?
Olá, Oswaldo. Vai depender da escala que você estiver usando, assim como expliquei no tópico “Interpretação dos valores medidos”. Se a aceleração estiver na escala padrão (+-2g), uma leitura igual a 32767 vai ser equivalente a 2g ou 2*9,8 m/s^2 ou então 2*0,0000098 m/microssegundo^2. Então é só você fazer uma conversão de valores. Acho que a função map não vai funcionar pra seu caso, porque ela trabalha com valores inteiros e a constante 0,0000098 não pode ser inteira.
Olá, estou trabalhando em um projeto pro meu curso que seria um alarme para bicicletas, onde se a bicicleta por algum acaso se movimentar iria acionar o alarme, eu estava pensando em usar o Uno R3 com esse acelerômetro. Comecei a estudar Arduino
agora, qualquer sugestão iria me ajudar muito, qualquer coisa me manda um email que eu forneço mais detalhes.
Olá, Paulo. Que bacana, espero que seus estudos sejam proveitosos! Aqui no site tem um mini curso de Arduino pra iniciantes, depois veja se te ajuda.
Sobre seu projeto, ao meu ver, uma solução simples seria verificar se a aceleração lida em algum eixo ultrapassa um determinado limiar. Lembrando que, dependendo da posição que você montar o MPU6050, um dos eixos vai medir uma aceleração próxima de 1 g por conta da gravidade. Então tente fazer as detecções nos outros dois eixos.
Outra coisa, recomendo usar o Chat GPT pra te ajudar no seu aprendizado e no seu projeto.
Olá, obrigado pelas recomendações, realmente estou usando o Chat para tirar algumas dúvidas…
Eu comprei as peças necessárias para o meu projeto, incluindo o acelerômetro e o conversor digital, porém eu comprei um de 4 canais, a ligação com um desse ficaria igual a do com 2 canais??
Por nada! Que ótimo então!
Ficaria sim. O conversor mostrado no post também é de 4 canais, mas só 2 estão sendo usados. O importante é você observar quais canais são bidirecionais e qual é o lado de alta e o lado de baixa tensão.
Olá novamente kkk, queria tirar uma dúvida em relação ao circuito acima, porque vc usou dois canais GND diferentes no Arduino? E realmente necessário ou eu posso usar o mesmo?
Pode usar o mesmo. Usei dois pinos diferentes pra facilitar a visualização do desenho do circuito. Todos os pinos GNDs do Arduino são interconectados.
Estive fazendo uns testes e acho que acabei errando em alguma conexão, o sensor esquentou e senti um cheiro de queimado, quais as chances de ainda funcionar kkk?
Vish kkk
Diria que a chance é bem pequena. Quando um componente solta a fumacinha dele, normalmente é um sinal de que já era. Ainda mais se for o circuito integrado (MPU6050).
Oláa comprei outro acelerômetro…
Montei com o circuito acima e coloquei o mesmo código também.
Pelo oq eu tinha entendi era pra mim ter valor entre 16k por ser metade de 2g e g ser a aceleração da gravidade. Eu obtive o seguinte output:
AcX = -1 | AcY = -1 | AcZ = -1 | Tmp = 36.53 | GyX = -1 | GyY = -1 | GyZ = -1
Não entendi oq quer dizer poderia me explicar?
Olá, Paulo. Esses valores que você obteve normalmente ocorrem quando há uma falha na comunicação entre o Arduino e o acelerômetro. Confira o pino AD0 e o endereço usado. Você pode usar o código do I2C scanner para ver se o Arduino está enxergando o acelerômetro no endereço esperado. Outra coisa, me mande uma foto da ligação que você fez por email (mundoprojetado@gmail.com) para ver se consigo enxergar algum detalhe que passou batido. Em último caso, você pode tentar ligar os pinos de dados do Arduino (SDA e SCL) direto no MPU6050 pra ver se assim a comunicação vai funcionar.
Olá Fabio! Parabéns pelo conteúdo!
Fiquei com dúvida com relação a questão dos 5V/3.3V que gera a perda de comunicação. O terminal VCC do MPU pode ser alimentado com 3.3V? Se sim, isso resolveria o problema da tensão nos terminais e dispensaria o uso do conversor? Se a pinagen de comunicação utiliza as entradas (não saídas) do Arduino, qual seria o motivo do regulador?
Fiz o teste de alimentar a MPU com 3.3V, sem o conversor, e rodei seu código por algumas horas sem ocorrer a perda de comunicação. Só não consigo saber ainda se os valores retornados estão plausíveis.
Olá, Pedro. Muito obrigado!
Excelente dúvida! O VCC pode ser alimentado com 3,3 V sem problemas. Entre o pino Vcc e o barramento interno de alimentação, existe um regulador de tensão. Esse regulador apresenta uma queda de tensão de algumas centenas de milivolts entre a entrada e a saída. Não sei o valor certo, mas é plausível dizer que seja uns 100-300 mV. Ou seja, no pior caso, a tensão de saída vai ser ~3V. 3V ainda e suficiente pra alimentar o MPU6050, por isso não tem problema usar 3,3V no Vcc.
E os pinos do Arduino não atuam como saídas durante a comunicação, por isso a comunicação I2C depende dos resistores de pull-up que existem na placa do MPU6050 pro barramento ir pra nível alto. Ou seja, em certo sentido, você está certo em dizer que a comunicação utiliza entradas.
Diante disso tudo que falei, parece desnecessário fazer uso do conversor de nível de tensão. E provavelmente é mesmo, tanto que inicialmente esse post não tinha menção nenhuma à ele. No fim das contas, decidi incluir, porque perdi muitas horas tentando fazer o meu MPU6050 funcionar sem perda e, no meu caso, não obtive sucesso mesmo quando alimentava o VIN com 3,3 V. Essa recomendação do conversor é interessante também para o caso de alguém ligar o MPU6050 direto no Arduino antes de gravar o código, quando o código previamente gravado usa os pinos A4 e A5 como saída. Nesse cenário improvável, é bem possível que o MPU6050 queime.
Sobre sua dúvida se os valores retornados estão plausíveis ou não, aqui vai uma sugestão: com o sensor parado em uma mesa plana, o eixo Z vai marcar um valor próximo de 1 g (16383) e os outros eixos, valores próximos de 0. Como esse sensor é bem ruidoso e depende de calibração, você pode esperar o eixo Z marcar algo em torno de 15000 ou 17000 e os outros eixos marcarem valores na casa das centenas. Você pode inclinar o MPU6050 para ver se o aceleração de 1g “passa” pra outro eixo e para ver se o giroscópio indica valores coerentes a medida que você for girando o sensor.
Espero ter ajudado!
Olá, Fábio Guimarães. Primeiramente parabéns pelo post e pela qualidade da informação. Estou em grupo de disciplina desenvolvendo um projeto de sensores e escolhemos usar o MPU6050 para medir inclinação. Um dos requisitos do projeto é simular o circuito com arduino. Vimos as imagens que você colocou nesse post e gostaríamos de saber qual simulador foi usado, pois já testamos em outros(como tinkercad) e não possuem o MPU6050. Agradeço desde já a atenção.
Olá, Ana. Muitíssimo obrigado!
As imagens dos circuitos foram feitas no fritzing. Ele não é um simulador, é apenas um software pra desenhar circuitos. E eu não conheço um software em que você possa simular o MPU6050 com Arduino. Vocês vão ter que testar na prática.
Sobre seu projeto, gostaria de fazer um comentário: o MPU6050, dependendo da precisão necessária, é suficiente sim para medir a inclinação de um objeto. O problema é que o MPU6050 é um Circuito Integrado obsoleto (não é mais fabricado) e apresenta ruído considerável quando comparado aos Circuitos Integrados mais recentes. Se vocês ainda não fizeram a compra dos componentes, vou sugerir o lsm6ds3 (também existe um módulo dele).
Espero ter ajudado. Boa sorte no projeto!
Muito obrigada pela ajuda, Fábio! Nosso projeto é o desenvolvimento de uma órtese para correção da postura(como nesse link https://lidafacil.com/products/corretor-postural-sensor-vibracao-inteligente-adulto-e-crianca?variant=43813002772707) usando as medições de ângulo do MPU6050. Caso o indivíduo esteja com a coluna mais inclinada do que deveria será enviado um sinal sonoro (buzzer) e sinal visual (led). Vc tem alguma outra dica para facilitar a implementação?
Por nada! Que legal esse dispositivo, não sabia que existia algo assim. Parece ser bem útil e simples de replicar. E tenho outra dica sim, que na verdade é um ctrl c de outro comentário que fiz aqui:
“Neste link você encontra um código de exemplo com as fórmulas para os ângulos dos três eixos. E este outro link tem uma explicação detalhada da teoria da conversão de aceleração para ângulo. Para você conseguir valores mais exatos, seu código precisa fazer uma calibração do MPU6050.”
O código do link que mandei é uma das formas mais simples de obter o ângulo e ele é relativamente simples e confiável. Mas saiba que existem algoritmos que entregam resultados mais precisos, mas envolvem fórmulas e teorias mais complexas (fusão de sensores).
Boa tarde, amigo. Esse post contribuiu bastante para o projeto que estou fazendo na instrumentação de estruturas. Muito obrigado.
Gostaria também de saber se é possível usar 3 módulos usando apenas um arduino mega 2560 e o que mudaria no cabeamento e no código. Mais uma vez, muito obrigado e parabéns pelo conteúdo. Será referenciado no artigo.
Boa noite, Lucas. Caramba, que coisa boa ler seu comentário. Valeu! É possível usar 3 módulos sim. O módulo permite alternar entre 2 endereços I2C por meio do nível lógico do pino AD0: 0x68 e 0x69. Ou seja, você consegue ligar 2 sensores no mesmo barramento, cada um com um endereço diferente. Mas ligar um terceiro módulo no mesmo barramento não vai funcionar. Para contornar esse problema, você pode ligar o 3º módulo em outros pinos e usar a biblioteca SoftWire, que cria um barramento I2C via software. Isso dificulta o uso do módulo com bibliotecas do MPU6050, porque é altamente improvável que a biblioteca aceite comunicar com o módulo via SoftWire. Portanto, você possivelmente vai ter que criar a própria biblioteca. Antes de percorrer esse caminho, avalie se realmente é necessário usar 3 módulos.
Boa sorte no seu projeto!
Primeiramente, gostaria de dar os parabéns pelo conteúdo do post e da página.
Gostaria de saber também, se você tem uma ideia de como posso fazer leituras da aceleração linear nos 3 eixos com esse sensor.
Desde já agradeço pela atenção.
Muito obrigado, Matheus!
Não entendi muito bem sua dúvida. Me diga qual seria a aplicação, que consigo entender e te ajudar melhor com o problema.
pode me dar uma dica, de como usar esse sensor, para medir a frequência de vibração ?
Não tenho experiência prática suficiente com esta aplicação, mas já li uns trabalhos sobre. Recomendo este aqui para te orientar.
Olá!
Boa Noite!
Estamos produzindo um TCC, e encontramos esse obstáculo, seu relato aqui contribuiu muito para seguir com o projeto.
Porém, agora estamos com algumas dificuldades quanto ao código para dois acelerômetros MPU6050, em placa Arduíno UNO.
Seria possível o compartilhamento desse código?
Ficariamos muitíssimo gratos.
Desde já agradecemos toda ajuda.
Boa noite, Giovanna. Fico feliz em ter contribuído.
Te mandei por e-mail o código.
Boa sorte no TCC!
boa tarde, preciso balancear eixos de turbinas, qual o sensor apropriado para o caso?
aguardo contato
Olá, Antonio. Excelente pergunta. Não sei te dizer ao certo. Possivelmente um acelerômetro serviria. Mas não sei como tratar a leitura dele para obtenção adequada dos parâmetros de balanceamento.