Arduino magnetisk kompas

Fra HTX Arduino
Spring til navigation Spring til 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


Atmel Microcontroller
Atmel udviklingsmiljø AVR Compiler - AVR Makefile - AVR udviklingsboard - AVR-batch - AVR-programmer Shield - WinAVR
Atmel-type Udviklingsboard - ATMega328 - ATTiny2313A - ATTiny24A - ATTiny45 - ATTiny461 - ATTiny48
I2C Moduler Arduino Display - Arduino DS1307 RTC - Arduino IO Expander - Arduino magnetisk kompas - Frekvensmodul - I2C barometer - I2C Display - I2C Lommeregner - I2C strain gauge - I2C tastatur - I2C-RF-modtager - IR Fjernbetjening - Mikrofon som Undervisningsudstyr


Arduino-Modul-Oversigt
Arduino Generelt: Biblioteker - Board - Driver - Shield - Arduino Analog - Arduino Seriel

Arduino-typer: Arduino UNO - Arduino Nano - Arduino Pro Mini - Arduino MEGA 2560 - LiliyPad Mikrocontroller - Arduino DUE - WeMOS

Input-moduler Trådløse: Bluetooth - Transceiver modul - WiFi Modul - SMS Modul - I2C-RF-modtager - RF Link - GPRS/GSM - GSM_Modul

Sensorer: GPS - Strøm-sensor - I2C Humidity - Lys og Nærhed - Magnetisk Kompas - I2C barometer - Farvegenkendelsesmodul - Alkoholsensor - Accelerometer - I2C Accelerometer - I2C Gyroskop - Vejecelleforstærker - IR Distance - AC Strømsensor - Afstand - XY Joystick - Humidity - Tryksensor - Vindhastighedsmåler
Photo og IR: IR Fjernbetjening - Photo Interrupter - IR Modtager - Bevægelsescensor - Photo Refleks Sensor - VGA Kamera
Power: Power Adapter - Lithium Batteri
Lager: SD Kort
Konvertere: I2C AD-konverter
Funktionsmoduler: RFID-modul - Matrix tastatur - DS1307 RTC - ENC28J60 Ethernet - IO Expander
Touch Display: Touch Display

Output-moduler Trådløse: Bluetooth - RF Link - GPRS/GSM - Transceiver modul - WiFi Modul - SMS Modul

Display: Display Shield - Touch Display - Arduino Display - Nokia 5110 Display - Dot-Matrix - Lys-avis - I2C Display
Funktionsmoduler: Lydgiver - Lydmodul - Relæ modul - Audio Power Forstærker - ENC28J60 Ethernet - Peltier Element - IO Expander
Hukommelse: SD Kort
Motorer: Stepper Motor Driver - Stepper med Accelleration - Servo

I2C-Moduler Funktionsmoduler: DS1307 RTC - I2C-RF-modtager - I2C tastatur

Sensorer: I2C Humidity - Magnetisk Kompas - I2C barometer - I2C Accelerometer - I2C Gyroskop
Konvertere: I2C AD-konverter
Display: I2C Display