Módulo GY-521 (MPU-6050) com o ESP32 | ACELERÔMETRO E GIROSCÓPIO

Olá, entusiastas da eletrônica e inovação! Neste tutorial, iremos explorar o módulo GY-521: suas aplicações, conexões e projetos práticos. Além disso, aprofundaremos nosso conhecimento sobre acelerômetro, giroscópios e também o protocolo I2C, essencial para a interação com este sensor.

kit robotica educacional com Arduino ESP ou Microbit

Conhecendo o Módulo GY-521 (MPU-6050) | ACELERÔMETRO E GIROSCÓPIO

O módulo GY-521 é um módulo que utiliza o chip MPU-6050, é uma verdadeira maravilha da tecnologia que pode adicionar detecção de movimento e orientação aos seus projetos, unindo giroscópio e acelerometro de alta precisão em um único módulo tornando-o uma excelente opção.

Versatilidade de Aplicações: O módulo GY-521 é reconhecido por sua versatilidade, sendo aplicável em diversos projetos eletrônicos, como drones, robôs e dispositivos de realidade virtual.

Combinação de Sensores: Equipado com o chip MPU-6050, integra giroscópio e acelerômetro em um único dispositivo, permitindo medições precisas de movimentos e orientações.

Protocolo de Comunicação I2C: Utiliza o eficiente protocolo I2C, essencial para conexão com outros dispositivos no mesmo barramento.

Alta Precisão de Medição: Apresenta alta precisão nas medições de taxas de rotação, graças ao giroscópio, e fornece dados precisos sobre aceleração linear por meio do acelerômetro.

Acelerômetros e Giroscópios

Mas antes de entrarmos nos projetos, vamos ent: Para que serve o acelerômetro e o que exatamente é um giroscópio? Há alguma diferença importante entre eles?

Acelerômetro: Um acelerômetro é como um “detector de movimento” que ajuda a saber se algo está se movendo para frente, para trás, para cima ou para baixo. É o que permite que o seu telefone saiba quando você o está inclinando ou agitando.

Giroscópio: Um giroscópio é como um “sensor de rotação” que ajuda a entender se algo está girando ou virando. É útil para manter as coisas estáveis, como a câmera do seu telefone ao tirar uma foto, ou para ajudar um drone a permanecer equilibrado no ar.

Diferença: A principal diferença é que o acelerômetro ajuda a entender o movimento linear (para frente, para trás, para cima, para baixo), enquanto o giroscópio ajuda a entender a rotação ou movimento angular (giro, virada). Juntos, eles fornecem informações detalhadas sobre como um dispositivo está se movendo.

 

Mergulhando na Prática

Vamos agora colocar a mão na massa! Então pegue o seu kit, pois estamos prestes a mostrar como utilizar o GY-521.

Componentes necessários

BIBLIOTECAS

Para utilizar esse módulo com o ESP32 é necessário a instalação de algumas bibliotecas. Basta seguir esse passo-a-passo.

Abra a IDE da Arduino

• Rascunho > Incluir Biblioteca > Gerenciar Bibliotecas…  

• Procure por “Adafruit MPU6050”. Em seguida instale. 

• Agora clique em INSTALAR TODAS, com isso você irá instalar todas as bibliotecas necessárias incluindo (Adafruit Unified Sensor e Adafruit BusIO).

• Pronto, já podemos utilizar nosso GY-521.

PROJETO 1

No nosso projeto inicial, vamos efetuar a leitura do sensor GY-521 e exibir os movimentos nos diferentes eixos no monitor serial.

montagem ESP32 com o Módulo GY-521 MPU-6050
montagem ESP32 com o Módulo GY-521 MPU-6050
//                                VIDA DE SILICIO
//                                    KIT ESP32
//                                      AULA 7 
//                      PROGRAMA 1 : PROJETO LEITURA DOS EIXOS

//inclusão das bibliotecas
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;

//Variaveis para receber os valores de aceleração dos eixos
int valoranteriorX = 0 ;
int valoranteriorY = 0 ;
int valoranteriorZ = 0 ;

//Define os leds
#define ledvermelho = 4;
#define ledamarelo = 5;
#define ledverde = 18;



void setup(void) {
  Serial.begin(115200); // iniciar o monitor serial 

 //Verifica se o módulo GY-521 (MPU6050) está conectado 
  if (!mpu.begin()) {
    Serial.println("Falha ao conectar o módulo");// caso não encontre
    while (1) {
      delay(10);
    }
  }
  Serial.println("Módulo conectado"); // caso encontre
// Definição da variação do chip.
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Variação do aceleremetro para: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Variação do Giroscópio para: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filtro: ");
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);

  //Inicia os pinos dos leds como saida
  pinMode(ledvermelho,OUTPUT);
  pinMode(ledamarelo,OUTPUT);
  pinMode(ledverde,OUTPUT);

  //Garante que iniciem desligados
  digitalWrite(ledvermelho,LOW);
  digitalWrite(ledamarelo,LOW);
  digitalWrite(ledverde,LOW);

}

void loop() {

  //Variáveis para leitura do Acelerometro, Giroscopio e Tempratura.
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  //Imprime os valores do acelerometro no monitor serial
  Serial.print("Aceleração X: ");
  Serial.print(a.acceleration.x);
  Serial.print(", Y: ");
  Serial.print(a.acceleration.y);
  Serial.print(", Z: ");
  Serial.print(a.acceleration.z);
  Serial.println(" m/s^2");
//Imprime os valores do giroscopio no monitor serial
  Serial.print("Rotação X: ");
  Serial.print(g.gyro.x);
  Serial.print(", Y: ");
  Serial.print(g.gyro.y);
  Serial.print(", Z: ");
  Serial.print(g.gyro.z);
  Serial.println(" rad/s");
//Imprime os valores do termometro no monitor serial
  Serial.print("Temperatura: ");
  Serial.print(temp.temperature);
  Serial.println(" °C");

  Serial.println("");
  delay(2000); // Atraso definido em milisegundos entre as leituras ** EDITAVEL**
}

 

PROJETO 2

Logo em seguida, vamos inserir três LEDs na montagem, utilizando-os como indicadores para alertar sempre que o sensor detectar movimento em qualquer um dos três eixos (x, y e z).

montagem ESP32 com o Módulo GY-521 MPU-6050 com leds

 

//                                VIDA DE SILICIO
//                                    KIT ESP32
//                                      AULA 7 
//                      PROGRAMA 1 : PROJETO LEITURA DOS EIXOS

//inclusão das bibliotecas
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;

//Variaveis para receber os valores de aceleração dos eixos
int valoranteriorX = 0 ;
int valoranteriorY = 0 ;
int valoranteriorZ = 0 ;

//Define os leds
const int ledvermelho = 4;
const int ledamarelo = 5;
const int ledverde = 18;



void setup(void) {
  Serial.begin(115200); // iniciar o monitor serial 

 //Verifica se o módulo GY-521 (MPU6050) está conectado 
  if (!mpu.begin()) {
    Serial.println("Falha ao conectar o módulo");// caso não encontre
    while (1) {
      delay(10);
    }
  }
  Serial.println("Módulo conectado"); // caso encontre
// Definição da variação do chip.
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Variação do aceleremetro para: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Variação do Giroscópio para: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filtro: ");
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);

  //Inicia os pinos dos leds como saida
  pinMode(ledvermelho,OUTPUT);
  pinMode(ledamarelo,OUTPUT);
  pinMode(ledverde,OUTPUT);

  //Garante que iniciem desligados
  digitalWrite(ledvermelho,LOW);
  digitalWrite(ledamarelo,LOW);
  digitalWrite(ledverde,LOW);

}

void loop() {

  //Variáveis para leitura do Acelerometro, Giroscopio e Tempratura.
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  //Imprime os valores do acelerometro no monitor serial
  Serial.print("Aceleração X: ");
  Serial.print(a.acceleration.x);
  Serial.print(", Y: ");
  Serial.print(a.acceleration.y);
  Serial.print(", Z: ");
  Serial.print(a.acceleration.z);
  Serial.println(" m/s^2");
//Imprime os valores do giroscopio no monitor serial
  Serial.print("Rotação X: ");
  Serial.print(g.gyro.x);
  Serial.print(", Y: ");
  Serial.print(g.gyro.y);
  Serial.print(", Z: ");
  Serial.print(g.gyro.z);
  Serial.println(" rad/s");
//Imprime os valores do termometro no monitor serial
  Serial.print("Temperatura: ");
  Serial.print(temp.temperature);
  Serial.println(" °C");

  Serial.println("");

  //Condições de movimento para que os leds sejam acesos
  //eixo X
   int valoratualX = a.acceleration.x;

  if (valoratualX != valoranteriorX) {
    digitalWrite(ledvermelho, HIGH); // Acende o LED se houver alteração
  } else {
    digitalWrite(ledvermelho, LOW); // Mantém o LED apagado se não houver alteração
  }
valoranteriorX = valoratualX; // Atualiza o valor anterior para a próxima comparação

  //Eixo Y
      int valoratualY = a.acceleration.y;
    
    if (valoratualY != valoranteriorY) {
    digitalWrite(ledamarelo, HIGH); // Acende o LED se houver alteração
  } else {
    digitalWrite(ledamarelo, LOW); // Mantém o LED apagado se não houver alteração
  }

  valoranteriorY = valoratualY; // Atualiza o valor anterior para a próxima comparação

  //Eixo Z
   int valoratualZ = a.acceleration.z;

  if (valoratualZ != valoranteriorZ) {
    digitalWrite(ledverde, HIGH); // Acende o LED se houver alteração
  } else {
    digitalWrite(ledverde, LOW); // Mantém o LED apagado se não houver alteração
  }
valoranteriorZ = valoratualZ; // Atualiza o valor anterior para a próxima comparação
  
  delay(500); // Atraso definido em milisegundos entre as leituras ** EDITAVEL**
}

 

Entendendo a fundo

Arquitetura

O módulo GY521 possui diversos pinos de conexão, cada um com funções específicas que podem variar de acordo com as necessidades do projeto. A seguir, detalharemos a função de cada um deles.

VCC: Pino de alimentação, geralmente conectado a uma fonte de 3.3V.

GND: Pino de terra, conectado ao terra do sistema.

SCL (Serial Clock): Pino de relógio para a comunicação I2C.

SDA (Serial Data): Pino de dados bidirecional para a comunicação I2C. 
XDA e XCL: Pinos auxiliares para expansões futuras, normalmente não são usados.
AD0: Pino de endereço usado para definir o último bit do endereço I2C. Pode ser conectado a VCC ou GND para definir o endereço.

INT: Pino de interrupção, usado para indicar que há dados prontos paraserem lidos.

 

Funcionamento

O módulo GY-521, também conhecido como MPU-6050 que é o chip utilizado nesse módulo, é uma unidade que integra funcionalidades de um acelerômetro e um giroscópio, permitindo a medição precisa de movimentos e orientação em um espaço tridimensional. O acelerômetro é responsável por mensurar a aceleração linear ao longo dos três eixos cartesianos (X, Y, Z), fornecendo informações sobre o quão rápido um objeto está se movendo em uma determinada direção. Por outro lado, o giroscópio avalia a taxa de rotação em torno dos mesmos eixos, indicando as mudanças na orientação do objeto.

Dessa forma, o GY-521 fornece dados abrangentes sobre o comportamento dinâmico de um objeto, capturando tanto as acelerações lineares quanto as rotações, sendo particularmente útil em aplicações que exigem um entendimento detalhado dos movimentos em três dimensões. Essa combinação de sensores permite que o módulo seja aplicado em uma variedade de projetos, desde controle de movimento até estabilização de dispositivos, contribuindo para uma ampla gama de aplicações em eletrônica e automação.

PROTOCÓLO I2C
 O protocolo I2C (InterIntegrated Circuit) é um método de comunicação serial que permite a troca de dados entre dispositivos eletrônicos. Ele utiliza apenas dois fios, um para a transmissão de dados (SDA Serial Data) e outro para o sinal de relógio
(SCL Serial Clock). Esse protocolo é amplamente utilizado em dispositivos como sensores, módulos e chips para transmitir informações de maneira eficiente e simples.

 Uma das vantagens notáveis do protocolo I2C é sua capacidade de reduzir a quantidade de pinos necessários para conectar vários componentes eletrônicos em um sistema. Isso é especialmente útil em projetos que requerem a comunicação
entre múltiplos dispositivos, já que os pinos disponíveis em um microcontrolador muitas vezes são limitados.

 No contexto da nossa aula sobre o sensor GY521 (MPU6050), o protocolo I2C desempenha um papel crucial. Ele é utilizado para a comunicação entre o GY521 e o microcontrolador, permitindo que os dados medidos pelo acelerômetro e giroscópio sejam transmitidos de maneira eficiente. Através dos pinos SDA e SCL do GY521, podemos acessar informações sobre movimento e orientação em tempo real.

Conclusão

 

Convidamos você a participar ativamente desta comunidade. Deixe seu like, inscreva-se no canal e compartilhe suas dúvidas, conquistas e ideias nos comentários. Sua interação é o que dá vida a este canal. Estamos aqui para aprender juntos e moldar o futuro da tecnologia DIY e IoT. Até a próxima aula!