Introdução
O MPU6050 possui, no mesmo invólucro, um acelerômetro e um giroscópio de alta precisão com tecnologia MEMS. No total, são 6 eixos, sendo três para o acelerômetro e 3 para o giroscópio. Além disso, esse dispositivo possui um sensor de temperatura interno que permite medir temperaturas entre -40 a 85°C com acurácia de +/- 1°C. A comunicação é feita através do padrão I2C, usando os pinos SCL e SDA.
Neste artigo, vamos entender como ler os sinais do acelerômetro, do giroscópio e do sensor de temperatura usando a Franzininho WiFi. O Exemplo apresentado poderá ser usado para diversas aplicações que necessitem de acelerômetro e giroscópio.
Instalação da Biblioteca
Para aproveitar o máximo dos recursos disponíveis pelo MPU6050, vamos instalar no Arduino IDE a biblioteca responsável por inicializar o barramento (I2C) e realizar as leituras do acelerômetro e do giroscópio.
Acesse: Ferramenta -> Gerenciador de Bibliotecas (Tools -> Manager Libraries)

Após acessar o Gerenciador de biblioteca aguarde surgir uma janela como mostrado na imagem abaixo. Digite no campo de texto: “mpu6050”, e aguarde o resultado da pesquisa finalizar. Procure pela biblioteca Adafruit MPU6050 by Adafruit e clique em Install para concluir a instalação e clique em Close. Pronto já estamos aptos a utilizar a biblioteca.
Biblioteca MPU6050 Adafruit MPU6050
Nesta seção vamos apresentar os métodos utilizados pela biblioteca da Adafruit MPU6050.h presente no exemplo de projeto.
begin()
Configura o barramento I2C para realizar a comunicação com o dispositivo.
bool begin(uint8_t i2caddr, TwoWire *wire, uint8_t sensorID);
- i2caddr: parâmetro opcional (pode ser omitido ao chamar o método), por padrão o endereço I2C do MPU6050 é 68 em hexadecimal (0x68), normalmente utiliza-se quando há mais de um sensor conectado ao barramento.
- wire: parâmetro opcional(pode ser omitido ao chamar o método), ponteiro para o objeto da biblioteca Wire.
- sensorID: parâmetro opcional(pode ser omitido ao chamar o método) usado como identificador.
Retorna true, configurou corretamente e false, não foi possível configurar.
setMotionInterrupt()
Configura os registros do chip para habilitar ou não a interrupção no pino INT .
void setMotionInterrupt(bool active);
- active: true, para habilitar a interrupção e false, para desabilitar a interrupção
getInterruptStatus()
Verifica status da do pino INT, isso indica que a leituras dos sensores foram finalizadas naquele ciclo.
bool getInterruptStatus();
Retorna true, concluiu a leitura e false, não ainda não concluiu a leitura .
getEvent()
Busca os eventos mais recentes ocorridos . O evento trata-se de um ciclo de leitura realizado quando solicitado aos registradores do chip.
bool getEvent(sensors_event_t *accel, sensors_event_t *gyro ,sensors_event_t *temp);
A estrutura de dados sensors_event_t contém os elementos:
- Version – valor fixo de 1
- Sensor ID – identificador numérico para cada tipo de sensor
- Type – identificado de tipo de sensor (SENSOR_TYPE_AMBIENT_TEMPERATURE, SENSOR_TYPE_ACCELEROMETER, SENSOR_TYPE_GYROSCOPE)
- Timestamp – tempo decorrido do evento, utiliza a função millis() para registrar
- Gyro – leitura dos 3 eixo do giroscópio
- Accel – leitura dos 3 eixo do acelerômetro
- Temp – leitura de temperatura
Os parâmetros do método são:
- c
- gyro : ponteiro de estrutura para receber as leituras do giroscópio
- temp : ponteiro de estrutura para receber as leituras de temperatura.
Retorna true, evento finalizado e false, ainda está ocorrendo.
Materiais necessários
Os materiais necessários para desenvolver nossa aplicação são:
- Placa Franzininho WiFi
- Módulo MPU6050
- Jumpers
- Arduino IDE
Circuito
No circuito proposto para o nosso projeto, vamos utilizar o barramento I2C (GPIO 9 e GPIO 8) para realizar a troca de informações, seja para solicitar as leituras do sensor ou recebê-las. O módulo MPU6050 possui oito pinos, dentre eles temos a alimentação (VCC e GND), porém não iremos utilizar todos. Abaixo segue uma imagem e uma descrição sobre cada pino:
- SCL: responsável por transferir o clock do barramento, sincronizando as trocas de bits.
- SDA: pino bidirecional, responsável por transferir os bits de leituras e comandos solicitados para realizá-las.
- XDA: pino de dados utilizado para conectar a um barramento I2C externo.
- XCL: pino de clock utilizado para conectar a um barramento I2C externo.
- AD0: caso haja mais de um MPU6050, esse pino pode mudar o endereço I2C dependendo de onde esteja conectado (VCC, GND, SDA ou SCL).
- INT: pino para interrupção, indica quando os dados estão prontos para leitura.
Código
No projeto proposto, vamos realizar as leituras do módulo MPU6050 a fim de adquirir as informações do giroscópio e do acelerômetro. Os dados serão mostrados na tela no Monitor Serial e, caso deseje visualizar no Plotter Serial, uma visualização gráfica dos dados, descomente o trecho do código referente a esse recurso:
/*
Autor: Embarcados
*/
// Inclui a biblioteca para configurar o barramento I2C
#include <Wire.h>
// Inclui bibliotecas para habilitar os métodos
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
// Declaração do objeto
Adafruit_MPU6050 mpu;
// Estrutura para receber as leituras dos sensores
sensors_event_t acc, gyr, temp;
void setup()
{
// Inicializa a comunicação serial
Serial.begin(115200);
Serial.println("Iniciando demo MPU6050...");
// Inicializa o módulo MPU6050 e verifica se foi configurado corretamente
if (!mpu.begin())
{
// Caso não seja configurado corretamente, informa no monitor serial
Serial.println("Falha ao configurar MPU6050");
}
Serial.println("MPU6050 encontrado");
}
void loop()
{
// Realiza as leituras do acelerômetro, giroscópio e do sensor de temperatura.
mpu.getEvent(&acc, &gyr, &temp);
// Mostra na tela as leituras realizadas no Monitor Serial
Serial.println(" # Acelerômetro: ");
Serial.print(" X: ");
Serial.print(acc.acceleration.x);
Serial.print("\t Y: ");
Serial.print(acc.acceleration.y);
Serial.print("\t Z: ");
Serial.println(acc.acceleration.z);
Serial.println(" # Giroscópio: ");
Serial.print(" X: ");
Serial.print(gyr.gyro.x);
Serial.print("\t Y: ");
Serial.print(gyr.gyro.y);
Serial.print("\t Z: ");
Serial.println(gyr.gyro.z);
Serial.println("--------------------");
// Mostra as leituras realizadas no Plotter Serial
// Descomente para mostrar as leituras individuais do acelerômetro no Plotter Serial
/*
Serial.print(acc.acceleration.x);
Serial.print("\t");
Serial.print(acc.acceleration.y);
Serial.print("\t");
Serial.println(acc.acceleration.z);
*/
// Descomente para mostrar as leituras individuais do giroscópio no Plotter Serial
/*
Serial.print(gyr.gyro.x);
Serial.print("\t");
Serial.print(gyr.gyro.y);
Serial.print("\t");
Serial.println(gyr.gyro.z);
*/
delay(50);
}Simule esse exemplo no Wokwi: https://wokwi.com/projects/366882120661309441
Explicação do Código
Nesta seção, explicaremos o código linha por linha, para garantir uma compreensão completa e entender a finalidade de cada função utilizada.
Nesse trecho, estamos incluindo a biblioteca “Wire.h”, que permite a configuração do barramento I2C:
// Inclui a biblioteca para configurar o barramento I2C
#include <Wire.h>Aqui, estamos incluindo duas bibliotecas adicionais: “Adafruit_MPU6050.h” e “Adafruit_Sensor.h”. Essas bibliotecas habilitam os métodos necessários para o funcionamento do MPU6050, um sensor de movimento que combina um acelerômetro e um giroscópio:
// Inclui bibliotecas para habilitar os métodos
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>Nessa linha, estamos declarando um objeto chamado “mpu” do tipo “Adafruit_MPU6050”. Esse objeto será utilizado para interagir com o sensor MPU6050:
// Declaração do objeto
Adafruit_MPU6050 mpu;Aqui, estamos declarando uma estrutura chamada “sensors_event_t” que será utilizada para armazenar as leituras dos sensores do MPU6050. Ela contém informações sobre o acelerômetro, o giroscópio e a temperatura:
// Estrutura para receber as leituras dos sensores
sensors_event_t acc, gyr, temp;A função “setup()” é executada apenas uma vez quando o Arduino é ligado ou reiniciado. Nesse trecho, inicializamos a comunicação serial com a taxa de transmissão de 115200 bps. Em seguida, exibimos uma mensagem no Monitor Serial informando que o código está sendo iniciado.
Em seguida, tentamos inicializar o sensor MPU6050 utilizando o método “begin()”. Se a inicialização falhar, exibimos uma mensagem informando o erro. Caso contrário, exibimos uma mensagem informando que o MPU6050 foi encontrado com sucesso:
void setup()
{
// Inicializa a comunicação serial
Serial.begin(115200);
Serial.println("Iniciando demo MPU6050...");
// Inicializa o módulo MPU6050 e verifica se foi configurado corretamente
if (!mpu.begin())
{
// Caso não seja configurado corretamente, informa no monitor serial
Serial.println("Falha ao configurar MPU6050");
}
Serial.println("MPU6050 encontrado");
}A função “loop()” é executada continuamente após a execução da função “setup()”. Nesse trecho, realizamos as leituras do acelerômetro, giroscópio e sensor de temperatura utilizando o método “getEvent()”.
Em seguida, exibimos as leituras no Monitor Serial. Mostramos as leituras do acelerômetro (eixos X, Y e Z) e do giroscópio (eixos X, Y e Z) utilizando a função “Serial.print()”. Adicionamos algumas formatações para melhor visualização das informações.
No trecho comentado, temos opções para exibir as leituras individuais do acelerômetro e do giroscópio no Plotter Serial. Para utilizar essas opções, é necessário descomentar os trechos de código removendo os comentários (/* e */).
Por fim, adicionamos um pequeno atraso de 50 milissegundos utilizando a função “delay(50)” para evitar que as leituras sejam realizadas de forma muito rápida.
void loop()
{
// Realiza as leituras do acelerômetro, giroscópio e do sensor de temperatura.
mpu.getEvent(&acc, &gyr, &temp);
// Mostra na tela as leituras realizadas no Monitor Serial
Serial.println(" # Acelerômetro: ");
Serial.print(" X: ");
Serial.print(acc.acceleration.x);
Serial.print("\t Y: ");
Serial.print(acc.acceleration.y);
Serial.print("\t Z: ");
Serial.println(acc.acceleration.z);
Serial.println(" # Giroscópio: ");
Serial.print(" X: ");
Serial.print(gyr.gyro.x);
Serial.print("\t Y: ");
Serial.print(gyr.gyro.y);
Serial.print("\t Z: ");
Serial.println(gyr.gyro.z);
Serial.println("--------------------");
// Mostra as leituras realizadas no Plotter Serial
// Descomente para mostrar as leituras individuais do acelerômetro no Plotter Serial
/*
Serial.print(acc.acceleration.x);
Serial.print("\t");
Serial.print(acc.acceleration.y);
Serial.print("\t");
Serial.println(acc.acceleration.z);
*/
// Descomente para mostrar as leituras individuais do giroscópio no Plotter Serial
/*
Serial.print(gyr.gyro.x);
Serial.print("\t");
Serial.print(gyr.gyro.y);
Serial.print("\t");
Serial.println(gyr.gyro.z);
*/
delay(50);
}Valores lidos:
A figura a seguir exibe os valores lidos exibidos no terminal:
Quando descomentado o trecho referente a aceleração para o plotter Serial, os seguintes valores foram exibidos para a aceleração:
Conclusão
O rastreamento de movimentos e a detecção de vibração são funcionalidades comuns em diversos dispositivos eletrônicos. Por exemplo, nos smartphones, temos internamente os mesmos sensores presentes no módulo MPU 6050 (acelerômetro e giroscópio), que servem para interagir com o usuário. Para criar esse recurso, podemos adicionar algoritmos capazes de extrair informações instantâneas, como velocidade ou aceleração, e ao longo do tempo, como distância percorrida.
Neste artigo, exploramos os recursos disponíveis, configuramos e realizamos as leituras dos sensores em um exemplo de projeto. Com isso, desafiamos você a criar aplicações que possam interagir com outros dispositivos, como display, LED ou buzzer, e, ao final, compartilhar sua experiência com a comunidade por meio de um artigo ou vídeo.








Bom dia , excelente projeto mas gostaria de saber onde posso comprar o frazininho.
Pode m mandar um feedback/
Marco, você pode comprar em: https://sacola.pagseguro.uol.com.br/e9bdf81f-339f-4b36-951c-88c69240e0e7