Entendo o funcionamento do sensor inclinação (Giroscópio) com Arduino

Fala galera tudo bem com vocês? Hoje vamos aprender a usar de maneira bem fácil o giroscópio (GY-521/MPU6050), que normalmente é usado para medir a aceleração e ângulo de rotação em 3 eixos (X, Y e Z). Esses movimentos são ilustrados pelas setas circulares na figura abaixo:

Fonte: Makergram

O giro e a variação da velocidade rotacional vão incrementar ou decrementar o valor das variáveis correspondentes a cada eixo de movimento.

Ex.: Realizando um determinado movimento, a tela do “PC” poderá mostrar: Inclinação (X=46 ; Y=78 ; Z=70) ; Velocidade de inclinação (X=77 ; Y=0 ; Z=2).

Entendendo o hardware GY-521: Acelerômetro e giroscópio

A figura abaixo mostra a relação de pinos e suas funções diretamente da placa de circuito do GY-521:

Fonte: Elaborado pelo autor

Os pinos SCL e SDA são responsáveis pela comunicação com o controlador (Arduino no nosso caso) e utilizam o protocolo de comunicação 12C. Não precisamos saber muitos detalhes sobre o funcionamento do protocolo I2C para evoluir neste projeto, mas você pode se aprofundar no assunto em um resumo que preparamos de um artigo sobre este protocolo da Universidade Federal do Vale do São Francisco clicando aqui.

A Interface I2C Auxiliar permite a conexão de mais um dispositivo além do controlador que será conectado na Interface I2C padrão.

Conectando os pinos

Antes de começar a conectar, solde os pinos na placa do módulo e conecte os fios conforme a figura abaixo:

Fonte: Elaborado pelo autor

Na imagem abaixo podemos ver uma demonstração da montagem final:

Fonte: Elaborado pelo Autor

Obs.: Caso utilize o Arduino Mega (Nosso caso), os pinos SDA e SCL deverão ser conectados nas portas 20 e 21 respectivamente. Caso contrário, serão mostrados valores (-1) em todas as medições.

Desenvolvendo o código

Abaixo segue o código fonte para este estudo do GY-521:

//Programa: Teste GY-521
// Publicação: Blog do Arduino Ômega.
//Programador: Engº Leandro Castro.
//Baseado no programa original de JohnChi

//Carrega a biblioteca Wire
#include<Wire.h>

const int MPU = 0x68; // Variável que irá armazenar o endereço do módulo
int AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; //Criando variaveis de inclinação e acelaração.

void setup()
{
  Serial.begin(9600); // Iniciando objeto serial com parâmetro de taxa de transmissão
  
  Wire.begin(); // Iniciando objetos do módulo
  Wire.beginTransmission(MPU) // Adicionando tipo de CI do módulo;
  Wire.write(0x6B);

  //Inicializa o MPU-6050
  Wire.write(0);
  Wire.endTransmission(true);

}
void loop()
{
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // Começando com o registrador 0x3B (ACCEL_YOUT_H)
  Wire.endTransmission(false);
  //Solicita os dados do sensor
  Wire.requestFrom(MPU, 14, true);
  //Armazena o valor dos sensores nas variáveis correspondentes
  AcY = Wire.read() << 8 | Wire.read(); //0x3B (ACCEL_YOUT_H) & 0x3C (ACCEL_YOUT_L)
  AcX = Wire.read() << 8 | Wire.read(); //0x3D (ACCEL_XOUT_H) & 0x3E (ACCEL_XOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); //0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp = Wire.read() << 8 | Wire.read(); //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX = Wire.read() << 8 | Wire.read(); //0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY = Wire.read() << 8 | Wire.read(); //0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ = Wire.read() << 8 | Wire.read(); //0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

 
  
  //Envia valor X do acelerometro para a serial e o LCD
  Serial.print("Inclinacao X = "); Serial.print(AcX);
  
 
 //Envia valor Y do acelerometro para a serial e o LCD
  Serial.print(" | Inclinacao Y = "); Serial.print(AcY);

  //Envia valor Z do acelerometro para a serial e o LCD
  Serial.print(" | Inclinacao Z = "); Serial.print(AcZ);
  

 //Envia valor X do giroscopio para a serial e o LCD
  Serial.print(" | Vel.Inclinacao X = "); Serial.print(GyX);
 

 //Envia valor Y do giroscopio para a serial e o LCD
  Serial.print(" | Vel.Inclinacao Y = "); Serial.print(GyY);

  //Envia valor Z do giroscopio para a serial e o LCD
  Serial.print(" | Vel.Inclinacao Z = "); Serial.println(GyZ);

  //Aguarda 100 ms e reinicia o processo
  delay(100);
}
Acesse o código fonte deste tutorial em nosso repositório do Gitbhub!

Teste e resultados

Caso a conectorização dos pinos esteja correta, os resultados abaixo deverão ser mostrados nas telas “Monitor serial” e “Ploter serial” no software do Arduino:

Fonte: Elaborado pelo autor
Fonte: Elaborado pelo autor

É fácil encontrar na internet textos falando sobre o GY-521 como sendo um sensor que mede, além da inclinação e aceleração. Os resultados mostraram que na verdade, os valores medidos são de inclinação e velocidade de inclinação e não de translação, como muitos pensam.

Outro resultado curioso é que o ângulo de inclinação no eixo Z não obedeceu aos movimentos de teste aplicados no módulo, reforçado pelo fato de que o princípio físico por trás da medição de rotação neste eixo seja igual ao encontrado em uma bússola, diferentemente do módulo GY-521. Os valores dos demais eixos foram medidos normalmente.

Por hoje é só pessoal, qualquer dúvida ou sugestão, deixa um comentário no espaço abaixo, e aproveitem para conhecer o meu canal no Youtube o Canal Engrenagens! Abraços!

Leandro Castro
Sobre Leandro Castro 2 artigos
Engenheiro de Controle e Automação. Trabalhou no SENAI como professor dos cursos de Automação Industrial, Eletromecânica, Instalações Elétricas Prediais e Industriais, Mecânico de Refrigeração e Desenho. Atuou como pesquisador na área de sistemas de energia alternativa na empresa Globaltek e pesquisador convidado no SENAI Riachuelo – RJ.

1 Trackback / Pingback

  1. Entendo o protocolo I2C – Blog Arduino Ômega

Deixe uma resposta

O seu endereço de email não será publicado.


*