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 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
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