Franzininho WiFi: Acelerômetro e Giroscópio MPU6050

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)

Figura 1 – Acessando o gerenciador de bibliotecas

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.

Figura 2: Instalação da 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.
Figura 3: Esquema de montagem com a Franzininho WiFi e o MPU6050

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:

Figura 4: Saída das leituras de aceleração no Monitor Serial

Quando descomentado o trecho referente a aceleração para o plotter Serial, os seguintes valores foram exibidos para a aceleração: 

Figura 5: Saída das leituras de aceleração no Plotter Serial

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.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Marco Aurelio Santos Cunha
Marco Aurelio Santos Cunha
16/06/2023 02:51

Bom dia , excelente projeto mas gostaria de saber onde posso comprar o frazininho.
Pode m mandar um feedback/

fabio
fabio
Reply to  Marco Aurelio Santos Cunha
16/06/2023 07:06
Home » Arduino » Franzininho WiFi: Acelerômetro e Giroscópio MPU6050

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: