Difference between revisions of "Luftkissenbahn und Federpendel"
Line 4: | Line 4: | ||
| Sensors = MPU-6050 | | Sensors = MPU-6050 | ||
}} | }} | ||
− | Sowohl beim Federpendel als auch bei Versuchen auf der Luftkissenbahn, wo man Beschleunigung und Abstand messen möchte, bietet sich eine Kombination aus Abstand- und Beschleunigungssensor an. Der Arduino Nano 33 BLE verfügt über einen eingebauten Beschleunigungssensor. Über den I2C-Bus lässt sich zusätzlich ein Time-of-Flight-Sensor anschließen, siehe https://phyphox.org/wiki/index.php/Distanzsensor_(Federpendel). So lassen sich beim Federschwinger die Elongation (millimetergenau) und die Beschleunigung des Schwingers gleichzeitig messen. Bei der Luftkissenbahn bekommt man das Weg-Zeit und das Beschleunigung-Zeit-Diagramm parallel in Echtzeit. | + | Sowohl beim Federpendel als auch bei Versuchen auf der Luftkissenbahn, wo man Beschleunigung und Abstand messen möchte, bietet sich eine Kombination aus Abstand- und Beschleunigungssensor an. Der Arduino Nano 33 BLE verfügt über einen eingebauten Beschleunigungssensor. Über den I2C-Bus lässt sich zusätzlich ein Time-of-Flight-Sensor anschließen, siehe https://phyphox.org/wiki/index.php/Distanzsensor_(Federpendel). So lassen sich beim Federschwinger die Elongation (millimetergenau) und die Beschleunigung des Schwingers gleichzeitig messen. Bei der Luftkissenbahn bekommt man so das Weg-Zeit und das Beschleunigung-Zeit-Diagramm parallel in Echtzeit. |
Beim Federpendel wird die Sensorbox unter den Schwinger geklettet. Der Abstand wird zum Tisch gemessen. Positive Beschleunigung geht hier also in negative z-Richtung (siehe Programmierung). schon eine leichte Verkippung des Sensors in den Rohdaten messbar ist, wird beim Einschalten oder Resetten des Sensors der Beschleunigungssensor auf Null tariert (Offsetmessung, siehe Programmierung). Auch der Abstand wird auf Null tariert. In zwei Views wird der Abstand untariert und tariert dargestellt. | Beim Federpendel wird die Sensorbox unter den Schwinger geklettet. Der Abstand wird zum Tisch gemessen. Positive Beschleunigung geht hier also in negative z-Richtung (siehe Programmierung). schon eine leichte Verkippung des Sensors in den Rohdaten messbar ist, wird beim Einschalten oder Resetten des Sensors der Beschleunigungssensor auf Null tariert (Offsetmessung, siehe Programmierung). Auch der Abstand wird auf Null tariert. In zwei Views wird der Abstand untariert und tariert dargestellt. |
Revision as of 20:10, 16 November 2023
Experiment | Luftkissenbahn und Federpendel |
---|---|
Category | Arduino library experiments |
Used sensors | MPU-6050 |
Sowohl beim Federpendel als auch bei Versuchen auf der Luftkissenbahn, wo man Beschleunigung und Abstand messen möchte, bietet sich eine Kombination aus Abstand- und Beschleunigungssensor an. Der Arduino Nano 33 BLE verfügt über einen eingebauten Beschleunigungssensor. Über den I2C-Bus lässt sich zusätzlich ein Time-of-Flight-Sensor anschließen, siehe https://phyphox.org/wiki/index.php/Distanzsensor_(Federpendel). So lassen sich beim Federschwinger die Elongation (millimetergenau) und die Beschleunigung des Schwingers gleichzeitig messen. Bei der Luftkissenbahn bekommt man so das Weg-Zeit und das Beschleunigung-Zeit-Diagramm parallel in Echtzeit.
Beim Federpendel wird die Sensorbox unter den Schwinger geklettet. Der Abstand wird zum Tisch gemessen. Positive Beschleunigung geht hier also in negative z-Richtung (siehe Programmierung). schon eine leichte Verkippung des Sensors in den Rohdaten messbar ist, wird beim Einschalten oder Resetten des Sensors der Beschleunigungssensor auf Null tariert (Offsetmessung, siehe Programmierung). Auch der Abstand wird auf Null tariert. In zwei Views wird der Abstand untariert und tariert dargestellt.
Da ein Gyroskop sowieso mit verbaut ist, lässt sich eine Messung zur Zentrifugalbeschleunigung (siehe https://phyphox.org/wiki/index.php/Drehrate_und_Beschleunigung) auch gleich noch mit in view3 interieren.
Aufbau
Die Verkabelung des Sensors ist wieder wie üblich: 3-6V – 3V3, Gnd – Gnd, SCL – A5, SDA –A4. Als Stromversorgung dient hier ein schalbarer 4,5-V-Batteriehalter, auf den der Nano mit Pilzkopfband geklettet wird. Der ToF-Sensor wurde mit etwas Heißkleber auf den Nano neben das Kommunikationsmodul geklebt.
Programmierung
Der Arduino Nano 33 BLE wird über die Arduino IDE programmiert. Es müssen die Definitionen für den Nano und die phyphox-Bibliothek installiert sein. Siehe dazu das Video unter Category: Arduino library experiments.
Möchte man mehrere Sensoren basteln, ist darauf zu achten, dass jeder eine eigene Kennung hat (diese wird in PhyphoxBLE::start("DistanceGyroAcceleration_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> #include <Wire.h> #include <VL53L1X.h> #include <Arduino_LSM9DS1.h> float x ,y ,z, OffsetX, OffsetY, OffsetZ, Beschleunigung, az, OffsetS, Elong, Distance, ZentrifugalBeschl, wx, wy, wz, Drehrate; VL53L1X sensor; void setup() { PhyphoxBLE::start("DistanceGyroAcceleration"); //Start the BLE server //Experiment PhyphoxBleExperiment experiment; experiment.setTitle("Abstand"); experiment.setCategory("Arduino Experiments"); experiment.setDescription("Abstand, Beschleunigung und Drehrate für Federschwinger, Luftkissenbahn und Drehschleuder"); //Views PhyphoxBleExperiment::View view1; view1.setLabel("az, s - Offset"); PhyphoxBleExperiment::View view2; view2.setLabel("az, s"); PhyphoxBleExperiment::View view3; view3.setLabel("Zentrifugal, Drehrate"); //Graph PhyphoxBleExperiment::Graph graph1; graph1.setLabel("Elongation"); graph1.setUnitX("s"); graph1.setUnitY("mm"); graph1.setLabelX("t"); graph1.setLabelY("s"); graph1.setChannel(0,1); PhyphoxBleExperiment::Graph graph2; graph2.setLabel("Beschleunigung"); graph2.setUnitX("s"); graph2.setUnitY("m/s2"); graph2.setLabelX("t"); graph2.setLabelY("a"); graph2.setChannel(0,2); PhyphoxBleExperiment::Graph graph3; graph3.setLabel("Abstand"); graph3.setUnitX("s"); graph3.setUnitY("mm"); graph3.setLabelX("t"); graph3.setLabelY("s"); graph3.setChannel(0,3); PhyphoxBleExperiment::Graph graph4; graph4.setLabel("Beschleunigung"); graph4.setUnitX("s"); graph4.setUnitY("m/s2"); graph4.setLabelX("t"); graph4.setLabelY("az"); graph4.setChannel(0,2); PhyphoxBleExperiment::Graph graph5; //axy von omega_res graph5.setLabel("Zentrifugalbeschleunigung"); 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("t"); graph6.setLabelY("omega_xyz"); graph6.setChannel(0, 5); PhyphoxBleExperiment::Graph graph7; //axy von omega_res graph7.setLabel("Zentrifugalbeschleunigung"); graph7.setLabelX("axy"); graph7.setUnitX("s"); graph7.setUnitY("m/s2"); graph7.setLabelX("t"); graph7.setLabelY("axy"); graph7.setChannel(0, 4); experiment.addView(view1); view1.addElement(graph1); view1.addElement(graph2); experiment.addView(view2); view2.addElement(graph3); view2.addElement(graph4); experiment.addView(view3); view3.addElement(graph5); view3.addElement(graph6); view3.addElement(graph7); PhyphoxBLE::addExperiment(experiment); //Attach experiment to server Wire.begin(); while (!sensor.init()) delay(100); sensor.setTimeout(500); sensor.setDistanceMode(VL53L1X::Short); sensor.setMeasurementTimingBudget(20000); sensor.startContinuous(20); IMU.begin(); //Beschleunigungssensor starten delay(250); //Nach dem der Knopf geedrückt wird, muss sich das Ding kurz beruhigen // Offsetkorrektur Beschleunigung for(int i=0;i<100;i++){ IMU.readAcceleration(x, y, z); OffsetX += x; OffsetY += y; OffsetZ += z; OffsetS += sensor.read(); delay(10); } OffsetX=OffsetX/100; OffsetY=OffsetY/100; OffsetZ=OffsetZ/100; OffsetS=OffsetS/100; } void loop() { Distance = sensor.read(); Elong = Distance - OffsetS; IMU.readAcceleration(x, y, z); Beschleunigung =-9.81*(z- OffsetZ); ZentrifugalBeschl = 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 PhyphoxBLE::write(Elong, Beschleunigung, Distance, ZentrifugalBeschl, Drehrate); //Send value to phyphox delay(10); }