Szukaj

HMC5883L - Trójosiowy magnetometr (kompas elektroniczny)

Kod:
hmc5883l
Waga: Help
2 g
Dostawca:

HMC5883L to trójosiowy magnetometr. Mierzy pole elektromagnetyczne w 3 różnych kierunkach. Jego głównym zastosowaniem jest praca jako elektroniczny kompas.

Produkt wycofany ze sprzedaży

Zastąpiony przez: Moduł 3-osiowego magnetometru I2C HMC5883L

  • Wymiary: W mm H mm
  • Waga: XXX g
  • Zasilanie: od 2.16 do 3.6 V
  • Pobór prądu: 100 uA w trybie pomiaru, 2 uA w trybie oczekiwania.
  • Standard stanów logicznych: Zależny od zasilania 2.4 lub 3.3 V
  • Komunikacja: Magistrala I2C (TWI)
  • Zakres pomiarowy: maksymalnie od -8 do 8 Gausów. Regulowany w 8 stopniach.
  • Rozdzielczość: 12 Bitów ze znakiem, 4096 jednostek (od -2048 do 2047)
  • Dokładność: od 0,00073 do 0,00435 Gausa na jednostkę
  • Dokładność jako kompas: od 1 do 2 stopni
  • Szybkość pomiaru: od 0.75 do 75 Hz
  • Możliwość sprzętowego uśrednienia 8 kolejnych wyników (eliminacja szumów)
  • Dokumentcja: xxxx

Opis wyprowadzeń:

  • GND - masa zasilania
  • VCC - zasilanie 2,4V lub 3,3V
  • SDA - sygnał danych magistrali I2C
  • SCL - sygnał zegara magistrali I2C

Podłączenie do Arduino:

  • Arduino Duemilanove: Piny 4 (SDA) i 5 (SCL) z grupy "ANALOG IN", piny 3V3 i GND z grupy "POWER"
  • Arduino UNO: Piny 4 (SDA) i 5 (SCL) z grupy "ANALOG IN", piny 3V3 i GND z grupy "POWER"
  • Arduino UNO R3: SDA, SCL w lewym górnym rogu, piny 3.3V i GND z grupy "POWER"
  • Arduino MEGA: piny 20 (SDA), 21 (SCL) z grupy pinów "COMMUNICATION", piny 3.3V i GND z grupy pinów "POWER". Czujnik wymaga podłączenia przez konwerter stanów logicznych (link).

Przykładowe podłączenie do Arduino UNO R3:

Program testowy:

#include <Wire.h>

// Adres czujnika w magistrali TWI
#define HMC_ADDR 0x1e

// Funkcja zapisujaca do rejestrow czujnika
void twiSetRegister(int address, byte reg, byte data)
{
  Wire.beginTransmission(address);
  Wire.write(reg);
  Wire.write(data);
  Wire.endTransmission();
  delay(5);
}

// Funkcja czytajaca rejestry czujnika
byte twiGetRegisters(int address, byte reg, byte *buffer, byte length)
{
  byte count = 0;
  
  Wire.beginTransmission(address);
  Wire.write(reg);
  Wire.endTransmission();
  
  Wire.beginTransmission(address);
  Wire.requestFrom(address, (int) length);
  while (Wire.available())
  {
    buffer[count] = Wire.read();
    count++;
  }
  Wire.endTransmission();
  
  return count;
}

// Wysyla wyniki pomiarow czujnika do komputera
void sendMeasurement()
{
  byte buffer[6];
  byte readed = twiGetRegisters(HMC_ADDR, 0x03, buffer, 6);
  if (readed != 6)
  {
    Serial.println(F("ERROR"));
  }
  else
  {
    int resultX = (int) word(buffer[0], buffer[1]);
    int resultZ = (int) word(buffer[2], buffer[3]);
    int resultY = (int) word(buffer[4], buffer[5]);
    
    float gX = resultX * 0.00256;
    float gY = resultY * 0.00256;
    float gZ = resultZ * 0.00256;

    Serial.print(gX);
    Serial.print(",");
    Serial.print(gY);
    Serial.print(",");
    Serial.print(gZ);
    Serial.println();
  }
}

void setup()
{
  Serial.begin(57600);
  Wire.begin();
  // Ustawienie 15 pomiarow na sekunde
  // Ustawienie usredniania 8 pomiarow
  // Ustawienie sztucznego, testowego, dodatniego pola magnetycznego
  twiSetRegister(HMC_ADDR, 0x00, 0x71);
  
  // Ustawienie czulosci +/- 4.7 Ga
  twiSetRegister(HMC_ADDR, 0x01, 0xa0);
  
  // Ustawienie trybu ciaglego pomiaru
  twiSetRegister(HMC_ADDR, 0x02, 0x00);
}

void loop()
{
  // Ustawienie sztucznego, testowego, dodatniego pola magnetycznego
  twiSetRegister(HMC_ADDR, 0x00, 0x71);
  // Oczekiwanie na wynik pomiaru
  delay(67);
  // Wyslanie wyniku do komputera
  Serial.print(F("PT="));
  sendMeasurement();
  
  // Ustawienie sztucznego, testowego, ujemnego pola magnetycznego
  twiSetRegister(HMC_ADDR, 0x00, 0x72);
  delay(67);
  Serial.print(F("NT="));
  sendMeasurement();
}

Jeśli czujnik jest prawidłowo podłączony i działa dobrze, to program powinien zwrócić do komputera wartości około 1.1 dla pomiarów testów dodatnich "PT" i około -1.1 dla pomiarów testów ujemnych "NT" dla każdej osi czujnika.

Program prezentujący normalne działanie czujnika:

#include <Wire.h>

// Adres czujnika w magistrali TWI
#define HMC_ADDR 0x1e

// Funkcja zapisujaca do rejestrow czujnika
void twiSetRegister(int address, byte reg, byte data)
{
  Wire.beginTransmission(address);
  Wire.write(reg);
  Wire.write(data);
  Wire.endTransmission();
  delay(5);
}

// Wysyla wyniki pomiarow czujnika do komputera
void sendMeasurement()
{
  byte buffer[6];
  // Czyta 6 rejestrow pomiarowych i zapisuje je w tablicy buffer
  byte readed = twiGetRegisters(HMC_ADDR, 0x03, buffer, 6); 
  if (readed != 6)
  {
    Serial.println(F("ERROR"));
  }
  else
  {
    // Przetwarza 8 bitowe dane z rejestrow na 16 bitowe cyfrowe wyniki pomiarow
    int resultX = (int) word(buffer[0], buffer[1]);
    int resultZ = (int) word(buffer[2], buffer[3]);
    int resultY = (int) word(buffer[4], buffer[5]);
    
    // Zamienia cyfrowe wyniki pomiarow na wyniki w jednostkach Gauss
    float gX = resultX * 0.00092;
    float gY = resultY * 0.00092;
    float gZ = resultZ * 0.00092;

    // Wysyla dane do komputera
    Serial.print("#MAG=");
    Serial.print(gX);
    Serial.print(",");
    Serial.print(gY);
    Serial.print(",");
    Serial.print(gZ);
    Serial.println();
  }
}

// Funkcja czytajaca rejestry czujnika
byte twiGetRegisters(int address, byte reg, byte *buffer, byte length)
{
  byte count = 0;
  
  Wire.beginTransmission(address);
  Wire.write(reg);
  Wire.endTransmission();
  
  Wire.beginTransmission(address);
  Wire.requestFrom(address, (int) length);
  while (Wire.available())
  {
    buffer[count] = Wire.read();
    count++;
  }
  Wire.endTransmission();
  
  return count;
}

void setup()
{
  Serial.begin(57600);
  Wire.begin();
  // Ustawienie trybu ciaglego pomiaru
  twiSetRegister(HMC_ADDR, 0x02, 0x00);
  
  // Ustawienie 75 pomiarow na sekunde
  twiSetRegister(HMC_ADDR, 0x00, 0x18);
}

void loop()
{
  sendMeasurement();
  delay(20);
}

Program odczytuje wartości pomiarów czujnika i przesyła je do komputera w formacie jednostek Gaussa dla każdej z osi.

Pliki

Gwarancja

Wszystkie zakupy na Nettigo są chronione 14-sto dniowym prawem do zwrotu. Bez zbędnych pytań.

Szczegółowe informacje o dostawie i zwrotach

Newsletter

Raz, góra dwa razy w miesiacu możesz otrzymać newsletter o nowościach w naszej ofercie, promocjach, a także porcję wiadomości ze świata DIY i Arduino.