O módulo acelerômetro e giroscópio MPU6050 é um componente de alta precisão que conta também com um sensor de temperatura para leituras entre -40 e +85 °C. Controlado pelo CI MPU-6050 (datasheet), ele é um sensor de 6 eixos (6 DOF – Degrees of Freedom, ou 6 Graus de Liberdade), fornecendo 6 valores de saída, sendo 3 do acelerômetro e 3 do giroscópio.
Esse CI tem um recurso chamado DMP (Digital Motion Processor), um acelerador de hardware que cuida da parte dos complexos cálculos do sensor.
Por ser um sensor de baixo custo, preciso e econômico em termos de consumo de energia, é ideal para projetos envolvendo robôs e simuladores, além é claro das aplicações em dispositivos portáteis, como smartphones e tablets, projetos de realidade aumentada e monitoração de equipamentos, entre outras.
Conexão do módulo MPU6050 ao Arduino
O módulo utiliza a comunicação via interface I2C, assim a conexão com o Arduino é bastante simplificada, utilizando apenas os pinos analógicos A4 (SDA) e A5 (SCL) e a alimentação, que pode variar entre 3 e 5V.
Os pinos XDA e XCL podem ser utilizados para ligação de outros dispositivos I2C ao módulo. Por meio do pino AD0 você pode selecionar o endereço I2C: em nível baixo o endereço é 0x68, e em nível alto (3.3V), o endereço é 0x69.
Neste artigo vou mostrar dois exemplos de utilização dos dados do MPU6050, conectado ao Arduino Uno:
Se possível, utilize fios e conectores macho/fêmea para ligação do módulo ao Arduino, já que os testes envolvem a movimentação da placa em várias direções.
Mostre os dados do acelerômetro e giroscópio MPU6050 no Serial Monitor
Para efetuar a leitura dos dados “puros” do sensor, carregue o programa abaixo no Arduino:
//Programa: Teste MPU6050 //Alteracoes e adaptacoes: Arduino e Cia // //Baseado no programa original de JohnChi //Carrega a biblioteca Wire #include<Wire.h> //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); Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); //Inicializa o MPU-6050 Wire.write(0); Wire.endTransmission(true); } 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) //Mostra os valores na serial Serial.print("Acel. X = "); Serial.print(AcX); Serial.print(" | Y = "); Serial.print(AcY); Serial.print(" | Z = "); Serial.print(AcZ); Serial.print(" | Gir. X = "); Serial.print(GyX); Serial.print(" | Y = "); Serial.print(GyY); Serial.print(" | Z = "); Serial.print(GyZ); Serial.print(" | Temp = "); Serial.println(Tmp/340.00+36.53); //Aguarda 300 ms e reinicia o processo delay(300); }
Abra o serial monitor, onde serão apresentados os valores de X, Y e Z do acelerômetro e do giroscópio, além da temperatura:
Integrando o MPU6050 com o Processing
Uma das aplicações mais interessantes para mostrar o funcionamento do MPU-6050 é a sua integração com o Processing. Com ele podemos efetuar a leitura do sensor conectado ao Arduino e apresentar esses dados de forma gráfica em uma janela na tela do computador.
(No tutorial Processing : mostre as informações do Arduino no seu computador você encontra informações sobre como instalar o Processing e os passos básicos para utilização do programa)
Um dos melhores exemplos que eu encontrei de utilização do MPU-6050 com o Processing foi no site Varesano.net. O programa desse site gera na tela um retângulo, que se movimenta conforme movimentamos o sensor:
Mais tarde achei uma evolução desse programa, que substitui o retângulo por uma representação do próprio módulo:
Para realizar esses testes com o seu módulo MPU6050, você vai precisar de dois programas, que estão no Github do Arduino e Cia:
- MPU_6050_test.zip: Faça o download, descompacte e carregue o programa MPU_6050_test.pde no Arduino
- FreeIMU_cube1.zip: Faça o download, descompacte e carregue o programa FreeIMU_cube1.pde no Processing
No programa FreeIMU_cube1.pde, altere a linha abaixo de acordo com a porta serial utilizada pelo seu Arduino:
final String serialPort = “/dev/tty.usbmodem1d11“;
No caso da porta COM5, por exemplo, o código ficará assim:
final String serialPort = “COM5“;
Após as alterações, acione o botão RUN, conforme destacado abaixo, para que seja aberta uma nova janela e o Processing comece a receber os dados do sensor ligado ao Arduino:
Utilize o teclado e pressione H para definir a posição de origem do sensor. Movimente o sensor em várias direções para que o movimento seja reproduzido na tela.
No vídeo abaixo você confere o teste do módulo com Arduino e Processing:
Gostou? Confira outros post com acelerômetro aqui mesmo no Arduino e Cia!