Die Hardware
Zum Bauen des Kompass benötigt man das HMC5883L Magnetometer (hier auf Amazon
) und einen Arduino/Mikrocontroller mit I2C, beispielsweise einen preiswerten Arduino Nano Klon (hier auf Amazon
). Leider konnte ich kein Magnetometer finden, welches schon verlötet war, weshalb, auch bei dem Verlinktem, ein Lötkolben (meine Lötstation auf amzon.de) notwendig ist.
Die Verkabelung mit dem Arduino ist simpel, da die Kontakte auf der Rückseite beschriftet sind. SDA muss mit dem SDA Pin des Arduino verbunden werden, SCL mit SCL, GND mit dem Ground und entweder VCC mit +3.3V oder VCC_+5V mit +5V.
Der Sensor sollte direkt ins Breadboard gesteckt werden, da er so immer gleich liegt. Ansonsten könnte es zu einer Verfälschung der Messung kommen.
Zum Auslesen des Sensors, für den es auch ein Modell von Adafruit gibt, hat Adafruit eine extra Bibliothek erstellt, welche jedoch mit allen HMC5883L Modulen funktioniert. Diese kann man direkt über den Library Manager nachladen (Adafruit HMC5883 Unified). Zusätzlich benötigt man noch die Adafruit Unified Sensor Bibliothek, welche man sich auch über den Library Manager herunterladen kann.Die Verkabelung mit dem Arduino ist simpel, da die Kontakte auf der Rückseite beschriftet sind. SDA muss mit dem SDA Pin des Arduino verbunden werden, SCL mit SCL, GND mit dem Ground und entweder VCC mit +3.3V oder VCC_+5V mit +5V.
Der Sensor sollte direkt ins Breadboard gesteckt werden, da er so immer gleich liegt. Ansonsten könnte es zu einer Verfälschung der Messung kommen.
Der Sketch
Wenn man nach dem Download der Bibliotheken auf Datei > Beispiele > Adafruit HMC5883 Unified klickt, sieht man einen passenden Beispielsketch für den Sensor, welchen man einfach nur auf den Arduino hochladen muss.
Hier der Sketch zum Durchlesen:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************************************** | |
This is a library example for the HMC5883 magnentometer/compass | |
Designed specifically to work with the Adafruit HMC5883 Breakout | |
http://www.adafruit.com/products/1746 | |
*** You will also need to install the Adafruit_Sensor library! *** | |
These displays use I2C to communicate, 2 pins are required to interface. | |
Adafruit invests time and resources providing this open source code, | |
please support Adafruit andopen-source hardware by purchasing products | |
from Adafruit! | |
Written by Kevin Townsend for Adafruit Industries with some heading example from | |
Love Electronics (loveelectronics.co.uk) | |
This program is free software: you can redistribute it and/or modify | |
it under the terms of the version 3 GNU General Public License as | |
published by the Free Software Foundation. | |
This program is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
GNU General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with this program. If not, see <http://www.gnu.org/licenses/>. | |
***************************************************************************/ | |
#include <Wire.h> | |
#include <Adafruit_Sensor.h> | |
#include <Adafruit_HMC5883_U.h> | |
/* Assign a unique ID to this sensor at the same time */ | |
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345); | |
void displaySensorDetails(void) | |
{ | |
sensor_t sensor; | |
mag.getSensor(&sensor); | |
Serial.println("------------------------------------"); | |
Serial.print ("Sensor: "); Serial.println(sensor.name); | |
Serial.print ("Driver Ver: "); Serial.println(sensor.version); | |
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); | |
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT"); | |
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT"); | |
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT"); | |
Serial.println("------------------------------------"); | |
Serial.println(""); | |
delay(500); | |
} | |
void setup(void) | |
{ | |
Serial.begin(9600); | |
Serial.println("HMC5883 Magnetometer Test"); Serial.println(""); | |
/* Initialise the sensor */ | |
if(!mag.begin()) | |
{ | |
/* There was a problem detecting the HMC5883 ... check your connections */ | |
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!"); | |
while(1); | |
} | |
/* Display some basic information on this sensor */ | |
displaySensorDetails(); | |
} | |
void loop(void) | |
{ | |
/* Get a new sensor event */ | |
sensors_event_t event; | |
mag.getEvent(&event); | |
/* Display the results (magnetic vector values are in micro-Tesla (uT)) */ | |
Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" "); | |
Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" "); | |
Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT"); | |
// Hold the module so that Z is pointing 'up' and you can measure the heading with x&y | |
// Calculate heading when the magnetometer is level, then correct for signs of axis. | |
float heading = atan2(event.magnetic.y, event.magnetic.x); | |
// Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location. | |
// Find yours here: http://www.magnetic-declination.com/ | |
// Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians | |
// If you cannot find your Declination, comment out these two lines, your compass will be slightly off. | |
//float declinationAngle = 0.22; | |
//heading += declinationAngle; | |
// Correct for when signs are reversed. | |
if(heading < 0) | |
heading += 2*PI; | |
// Check for wrap due to addition of declination. | |
if(heading > 2*PI) | |
heading -= 2*PI; | |
// Convert radians to degrees for readability. | |
float headingDegrees = heading * 180/M_PI; | |
Serial.print("Heading (degrees): "); Serial.println(headingDegrees); | |
delay(500); | |
} |
Keine Kommentare:
Kommentar veröffentlichen
Mit dem Veröffentlichen eines Kommentars erklären Sie sich mit unserer Datenschutzerklärung einverstanden.
https://michaelsarduino.blogspot.de/p/datenschutzerklarung.html