Go Down

Topic: Problem mit Kompassensor HMC6352 (Read 726 times) previous topic - next topic

maxbot

Hallo zusammen,
ich habe ein Problem mit meinem Sparkfun HMC6352 Magnetkompass-Sensor (http://www.sparkfun.com/commerce/product_info.php?products_id=7915): Im Web gibt es ja versch. Sketches zu diesem Sensor inkl. Anschlussanleitung, allerdings funktioniert bei mir kein einziges "richtig". Manche gehen gar nicht, bei anderen kommen komische Gradzahlen raus...
Ich habe den GND und Vcc ganz normal angeschlossen (Vcc an 5V), SDA an Analog 4 & SCA an Analog 5.
Wenn ich jetzt beispielsweise diesen Code hier verwende:

Code: [Select]
#include <Wire.h>
int HMC6352Address = 0x42;
// This is calculated in the setup() function
int slaveAddress;
int ledPin = 13;
boolean ledState = false;
byte headingData[2];
int i, headingValue;
void setup()
{
// Shift the device's documented slave address (0x42) 1 bit right
// This compensates for how the TWI library only wants the
// 7 most significant bits (with the high bit padded with 0)
slaveAddress = HMC6352Address >> 1; // This results in 0x21 as the address to pass to TWI
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // Set the LED pin as output
Wire.begin();
}
void loop()
{
// Flash the LED on pin 13 just to show that something is happening
// Also serves as an indication that we're not "stuck" waiting for TWI data
ledState = !ledState;
if (ledState) {
digitalWrite(ledPin,HIGH);
}
else
{
digitalWrite(ledPin,LOW);
}
// Send a "A" command to the HMC6352
// This requests the current heading data
Wire.beginTransmission(slaveAddress);
Wire.send("A"); // The "Get Data" command
Wire.endTransmission();
delay(10); // The HMC6352 needs at least a 70us (microsecond) delay
// after this command. Using 10ms just makes it safe
// Read the 2 heading bytes, MSB first
// The resulting 16bit word is the compass heading in 10th's of a degree
// For example: a heading of 1345 would be 134.5 degrees
Wire.requestFrom(slaveAddress, 2); // Request the 2 byte heading (MSB comes first)
i = 0;
while(Wire.available() && i < 2)
{
headingData[i] = Wire.receive();
i++;
}
headingValue = headingData[0]*256 + headingData[1]; // Put the MSB and LSB together
Serial.print("Current heading: ");
Serial.print(int (headingValue / 10)); // The whole number part of the heading
Serial.print(".");
Serial.print(int (headingValue % 10)); // The fractional part of the heading
Serial.println(" degrees");
delay(500);
}


Dann kommen nur Gradzahlen von ~1.5 bis ~ 359.6 raus...
Weiss jemand woran das liegen könnte ?

webmeister

Quote
Dann kommen nur Gradzahlen von ~1.5 bis ~ 359.6 raus...


Was erwartest du für Werte?
0 - 360 Grad wäre wohl der Idealfall. Deine Werte sind also recht genau und liegen bestimmt in der Toleranz.

Diese Sensoren sind meist sehr empfindlich und können leicht durch metallische Teile gestört werden. Eine Leiterbahn o.ä. kann das Resultat schon beeinflussen.

maxbot

#2
Dec 24, 2009, 12:48 pm Last Edit: Dec 24, 2009, 02:54 pm by maxbot Reason: 1
oh das war jetzt wohl leicht missverständlich, bei mir kommen nicht werte von 1.5 bis 359 raus (was ja top wäre) sondern werte von 359 bis 1.5 also nur ein Wertebereich von ~ 2 grad  ::)
EDIT: Muss ich SDA & SCL vl. an Widerstände anschließen ? In einigen Foren ist von 10k Ohm die Rede

Go Up