MPU6050 in a nutshell

Resumo desorganizado de como resolver as tretas com o nosso querido MPU6050.

Paraiso da desorganizacao

MPU6050_DMP6.ino Descomenta ql parte tu quer

MPU6050_calibration.ino

mpu6050_complete.ino

Arduino_EMG_INERTIAL_Com_Fio.ino

Isso resolve Se precisar de precisão e tal Tu usa esse outro:

Codigos usando algoritmo de madgwick: GY88_AND_DEMUX Esse é o brabo, **artigo de referencia: ** Madgwick 2010 madgwick_article.png

nao tem isso no datasheet nao kk

Pra pegar os dados filtrados pre processados e com altas coisas la

vc usa uma coisa chamada DMP

mas se quiser so os dados brutos

pra vc fazer oq bem entender

so usar comunicacao I2C

adiciona a biblioteca de i2c

#include<Wire.h> inicia o i2c: Wire.begin(); “Liga” o sensor, tipo, tu configura ele pra ficar lendo:

Wire.beginTransmission(0x68); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true);

No loop, vc le os dados do sensor: Requisita a leitura no registro 0x3B (inicio do vetor de dados na memoria do mpu6050):

Wire.beginTransmission(0x68); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(0x68,14,true); 

Entao le:

Aceleracao_X = Wire.read() << 8 | Wire.read(); 
Aceleracao_Y = Wire.read() << 8 | Wire.read(); 
Aceleracao_Z = Wire.read() << 8 | Wire.read(); 
Temperatura = Wire.read()<<8|Wire.read(); Temperatura = Temperatura/340.00+36.53;
Giroscopio_X = Wire.read() << 8 | Wire.read(); 
Giroscopio_Y = Wire.read() << 8 | Wire.read();
Giroscopio_Z = Wire.read() << 8 | Wire.read();

Wire.read() -> Le 8 bytes do barramento i2c

Tu esta lendo 8 bytes, entao empurrando ele 8 casas a esquerda, depois somando com mais 8 bytes:

Le 8 bytes: __ __ 1111 1111

add 8 zeros a esquerda: 1111 1111 0000 0000

Le mais 8 bytes: __ __ 1111 1111

Faz a operacao (ou) (msm coisa de somar nesse caso pq soma com zeros:

1111 1111 0000 0000 OU __ __ 1111 1111 = 1111 1111 1111 1111

No final vc tem um numero de 16 bits lindao

obs: tu tem que ler a temperatura tbm nessa ordem e ignorar ela, pra poder mudar o endereco de registrador

teve um povo ae que fez uns codigos explicando esse sensor: https://www.i2cdevlib.com/devices/mpu6050#source

se tu olhar no mapa de registradores:

img1.jpeg

vai ver que o 0x6B é o power management 1

img2.jpeg

E quanto vc escreve um “0” nele vc esta configurando o dispositivo pra: sair do sleep mode e selecionando o clock interno dele

0x68 é o endereco do sensor no barramento I2C, mas se vc ligar a perninha de addr dele em nivel alto ele vira 0x69, e tu pode usar isso pra conectar varios sensores no mesmo arduino ou uC

img3.jpeg

Os dados que vc le comecam no 0x3B, e vc vai lendo ate chegar na ultima informacao do gyroscopio

img4.jpeg

na pag35 do datasheet ele fala como usar o I2C pra ler e escrever dados nos registros do MPU6050

img5.jpeg

escrevendo o valor 0 (0000 0000) no registro de endereco 0x6B PWR_MNGT_1 usando o arduino:

Wire.beginTransmission(0x68); //Master envia Start + Address
Wire.write(0x6B); // Envia register address
Wire.write(0); // Envia DATA
Wire.endTransmission(true); // Stop Condition

img6.jpeg Lendo o valor do register 0x3B (onde fica armazenado o X do acelerometro): Requisita a leitura no registro 0x3B (inicio do vetor de dados na memoria do mpu6050):

Wire.beginTransmission(0x68);  //Master envia Start + Address
Wire.write(0x3B); // Envia register address
Wire.endTransmission(false); // Segura o barramento pra nao fechar a conexao antes de enviar uma requisicao de leitura
Wire.requestFrom(0x68, 2, true);  // Envia Device Address + Read bit (1) e configura o arduino pra segurar o barramento pelos proximos 2 bytes e depois de 2 bytes enviar uma stop condition (true) 
Aceleracao_X_MSB = Wire.read(); // primeiro bytes DATA 8 bits (1bytes)  received data
Aceleracao_X_LSB = Wire.read();  // segundo byte DATA 8 bits (1bytes)  received data
// Automaticamente depois de 2 bytes ele envia uma STOP Condition pq voce definiu com "Wire.requestFrom(0x68, 2, true);"

dps pra converter tu junta o MSB com o LSB, (faz o complemento de 2 se nao estiver plotando os valores negativos, nao lembro se ele ja vinha com o 1 no inicio da word qnd convertia pra int) e divite pela resolucao do sensor:

acceleracaoX = Aceleracao_X_MSB << 8 | Aceleracao_X_LSB;
acceleracaoX_em_g = acceleracaoX / 16384.0;

Dia 25/04/2019 eu mandei uns codigos pro eber que leem usando os filtros internos quartenios etc no whatsapp dele deve ter

Artigos:

acabei de achar isso na minha pasta de coisas antigas :

Licence and Author


-----------------------------------------------------------------------------
"THE BEER-WARE LICENSE" (Revision 42):
italogsfernandes wrote this file.  As long as you retain this notice you
can do whatever you want with this stuff. If we meet some day, and you think
this stuff is worth it, you can buy me a beer in return.  Italo G S Fernandes
-----------------------------------------------------------------------------