Difference between revisions of "Drehrate und Beschleunigung"
(7 intermediate revisions by 2 users not shown) | |||
Line 4: | Line 4: | ||
| Sensors = MPU-6050 | | Sensors = MPU-6050 | ||
}} | }} | ||
− | |||
− | |||
− | |||
Auch wenn man für viele Beschleunigungsexperimente prinzipiell den im Smartphone verbauten Beschleunigungs- und Drehratensensor verwenden könnte, macht auch hier ein externer Sensor sehr viel Sinn: | Auch wenn man für viele Beschleunigungsexperimente prinzipiell den im Smartphone verbauten Beschleunigungs- und Drehratensensor verwenden könnte, macht auch hier ein externer Sensor sehr viel Sinn: | ||
Line 15: | Line 12: | ||
3. Sensoren wie der hier verwendete MPU-6050 sind günstig, gut und dank der I2C-Bus-Schnittstelle sehr einfach zu verlöten. | 3. Sensoren wie der hier verwendete MPU-6050 sind günstig, gut und dank der I2C-Bus-Schnittstelle sehr einfach zu verlöten. | ||
− | Hier soll der Sensor für Beschleunigungsmessungen auf der Luftkissenbahn sowie für Drehraten- und Zentrifugalbeschleunigungsmessungen eingesetzt werden. Aus diesem Grund ist das Programm so aufgebaut, dass der Sensor die Resultierende aus ax und ay sowie die Resultierende Drehrate aller drei Achsen übermittelt. Direkt nach dem Starten oder einem Reset muss der Sensor einige Sekunden ruhen. Während dieser Zeit wird die Beschleunigung auf null Tariert. So wird die Erdbeschleunigung | + | Hier soll der Sensor für Beschleunigungsmessungen auf der Luftkissenbahn sowie für Drehraten- und Zentrifugalbeschleunigungsmessungen eingesetzt werden. Aus diesem Grund ist das Programm so aufgebaut, dass der Sensor die Resultierende aus ax und ay sowie die Resultierende Drehrate aller drei Achsen übermittelt. Direkt nach dem Starten oder einem Reset muss der Sensor einige Sekunden ruhen. Während dieser Zeit wird die Beschleunigung auf null Tariert. So wird die Erdbeschleunigung herausgerechnet, falls der Sensor schief liegt. Der Sensor funktioniert so gut, dass aus den Parabeln im 3. Graph millimetergenau der Radius zur Dreachse ermittelt werden kann. Wichtig ist, dass der Sensor entweder in der Drehebene liegt oder ggf. schief mit x-Richtig radial ausgerichtet, wie auf dem folgenden Foto. |
+ | <gallery widths=500px heights=400px> | ||
+ | File:Drehrate.jpg|Aufbau | ||
+ | File:Drehrate_2.jpg|Aufbau mit Schumpfschlauch und Klettband | ||
+ | </gallery> | ||
==Aufbau== | ==Aufbau== | ||
Die Verkabelung des Sensors ist wieder wie üblich: 3V3 – Vin, Gnd – Gnd, SCL – 22, | Die Verkabelung des Sensors ist wieder wie üblich: 3V3 – Vin, Gnd – Gnd, SCL – 22, | ||
− | SDA –21. Als Stromversorgung dient hier einfach eine kleine Powerbank. Der MPU-6050 wurde mit etwas Heißkleber auf den ESP32 neben das | + | SDA –21. Als Stromversorgung dient hier einfach eine kleine Powerbank, auf die der ESP32 mit Doppelseitigem Klebeband befestigt wird. Der MPU-6050 wurde mit etwas Heißkleber auf den ESP32 neben das Kommunikationsmodul geklebt und am Ende alles mit Schrumpfschlauch versiegelt. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==Programmierung== | ==Programmierung== | ||
Line 34: | Line 29: | ||
<pre> | <pre> | ||
+ | #include <Adafruit_MPU6050.h> | ||
+ | #include <Adafruit_Sensor.h> | ||
+ | #include <Wire.h> | ||
#include <phyphoxBle.h> | #include <phyphoxBle.h> | ||
− | + | Adafruit_MPU6050 mpu; | |
− | + | ||
− | + | float Beschleunigung = 0; | |
− | + | float Drehrate = 0; | |
− | + | float ZeroX = 0; | |
− | + | float ZeroY = 0; | |
− | |||
− | |||
− | |||
− | //Experiment | + | void setup(void) { |
+ | PhyphoxBLE::start("Beschleunigungssensor"); | ||
+ | |||
+ | //Experiment | ||
PhyphoxBleExperiment experiment; | PhyphoxBleExperiment experiment; | ||
− | experiment.setTitle(" | + | experiment.setTitle("Beschleunigungssensor"); |
experiment.setCategory("Arduino Experiments"); | experiment.setCategory("Arduino Experiments"); | ||
− | experiment.setDescription("Plot the | + | experiment.setDescription("Plot the acceleration over time."); |
//View | //View | ||
PhyphoxBleExperiment::View view; | PhyphoxBleExperiment::View view; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | view.addElement(graph); //Attach graph to view | + | //Graph |
+ | PhyphoxBleExperiment::Graph graph1; | ||
+ | graph1.setLabel("Beschleunigung"); | ||
+ | graph1.setUnitX("s"); | ||
+ | graph1.setUnitY("m/s2"); | ||
+ | graph1.setLabelX("time"); | ||
+ | graph1.setLabelY("ax"); | ||
+ | graph1.setChannel(0,1); | ||
+ | |||
+ | //Graph | ||
+ | PhyphoxBleExperiment::Graph graph2; | ||
+ | graph2.setLabel("Drehrate"); | ||
+ | graph2.setUnitX("s"); | ||
+ | graph2.setUnitY("1/s"); | ||
+ | graph2.setLabelX("time"); | ||
+ | graph2.setLabelY("omega"); | ||
+ | graph2.setChannel(0,2); | ||
+ | |||
+ | |||
+ | PhyphoxBleExperiment::Graph graph3; | ||
+ | graph3.setLabel("Beschleunigung"); | ||
+ | graph3.setUnitX("1/s"); | ||
+ | graph3.setUnitY("m/s2"); | ||
+ | graph3.setLabelX("omega"); | ||
+ | graph3.setLabelY("ax"); | ||
+ | graph3.setStyle("dots"); | ||
+ | graph3.setChannel(2,1); | ||
+ | |||
+ | |||
+ | view.addElement(graph1); //Attach graph to view | ||
+ | view.addElement(graph2); //Attach graph to view | ||
+ | view.addElement(graph3); //Attach graph to view | ||
experiment.addView(view); //Attach view to experiment | experiment.addView(view); //Attach view to experiment | ||
PhyphoxBLE::addExperiment(experiment); //Attach experiment to server | PhyphoxBLE::addExperiment(experiment); //Attach experiment to server | ||
− | + | mpu.begin(); | |
− | + | mpu.setAccelerometerRange(MPU6050_RANGE_4_G); | |
− | + | mpu.setGyroRange(MPU6050_RANGE_1000_DEG); | |
− | + | mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); | |
− | + | delay(1000); | |
− | + | ||
− | + | //Offsetkorrektur | |
− | + | ZeroX=0; | |
+ | ZeroY=0; | ||
+ | for(int i=0;i<7;i++){ | ||
+ | sensors_event_t a, g, temp; | ||
+ | mpu.getEvent(&a, &g, &temp); | ||
+ | ZeroX+=a.acceleration.x; | ||
+ | ZeroY+=a.acceleration.y; | ||
+ | delay(10); | ||
+ | } | ||
+ | ZeroX=ZeroX/7; | ||
+ | ZeroY=ZeroY/7; | ||
} | } | ||
− | + | void loop() { | |
+ | sensors_event_t a, g, temp; | ||
+ | mpu.getEvent(&a, &g, &temp); | ||
+ | Beschleunigung = sqrt(sq(a.acceleration.x-ZeroX)+sq(a.acceleration.y-ZeroY)); | ||
+ | Drehrate = sqrt(sq(g.gyro.x)+sq(g.gyro.y)+sq(g.gyro.z)); | ||
+ | PhyphoxBLE::write(Beschleunigung, Drehrate); | ||
+ | delay(10); | ||
+ | } | ||
</pre> | </pre> | ||
==Arbeitsmaterialien== | ==Arbeitsmaterialien== | ||
+ | |||
+ | |||
[[Category:Arduino library experiments]] | [[Category:Arduino library experiments]] |
Latest revision as of 17:47, 11 November 2023
Experiment | Drehrate und Beschleunigung |
---|---|
Category | Arduino library experiments |
Used sensors | MPU-6050 |
Auch wenn man für viele Beschleunigungsexperimente prinzipiell den im Smartphone verbauten Beschleunigungs- und Drehratensensor verwenden könnte, macht auch hier ein externer Sensor sehr viel Sinn:
1. Man möchte nicht, dass ein Smartphone bei einer Messung Schaden nimmt.
2. Man weiß nicht millimetergenau, wo genau die Sensoren im Smartphone verbaut sind.
3. Sensoren wie der hier verwendete MPU-6050 sind günstig, gut und dank der I2C-Bus-Schnittstelle sehr einfach zu verlöten.
Hier soll der Sensor für Beschleunigungsmessungen auf der Luftkissenbahn sowie für Drehraten- und Zentrifugalbeschleunigungsmessungen eingesetzt werden. Aus diesem Grund ist das Programm so aufgebaut, dass der Sensor die Resultierende aus ax und ay sowie die Resultierende Drehrate aller drei Achsen übermittelt. Direkt nach dem Starten oder einem Reset muss der Sensor einige Sekunden ruhen. Während dieser Zeit wird die Beschleunigung auf null Tariert. So wird die Erdbeschleunigung herausgerechnet, falls der Sensor schief liegt. Der Sensor funktioniert so gut, dass aus den Parabeln im 3. Graph millimetergenau der Radius zur Dreachse ermittelt werden kann. Wichtig ist, dass der Sensor entweder in der Drehebene liegt oder ggf. schief mit x-Richtig radial ausgerichtet, wie auf dem folgenden Foto.
Aufbau
Die Verkabelung des Sensors ist wieder wie üblich: 3V3 – Vin, Gnd – Gnd, SCL – 22, SDA –21. Als Stromversorgung dient hier einfach eine kleine Powerbank, auf die der ESP32 mit Doppelseitigem Klebeband befestigt wird. Der MPU-6050 wurde mit etwas Heißkleber auf den ESP32 neben das Kommunikationsmodul geklebt und am Ende alles mit Schrumpfschlauch versiegelt.
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("Thermometer_01") festgelegt). Anschließend kann über das Plus-Symbol in phyphox ein Bluetooth-Experiment hinzugefügt werden, das Experiment wird dann automatisch geladen.
#include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> #include <Wire.h> #include <phyphoxBle.h> Adafruit_MPU6050 mpu; float Beschleunigung = 0; float Drehrate = 0; float ZeroX = 0; float ZeroY = 0; void setup(void) { PhyphoxBLE::start("Beschleunigungssensor"); //Experiment PhyphoxBleExperiment experiment; experiment.setTitle("Beschleunigungssensor"); experiment.setCategory("Arduino Experiments"); experiment.setDescription("Plot the acceleration over time."); //View PhyphoxBleExperiment::View view; //Graph PhyphoxBleExperiment::Graph graph1; graph1.setLabel("Beschleunigung"); graph1.setUnitX("s"); graph1.setUnitY("m/s2"); graph1.setLabelX("time"); graph1.setLabelY("ax"); graph1.setChannel(0,1); //Graph PhyphoxBleExperiment::Graph graph2; graph2.setLabel("Drehrate"); graph2.setUnitX("s"); graph2.setUnitY("1/s"); graph2.setLabelX("time"); graph2.setLabelY("omega"); graph2.setChannel(0,2); PhyphoxBleExperiment::Graph graph3; graph3.setLabel("Beschleunigung"); graph3.setUnitX("1/s"); graph3.setUnitY("m/s2"); graph3.setLabelX("omega"); graph3.setLabelY("ax"); graph3.setStyle("dots"); graph3.setChannel(2,1); view.addElement(graph1); //Attach graph to view view.addElement(graph2); //Attach graph to view view.addElement(graph3); //Attach graph to view experiment.addView(view); //Attach view to experiment PhyphoxBLE::addExperiment(experiment); //Attach experiment to server mpu.begin(); mpu.setAccelerometerRange(MPU6050_RANGE_4_G); mpu.setGyroRange(MPU6050_RANGE_1000_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); delay(1000); //Offsetkorrektur ZeroX=0; ZeroY=0; for(int i=0;i<7;i++){ sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); ZeroX+=a.acceleration.x; ZeroY+=a.acceleration.y; delay(10); } ZeroX=ZeroX/7; ZeroY=ZeroY/7; } void loop() { sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); Beschleunigung = sqrt(sq(a.acceleration.x-ZeroX)+sq(a.acceleration.y-ZeroY)); Drehrate = sqrt(sq(g.gyro.x)+sq(g.gyro.y)+sq(g.gyro.z)); PhyphoxBLE::write(Beschleunigung, Drehrate); delay(10); }