Kompass Problem mit GY-271 (HMC5883L)

Hey Leute, ich habe eine Problem und zwar schaffe ich es nicht die Daten aus dem Kompass GY-271 auszulesen. :( Ich habe das Board Funduino Uno. Angeschlossen ist es so: - VCC: 5V - GND: GND - SCL: A5 - SDA: A4

Der Code ist dieser hier: http://bluelemonlabs.blogspot.de/search/label/Arduino Den Code hier habe ich ebenfalls probiert: https://drive.google.com/file/d/0B2_rhDNAxM4sSkg2d19iRE5GTG8/view

LG. Suchtaa

Und, was sind die Fehler / Symtome? Grüße Uwe

Mal so als Bauchgefühl. Hast du die richtige Adresse deines Sensors im sketch eingetragen?

Mit einem i2c Scanner kannst du diese herausfinden. Einfach "i2c Scanner" Googlen und da solltest du nen passenden sketch finden.

Also der Fehler liegt darin, dass ich immer die gleichen Werte ausgelesen bekomme.
In dem ersten Code, den ich gepostet habe, kommt immer die Grad zahl 92.87 raus.
Aus dem zweitem Code kommen zwar manchmal verschiedene Ergebnisse raus, diese sind aber ziemlich sinnlos… :frowning:

Der i2c Scanner gibt mir diese Adresse aus: 0x1E

Wo genau müsste ich diese dann in dem Sketch eintragen?

Danke, dass ihr mir helft :slight_smile:

Poste doch mal den sketch hier in den code Tags. Mobil diverse Seiten zu browsen ist müßig.

Okay, also der von bluemolemolabs

// Reference the I2C Library
#include <Wire.h>
// Reference the HMC5883L Compass Library
#include <HMC5883L.h>

// Store our compass as an object.
HMC5883L compass;

// Record any errors that may occur in the compass.
int error = 0;

// Out setup routine, here we will configure the microcontroller and compass.
void setup()
{
  // Initialize the serial port.
  Serial.begin(9600);

  Serial.println("Starting the I2C interface.");
  Wire.begin(); // Start the I2C interface.

  Serial.println("Constructing new HMC5883L");
  compass = HMC5883L(); // Construct a new HMC5883 compass.
  //The implementation of the class is provided in the library
  
  // Now we have an istance of the class!
  //Let's initializate it...
  
  Serial.println("Setting scale to +/- 1.3 Ga");
  error = compass.SetScale(1.3); // Set the scale of the compass to 1.3Ga
  if(error != 0){ // If there is an error, print it out. 
    Serial.println(compass.GetErrorText(error));
    error =0;
  }

  Serial.println("Setting measurement mode to continous.");
  error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
  if(error != 0) {// If there is an error, print it out.
    Serial.println(compass.GetErrorText(error)); //Todo: Error handling for this method in .h and .cpp
    error=0;
  }
}

// Our main program loop. 
void loop()
{
  // Retrieve the raw values from the magnetometer (not scaled).
  MagnetometerRaw raw = compass.ReadRawAxis();
  // Retrieve the scaled values from the magnetometer (scaled to the configured scale).
  MagnetometerScaled scaled = compass.ReadScaledAxis();

  // Values are accessed like so:
  int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)

  // Calculate heading when the magnetometer is level, then correct for signs of axis.
  // Atan2() automatically check the correct formula taking care of the quadrant you are in
  float heading = atan2(scaled.YAxis, scaled.XAxis);

  // Once you have your heading, you must then add your 'Declination Angle',
  // which is the 'Error' of the magnetic field in your location. Mine is 0.0404 
  // Find yours here: http://www.magnetic-declination.com/
  
  // If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
  float declinationAngle = 0.0404;
  heading += declinationAngle;

  // Correct for when signs are reversed.
  if(heading < 0)
    heading += 2*PI;

  // Check for wrap due to addition of declination.
  if(heading > 2*PI)
    heading -= 2*PI;

  // Convert radians to degrees for readability.
  float headingDegrees = heading * 180/M_PI; 

  // Output the data via the serial port.
  Output(raw, scaled, heading, headingDegrees);

  // By default the HMC5883L reads the data 15 time per second (15Hz)
  // However since we have a long serial out (104ms at 9600) we will let
  // it run at its natural speed.
  // delay(66);
}

// Output the data down the serial port.
void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
{
  Serial.print("Raw:\t");
  Serial.print(raw.XAxis);
  Serial.print("   ");   
  Serial.print(raw.YAxis);
  Serial.print("   ");   
  Serial.print(raw.ZAxis);
  Serial.print("   \tScaled:\t");

  Serial.print(scaled.XAxis);
  Serial.print("   ");   
  Serial.print(scaled.YAxis);
  Serial.print("   ");   
  Serial.print(scaled.ZAxis);

  Serial.print("   \tHeading:\t");
  Serial.print(heading);
  Serial.print(" Radians   \t");
  Serial.print(headingDegrees);
  Serial.println(" Degrees   \t");
}

und der andere

#include <HMC5883L.h>


#include <Wire.h> //I2C Arduino Library

#define address 0x1E //0011110b, I2C 7bit address of HMC5883

void setup(){
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Wire.begin();
  
  //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
  }
  
  //Print out values of each axis
  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);
  Serial.print("  z: ");
  Serial.print(z);

  Serial.print("\t\tangle: ");
  Serial.println(atan2(x, y));
  
  delay(250);
}
#define address 0x1E

Ist die Adresse im 2ten sketch. Im ersten taucht sowas nicht auf soweit ich sehen konnte. Wird wohl in der lib stehen, da sie wohl das Ding mit nur einer Adresse produzieren.

Ohhh man, Es funktioniert jetzt richtig. Ich habe es einfach nochmal richtig verlötet und nun funktioniert es auch sehr gut.... :D

Hallo Suchtaa, welche der beiden Sketches hat du letztlich verwendet und hast du es noch verändert ? Ich habe auch immer noch Probleme mit sinnlosen Werten und starken Schwankungen.

Hey,

also ich habe nun diesen hier und der funktioniert sehr gut mit dem Kompass und dem Arduino Uno(eben grade noch einmal getestet).

#include <Wire.h>

#define Addr 0x1E               // 7-bit address of HMC5883 compass

void setup() {
  Serial.begin(9600);
  Serial.println();
  Wire.begin();
  
  // Set operating mode to continuous
  Wire.beginTransmission(Addr); 
  Wire.write(byte(0x02));
  Wire.write(byte(0x00));
  Wire.endTransmission();
}

void loop() {
  int x, y, z;

  // Initiate communications with compass
  Wire.beginTransmission(Addr);
  Wire.write(byte(0x03));       // Send request to X MSB register
  Wire.endTransmission();

  Wire.requestFrom(Addr, 6);    // Request 6 bytes; 2 bytes per axis
  if(Wire.available() <=6) {    // If 6 bytes available
    x = Wire.read() << 8 | Wire.read();
    z = Wire.read() << 8 | Wire.read();
    y = Wire.read() << 8 | Wire.read();
  }
  // If compass module lies flat on the ground with no tilt,
  // just x and y are needed for calculation
  float heading=atan2(-x, y)/0.0174532925;
  if(heading < 0) heading+=360; // N=0/360, E=90, S=180, W=270
  Serial.println(heading);  
  delay(500);
}

Der Code ist von hier