Externer Magnetfeldsensor
Experiment | Externer Magnetfeldsensor |
---|---|
Category | Arduino library experiments |
Used sensors | Magentic Field |
Magnetfeldern von Permanentmagneten oder stromdurchflossenen Spulen lassen sich mit den in Smartphones integrierten Magnetfeldsensoren praktisch nicht messen. Das liegt daran, dass die eingebauten Sensoren für sehr schwache Magnetfelder ausgelegt sind, um eine Kompassfunktion zu ermöglichen. In der Regel geht der Messbereich bis maximal 5 mT.
Möchte man z. B. das Magnetfeld einer Spule entlang der Spulenachse ausmessen, muss der Messbereich eine Größenordnung darüberliegen. Im Folgenden Versuch wird mittels eines Hallsensors (Typ 49e) ein einfach zu benutzender Magnetfeldsensor verwendet, der auch von Oberstufenschülern selbst gebaut werden kann (aktuelle Sicherheitsrichtlinien nach RISU beachten!).
Das grüne Kabel unten im Bild ist ein Relikt eines anderen Versuchs und hat hier keine Bewandtnis.
Die Platine kann man mit dickem (Kurzschlussgefahr!) dppelseitigen Klebeband aufs ESP-Board kleben. Als Packaging hat sich transparenter Schumpfschlauch bewährt.
Aufbau
Bei B = 0 beträgt die ausgegebene Spannung die Hälfte der angelegten Spannung. Somit ist die Differenz zwischen Ausgegebener Spannung und halber angelegter Spannung Proportional zum Magnetfeld:
V_out-V_DD∼B.
Die Steigung der Geraden beträgt ca. (3 V)/(200 mT). Die ADCs des ESP32 eine Auflösung von 12 Bit. Bei einer anliegenden Spannung U wird somit der Zahlenwert Messwert= U/(3,3 V)⋅4096 herausgegeben. In unserer Schaltung liegt die Ausgangsspannung am Pin 27 des ESP32 an. Dieser gibt den eben erläuterten zur Spannung proportionalen Messwert als Zahl heraus. Die magnetische Feldstärke berechnet sich dann zu
B=(Messwert-4096/2)⋅(200 mT)/4096=(Messwert-2048)⋅0,049 mT.
Da die vorliegende Werte meist etwas driften, wird zu Beginn des Programms wird eine Offsetkorrektur vorgenommen. Das bei Einschalten des Sensors anliegende B-Feld wird als null angenommen. Die Steigung (Faktor 0,049 in Gleichung oben) muss in der Regel individuell an den Sensor angepasst werden. Diese Kalibrierung kann einfach mit einer Spule bekannter Geometrie und Windungszahl durchgeführt werden. Bei Programm unten beträgt der Faktor deshalb 0,0492.
V_out geht an Pin 27, + an 3,3 V und – an Gnd. Der Hallsensor wurde hier noch nach oben gebogen, da so z. B. das Magnetfeld einer Spule vermessen werden kann. Um das Rauschen zu verringern, empfiehlt es sich, die Vout-Leitung mit einem 10-kOhm-Widerstand auf Masse zu ziehen.
Das grüne Kabel unten im Bild ist ein Relikt eines anderen Versuchs und hat hier keine Bewandtnis. Die Platine kann man mit dickem (Kurzschlussgefahr!) doppelseitigen Klebeband aufs ESP-Board kleben. Als Packaging hat sich transparenter Schumpfschlauch bewährt.
Programmierung
Der ESP32 wird über die Arduino IDE programmiert. Es müssen die Definitionen für den ESP32 und die phyphox-Bibliothek installiert sein. Siehe dazu das Video unter Category: Arduino library experiments.
Es ist darauf zu achten, dass jeder ESP32 eine eigene Kennung hat (diese wird in PhyphoxBLE::start("Magnetfeldsensor_01") festgelegt). Anschließend kann über das Plus-Symbol in phyphox ein Bluetooth-Experiment hinzugefügt werden, das Experiment wird dann automatisch geladen.
#include <phyphoxBle.h> int AnalogPin=27; float Messwert; float Offset; float Magnetfeld; void setup() { PhyphoxBLE::start("Magnetfeldsensor_01"); //Start the BLE server //Experiment PhyphoxBleExperiment experiment; experiment.setTitle("Magnetfeld"); experiment.setCategory("Arduino Experiments"); experiment.setDescription("Plot the magnetic field of a Hall sensor over time."); //View PhyphoxBleExperiment::View view; //Value // PhyphoxBleExperiment::Value Value1; // Value1.setLabel("B = "); // Value1.setUnit("mT"); // Value1.setChannel(1); //Graph PhyphoxBleExperiment::Graph graph; graph.setLabel("B over time"); graph.setUnitX("s"); graph.setUnitY("mT"); graph.setLabelX("time"); graph.setLabelY("B"); view.addElement(graph); //Attach graph to view // view.addElement(Value1); experiment.addView(view); //Attach view to experiment PhyphoxBLE::addExperiment(experiment); //Attach experiment to server //Offsetkorrektur Offset=0; for(int i=0;i<7;i++){ Offset+=analogRead(AnalogPin); delay(10); } Offset=Offset/7; } void loop() { Messwert=0; for(int i=0;i<37;i++){ Messwert+=analogRead(AnalogPin); delay(10); } Messwert=Messwert/37; Magnetfeld=(Messwert-Offset)*(-0.0492); PhyphoxBLE::write(Magnetfeld); // delay(50); }