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.
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.
// 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).
// 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
• 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.
• 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.
O protocolo I2C (Inter–Integrated 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 GY–521 (MPU–6050), o protocolo I2C desempenha um papel crucial. Ele é utilizado para a comunicação entre o GY–521 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 GY–521, 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!