Componentes eletrônicos, Hobby, Microcontroladores, Projetos, Tutorial

Usando o módulo MPU6050 com Arduino

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

ligação Arduino UNO com MPU6050
Para ligar um MPU6050 a um Arduino UNO, o SDA e o SCL devem ser ligados aos pinos A4 e A5 respectivamente.
ligação MPU6050 e Arduino
O Arduino Leonardo tem os pinos SCL e SDA, que podem ser ligados com os do MPU6050. Neste post, é usada a placa Leonardo para exemplo de projeto.

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.
}
tela serial com mpu6050
A tela serial deve aparecer assim. Os números devem mudar quando você mexe o módulo.

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.

projeto com MPU6050
Os botões servem como os principais botões do mouse e o potenciômetro funciona como a roda do mouse.
Projeto em protoboard
O projeto montado em uma protoboard.

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.

About Pedro Ney Stroski

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *