Difference between revisions of "Magnetfeld und Beschleunigung"
(Created page with "{{Infobox Experiment | Name = Magnetfeld und Beschleunigung | Category = Arduino library experiments | Sensors = 49e, Arduino Nano 33 BLE (IMU) }} Magnetfeldern von Perman...") |
(→Aufbau) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
| Sensors = 49e, Arduino Nano 33 BLE (IMU) | | 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. | ||
+ | <gallery widths=500px heights=300px> | ||
+ | File:IMG 3254.jpg|Sensormodul | ||
+ | </gallery> | ||
==Aufbau== | ==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. Der 10-kOhm-Pulldown-Widerstand ist rückseitig verlötet. Der 49e-Hall-Sensor wurde mit Heißkleber verklebt. Bei der Verdrahtung ist streng darauf zu achten, Kurzschlüsse zu vermeiden. Zum Schutz wurde alles mit Schrumpfschlauch versiegelt. | |
− | |||
− | |||
− | |||
==Programmierung== | ==Programmierung== | ||
− | Der | + | 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 | + | Es ist darauf zu achten, dass jeder Nano 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= | + | 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(" | + | PhyphoxBLE::start("Nano33_Multi_1"); |
//Experiment | //Experiment | ||
PhyphoxBleExperiment experiment; | PhyphoxBleExperiment experiment; | ||
− | experiment.setTitle(" | + | experiment.setTitle("Nano33_Multi1_B"); |
experiment.setCategory("Arduino Experiments"); | experiment.setCategory("Arduino Experiments"); | ||
− | experiment.setDescription(" | + | experiment.setDescription("Magnetfeld, Beschleunigung, Gyro"); |
− | + | ||
− | PhyphoxBleExperiment::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 61: | Line 58: | ||
Value1.setUnit("mT"); | Value1.setUnit("mT"); | ||
Value1.setChannel(1); | Value1.setChannel(1); | ||
− | // | + | //Graphen |
− | PhyphoxBleExperiment::Graph | + | 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"); | |
− | experiment.addView( | + | 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 80: | Line 126: | ||
} | } | ||
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 89: | Line 153: | ||
} | } | ||
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( | + | delay(10); |
} | } | ||
</pre> | </pre> |
Latest revision as of 20:11, 13 November 2023
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.
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. Der 10-kOhm-Pulldown-Widerstand ist rückseitig verlötet. Der 49e-Hall-Sensor wurde mit Heißkleber verklebt. Bei der Verdrahtung ist streng darauf zu achten, Kurzschlüsse zu vermeiden. Zum Schutz wurde alles mit Schrumpfschlauch versiegelt.
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 Nano 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.