Dificuldades na Utilização da Bussola HM5883L (Magnetometro)

Bom Dia,
Estou a utilizar este dispositivo HMC5883L para identificar o polo norte, e usei este código para que os valores dos eixos x e Y pudessem ser transformado em uma saída correspondente a 360 graus depois de compilar e fazer o upload do programa no arduino ele funciona normalmente conforme eu esperava mas isto quando tenho o dispositvo a rodar ao meio livre (Ou seja estando eu a segurar e a fazer a rotação), mas sempre que eu conecto o dispositivo na Bread Board ou por cima de uma placa ele da valores completamente errados e inexperados ele ja nem faz a saída do valor a 360º faz apenas entre 90 a 110º e vezes há que faz entre 180 e 90.... tendo em conta que o dispositivo facilmente sofre interferencia magnetica eu acreditava que era por este motivo mas ainda assim eu testei no mesmo ambiente. Alguém sabe explicar-me o problema por favor ? ou ajudar-me a corrigir isto ? Abaixo tem o código...

Em anexo coloco a imagem do dispositivo que estou a utilizar...

//////////////////////////////////////// Inicio do Código /////////////////////////////////////////////////////////////////////////////

/*
Analog input 4 I2C SDA
Analog input 5 I2C SCL
*/

#include //I2C Arduino Library

#define address 0x1E //0011110b, I2C 7bit address of HMC5883
float bussola;
void setup(){
//Initialize Serial and I2C communications
Serial.begin(9600);
Wire.begin();
pinMode(13,OUTPUT);
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(address); //open communication with HMC5883
Wire.write(0x02); //select mode register
Wire.write(0x00); //continuous measurement mode
Wire.endTransmission();
}

void loop(){
int x,y,z; //triple axis data

//Tell the HMC5883 where to begin reading data
Wire.beginTransmission(address);
Wire.write(0x03); //select register 3, X MSB register
Wire.endTransmission();


//Read data from each axis, 2 registers per axis
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
x = Wire.read()8; //X msb
x |= Wire.read(); //X lsb
z = Wire.read()8; //Z msb
z |= Wire.read(); //Z lsb
y = Wire.read()8; //Y msb
y |= Wire.read(); //Y lsb
}
bussola=((atan2(y,x))*360)/(2*PI);
//Print out values of each axis
Serial.println("");
Serial.print("x: ");
Serial.print(x);
Serial.print(" y: ");
Serial.print(y);
Serial.print(" z: ");
Serial.println(z);
Serial.println("Bussola: ");
Serial.print(bussola);

delay(500);
}

//////////////////////////////////////// Fim do Código /////////////////////////////////////////////////////////////////////////////

Exibições: 235

Anexos

Responder esta

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço