Boa noite,

Alguém sabe como converter os números lidos pelo giroscópio em ângulos? para que com isso eu possa posicionar o braço do servo de acordo com o ângulo lido.

Exibições: 6287

Responder esta

Respostas a este tópico

José, 

Já dei uma lida nesse link, ele mostra como ler os valores brutos, isso já conseguir fazer, o que estou precisando agora é converter os valores lidos em ângulos, pelo que li em vários artigos é que tanto o giroscopio como o acelerômetro tem pequenas falhas onde um compensa o outro, para a obtenção precisa de angulo tenho que combinar os dois e converter esse números em ângulos.

Teodoro,

Acredito que conseguir a solução, estou fazendo mais alguns teste e posteriormente posto aqui.

Encontrei esse tutorial sobre o uso do MPU-6050 com arduino para calculo de deslocamento angular

http://hobbylogs.me.pn/?p=47

Não pude testar esse código pois não estou com uma MPU-6050 em mãos agora porem todo o processo está bem detalhado, caso o código não funcione você pode pegar as instruções fornecidas e criar sua própria versão

João , tutorial muito bem feito. Boa dica !

Obrigado João,

Vou estudar esse.

Resolvido os eixos Pitch e Roll, estou fazendo uns ajustes no eixo Yaw, segue o cod:

#include <SPI.h>
#include <Wire.h>
#include <Servo.h>
#define MPU 0x68 // I2C address of the MPU-6050

Servo ServoX, ServoY, ServoZ;
double AcX,AcY,AcZ;
int Pitch, Roll, Yaw;

void setup(){
Serial.begin(9600);
ServoX.attach(8);
ServoY.attach(9);
ServoZ.attach(10);
init_MPU(); // Inizializzazione MPU6050
}

void loop()
{
FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.

Roll = FunctionsPitchRoll(AcX, AcY, AcZ); //Calcolo angolo Roll
Pitch = FunctionsPitchRoll(AcY, AcX, AcZ); //Calcolo angolo Pitch
Yaw = FunctionsPitchRoll(AcZ, AcX, AcY); //Calcolo angolo Pitch

int ServoRoll = map(Roll, -90, 90, 0, 179);
int ServoPitch = map(Pitch, -90, 90, 179, 0);
int ServoYaw = map(Pitch, -90, 90, 179, 0);

ServoX.write(ServoRoll);
ServoY.write(ServoPitch);
ServoZ.write(ServoYaw);


Serial.print("Pitch: "); Serial.print(Pitch);
Serial.print("\t");
Serial.print("Roll: "); Serial.print(Roll);
Serial.print("\n");
Serial.print("Yaw: "); Serial.print(Yaw);
Serial.print("\n");

}

void init_MPU(){
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
delay(1000);
}

//Funzione per il calcolo degli angoli Pitch e Roll
double FunctionsPitchRoll(double A, double B, double C){
double DatoA, DatoB, Value;
DatoA = A;
DatoB = (B*B) + (C*C);
DatoB = sqrt(DatoB);

Value = atan2(DatoA, DatoB);
Value = Value * 180/3.14;

return (int)Value;
}

//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050
void FunctionsMPU(){
Wire.beginTransmission(MPU);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU,6,true); // request a total of 14 registers
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(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
}

Estou estudando o MPU-6050 para desenvolver um projeto usando o principio do Segway (equilíbrio).

eu gotaria de saber como você resolveu este problema

resolvi com o código postado anteriormente.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço