Neste artigo vamos ver como ligar Acelerómetro e Giroscópio através do modulo GY-521 MPU-6050 ao Arduino. Nesse módulo GY-521 encontramos na mesma placa um acelerómetro e um giroscópio de alta precisão, ambos controlados no mesmo Circuito Integrado, o MPU6050:
Acelerometro e Giroscopio GY-521 MPU-6050
O CI MPU6050, 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.
Material necessário:
– Arduino Uno (ou outro modelo)
– Modulo GY-521 MPU-6050 (Comprar aqui)
– LCD 20×04 (ou outro modelo)
– Potenciómetro 10k (facultativo, para ajuste contraste LCD)
– Fios condutores
Pinagem e endereços do MPU6050
A comunicação com o microcontrolador usa a interface I2C, por meio dos pinos SCL e SDA do sensor. A alimentação do módulo pode variar entre 3V e 5V, mas para melhores resultados e precisão recomenda-se utilizar 5V.
O pino AD0 desligado define que o endereço I2C do sensor é 0x68. Devem ligar o pino AD0 ao pino 3.3V do Arduino para que o endereço seja alterado para 0x69. Esta alteração permite ter dois módulos MPU-6050 em um mesmo circuito, caso assim o pretendam por algum motivo.
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:
Programando o Arduino com o 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.
//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 preferirem visualizar os dados no serial monitor o resultado será assim:
Espero que tenham gostado deste artigo, poderá ser útil para controlar movimentos de robots como drones, ou criar comandos com ação por movimento.
Em breve vamos ver como interligar o Arduino ao Processing e registar visualmente os movimentos deste sensor.
—————
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.
Gostaram deste artigo ? Deixem o vosso comentário no formulário a baixo.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?