Difference between revisions of "Magnetfeld und Beschleunigung"

From phyphox
Jump to navigation Jump to search
Line 10: Line 10:
 
https://phyphox.org/wiki/index.php/Drehrate_und_Beschleunigung .
 
https://phyphox.org/wiki/index.php/Drehrate_und_Beschleunigung .
  
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.
+
Für die genaue Beschreibung wird also auf die oberen beiden Links verwiesen. Zu erwähnen ist aber Folgendes:
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!).
+
 
 +
Obwohl der Drehratensensor die Werte in Winkelgrad pro Sekunde ausgeben sollte, musste ein Korrekturfaktor ins Programm, um vernünftige Messwerte zu bekommen.
 +
In den drei Views wären mehr Datenkanäle wünschenswert gewesen. Die Bibliothek erlaubt aber maximal fünf.
  
 
<gallery widths=500px heights=300px>
 
<gallery widths=500px heights=300px>
Line 24: Line 26:
  
 
==Aufbau==
 
==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:
+
siehe
 
+
https://phyphox.org/wiki/index.php/Externer_Magnetfeldsensor
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.
+
https://phyphox.org/wiki/index.php/Drehrate_und_Beschleunigung .
  
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.
+
Der Signal-Pin des Hall-Sensors ist an den Arduino-Pin A6 gelötet.
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==
 
==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]].
+
Der Arduino Nano 33 BLE wird über die Arduino IDE programmiert. Es müssen die Definitionen für den Nano 33 BLE 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.
+
Es ist darauf zu achten, dass jeder Nao eine eigene Kennung hat (diese wird in ''PhyphoxBLE::start("Nano33_Multi_1")'' festgelegt). Anschließend kann über das Plus-Symbol in phyphox ein Bluetooth-Experiment hinzugefügt werden, das Experiment wird dann automatisch geladen.
  
 
<pre>
 
<pre>
 +
#include <Arduino_LSM9DS1.h>
 
#include <phyphoxBle.h>
 
#include <phyphoxBle.h>
int AnalogPin=27;
+
int AnalogPin=A6; //Pin Hall-Sensor
float Messwert;
+
float Messwert,x ,y ,z, OffsetX, OffsetY, OffsetZ, wx, wy, wz;
float Magnetfeld;
+
float Magnetfeld, Beschleunigung, Drehrate;
 
float Offset;
 
float Offset;
 
void setup() {
 
void setup() {
PhyphoxBLE::start("Magnetfeldsensor_01");
+
PhyphoxBLE::start("Nano33_Multi_1");
 
//Experiment
 
//Experiment
 
PhyphoxBleExperiment experiment;
 
PhyphoxBleExperiment experiment;
experiment.setTitle("Magnetfeld");
+
experiment.setTitle("Nano33_Multi1_B");
 
experiment.setCategory("Arduino Experiments");
 
experiment.setCategory("Arduino Experiments");
experiment.setDescription("Plot the magnetic field over time.");
+
experiment.setDescription("Magnetfeld, Beschleunigung, Gyro");
//View
+
 
PhyphoxBleExperiment::View view;
+
PhyphoxBleExperiment::View view1;
 +
view1.setLabel("Magnetfeld");
 +
PhyphoxBleExperiment::View view2;
 +
view2.setLabel("Beschleunigung");
 +
PhyphoxBleExperiment::View view3;
 +
view3.setLabel("a von omega");
 
//Value
 
//Value
 
PhyphoxBleExperiment::Value Value1;
 
PhyphoxBleExperiment::Value Value1;
Line 66: Line 64:
 
Value1.setUnit("mT");
 
Value1.setUnit("mT");
 
Value1.setChannel(1);
 
Value1.setChannel(1);
//Graph
+
//Graphen
PhyphoxBleExperiment::Graph graph;
+
PhyphoxBleExperiment::Graph graph1; //B
graph.setLabel("B over time");
+
graph1.setLabel("B - Offset");
graph.setUnitX("s");
+
graph1.setUnitX("s");
graph.setUnitY("mT");
+
graph1.setUnitY("mT");
graph.setLabelX("time");
+
graph1.setLabelX("time");
graph.setLabelY("B");
+
graph1.setLabelY("B");
graph.setChannel(0,1);
+
graph1.setChannel(0,1);
view.addElement(graph);
+
PhyphoxBleExperiment::Graph graph2; //ax
view.addElement(Value1);
+
graph2.setLabel("ax");
experiment.addView(view);
+
graph2.setUnitX("s");
 +
graph2.setUnitY("g");
 +
graph2.setLabelX("time");
 +
graph2.setLabelY("ax");
 +
graph2.setChannel(0,2);
 +
PhyphoxBleExperiment::Graph graph3; //ay
 +
graph3.setLabel("az");
 +
graph3.setUnitX("s");
 +
graph3.setUnitY("g");
 +
graph3.setLabelX("time");
 +
graph3.setLabelY("az");
 +
graph3.setChannel(0,3);
 +
PhyphoxBleExperiment::Graph graph4; //az
 +
graph4.setLabel("|a_res| aus ax und ay - Offset");
 +
graph4.setUnitX("s");
 +
graph4.setUnitY("m/s2");
 +
graph4.setLabelX("time");
 +
graph4.setLabelY("axy");
 +
graph4.setChannel(0,4);
 +
PhyphoxBleExperiment::Graph graph5; //axy von omega_res
 +
graph5.setLabel("|a_res| von omega_res");
 +
graph5.setLabelX("axy");
 +
graph5.setUnitX("1/s");
 +
graph5.setUnitY("m/s2");
 +
graph5.setLabelX("omega_xyz");
 +
graph5.setLabelY("axy");
 +
graph5.setStyle("dots");
 +
graph5.setChannel(5, 4);
 +
 
 +
PhyphoxBleExperiment::Graph graph6;
 +
graph6.setLabel("Res. Drehrate");
 +
graph6.setLabelX("omega_xyz");
 +
graph6.setUnitX("s");
 +
graph6.setUnitY("1/s");
 +
graph6.setLabelX("time");
 +
graph6.setLabelY("omega_xyz");
 +
graph6.setChannel(0, 5);
 +
 
 +
view1.addElement(graph1);
 +
view1.addElement(Value1);
 +
view2.addElement(graph2);
 +
view2.addElement(graph3);
 +
view2.addElement(graph4);
 +
view3.addElement(graph5);
 +
view3.addElement(graph6);
 +
view3.addElement(graph4);
 +
experiment.addView(view1);
 +
experiment.addView(view2);
 +
experiment.addView(view3);
 
PhyphoxBLE::addExperiment(experiment);
 
PhyphoxBLE::addExperiment(experiment);
//Offsetkorrektur
+
 
 +
//Offsetkorrektur Magnetfeld
 
Offset=0;
 
Offset=0;
 
for(int i=0;i<100;i++){
 
for(int i=0;i<100;i++){
Line 85: Line 132:
 
}
 
}
 
Offset=Offset/100;
 
Offset=Offset/100;
 +
 +
IMU.begin(); //Beschleunigungssensor starten
 +
// Offsetkorrektur Beschleunigung
 +
for(int i=0;i<100;i++){
 +
  IMU.readAcceleration(x, y, z);
 +
  OffsetX += x;
 +
  OffsetY += y;
 +
  OffsetZ += z;
 +
  delay(10);
 +
}
 +
OffsetX=OffsetX/100;
 +
OffsetY=OffsetY/100;
 +
OffsetZ=OffsetZ/100;
 +
 
Serial.begin(38400);
 
Serial.begin(38400);
 
}
 
}
 
void loop() {
 
void loop() {
Messwert=0;
+
IMU.readAcceleration(x, y, z);
 +
Beschleunigung = 9.81 * sqrt(sq(x - OffsetX) + sq(y - OffsetY));
 +
IMU.readGyroscope(wx, wy, wz);
 +
Drehrate = 1.1148*6.28318530718*(sqrt(sq(wx) + sq(wy) + sq(wz))) / 360; //Kalibrierung Plattenspieler
 +
Messwert=0;//Magnetfeld mitteln
 
for(int i=0;i<7;i++){
 
for(int i=0;i<7;i++){
 
Messwert+=analogRead(AnalogPin);
 
Messwert+=analogRead(AnalogPin);
Line 94: Line 159:
 
}
 
}
 
Messwert=Messwert/7;
 
Messwert=Messwert/7;
Magnetfeld=(Messwert-Offset)*(-0.0492); //Kalibrierung überprüfen
+
Magnetfeld=(Messwert-Offset)*(-0.0492)*40/9; //Kalibrierung überprüfen
PhyphoxBLE::write(Magnetfeld);
+
PhyphoxBLE::write(Magnetfeld,x ,z, Beschleunigung, Drehrate); //leider nur 5 channels
 
Serial.println(Magnetfeld);
 
Serial.println(Magnetfeld);
delay(50);
+
delay(10);
 
}
 
}
 
</pre>
 
</pre>

Revision as of 17:18, 13 November 2023

Magnetfeld und Beschleunigung
Experiment Magnetfeld und Beschleunigung
Category Arduino library experiments
Used sensors 49e, Arduino Nano 33 BLE (IMU)

Der Arduino Nano 33 BLE verfügt über einen internen Beschleunigungs- und Drehratensensor. Außerdem ist er schlank genug, mit direkt aufgelötetem Hall-Sensor in spulen eingeführt zu werden. Somit lässt sich ein kleines, kompaktes Multi-Sensormodul daraus bauen, also eine Kombination aus

https://phyphox.org/wiki/index.php/Externer_Magnetfeldsensor

https://phyphox.org/wiki/index.php/Drehrate_und_Beschleunigung .

Für die genaue Beschreibung wird also auf die oberen beiden Links verwiesen. Zu erwähnen ist aber Folgendes:

Obwohl der Drehratensensor die Werte in Winkelgrad pro Sekunde ausgeben sollte, musste ein Korrekturfaktor ins Programm, um vernünftige Messwerte zu bekommen. In den drei Views wären mehr Datenkanäle wünschenswert gewesen. Die Bibliothek erlaubt aber maximal fünf.

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

siehe https://phyphox.org/wiki/index.php/Externer_Magnetfeldsensor

https://phyphox.org/wiki/index.php/Drehrate_und_Beschleunigung .

Der Signal-Pin des Hall-Sensors ist an den Arduino-Pin A6 gelötet.

Programmierung

Der Arduino Nano 33 BLE wird über die Arduino IDE programmiert. Es müssen die Definitionen für den Nano 33 BLE und die phyphox-Bibliothek installiert sein. Siehe dazu das Video unter Category: Arduino library experiments.

Es ist darauf zu achten, dass jeder Nao eine eigene Kennung hat (diese wird in PhyphoxBLE::start("Nano33_Multi_1") festgelegt). Anschließend kann über das Plus-Symbol in phyphox ein Bluetooth-Experiment hinzugefügt werden, das Experiment wird dann automatisch geladen.

#include <Arduino_LSM9DS1.h>
#include <phyphoxBle.h>
int AnalogPin=A6; //Pin Hall-Sensor
float Messwert,x ,y ,z, OffsetX, OffsetY, OffsetZ, wx, wy, wz;
float Magnetfeld, Beschleunigung, Drehrate;
float Offset;
void setup() {
PhyphoxBLE::start("Nano33_Multi_1");
//Experiment
PhyphoxBleExperiment experiment;
experiment.setTitle("Nano33_Multi1_B");
experiment.setCategory("Arduino Experiments");
experiment.setDescription("Magnetfeld, Beschleunigung, Gyro");

PhyphoxBleExperiment::View view1;
view1.setLabel("Magnetfeld");
PhyphoxBleExperiment::View view2;
view2.setLabel("Beschleunigung");
PhyphoxBleExperiment::View view3;
view3.setLabel("a von omega");
//Value
PhyphoxBleExperiment::Value Value1;
Value1.setLabel("B = ");
Value1.setUnit("mT");
Value1.setChannel(1);
//Graphen
PhyphoxBleExperiment::Graph graph1; //B
 graph1.setLabel("B - Offset");
 graph1.setUnitX("s");
 graph1.setUnitY("mT");
 graph1.setLabelX("time");
 graph1.setLabelY("B");
 graph1.setChannel(0,1);
PhyphoxBleExperiment::Graph graph2; //ax
 graph2.setLabel("ax");
 graph2.setUnitX("s");
 graph2.setUnitY("g");
 graph2.setLabelX("time");
 graph2.setLabelY("ax");
 graph2.setChannel(0,2);
PhyphoxBleExperiment::Graph graph3; //ay
 graph3.setLabel("az");
 graph3.setUnitX("s");
 graph3.setUnitY("g");
 graph3.setLabelX("time");
 graph3.setLabelY("az");
 graph3.setChannel(0,3);
PhyphoxBleExperiment::Graph graph4; //az
 graph4.setLabel("|a_res| aus ax und ay - Offset");
 graph4.setUnitX("s");
 graph4.setUnitY("m/s2");
 graph4.setLabelX("time");
 graph4.setLabelY("axy");
 graph4.setChannel(0,4);
PhyphoxBleExperiment::Graph graph5; //axy von omega_res
 graph5.setLabel("|a_res| von omega_res");
 graph5.setLabelX("axy");
 graph5.setUnitX("1/s");
 graph5.setUnitY("m/s2");
 graph5.setLabelX("omega_xyz");
 graph5.setLabelY("axy");
 graph5.setStyle("dots");
 graph5.setChannel(5, 4);

PhyphoxBleExperiment::Graph graph6;
 graph6.setLabel("Res. Drehrate");
 graph6.setLabelX("omega_xyz");
 graph6.setUnitX("s");
 graph6.setUnitY("1/s");
 graph6.setLabelX("time");
 graph6.setLabelY("omega_xyz");
 graph6.setChannel(0, 5);

view1.addElement(graph1);
view1.addElement(Value1);
view2.addElement(graph2);
view2.addElement(graph3);
view2.addElement(graph4);
view3.addElement(graph5);
view3.addElement(graph6);
view3.addElement(graph4);
experiment.addView(view1);
experiment.addView(view2);
experiment.addView(view3);
PhyphoxBLE::addExperiment(experiment);

//Offsetkorrektur Magnetfeld
Offset=0;
for(int i=0;i<100;i++){
Offset+=analogRead(AnalogPin);
delay(10);
}
Offset=Offset/100;

IMU.begin(); //Beschleunigungssensor starten
// Offsetkorrektur Beschleunigung
 for(int i=0;i<100;i++){
  IMU.readAcceleration(x, y, z);
  OffsetX += x;
  OffsetY += y;
  OffsetZ += z;
  delay(10);
 }
 OffsetX=OffsetX/100;
 OffsetY=OffsetY/100;
 OffsetZ=OffsetZ/100;

Serial.begin(38400);
}
void loop() {
IMU.readAcceleration(x, y, z);
 Beschleunigung = 9.81 * sqrt(sq(x - OffsetX) + sq(y - OffsetY));
IMU.readGyroscope(wx, wy, wz);
 Drehrate = 1.1148*6.28318530718*(sqrt(sq(wx) + sq(wy) + sq(wz))) / 360; //Kalibrierung Plattenspieler
Messwert=0;//Magnetfeld mitteln
for(int i=0;i<7;i++){
Messwert+=analogRead(AnalogPin);
delay(10);
}
Messwert=Messwert/7;
Magnetfeld=(Messwert-Offset)*(-0.0492)*40/9; //Kalibrierung überprüfen
PhyphoxBLE::write(Magnetfeld,x ,z, Beschleunigung, Drehrate); //leider nur 5 channels
Serial.println(Magnetfeld);
delay(10);
}

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