MAG3110 - 3-osiowy magnetometr cyfrowy I2C

MAG3110

Opis MAG3110

MAG3110 - jest trzyosiowym czujnikiem pola magnetycznego, który można wykorzystać m.in. jako sensor ziemskiego pola magnetycznego (kompas).

Sensor ten charakteryzuje się niewielkimi rozmiarami, niskim poborem energii oraz prostą obsługą.

Specyfikacja:

  • Napięcie zasilania: od 1.95V do 3.6V
  • Osie detekcji: X, Y, Z
  • Interfejs komunikacyjny: I2C (TWI) - adres 0x0E
  • Zakres pomiarowy: ± 1000 µT
  • Dokładność pomiaru: 0,10 µT
  • Wymiary płytki: 37 x 16  mm

Wyprowadzenia

Czujnik posiada cztery wyprowadzenia typu goldpin - raster 2,54 mm, co umożliwia bezpośrednie wpięcie w płytkę stykową.

Nazwa Opis
VCC Napięcie zasilania modułu w zakresie 1.95 V do 3.6 V.
GND Masa układu.
SCL Linia zegarowa magistrali I2C (TWI).
SDA Linia danych magistrali I2C (TWI).

 

Szczegóły dostępne w dokumentacji.

MAG3110 + Arduino

MAG3110 - kompas cyfrowy

Znajomość wartości ziemskiego pola magnetycznego (wektor X i wektor Y) pozwala na określenie bieżącego kierunku południka magnetycznego, a tym samym uzyskanie cyfrowego kompasu. Kierunek południka magnetycznego można obliczyć z prostej zależności:

kierunek_pomiaru (rad) = atan( wektor_y, wektor_x );

Aby  poprawnie wyznaczyć kierunek, konieczne jest również uwzględnienie czynnika błędu - deklinacji magnetycznej. Deklinacja magnetyczna spowodowana jest zarówno położeniem bieguna magnetycznego Ziemi w innym miejscu niż biegun geograficzny oraz zróżnicowanymi warunkami magnetycznymi w miejscu pomiaru.
Deklinacja magnetyczna dla Bielska-Białej wynosi plus 4 stopnie i 59 minut (wschód). Wartość tą należy przeliczyć na radiany:

kąt_deklinacji = (stopnie + (minuty / 60.0)) / (180 / Pi);
kąt_deklinacji = (4.0 + (59.0 / 60.0)) / (180 / Pi);

 

#include<Wire.h>

// MAG3110 I2C address is 0x0E(14)
#define Addr 0x0E

void setup() 
{
  // Initialise I2C communication as MASTER 
  Wire.begin();
  // Initialise serial communication, set baud rate = 9600
  Serial.begin(9600);
  
  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select control register-1
  Wire.write(0x10);
  // Set active mode enabled
  Wire.write(0x01);
  // Stop I2C Transmission
  Wire.endTransmission();
  delay(300);
}

void loop() 
{
  unsigned int data[6];
  
  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select data register
  Wire.write(0x01);
  // Stop I2C Transmission
  Wire.endTransmission();

  // Request 6 bytes of data
  Wire.requestFrom(Addr, 6);

  // Read 6 bytes of data
  // xMag lsb, xMag msb, yMag lsb, y Mag msb, zMag lsb, zMag msb
  if(Wire.available() == 6)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
    data[2] = Wire.read();
    data[3] = Wire.read();
    data[4] = Wire.read();
    data[5] = Wire.read();
  }
 
  // Convert the data
  int xMag = ((data[1] * 256) + data[0]);
  int yMag = ((data[3] * 256) + data[2]);
  int zMag = ((data[5] * 256) + data[4]);
  
  float heading = atan2(yMag, xMag);
 
  // Ustawienie kata deklinacji dla Bielska-Bialej
  // Formula: (deg + (min / 60.0)) / (180 / M_PI);
  float declinationAngle = (4.0 + (59.0 / 60.0)) / (180 / M_PI);
  heading += declinationAngle;
 
  // Korekta katow
  if (heading < 0)
  {
    heading += 2 * PI;
  }
 
  if (heading > 2 * PI)
  {
    heading -= 2 * PI;
  }
 
  // Zamiana radianow na stopnie
  float headingDegrees = heading * 180/M_PI;
 
  // Output
  Serial.print(" Heading = ");
  Serial.print(heading);
  Serial.print(" Degress = ");
  Serial.print(headingDegrees);
  Serial.println();
 
  delay(100);
 
  delay(100);
}

 

Istotnym problemem magnetometru jest nierównomierny pomiar pola magnetycznego w zakresie od 1° ÷ 180° oraz od 180° ÷ 360°. Dla pierwszego przedziału nasz magnetometr będzie generował przekłamane wyniki od 1° ÷ 240°, natomiast dla drugiego od 240° ÷ 360°.

Opracowano na podstawie: http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-magnetometr-hmc5883l.html

 

 

Zbudowano na Drupalu