Dit is een 3 assige digitaal kompas welke gebasseerds is op de HMC5883L chip. Het device helpt je dus de weg vinden aan de hand van het magnetische noord-pool.
De Honywell HMC5883L vind 3 X Y Z assen op het magnetische veld van de aarde. Beweeg je de HMC om een as dan blijft die as constant en de waarde van de andere assen veranderen.
Er is een library te vinden voor de Arduino op github.com.
Het board heeft een 3.3V spanning regelaar waardoor je het met de 5V Arduino kan benaderen of natuurlijk met b.v. de 3.3V ESP8266. Er zijn 2 typen, de CJ-M49 en de GY273. De CJ heeft een 3.3V output pin welke je nodig zou kunnen hebben voor een externe voeding.

De library van Gidhub doet het lastige werk en levert graden in minuten en seconden.
HMC5883L_Simple Compass;
Compass.SetDeclination(23, 35, 'E');
float heading = Compass.GetHeadingDegrees();
Om het compas te IJken kan je hier terecht.
Verbind de GY-273 aan jouw Arduino door middel van:

Hieronder zijn de verbindingen voor de Arduino.

GY-273 Kompas Module -> Arduino
VCC -> VCC (bekijk de bovenstaande staande opmerking)
GND -> GND
SCL -> A5/SCL, (gebruik Pin 21 op de Arduino Mega)
SDA -> A4/SDA, (gebruik Pin 20 op de Arduino Mega)
DRDY -> niet verbonden (in dit voorbeeld)

En dan mijn ervaring met de Gidhub library:
Mijn bedoeling was om de robot d.m.v. met kompas door een ruimte te laten rijden en dan via een sonar de ruimte op te meten en een weg te vinden.
Als ik het kompas aansluit krijg ik via SerialMonitor 'Heading getal1 getal2'. 2 Getallen waarvan getal1 veranderd als ik de HMC draai op een vlakke plaat. Het lijkt redelijk het noorden te vinden maar als ik de HMC kantel veranderd getal1 ook. Getal2 veranderd constant al tussen 0 en 99 als er niets gebeurt. Getal1 lijkt redelijk stabiel en veranderd in 0 en 1, til ik het board aan de 'zuidkant' 1 cm op veranderd dat getal in 13. Als ik de HMC aan de 'noordkant' optil lijkt er niets te gebeuren. Getal1 blijft 0.
Je kan behoorlijk met het board bewegen voordat er echt een duidelijk verschil meetbaar is.

Henry's bench
Die begint het verhaal dat de HMC een behoorlijk gecompliceerd device is. Had ik voor de Gidhub versie een library nodig en uit die library een voorbeeld sketch geprobeerd, nu staat er een sketch op de Henrysbench:
Het adres voor de HMC is dus 0x1E.
Ook het verschil met Gidhub is dat er nu constant gemeten wordt.

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

#define addr 0x1E //I2C Address for The HMC5883

void setup(){

Serial.begin(9600);
Wire.begin();

Wire.beginTransmission(addr); //start talking
Wire.write(0x02); // Set the Register
Wire.write(0x00); // Tell the HMC5883 to Continuously Measure
Wire.endTransmission();
}

void loop(){

int x,y,z; //triple axis data

//Tell the HMC what regist to begin writing data into
Wire.beginTransmission(addr);
Wire.write(0x03); //start with register 3.
Wire.endTransmission();

//Read the data.. 2 bytes for each axis.. 6 total bytes
Wire.requestFrom(addr, 6);
if(6<=Wire.available()){
x = Wire.read()<<8; //MSB x
x |= Wire.read(); //LSB x
z = Wire.read()<<8; //MSB z
z |= Wire.read(); //LSB z
y = Wire.read()<<8; //MSB y
y |= Wire.read(); //LSB y
}

// Show Values
Serial.print("X Waarde: ");
Serial.print(x);
Serial.print(" Y Waarde: ");
Serial.print(y);
Serial.print(" Z Waarde: ");
Serial.print(z);
Serial.println();

delay(500);
}

Ik heb alleen het deel aangepast wat de waarde toont. Persoonlijk vind ik data in 1 regel makkelijker lezen.
Er wordt door Henrysbench verwezen naar de Adafruit library.
Met de HenrysBench sketch zie ik 3 waarden waarbij de X waarde ook 361 kan tonen en de Y waarde het dichtste bij de Noordpool richting komt. Het is alleen lastig om te zien of de waarde door het kantelen van de robot veranderd of door het uit richting gaan.


Bronnen:
sparks.gogo.co.nz
github.com
henrysbench