Ein Magnetometer dient der Messung magnetischer Flussdichten B. Die Einheit von B ist Tesla. Das Erdmagnetfeld besitzt zum Beispiel in etwa eine Stärke von 40 µT, wohingegen starke Magnete (Neodym) Flussdichten bis in den Bereich von 1 T aufweisen können.
Zur Messung der Flussdichte bedient man sich eines sog. Hallsensors. Fließt ein Strom durch den Hallsensor und ist dieser einem Magnetfeld B ausgesetzt, so wirkt auf die bewegten Elektronen die sog. Lorentzkraft. Diese sorgt dafür, dass zwischen den Seiten des Hallsensors eine Spannung (die sog. Hallspannung) auftritt. Diese ist proportional zu B. Misst man sie, so kann auf die Flussdichte B geschlossen werden.
Variante 1: Messung sehr kleiner Flussdichten
Mit dem Sensor HMC5883L lassen sich sehr schwache Magnetfelder (z.B. das Erdmagnetfeld) messen. Angezeigt wird die Flussdichte in x-, y- und z-Richtung und bei horizontaler Ausrichtung des Messgeräts der Positionswinkel (Norden = 0°, Osten = 90°, Süden = 180°, Westen = 270°).
Arduino-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
#include <Wire.h> #include <HMC5883L.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG pin 5 HMC5883L compass; int i; float x_sum, y_sum, z_sum; float x,y,z; float x_offset, y_offset; float Winkel; // ==================== // ====== SETUP ======= // ==================== void setup() { Wire.begin(); Serial.begin(9600); //compass = HMC5883L(); lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.setCursor(2,0); lcd.print("Magnetfeld-"); lcd.setCursor(4,1); lcd.print("Sensor"); delay(3000); lcd.setCursor(2,0); lcd.print(" "); lcd.setCursor(4,1); lcd.print(" "); lcd.setCursor(2,0); lcd.print("Einheiten:"); lcd.setCursor(0,1); lcd.print("10-6 T bzw. grad"); delay(4000); lcd.setCursor(2,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,0); lcd.print("x:"); lcd.setCursor(9,0); lcd.print("y:"); lcd.setCursor(0,1); lcd.print("z:"); lcd.setCursor(9,1); lcd.print("W:"); Serial.println("Setting scale to +/- 1.3Ga"); int error = compass.SetScale(1.3); // Mögliche Bereiche: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1 Gauss if(error != 0) Serial.println(compass.GetErrorText(error)); Serial.println("Setting measurement mode to continuous"); error = compass.SetMeasurementMode(Measurement_Continuous); if(error != 0) Serial.println(compass.GetErrorText(error)); Serial.println("x: y: z: Total: Winkel:"); x = 0; y = 0; z = 0; Winkel = 0; // offset-Werte // ------------ x_offset = 2.44; y_offset = 13.15; } // ============================ // ====== HAUPTSCHLEIFE ======= // ============================ void loop() { MagnetometerRaw raw = compass.ReadRawAxis(); x_sum = 0; y_sum = 0; z_sum = 0; // Mittelwertsbildung: // ------------------- for (i = 1; i < 6; i++) { x_sum += raw.XAxis; // Einheit milligauss y_sum += raw.YAxis; // Einheit milligauss z_sum += raw.ZAxis; // Einheit milligauss } x = (x_sum / 50.0) + x_offset; // Mittelwert Einheit µT y = (y_sum / 50.0) + y_offset; // Mittelwert Einheit µT z = (z_sum / 50.0); // Mittelwert Einheit µT // Winkelberechnung // ---------------- Winkel = atan2(-x,y); if(Winkel < 0) Winkel += 2 * PI; // um ins Intervall [0,360] zu kommen Winkel = Winkel * (180/PI); // Umwandlung von rad in Grad Serial.print(x); Serial.print(" "); Serial.print(y); Serial.print(" "); Serial.print(z); Serial.print(" "); Serial.print(sqrt(x*x + y*y + z*z)); Serial.print(" "); Serial.println(Winkel); lcd.setCursor(2,0); lcd.print(" "); lcd.setCursor(11,0); lcd.print(" "); lcd.setCursor(2,1); lcd.print(" "); lcd.setCursor(11,1); lcd.print(" "); lcd.setCursor(2,0); lcd.print(x,1); lcd.setCursor(11,0); lcd.print(y,1); lcd.setCursor(2,1); lcd.print(z,1); lcd.setCursor(11,1); lcd.print(Winkel,0); delay(200); } |
Variante 2: Messung mittlerer Flussdichten
Für mittelgroße Flussdichten bis 0.08 T eignet sich der analoge Hallsensor SS495A. Bei einer Versorgungsspannung von 5V liefert dieser ohne Magnetfeld eine Ausgangsspannung von 2.5V. Bei 0.08T steigt die Ausgangsspannung auf 4.5V, bei -0.08T sinkt sie auf 0.5V. Man kann mit diesem Sensor also auch direkt die Polarität des Magnetfelds bestimmen.
Arduino-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
// ============================================================ // ==== Programm zur Messung der magnetischen Flussdichte B === // ============================================================ #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,16,2); // ACHTUNG: set the LCD address to 0x20 or 0x27 for a 16 chars and 2 line display!!! // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG Pin 5 // Hallsensor - ANAALOG Pin 1 float sensorValue = 0; // variable to store the value coming from the sensor connected to A1 float B; // variable for the magnetic flux density B void setup() { Serial.begin(9600); lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0,0); lcd.print("Flussdichte"); lcd.setCursor(0,1); lcd.print("B = "); } void loop() { sensorValue = analogRead(A1); // read the value from the sensor sensorValue = (sensorValue/1023.0) * 5.0; // Eingangsspannung in Volt B = 0.04 * sensorValue - 0.1; // Flussdichte in Tesla /* Serial.print("B = " ); Serial.println(B, 4); */ // Ausgabe auf dem LCD-Schirm // ========================== lcd.setCursor(4,1); lcd.print(" "); lcd.setCursor(4,1); lcd.print(B,3); lcd.setCursor(11,1); lcd.print("T"); delay(200); } |
Für mittlere Flussdichten bis zu +/- 25 mT besitze ich noch einen weiteren Hallsensor und zwar den MLX90290. Diesen habe ich dankenswerterweise von der Firma AS Electronic (https://as-electronic.net/MLX90290LUA-AAA-532) gratis zur Verfügung gestellt bekommen, vielen Dank dafür.
Die dazugehörige Arduinoschaltung ist sehr simpel:
Experiment:
Den MLX90290 habe ich konkret dafür verwendet, um die Abhängigkeit des Magnetfelds B(r) eines Würfelmagneten vom Abstand r zu ermitteln. Dazu habe ich den Hallsensor im Abstand r zum Magneten postiert und die Flussdichte gemessen. Vom Coulombgesetz wissen wir, dass die elektrische Feldstärke einer Punktladung mit 1/r² abnimmt. Doch mit welcher Potenz nimmt das Magnetfeld ab?
Das axiale Magnetfeld einer Leiterschleife nimmt für größere Abstände konkret mit 1/r³ ab:
Hier der gesamte experimentelle Aufbau zur Bestimmung der Flussdichte eines Würfelmagneten in Abhängigkeit vom Abstand r:
Um die Potenz n zu ermitteln bedienen wir uns eines einfachen Tricks. Wir logarithmieren die angesetzte Gleichung B(r) = a /r ^n. Tragen wir nun ln(B) in Abhängigkeit von ln(r) auf, so müssten wir eine fallende Gerade erhalten. Ihr Anstieg k entspricht dann genau der gesuchten Potenz n:
Meine experimentellen Ergebnisse liegen in der Tat sehr schön auf einer Geraden. Ihr Anstieg k beträgt konkret – 2.63. Demnach ergibt sich folgendes Abstandsgesetz für das Magnetfeld: B(r) = a / r ^2.63.
Arduino-Code für den Hallsensor MLX90290:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!! // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG pin 5 float voltage; float B; float offset; // =========================== // ======= SETUP ========= // =========================== void setup() { Serial.begin(9600); lcd.begin(); // initialize the lcd lcd.backlight(); lcd.setCursor(0,0); lcd.print("Teslam. MLX90290"); lcd.setCursor(0,1); lcd.print("max. 20 mT"); delay(3000); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); //offset = analogRead(A1) * 5.0 / 1023.0; // offset in Volt: Bei B = 0 müsste dieser Vcc/2, also 2.5V betragen offset = 2.5; } // =========================== // ======= LOOP ========= // =========================== void loop() { voltage = 0.0; for(int i = 1; i <= 20;i++) { voltage = voltage + analogRead(A1) * 5.0 / 1023.0; // Eingangsspannung in Volt //Serial.println(analogRead(A1)); } voltage = voltage / 20.0; /* Serial.println(voltage, 3); delay(100); */ B = (voltage - offset) * 10.0; // Umrechnung U[Volt] in B[mT]: 1 mT ergibt eine Spannung von 100 mV, daher 10 mT genau 1 V //Serial.println(voltage); lcd.setCursor(0,0); lcd.print("B = "); lcd.print(B,2); lcd.print(" mT "); delay (400); } |
Variante 3: Messung großer Flussdichten
Mit dem Hallsensor CYSJ362A lassen sich sehr starke Magnetfelder bis hin zu 3 T messen. Zum Betrieb des Sensors bzw. Arduino benötigt man allerdings 2 separate Spannungsversorgungen. Ich verwende zwei 9V-Batterien. Mit einer 9V-Batterie und dem Spannungswandler 7805 wird der Hallsensor mit 5V versorgt, mit der zweiten 9V-Batterie wird der Arduino und das Display betrieben.
Arduino-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x3F,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!! // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG pin 5 float voltage; float B; // =========================== // ======= SETUP ========= // =========================== void setup() { Serial.begin(9600); lcd.init(); // initialize the lcd lcd.backlight(); lcd.setCursor(0,0); lcd.print(" Teslameter"); lcd.setCursor(0,1); lcd.print(" max. 3 Tesla"); delay(3000); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); } // =========================== // ======= LOOP ========= // =========================== void loop() { voltage = analogRead(A0) * 5.0 / 1023.0; // Eingangsspannung in Volt B = voltage / 1.5; // Umrechnung U[Volt] in B[Tesla] //Serial.println(voltage); lcd.setCursor(0,0); lcd.print("B = "); lcd.print(B,2); lcd.print(" T "); delay (100); } |