O módulo MPU6050 é um acelerômetro e giroscópio com 6 graus de liberdade. Neste post, são apresentados o funcionamento e um exemplo de projeto.
Clique nos links a seguir para saber como funcionam o acelerômetro e o giroscópio.
Como funciona o acelerômetro?Clique aqui
Como funciona o giroscópio?Clique aqui
O módulo MPU6050
O MPU6050 é um sistema microeletromecânico (MEMS), com um giroscópio de 3 eixos, um acelerômetro de 3 eixos e um sensor de temperatura. Se comunica com o Arduino através do protocolo I2C, usando os pinos SCL (Serial Clock) e SDA (Serial Data).
Outros pinos do MPU6050:
- XDA e XCL: Serial Data e Serial Clock auxiliares, formam uma interface I2C auxiliar para se comunicar com outros sensores.
- ADO: o pino para selecionar o endereço de I2C.
- INT: o pino de interrupção, serve para avisar o Arduino quando um novo dado pode ser lido.
O sensor de temperatura e cada eixo do acelerômetro e do giroscópio têm um conversor analógico-digital de 16 bits, onde seus dados são digitalizados. O MPU6050 possui um Processador Digital de Movimento (DMP), cuja função é fazer os cálculos complexos, usando os dados digitalizados. O módulo também possui um buffer FIFO de 1024 bytes para reduzir o consumo de potência. FIFO significa First In First Out (Primeiro a Entrar e Primeiro a Sair). Este é um algoritmo que gerencia os dados em uma fila. A faixa de temperatura de operação: -40ºC a 85ºC.
Demonstração de funcionamento
Este algoritmo é para demonstrar o funcionamento do módulo. É necessária a biblioteca “MPU6050.h”, que pode ser baixada na janela do programa do Arduino. O vídeo abaixo mostra como baixar a biblioteca.
O algoritmo para testar o módulo.
#include <Wire.h> //Bibliotecas necessárias.
#include <I2Cdev.h>
#include <MPU6050.h>
MPU6050 mpu; //Declaração do módulo.
int16_t ax, ay, az, gx, gy, gz; //Declaração das variáveis. A int16_t é uma
//variável int sem sinal de 16 bits.
//Variáveis com 'a' são eixos do acelerômetro e 'g' são do giroscópio.
void setup() {
Serial.begin(9600); //Inicializa a tela Serial.
Wire.begin(); //Inicializa a comunicação I2C.
mpu.initialize(); //Inicializa o módulo.
if(!mpu.testConnection()){
while (1);
}
}
void loop() {
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //Função que faz a leitura
//dos eixos do acelerômetro e do giroscópio.
Serial.print("ax = ");
Serial.print(ax);
Serial.print(" | ay = ");
Serial.print(ay);
Serial.print(" | az = ");
Serial.print(az);
Serial.print("\n");
Serial.print("\n");
Serial.print("gx = ");
Serial.print(gx);
Serial.print(" | gy = ");
Serial.print(gy);
Serial.print(" | gz = ");
Serial.print(gz);
Serial.print("\n");
delay(500); //Para poder ler os dados na tela.
}
O problema do código acima, é que os dados fornecidos não indicam diretamente os valores do ângulo e da aceleração. Para mostrar os valores do giroscópio em graus e do acelerômetro em múltiplos de g (aceleração da gravidade), pode-se baixar a biblioteca “MPU6050_light.h”, cujo link está aqui. Esta biblioteca tem um exemplo chamado GetAllData.ino, o qual mostra as medidas de uma melhor forma.
Mouse com MPU6050 e Arduino
Neste projeto, o cursor do mouse é controlado pelo Arduino usando o MPU6050. É um mouse que não precisa estar em uma superfície. Só funciona com o Arduino Leonardo.
O código a seguir. Deve ser incluída a biblioteca “Mouse.h”, que já está no Sketch no programa do Arduino.
#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Mouse.h>
const int pot=3; //Declaração das variáveis do potenciômetro no pino
//analógico A3.
int potentiometer=0;
MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz;
int vx, vy; //Estas variáveis servem para movimentar o cursor do
//mouse.
int button1 = 6; //Variáveis dos botões.
int button2 = 7;
int buttonState1 = 0;
int buttonState2 = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(pot,INPUT);
mpu.initialize();
if (!mpu.testConnection()) { while (1); }
}
void loop() {
potentiometer=analogRead(pot);
potentiometer=map(potentiometer,0,1023,-5,5);//Esta função converte os
//valores analógicos de 0 a 1023 para -5 a 5.
analogWrite(3,potentiometer);
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
vx = (gx+15)/150; //Calculando os valores de vx e vy.
vy = -(gz-100)/150;
Serial.print("gx = ");
Serial.print(gx);
Serial.print(" | gz = ");
Serial.print(gz);
Serial.print(" | X = ");
Serial.print(vx);
Serial.print(" | Y = ");
Serial.println(vy);
Mouse.move(vx, vy,potentiometer);//Função para mover o cursor do mouse.
if(potentiometer<=1 || potentiometer>=-1){ //A roda do mouse não se mexe
//se o terceiro valor estiver dentro desta faixa.
Mouse.move(vx, vy,0);
}
buttonState1 = digitalRead(button1);
buttonState2 = digitalRead(button2);
if (buttonState1 == LOW) { //Um botão
Mouse.press(MOUSE_LEFT); //Função que pressiona o botão do mouse.
//LEFT=esquerda e RIGHT=direita.
delay(100);
Mouse.release(MOUSE_LEFT);//Função que libera o botão do mouse.
delay(200);
}
else if(buttonState2 == LOW) {
Mouse.press(MOUSE_RIGHT);
delay(100);
Mouse.release(MOUSE_RIGHT);
delay(200);
}
delay(80);
}
O vídeo mostrando o funcionamento.