Forum: Mikrocontroller und Digitale Elektronik MPU6050 - verwirrend?


von Benjamin W. (benw)


Lesenswert?

Hallo Forum,

Ich hätte ganz kurz nur mal einige Fragen zum MPU6050, betrieben am 
Arduino Micro.

Misst ein 'Accelerometer', zu Deutsch 'Beschleunigungsmesser', die 
Drehgeschwindigkeit um die jeweilige Achse, oder die 
Bewegungsgeschwindigkeit, d.H. z.B. eine Links oder Rechts - Bewegung um 
die Achse?

Mein MPU6050 misst nämlich die Drehgeschwindigkeit um die Achsen,
wenn ich z.B. den MPU um die Hochachse drehe, schlägt der Wert aus, bis 
ich aufhöre zu drehen.

Ist das richtig, was der macht? Mir kommt das so komisch vor... Warum 
sollte man die Drehgeschwindigkeit angeben, wenn man schon durch den 
Gyrometer die Grad-Anzeige hat...


LG


BenW

von Chris R. (hownottobeseen)


Lesenswert?

Hi,

der MPU6050 ist eine Motion Processing Unit. Es beinhaltet ein 
Accelerometer (Beschleunigungssensor) und ein Gyroskop 
(Drehratensensor), das was der MPU ausgibt ist schon richtig, 
wahrscheinlich liest du einfach den falschen Wert aus, denn deine 
sonstigen Aussagen sind richtig ;)

Schau dir mal das Datenblatt an: 
https://www.cdiweb.com/datasheets/invensense/MPU-6050_DataSheet_V3%204.pdf

Seite 24ff.

Du musst nur die richtigen Register setzen & lesen.

HTH
Chris

von M. T. (restfet)


Lesenswert?

Der Beschleunigungssensor misst die Beschleunigung entlang einer 
Raumachse.

Das Gyrometer misst die Drehgeschwindigkeit (Winkelgeschwindigkeit) um 
eine Raumachse.

Dass auch der Beschleunigungssensor bei einer Drehung ausschlägt, liegt 
ganz einfach daran, dass es praktisch wohl unmöglich ist, den Sensorchip 
zu drehen, ohne dass sich auch der Beschleunigungssensor mitbewegt.

von Benjamin W. (benw)


Lesenswert?

Dann hat bei meinem MPU6050 doch was, oder ich komme mit der 
Programmierung nicht zurecht:

Der Beschleunigungsmesser(Accelerometer) zeigt keine 
Bewegung/Beschleunigung um eine Raumachse an, sondern die Drehung in 
Grad um die jeweilige Achse...


Stimmt folgender Code?:
1
#include<Wire.h>
2
3
const int MPU_addr=0x68;  // I2C address of the MPU-6050 0x68
4
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
5
6
7
8
void setup()
9
{
10
  Serial.begin(9600);
11
12
  Wire.begin();
13
  Wire.beginTransmission(MPU_addr);
14
  Wire.write(0x6B);  // PWR_MGMT_1 register
15
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
16
  Wire.endTransmission(true);
17
}
18
19
20
21
void loop()
22
{
23
24
  MPU();
25
}
26
27
28
29
30
void MPU()
31
{
32
  Wire.beginTransmission(MPU_addr);
33
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
34
  Wire.endTransmission(false);
35
  Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
36
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
37
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
38
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
39
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
40
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
41
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
42
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
43
44
  Serial.print("Accelerometer (Bewegungsgeschwindigkeit:)");
45
  Serial.print("\t");
46
  Serial.print("\t");
47
  Serial.print(AcX);
48
  Serial.print("\t");
49
  Serial.print(AcY);
50
  //Serial.print("\t");
51
  //Serial.print(AcZ);
52
  Serial.print("\t");
53
  Serial.print("\t");
54
  Serial.print("\t");
55
  Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
56
  Serial.print("\t");
57
  Serial.print("\t");
58
  Serial.print("\t");
59
  Serial.print("Gyrometer (Drehgeschwindigkeit in */Sekunde:)");
60
  Serial.print("\t");
61
  Serial.print("\t");
62
  Serial.print(GyX);
63
  Serial.print("\t");
64
  Serial.print(GyY);
65
  Serial.print("\t");
66
  Serial.println(GyZ);
67
  delay(333);
68
}

von M.F. (Gast)


Lesenswert?

Chris R. schrieb:
> Schau dir mal das Datenblatt an:
> https://www.cdiweb.com/datasheets/invensense/MPU-6050_DataSheet_V3%204.pdf

Ein Datenblatt, wo alles drin steht. Wie geil ist das denn.

SCNR

von Benjamin W. (benw)


Lesenswert?

OK, erstmal danke für das Datenblatt.

Die Frage ist nur: Was fange ich damit an, beziehungsweise wie setze ich 
auf auf einen Sketch auf den Arduino um?

Habe bereits jegliche Optionen, Libraries und Examples aus dem Internet 
probiert, trotzdem gibt mir der Accelerometer immer nur die Drehung um 
eine Achse aus.


Ganz ehrlich, bin ich zu dumm dafür?

Danke schon im Voraus ;)

von Thomas E. (picalic)


Lesenswert?

Benjamin W. schrieb:
> Habe bereits jegliche Optionen, Libraries und Examples aus dem Internet
> probiert, trotzdem gibt mir der Accelerometer immer nur die Drehung um
> eine Achse aus.

Ähm - kann es evtl. sein, daß Du die vom Sensor (korrekt) gemessene 
Erdbeschleunigung als "Drehung um die Achse" interpretierst? D.h. Du 
erwartest (fälschlicherweise) alle Werte Ax,Ay,Az = 0, weil Du den 
Sensor ja nicht bewegst? Beim Drehen des Sensors wandert der gemessene 
Wert der Erdbeschleunigung natürlich um die Achsen, je nachdem, welche 
dann gerade nach unten zeigt...

von Benjamin W. (benw)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,

Bei einer linearen Bewegung zeigt mein MPU leider überhaupt keine Werte 
an, nur bei einer Drehung.

Lassen wir jetzt mal den Gyrometer aus dem Spiel, ich weiß bereits, für 
was dieser gut ist.

In den beiden Bildern ist es nochmal verdeutlicht, was der MPU macht:

Wenn ich ihn nach dem Einschalten um die X-Achse nicht bewege, zeigt 
diese null an. Erst wenn ich ihn um die Achse bewege, wandert auch der 
Wert mit.

Ähnlich einem Wendezeiger, oder, besser ausgedrückt, einem Winkelmesser 
zur Horizontalen.

Gruß

BenW

von Thomas E. (picalic)


Lesenswert?

Benjamin W. schrieb:
> Ähnlich einem Wendezeiger, oder, besser ausgedrückt, einem Winkelmesser
> zur Horizontalen.

Eben, der Winkel, den der Sensor misst, ist der Winkel der 
Erdbeschleunigung - die zieht immer nach unten! Was für eine 
Beschleunigung soll der Sensor denn messen, wenn Du ihn mit konstanter 
Geschwindigkeit in der Horizontalen bewegst? Wenn Du in einem ICE sitzt, 
der mit 250 km/h über gerade Gleise rauscht, und machst die Augen zu, 
warum fühlst Du dich da z.B. nicht mehr beschleunigt, als im Wohnzimmer 
auf der Couch?

von Dirk K. (dekoepi)


Lesenswert?

Klassische Verwechslung der Begriffe "Beschleunigung" und "Bewegung"? Um 
Thomas' Einwurf noch mal deutlicher zu machen.
Accelerometer heißt Beschleunigungsmesser. Nicht Bewegungsmesser.

von Niko S. (jumanji)


Lesenswert?

Hier gibts ein fertiges Projekt mit Arduino-Sketch und auf Wunsch mit 
Processing-Visualisierung der Drehungen/Bewegungen.  Habe die Sketchs 
selbst mal ausprobiert. Liefen super.

Teste den Sketch einfach mal. Wenn er läuft musst du in deinem Code 
nochmal auf Fehlersuche gehen. Wenn nicht ist es vll ein Problem der 
Lötstellen (Chinanachbau o.ä.)...

http://www.geekmomprojects.com/gyroscopes-and-accelerometers-on-a-chip/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.