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

</div><div class="techdata"><ul>

  • 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
  • </ul> </div><div class="pinouts"><p>Opis wyprowadzeń:</p>

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

    </div><div class="connect"><p>Podłączenie do Arduino:</p>

    • 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:

    </div><div class="testcode"><p>Program testowy:</p>

    #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.

    </div><div class="workcode"><p>Program prezentujący normalne działanie czujnika:</p>

    #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.

    </div><div class="links"><p>Linki:</p>

    Pliki