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