TUTORIAL: ACELERÔMETRO MPU6050 COM ARDUINO

 

MPU6050-630x311

Nesse módulo GY-521 você tem em uma mesma placa um acelerômetro e um giroscópio de alta precisão, tudo isso controlado por um único CI, o MPU6050:

GY-521-MPU-6050

O CI MPU6050 (datasheet), além dos dois sensores, tem embutido um recurso chamado DMP (Digital Motion Processor), responsável por fazer cálculos complexos com os sensores e cujos dados podem ser usados para sistemas de reconhecimento de gestos, navegação (GPS), jogos e diversas outras aplicações. Outro recurso adicional é o sensor de temperatura embutido no CI, que permite medições entre -40 e +85 ºC.

PINAGEM E ENDEREÇAMENTO DO MPU6050

A comunicação com o microcontrolador usa a interface I2C, por meio dos pinos SCL e SDA do sensor. Nos pinos XDA e XCL você pode ligar outros dispositivos I2C, como um magnetômetro por exemplo, e criar um sistema de orientação completo. A alimentação do módulo pode variar entre 3 e 5v, mas para melhores resultados e precisão recomenda-se utilizar 5v.

GY-521-MPU-6050-Pinos1

O pino AD0 desconectado define que o endereço I2C do sensor é 0x68. Conecte o pino AD0 ao pino 3.3V do Arduino para que o endereço seja alterado para 0x69. Essa mudança permite que você tenha dois módulos MPU-6050 em um mesmo circuito.

ACELERÔMETRO MPU6050 COM ARDUINO E DISPLAY LCD 20×4

Vamos utilizar um Display LCD 20×4 para mostrar os valores lidos do MPU6050 em conjunto com um Arduino Uno. Nas duas primeiras linhas do display, além da temperatura no canto superior direito, temos os valores de X, Y e Z para o Acelerômetro, e nas duas últimas linhas os valores de X, Y e Z para o giroscópio. O potenciômetro de 10 K serve para ajuste do contraste do display:

Circuito-LCD-20x4-MPU-6050

PROGRAMANDO ARDUINO COM MPU6050

O programa envia os dados tanto para o LCD como para o serial monitor, e utiliza apenas as biblioteca Wire para ler os dados da interface I2C e LiquidCrystal para enviar os dados para o display. Observe no circuito acima que utilizamos um mini-protoboard para conectar o MPU6050 e deixá-lo separado do display, para facilitar a movimentação do sensor e observar a alteração dos valores mostrados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//Programa : Teste MPU6050 e LCD 20x4
//Alteracoes e adaptacoes : FILIPEFLOP
//
//Baseado no programa original de JohnChi
//Carrega a biblioteca Wire
#include<Wire.h>
//Carrega a biblioteca do LCD
#include <LiquidCrystal.h>
// Inicializa o LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Endereco I2C do MPU6050
const int MPU=0x68; 
//Variaveis para armazenar valores dos sensores
int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup()
{
  Serial.begin(9600);
  //Inicializa o LCD
  lcd.begin(20, 4);
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  
  //Inicializa o MPU-6050
  Wire.write(0);
  Wire.endTransmission(true);
    
  //Informacoes iniciais do display
  lcd.setCursor(0,0);
  lcd.print("Acelerometro");
  lcd.setCursor(0,2);
  lcd.print("Giroscopio");
}
void loop()
{
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  //Solicita os dados do sensor
  Wire.requestFrom(MPU,14,true); 
  //Armazena o valor dos sensores nas variaveis correspondentes
  AcX=Wire.read()<<8|Wire.read();  //0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  AcY=Wire.read()<<8|Wire.read();  //0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_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("AcX = "); Serial.print(AcX);
  lcd.setCursor(0,1);
  lcd.print("X=");
  lcd.print(AcX);
  
  //Envia valor Y do acelerometro para a serial e o LCD
  Serial.print(" | AcY = "); Serial.print(AcY);
  lcd.setCursor(7,1);
  lcd.print("Y=");
  lcd.print(AcY);
  
  //Envia valor Z do acelerometro para a serial e o LCD
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  lcd.setCursor(13,1);
  lcd.print("Z=");
  lcd.print(AcZ);
  
  //Envia valor da temperatura para a serial e o LCD
  //Calcula a temperatura em graus Celsius
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);
  lcd.setCursor(13,0);
  lcd.print("T:");
  lcd.print(Tmp/340.00+36.53);
  
  //Envia valor X do giroscopio para a serial e o LCD
  Serial.print(" | GyX = "); Serial.print(GyX);
  lcd.setCursor(0,3);
  lcd.print("X=");
  lcd.print(GyX);
  
  //Envia valor Y do giroscopio para a serial e o LCD 
  Serial.print(" | GyY = "); Serial.print(GyY);
  lcd.setCursor(7,3);
  lcd.print("Y=");
  lcd.print(GyY);
  
  //Envia valor Z do giroscopio para a serial e o LCD
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  lcd.setCursor(13,3);
  lcd.print("Z=");
  lcd.print(GyZ);
  
  //Aguarda 300 ms e reinicia o processo
  delay(300);
}

Se você prefere visualizar os dados no serial monitor, terá uma saída como essa:

MPU_6050_Serial_Monitor

 

 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s