Pesquisar

GIROSCÓPIO MPU6050 & CONTROLE SERVO

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.

Para baixar as bibliotecas utilizadas, use os links abaixo
MPU6050.H
Wire.H
Servo.H

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);
}


Nenhum comentário:

Postar um comentário