Arduino magnetisk kompas
På modulet sidder der en sensor-chip, der måler det magnetiske felt den er placeret i, og den er designet til at måle magnetfeltet fra Jorden. Da modulet har tre akser, en x, en y og en z akse, kan modulet bestemme retningen af nord med nøjagtighed i tre dimensioner, modsat et gammeldags kompas, der kun kan måle i to akser, og derfor ikke tager højde for om kompasset står skævt på magnetfeltet.
Der er konstrueret nogle forskellige anvendelser af kredsen HMC5883L Datablad.
Det 3-akses kompas, vi har hjemme på HTX kan findes på listen over moduler til Arduino. [1]
Fra dx.com
De kompas moduler vi har hjemme (oktober 2017) er fra dx.com, og kan p.t. købes som GY-273 HMC5883L 3-Axis Magnetic Electronic Compass.
Denne dokumentation tager udgangspunkt i dette modul.
Software setup til at arbejde med modulet
Først gemmes Dette bibliotek i ens arbejdsområde, så man kan kommunikere med modulet.
I Arduino-programmet åbnes Fil Åben og finde Kompas[1].
Virkemåde
I funktionen setup() initialiseres kompasset, hvis det er tilsluttet og man kan kommunikere med det.
I funktionen loop() afvikles den samme kode i en uendelig løkke, der måler magnetfeltet og udlæser en kompasretning.
Modulet arbejder på en I2C Bus og er placeret på adresse 0x1E.
Egenskaber
I følge databladet[2] har modulet en 12-bit ADC, der sammen med en anisotropisk magnetoresistiv (AMR) sensor, giver modulet en præcision på mellem 1˚ og 2˚, hvilket er meget præcist.
Hardware
For at kunne kommunikere skal Kompas modulet forbindes til Arduinoen efter følgende tabel:
Kompas Modul | Arduino |
---|---|
VCC / +4-5V | +5V |
GND | GND |
SCL | SCL |
SDA | SDA |
DRDY | ikke forbundet |
Software
Softwaren der gennemgås her er den software der ligger i det anbefalede bibliotek.
Anvendelse af software
#include <Wire.h>
#include <HMC5883L.h>
HMC5883L compass;
De nødvendige biblioteker inkluderes og biblioteket HMC5883L initialiseres.
void setup()
{
Serial.begin(9600);
// Initialize Initialize HMC5883L
Serial.println("Initialize HMC5883L");
while (!compass.begin())
{
Serial.println("Could not find a valid HMC5883L sensor, check wiring!");
delay(500);
}
// Set measurement range
compass.setRange(HMC5883L_RANGE_1_3GA);
// Set measurement mode
compass.setMeasurementMode(HMC5883L_CONTINOUS);
// Set data rate
compass.setDataRate(HMC5883L_DATARATE_30HZ);
// Set number of samples averaged
compass.setSamples(HMC5883L_SAMPLES_8);
I setup() startes den serielle port, hvilket gør det muligt for programmet at skive til den serielle monitor. Desuden konfigureres kompassets indstillinger, disse kan ændres for at tilpasse programmet efter behov.
// Set calibration offset. See HMC5883L_calibration.ino
compass.setOffset(0, 0);
For at få korrekte resultater, skal enheden konfigures.
Dette kan gøres med den kalibrationsfil, der er inkluderet i biblioteket. HMC5883L_calibration.ino
Mere information og hvorfor dette er nødvendigt, samt hvordan det virker, kan finde i databladet.
void loop()
{
Vector norm = compass.readNormalize();
// Calculate heading
float heading = atan2(norm.YAxis, norm.XAxis);
I starten af loopet læses værdierne for X og Y. Ud fra disse værdier udregnes retningen i radianer.
// Set declination angle on your location and fix heading
// (+) Positive or (-) for negative
// Formula: (deg + (min / 60.0)) / (180 / M_PI);
float declinationAngle = (2.0 + (18.0 / 60.0)) / (180 / M_PI);
heading += declinationAngle;
Der tages højde for den magnetiske afvigelse.
Afvigelsen kan findes på hjemmesiden http://www.magnetic-declination.com/
For Holstebro er det 2'18E positiv. Det denne værdi der er anvendt i eksemplet.
// Correct for heading < 0deg and heading > 360deg
if (heading < 0)
{
heading += 2 * PI;
}
if (heading > 2 * PI)
{
heading -= 2 * PI;
}
// Convert to degrees
float headingDegrees = heading * 180/M_PI;
I denne del korrigeres hvis retningen ligger uden for området 0-360 grader.
// Output
Serial.print(" Heading = ");
Serial.print(heading);
Serial.print(" Degress = ");
Serial.print(headingDegrees);
Serial.println();
delay(100);
}
Til sidst bliver resultaterne skrevet til den serielle monitor.
Test
Referencer
- ↑ http://arduino.cc/en/Reference/Wire?from=Libraries.Wire I2C modulet fra Arduino