Difference between revisions of "Externer Magnetfeldsensor"

From phyphox
Jump to navigation Jump to search
 
(12 intermediate revisions by 2 users not shown)
Line 2: Line 2:
 
  | Name = Externer Magnetfeldsensor
 
  | Name = Externer Magnetfeldsensor
 
  | Category = Arduino library experiments
 
  | Category = Arduino library experiments
  | Sensors = Magentic Field
+
  | Sensors = 49e
 
}}
 
}}
  
Line 8: Line 8:
 
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!).
 
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!).
  
[[File:SpulenBFeld.jpg|Sensor]]
+
<gallery widths=500px heights=300px>
 
+
File:SpulenBFeld.jpg|Aufbau
[[File:B_Sensor2.jpg|Sensor]]
+
File:B_Sensor2.jpg|Sensor
 
+
</gallery>
 
 
 
 
  
 
Das grüne Kabel unten im Bild ist ein Relikt eines anderen Versuchs und hat hier keine Bewandtnis.
 
Das grüne Kabel unten im Bild ist ein Relikt eines anderen Versuchs und hat hier keine Bewandtnis.
Line 21: Line 19:
  
 
==Aufbau==
 
==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:
+
Bei B = 0 beträgt die vom Halsensor (49e) ausgegebene Spannung die Hälfte der dort angelegten Spannung. Somit ist die Differenz zwischen Ausgegebener Spannung und halber angelegter Spannung Proportional zum Magnetfeld:
  
 
V_out-V_DD∼B.
 
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.  
+
Die Steigung der Geraden beträgt ca. (3 V)/(200 mT). Die ADCs des ESP32 haben 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
 
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.
 
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. Eine passende Formel findet sich auf dem unten verlinkten Arbeitsblatt. Diese Kalibrierung kann einfach mit einer Spule bekannter Geometrie und Windungszahl durchgeführt werden. Bei Programm unten beträgt der Faktor deshalb 0,0492.
+
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. Eine passende Formel findet sich auf dem unten verlinkten Arbeitsblatt. Diese Kalibrierung kann dann mit einer Spule bekannter Geometrie und Windungszahl durchgeführt werden. Beim Programm unten beträgt der Faktor deshalb 0,0492.
 
Zu guter Letzt wird noch eine Mittelwertbildung über 37 Werte vorgenommen. Auch dies lässt sich natürlich individuell anpassen.
 
Zu guter Letzt wird noch eine Mittelwertbildung über 37 Werte vorgenommen. Auch dies lässt sich natürlich individuell anpassen.
  
Line 44: Line 42:
  
 
<pre>
 
<pre>
 +
/* ////////////////////////////////////////////////////////////////////////////
 +
  phyphox ESP32 for hall sensor E49
 +
  This program reads out the simple analog values and sends them to phyphox.
 +
  TODO: Calibration option
 +
  AUTHOR: Torsten Klaffs
 +
  LICENSE: CC0
 +
*/
 +
 +
#include <phyphoxBle.h>
  
#include <phyphoxBle.h>
+
// Der Hall Sensor ist verbunden mit GPIO PIN 2
 +
const int hallPin = 27;
  
int AnalogPin=27;
+
// Weitere Defintionen
float Messwert;
+
float hallValue;
float Offset;
+
float meanHallValue;
float Magnetfeld;
+
float magneticField;
 +
int meanCount = 37;
 +
float offset = 0;
  
 
void setup() {
 
void setup() {
    PhyphoxBLE::start("Magnetfeldsensor_01");               //Start the BLE server
+
  PhyphoxBLE::start("ESP32 Hall-Sensor 01");       // Bluetooth-Name
  
//Experiment
+
  // Defintion des Experimentesa
    PhyphoxBleExperiment experiment;
+
  PhyphoxBleExperiment e49;
 +
  e49.setTitle("Hall-Sensor");
 +
  e49.setCategory("ESP32 Experiment");
  
    experiment.setTitle("Magnetfeld");
+
  // Views (Tabs in der App)
    experiment.setCategory("Arduino Experiments");
+
  PhyphoxBleExperiment::View firstView;
    experiment.setDescription("Plot the magnetic field of a Hall sensor over time.");
+
  firstView.setLabel("Rohdaten");
  
    //View
+
  // Graph (ein einzelner Graph)
    PhyphoxBleExperiment::View view;
+
  PhyphoxBleExperiment::Graph firstGraph;
 +
  firstGraph.setLabel("Stärke Magnetfeld");
 +
  firstGraph.setUnitX("s");
 +
  firstGraph.setUnitY("mT");
 +
  firstGraph.setLabelX("Zeit");
 +
  firstGraph.setLabelY("Magnetfeld");
 +
  firstGraph.setChannel(0, 1);
  
    //Value
+
  // Value (zeige Wert, hier den letzten gesendeten)
//    PhyphoxBleExperiment::Value Value1;    
+
  PhyphoxBleExperiment::Value firstValue;
//    Value1.setLabel("B = ");                          
+
  firstValue.setLabel("Magnetfeld");
//    Value1.setUnit("mT");                    
+
  firstValue.setUnit("mT");
//    Value1.setChannel(1);
+
  firstValue.setPrecision(0);
 +
  firstValue.setChannel(1);
  
    //Graph
+
  // Export derDaten
    PhyphoxBleExperiment::Graph graph;
+
  PhyphoxBleExperiment::ExportSet dataSet;       //Provides exporting the data to excel etc.
    graph.setLabel("B over time");
+
  dataSet.setLabel("Data Set");
    graph.setUnitX("s");
+
  PhyphoxBleExperiment::ExportData exportData;
    graph.setUnitY("mT");
+
  exportData.setLabel("Data Export");
    graph.setLabelX("time");
+
  exportData.setDatachannel(1);
    graph.setLabelY("B");
 
 
    view.addElement(graph);                //Attach graph to view
 
  
//   view.addElement(Value1);
+
  // Experiment zusammen stellen
    experiment.addView(view);               //Attach view to experiment
+
  firstView.addElement(firstGraph);
    PhyphoxBLE::addExperiment(experiment); //Attach experiment to server
+
  firstView.addElement(firstValue);
 +
  e49.addView(firstView);
 +
  dataSet.addElement(exportData);
 +
  e49.addExportSet(dataSet);
 +
  PhyphoxBLE::addExperiment(e49);
  
//Offsetkorrektur
+
  // Offsetkorrektur
   Offset=0;
+
   /*
   for(int i=0;i<7;i++){
+
   for(int i=0; i<100; i++) {
     Offset+=analogRead(AnalogPin);
+
     offset += analogRead(hallPin);
 
     delay(10);
 
     delay(10);
 
   }
 
   }
   Offset=Offset/7;
+
   offset = offset/100;
 
+
  */
 
}
 
}
  
 
void loop() {
 
void loop() {
 +
  // Mittelwert über "meanCount" Werte bilden, um Rauschen zu minimieren
 +
  hallValue = 0;
 +
  for (int i = 0; i < meanCount; i++) {
 +
    hallValue = hallValue + analogRead(hallPin);
 +
    delay(5);
 +
  }
  
   Messwert=0;
+
   // Genauen Wert ausrechnen
   for(int i=0;i<37;i++){
+
   meanHallValue = (hallValue / meanCount);
    Messwert+=analogRead(AnalogPin);
+
  magneticField = (meanHallValue - 2048) * 0.049; //if offset = fixes
delay(10);
+
   //magneticField = (meanHallValue - offset) * (-0.0492); //if offset korrektion at startup enabled
   }
+
 
  Messwert=Messwert/37;
+
  // Daten senden
+
  PhyphoxBLE::write(magneticField);
Magnetfeld=(Messwert-Offset)*(-0.0492);
 
PhyphoxBLE::write(Magnetfeld);
 
// delay(50);
 
 
}
 
}
 +
</pre>
  
 
==Arbeitsmaterialien==
 
==Arbeitsmaterialien==
Ein mögliches Schülerarbeitsblatt (aktuelle Sicherheitsrichtlinien nach RISU beachten!): [[AB_Magnetfeldsensor_Spule.pdf|Sensor]]
+
Ein mögliches Schülerarbeitsblatt (aktuelle Sicherheitsrichtlinien nach RISU beachten!)
 +
Das folgende Material ist im Rahmen einer Lehrerfortbildung im Jahre 2022 in Niedersachsen entstanden. Es richtet sich an Physiklehrkräfte, also Fachleute. Jede Lehrkraft ist selbst dafür verantwortlich, die aktuell geltenden sicherheitsrichtlinien nach RISU einzuhalten und im Vorfeld selbst eine Gefährdungsbeurteilung zu schreiben. Der Autor dieses Materials übernimmt keinerlei Haftung für Schäden, die bei der Anwendung entstehen.
 +
 
 +
[[file:AB_Magnetfeldsensor_Spule.pdf]]
 
[[Category:Arduino library experiments]]
 
[[Category:Arduino library experiments]]

Latest revision as of 12:11, 25 March 2024

Externer Magnetfeldsensor
Experiment Externer Magnetfeldsensor
Category Arduino library experiments
Used sensors 49e


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 vom Halsensor (49e) ausgegebene Spannung die Hälfte der dort 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 haben 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. Eine passende Formel findet sich auf dem unten verlinkten Arbeitsblatt. Diese Kalibrierung kann dann mit einer Spule bekannter Geometrie und Windungszahl durchgeführt werden. Beim Programm unten beträgt der Faktor deshalb 0,0492. Zu guter Letzt wird noch eine Mittelwertbildung über 37 Werte vorgenommen. Auch dies lässt sich natürlich individuell anpassen.

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.

/* ////////////////////////////////////////////////////////////////////////////
  phyphox ESP32 for hall sensor E49
  This program reads out the simple analog values and sends them to phyphox.
  TODO: Calibration option
  AUTHOR: Torsten Klaffs
  LICENSE: CC0
*/

#include <phyphoxBle.h>

// Der Hall Sensor ist verbunden mit GPIO PIN 2
const int hallPin = 27;

// Weitere Defintionen
float hallValue;
float meanHallValue;
float magneticField;
int meanCount = 37;
float offset = 0;

void setup() {
  PhyphoxBLE::start("ESP32 Hall-Sensor 01");       // Bluetooth-Name

  // Defintion des Experimentesa
  PhyphoxBleExperiment e49;
  e49.setTitle("Hall-Sensor");
  e49.setCategory("ESP32 Experiment");

  // Views (Tabs in der App)
  PhyphoxBleExperiment::View firstView;
  firstView.setLabel("Rohdaten");

  // Graph (ein einzelner Graph)
  PhyphoxBleExperiment::Graph firstGraph;
  firstGraph.setLabel("Stärke Magnetfeld");
  firstGraph.setUnitX("s");
  firstGraph.setUnitY("mT");
  firstGraph.setLabelX("Zeit");
  firstGraph.setLabelY("Magnetfeld");
  firstGraph.setChannel(0, 1);

  // Value (zeige Wert, hier den letzten gesendeten)
  PhyphoxBleExperiment::Value firstValue;
  firstValue.setLabel("Magnetfeld");
  firstValue.setUnit("mT");
  firstValue.setPrecision(0);
  firstValue.setChannel(1);

  // Export derDaten
  PhyphoxBleExperiment::ExportSet dataSet;       //Provides exporting the data to excel etc.
  dataSet.setLabel("Data Set");
  PhyphoxBleExperiment::ExportData exportData;
  exportData.setLabel("Data Export");
  exportData.setDatachannel(1);

  // Experiment zusammen stellen
  firstView.addElement(firstGraph);
  firstView.addElement(firstValue);
  e49.addView(firstView);
  dataSet.addElement(exportData);
  e49.addExportSet(dataSet);
  PhyphoxBLE::addExperiment(e49);

  // Offsetkorrektur
  /*
  for(int i=0; i<100; i++) {
    offset += analogRead(hallPin);
    delay(10);
  }
  offset = offset/100;
  */
}

void loop() {
  // Mittelwert über "meanCount" Werte bilden, um Rauschen zu minimieren
  hallValue = 0;
  for (int i = 0; i < meanCount; i++) {
    hallValue = hallValue + analogRead(hallPin);
    delay(5);
  }

  // Genauen Wert ausrechnen
  meanHallValue = (hallValue / meanCount);
  magneticField = (meanHallValue - 2048) * 0.049; //if offset = fixes
  //magneticField = (meanHallValue - offset) * (-0.0492); //if offset korrektion at startup enabled

  // Daten senden
  PhyphoxBLE::write(magneticField);
}

Arbeitsmaterialien

Ein mögliches Schülerarbeitsblatt (aktuelle Sicherheitsrichtlinien nach RISU beachten!) Das folgende Material ist im Rahmen einer Lehrerfortbildung im Jahre 2022 in Niedersachsen entstanden. Es richtet sich an Physiklehrkräfte, also Fachleute. Jede Lehrkraft ist selbst dafür verantwortlich, die aktuell geltenden sicherheitsrichtlinien nach RISU einzuhalten und im Vorfeld selbst eine Gefährdungsbeurteilung zu schreiben. Der Autor dieses Materials übernimmt keinerlei Haftung für Schäden, die bei der Anwendung entstehen.

File:AB Magnetfeldsensor Spule.pdf