MPU 6050 Controle 2 Servos Motores

23/12/2014 19:29

Controle Dois Servos Motores utilizando o  Giroscópio MPU6050.

Você tem em um mesma placa um acelerômetro e um Giroscópio de alta precisão, tudo controlado pelo CI MPU6050

O MPU6050 (datasheet) tem embutido o recurso DMP(Processador de Movimento Digital) o mesmo é responsável por realizar os mais complexos cálculos com os sensores onde estes dados podem ser utilizados em sistemas de reconhecimento de movimento, navegação GPS, e as mais diversas aplicações. Outro recurso que o MPU 6050 possui é um sensor de temperatura embutido permitindo medições que podem variar emtre -40 à +85 ºC

 

Sua comunicação com o microcontrolador se dá através do barramento de dados I2C, utilizando os pinos SCL e SDA do sensor. Os pinos XDA e XCL pode ser ligado outros dispositivos I2C, como um magnetômetro por exemplo, e assim criar um sistema de orientação completo. Sua alimentação pode variar entre 3 e 5v, mas para um melhor desempenho e  precisão do módulo recomenda-se utilizar 5v.

O pino AD0 define o endereçamento do MPU6050,  quando desconectado define que o endereço I2C do sensor é 0x68. Uma vez conectado à 3v3 do Arduino seu endereço será  alterado para 0x69. Isto serve caso precise possuir mais de um MPU6050 no memo barramento.

 

Para mostrar os dados Infirmados pelo MPU6050 iremos utilizar o emulador de Serial do próprio Arduino para visualização.

Iremos mostrar os seguintes dados:
Valor de X

Valor de Y

Que são os mesmos dados enviados para movimentar o motor, outros valores pode ser mostrado fazendo pouca alteração no software.

O código abaixo utiliza apenas os valores fornecidos pelo acelerômetro. O eixo paralelo à gravidade terá força 1g adicional.

A biblioteca Servo.h será necessária para o controle dos servos motores.

 

 

//MPU 6050 2 axis Servo Controle 
// By AF Eletronica
 

#include "Wire.h"

#include "Servo.h"

#include "MPU6050.h"

 
MPU6050 mpu;
 
int16_t ax, ay, az;
int16_t gx, gy, gz;
 
Servo meuServoY;
Servo meuServoX;
 
int valorY;
int prevvalorY;
 
int valorX;
int prevvalorX;
 
void setup() 
{
  Wire.begin();
  Serial.begin(115200);
  Serial.println("Initializando MPU");
  mpu.initialize();
  Serial.println(mpu.testConnection() ? "Conectado" : "Conexão Falhou");
  meuServoY.attach(5);
  meuServoX.attach(6);
}
void loop() 
{
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  valorY = map(ay, -17000, 17000, 0, 179);
  valorX = map(ax, -17000, 17000, 0, 179);
  
  // display tab-separated accel/gyro x/y/z values
 
 
  if (valorY != prevvalorY)
  {
    meuServoY.write(valorY);
    prevvalorY = valorY;
    Serial.print("valorY:  ");
    Serial.print(valorY);Serial.print("\n");
  }
 
  if (valorX != prevvalorX)
  {
    meuServoX.write(valorX);
    prevvalorX = valorX;
    Serial.print("valorX:  ");
    Serial.print(valorX);Serial.print("\n");
  }
  delay(50);
}

 

 

Crie um site gratuito Webnode