Donnerstag, 1. August 2013

HMC5883L Sensor ohne (externe) Library auslesen mit dem Arduino

HMC5883L_auf_Breadboard
HMC5883 Magnet Sensor auf dem Breadboard Shield.

Letztes Jahr habe ich bereits darüber geschrieben, allerdings keinen Code dazu gepostet. Ich habe nur beschrieben, was mit der Library verändert werden musste, damit diese funktioniert. Diesmal hatte ich Zeit, um mich etwas näher damit zu befassen und konnte nun endlich ein funktionales Beispiel schreiben. Um den Code fürs erste übersichtlich zu halten, habe ich das Skalieren und das Berechnen nach Norden ausgelassen.

// Wird für die I²C Verbindung verwendet.
#include <Wire.h>
// Adresse des Sensors
#define sensor_address 0x1E
// Variabelen die für den Lese Vorgang benötigt werden
byte data[6];
int axisX;
int axisY;
int axisZ;
// Konfiguration der Seriellen Verbindung und Initialisierung des Sensors.
void setup()
{
  Serial.begin(9600);
  Serial.println("Init Sensor");
  // I²C Verbindung starten.
  Wire.begin();
  // Operating Mode (0x02):
  // Continuous-Measurement Mode (0x00)
  SetConfiguration(0x02, 0x00);
  // Standard Skalierung, siehe ggf. Datenblatt
  // +- 1.3 Ga, 1090 Gain(LSb/Gauss)
  SetConfiguration(0x01, 0x20);
}
// Hauptschleife
void loop()
{
  // Rohdaten abrufen
  ReadMagnetic();
  // Zeige Roh Messwerte
  Serial.print("Raw Measurement: X ");
  Serial.print(axisX, DEC);
  Serial.print("\tY ");
  Serial.print(axisY, DEC);
  Serial.print("\tZ ");
  Serial.println(axisZ, DEC);
}
// Liest die Messwerte aus dem Magnet Sensor
void ReadMagnetic()
{
  Wire.beginTransmission(sensor_address);
  Wire.write(0x03);
  Wire.endTransmission();
  // Die Array Größe, die hier zu erwarten ist sind 6 Bytes.
  Wire.requestFrom(sensor_address, 6);
  // Die einzelnen Bytes werden nun gelesen
  // und in das Byte Array geschrieben

  for(int i = 0; i < 6; i++)
  {
    data[i] = Wire.read();
  }
  // 2 Bytes bilden zusammen einen Wert von 0 bis 65536.
  // Durch Byte Shifting lassen sich die Bytes zu einem Integer Wert zusammen fügen.

  axisX = (data[0] << 8) | data[1];
  axisY = (data[2] << 8) | data[3];
  axisZ = (data[4] << 8) | data[5];
}
// Legt die Konfiguration fest, mit dem Einstellungs Byte und
// dem Byte für die Einstellungsbereich.
void SetConfiguration(byte reg, byte setting)
{
  Wire.beginTransmission(sensor_address);
  Wire.write(reg);
  Wire.write(setting);
  Wire.endTransmission();
  Wire.requestFrom(sensor_address, 1);
  byte result = Wire.read();
 
// Das Ergebnis aus dem Senden gibt einen Wert zurück. Ist der Wert 0,
  //
war das senden fehlerhaft.
  Serial.print("Status: ");
  if(result != 0)
  {
    Serial.println("OK");
  }
  else
  {
    Serial.println("Failur");
  }
}

Funktionaler Programmcode für das Einlesen der der Rohdaten.

Eigentlich hatte ich vor, noch die Himmelsrichtung zu bestimmen, allerdings habe ich eine Webseite gefunden, die das bereits sehr gut erklärt (Love Elektronics - HMC5883L Compass Tutorial with Arduino Library).

Zuletzt noch ein Schaltbild, mit dem Arduino.

Arduino_HMC5883L_2_Steckplatine
Arduino –> HMC5883L
3,3V      –> VCC
GND     –> GND
A4         –> SDA
A5         –> SCL

Keine Kommentare: