Arduino magnetisk kompas

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning

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

Kompas modul til Arduino
Kompas til Arduino

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

Kompas monior.png

Referencer

  1. http://arduino.cc/en/Reference/Wire?from=Libraries.Wire I2C modulet fra Arduino