Forum: Mikrocontroller und Digitale Elektronik Barometer / Höhenmessung mit MS5611


von Norbert S. (norberts)


Angehängte Dateien:

Lesenswert?

Moin,

mal keine Frage sondern ein Ausbruch von Begeisterung.

Ich hab eben ein MS5611 Barometer zum Laufen bekommen und bin völlig 
baff.
Zuerst hatte ich eine kleine Höhenmessung in meinem Nexus 4 gebastelt. 
Da weiß ich nur, daß ein Bosch Sensor drin ist. Ob nun BMP085 oder 
BMP180 weiß ich nicht.
Mit 2000 Werten gemittelt war das schon nicht übel, rauschte aber locker 
um 5-10Pa oder mehr. Wäre ich aber mit hingekommen.
Direkt mit einem BMP085 war ein Desaster. Der erste war im Arsch, der 
zweite auch nicht so dolle. Unbrauchbar für die Höhenregelung für einen 
Multicopter.

Mit dem Code anbei lese ich den MS5611 mit 1Hz aus und das rauscht max 
um 2-3 Pa!
Einzelne Werte!
Ich kann den mit 50Hz auslesen (bei höchstem Oversampling) oder noch 
schneller, wenn man die Temperatur nur selten ausliest.
Wenn man das mittelt, steht die Höhe wie ne Eins!

Nur, daß das gerade mit geschätzt 1m pro Minute driftet weil scheinbar 
der Luftdruck gerade fällt aber dafür kann der Sensor nix.

Ich kann mich an den Daten, die ich per BT aufs Handy bekomme kaum satt 
sehen.

Der Code anbei darf gerne für private Projekte genutzt werden...
Das ist auf Rechenzeit optimiert, etwas Rumgeturne mit den 
Variablentypen.
In den letzten Schritten der Druckberechnung geht theoretisch etwas 
Genauigkeit verloren, da die Mantisse von Double nur 52bit ist. 
Praktisch passiert da aber nichts.
Und ja, das geht noch etwas besser in Bascom.
Reicht mir aber so erstmal.

Mal sehen, ob ich es schaffe, die unsachlichen Antworten bzgl. Bascom zu 
ignorieren...

Gruß,
Norbert

von seb (Gast)


Lesenswert?

Dank deiner Begeisterung habe ich mir den auch bestellt und warte nun 
sehnsüchtig, dass er bei mir eintrifft. Mal schauen ob ich deine Freude 
dann teilen kann :)

von Norbert S. (norberts)


Lesenswert?

Hi,

würde mich freuen zu hören, wie Du damit klarkommst.
Wenn Du eigenen Code schreibst: Mach das Schritt für Schritt und teste 
es mit den Zahlenbeispielen aus dem Datenblatt.
Du suchst Dich nachher sonst zu Tode.
Mit C mag das ev. etwas eleganter als mit Bascom gehen aber bleibt doch 
ein Monstrum.

Gruß,
Norbert

von Ingo S. (ingo-s)


Lesenswert?

Der MS5611 ist wohl das Beste was man zur Zeit in diesem Preissegment 
bekommen kann.
Ich habe ihn schon ca. 3 Jahre erfolgreich in verschiedenen 
Multisensoren für Höhe und Vario im Einsatz. Damals musste man aber noch 
knapp 50€ für ihn berappen.

Gruß Ingo

von seb (Gast)


Lesenswert?

Bisher habe ich den BMP180 und den LPS331 probiert, aber die rauschen so 
stark, dass ich beim Filtern ne zu große Verzögerung reinbekomme. Bevor 
ich nun einen riesigen Filter entwerfe, versuch ich mal das Problem mit 
dem MS5611 an der Wurzel zu packen, dann wird auch der Filter nich so 
aufwendig :)

von seb (Gast)


Lesenswert?

ach ja, ich vergaß: DAS Filer ;)

von (prx) A. K. (prx)


Lesenswert?

Erfahrung wie sich das beim MPL3115A2 darstellt? Der ist bei mir grad in 
Arbeit. Wirkte eigentlich recht stabil, aber eine produktive 
Datenauswertung folgt noch. Laut Datasheet 1,5Pa Noise bei Einstellung 
auf 128x Oversampling (19Pa ohne). Freudlicherweise kann man sich 
Kompensations- und Kalibrier-Rechnung sparen, das Ergebnis ist bereits 
fertig, je nach Wunsch in Druck oder Höhe.

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

seb schrieb:
> Bisher habe ich den BMP180 und den LPS331 probiert, aber die rauschen so
> stark, dass ich beim Filtern ne zu große Verzögerung reinbekomme.

Dann kannst du vielleicht etwas mehr zu Vergleich der Sensoren sagen.

Für den BMP180 lese ich für 4 Pa RMS-Rauschen aus dem Datenblatt eine 
Wandlungszeiten von
  BMP180 13,5 ms (high resolution Mode)

Aber wie ist das beim LPS331 zu verstehen? Für den gleichen Rauschlevel 
komme ich auf
  LPS331  (Res_Conf 0x77 lt. Tab.17, internal average 128 lt. Tab.15)

Mit welcher Rate werden diese 128 samples für die Mittelung gemessen.

Bei der max. ODR von 25Hz käme man gerade auf 25 Hz/128 entsprechend 5 s 
für unkorrelierte Samples. Das kann doch fast nicht sein :-(

von seb (Gast)


Lesenswert?

Für den BMP180 stimmt das so, wie du geschrieben hast. Beim LPS331 hab 
ich auch höchste Genauigkeit eingestellt (intern 128 Samples) und dann 
einfach auf den Interrupt gewartet. Ich kann mich an die Zeit nicht mehr 
erinnern, die für die Wandlung benötigt wurde, da das Rauschen den 
Sensor für meine Zwecke aussortiert hat. Es waren auf alle Fälle keine 5 
Sekunden :) Ich werde mir den Sensor nochmal hernehmen, weil ich jetzt 
ein gescheites Breakoutboard habe. Die ersten Messungen habe ich mit 
fliegender Verdrahtung getätigt, evtl sind da noch Störungen 
reingekommen.

von seb (Gast)


Lesenswert?

Übrigens, wie kommst du bei 25Hz (40ms) / 128 Samples auf 5 s? Bei mir 
sind das 312 µs :)

von seb (Gast)


Angehängte Dateien:

Lesenswert?

Anbei mal ein plot mit Höhenmessung aus nem Ultraschall (HCSR04) und dem 
MS5611 Sensor. Wenn man die Barometerdaten noch etwas filtert, den 
Offset entfernt und (im Nahbereich) mit dem Ultraschall (dessen Werte 
auch noch Winkelabhängig behandelt wurden..) fusioniert, kann man schon 
nen Kopter recht easy autonom starten und landen lassen ;)

von Norbert S. (norberts)


Lesenswert?

Hi,

seb schrieb:
> Ultraschall (dessen Werte
> auch noch Winkelabhängig behandelt wurden..)

Das brauchst Du nicht bzw. ist falsch. Steht der Copter etwas schief und 
ist der Boden innnerhalb der "Reichweitenkeule" des US, ist das Signal 
immer der kürzeste und somit senkrechte Weg zum Boden (ebener Boden 
vorrausgesetzt).

Ich würde so vorgehen: Die Reichweite des US ist ja bekannt, sagen wir 
mal 6m bei idealen Bedingungen. Dann würde ich unter z.B. 4m:
1. den Drucksensor auf Höhe kalibrieren (der driftet Dir wetterbedingt 
teilweise um Meter pro 5 Min. weg) und
2. nur den US benutzen denn der ist um Dimensionen genauer und immer 
absolut.

Also nix mit Fusionieren, damit versaust Du nur das US-Signal sondern 
höchstens kombinieren.

Ich hab das Ganze übrigens aufgegeben. Alle möglichen Teilkomponenten 
(inkl GPS und Kompass)funktionierten bei mir zwar auch in Software schon 
aber das alles zu einem funktionierendem System zusammenzuhäkeln ist 
nochmal ne andere Nummer und dazu fehlt mir einfach die Zeit.
Spätestens als ich gesehen habe, wie das bei DJI funktioniert - wenn ich 
da wirklich Bock drauf hab nehme ich irgendwann "einfach" das Geld in 
die Hand.

Gruß,
Norbert

von seb (Gast)


Lesenswert?

Was genau meinst du mit "kompliziert"? Eine einfache Regelung/Steuerung 
für nen Kopter selbst zu implementieren oder aufwendigere Algorithmen 
incl Datenaufbereitung, Fusion, Regler und Modell zu entwerfen und zu 
implementieren?

Zumindest ne Steuerung mit lediglich Gyro/Acc, Empfänger auswerten, 
fertige Motorregler ansteuern und nem einfachen PID ist machbar. Alle 
zusätzlichen Features (RTOS, Kalman, Zustandsregler für Lage & Höhe, 
Positionsregler, Bodenstation etc.) kann man ja nach und nach basteln, 
wenn man Lust und Laune hat. Zumindest weiß man dann genau, was der 
Kopter macht und ist nicht auf andere angewiesen (Updates, 
Fehlerbehebung etc.). Und wenn er abschmiert kann man die Schuld nicht 
auf andere schieben ;)

Hab jetzt übrigens mal seit 1000 Sekunden den Baro am laufen, bisher 
driftet nix. Man muss auch die Einsatzbereiche betrachten: Baro eher in 
Höhen über 5m, da sind Drifts von +-2m völlig egal.

von Norbert S. (norberts)


Lesenswert?

Hi,

na klar ist das alles machbar.
Ich hab ein KK2.0 Board und die Signale der Kanäle "verbogen".
Zum Ausrichten nach Kompass hat das funktioniert aber die Höhenregelung 
hat dann schon auf Anhieb erstmal beschissen funktioniert. Das geht ja 
auch nur am lebenden Objekt.
Dazu dann "Coming Home" per GPS. GPS auslesen hat funktioniert.
Ich hab nicht wirklich aufgegeben, ich hab einfach nicht soviel Zeit um 
das alles umzusetzen. Bevor das ewig rumsteht, wird das alles jetzt 
verkloppt (Hexacopter für 3s und 3x 5Ah Lipos). Interesse?

Das mit der Höhe ist ausserhalb der Reichweite vom US natürlich 
unkritisch.
Der Drift ist Wetter wenn sich der Luftdruck ändert. Von schlecht zu gut 
sind so einige 10hPa, also einige 1000Pa - 1Pa = 8,3cm oder so.
Ich hab schon umgerechnet >5m in 10-15 Minuten gesehen.
Ist der Luftdruck wetterbedingt gerade konstant, driftet auch nix.

Gruß,
Norbert

von Alex W. (Gast)


Lesenswert?

Hallo,

evenuell kann mir jemand helfen!

Ich verwende den selben Sensortyp! Mit I2CRead bekomme ich auch die 
Sensoradresse (bei mir &EE anstatt wie im TO &EC).

Jedoch habe ich als

Temperatur: 2002
Pressure: 331067
Heigh: 0 (klar, ändert sich ja nix)

Jemand eine Idee?

von Alex W. (Gast)


Lesenswert?

PS:

Wenn ich die Adresse am Chip auf &EC einstelle und den Code anpasse, 
dann klappt es! Aber ich brauche &EE, dann klappt es nicht mehr!

von Norbert S. (norberts)


Lesenswert?

Moin,

Alex W. schrieb:
> Mit I2CRead bekomme ich auch die
> Sensoradresse (bei mir &EE anstatt wie im TO &EC).

Hä?
Die Adresse kannst Du nicht lesen oder einstellen, die ist fest und 
steht im Datenblatt.
&hEC ist zum lesen und &hED ist schreiben.
Mit &hEE versuchst Du zu schreiben aber das Chip Select Bit = 1 
deaktiviert den Chip.

Alex W. schrieb:
> Aber ich brauche &EE, dann klappt es nicht mehr!

Kann ja auch nicht. Warum brauchst Du &hEE?

Gruß,
Norbert

von Alex W. (a20q90)


Lesenswert?

Norbert S. schrieb:
> Kann ja auch nicht. Warum brauchst Du &hEE?

Ein anderer Sensor hat die selbe Adresse.

von Norbert S. (norberts)


Lesenswert?

Moin,

Dann leg den CS-Eingang auf Masse, dann ist das Bit immer 0 (wenn ich 
das DB richtig verstanden habe), egal wie Du das Bit in der Adresse 
sendest. Dann sollte &hEE gehen.

Gruß,
Norbert

von W.A. (Gast)


Lesenswert?

Norbert S. schrieb:
> Die Adresse kannst Du nicht lesen oder einstellen, die ist fest und
> steht im Datenblatt.
> &hEC ist zum lesen und &hED ist schreiben.

Die I2C-Adresse vom MS5611 ist nicht fest. Mit dem CSB-Pin kann man 
zwischen zwei verschiedenen Adressen auswählen.
Mit CSB=1 liegt der Chip auf I2C-Adresse 0x76, i.e. erstes Byte 0xEC 
(lesen) bzw. 0xED (schreiben). Mit CSB=0 liegt der Chip auf 0x77, i.e. 
erstes Byte 0xEE (lesen) bzw. 0xEF (schreiben). (s. Datenbaltt S.6 "I2C 
MODE" und 11 "I2C INTERFACE")

RTFM

von W.A. (Gast)


Lesenswert?

Norbert S. schrieb:
> Dann leg den CS-Eingang auf Masse, dann ist das Bit immer 0 (wenn ich
> das DB richtig verstanden habe)

Hast du nicht.

Chip-Select gibt es nur im SPI-Mode. Solange der Protocol Select Pin 
(PS) auf High liegt, ist das I2C-Interface aktiv und dann legt der 
invertierte Logikpegel vom CSB Signal das unterste Bit der I2C-Adresse 
fest (Datenblatt S. 5 "Serial Interface")

CSB an Masse bedeutet: Unterstes Bit = 1

von Norbert S. (norberts)


Lesenswert?

W.A. schrieb:
> Die I2C-Adresse vom MS5611 ist nicht fest. Mit dem CSB-Pin kann man
> zwischen zwei verschiedenen Adressen auswählen.
> Mit CSB=1 liegt der Chip auf I2C-Adresse 0x76, i.e. erstes Byte 0xEC
> (lesen) bzw. 0xED (schreiben). Mit CSB=0 liegt der Chip auf 0x77, i.e.
> erstes Byte 0xEE (lesen) bzw. 0xEF (schreiben). (s. Datenbaltt S.6 "I2C
> MODE" und 11 "I2C INTERFACE")

Moin,

Ahh, es dämmert, so war das.
Das ist 3 Jahre her und spontan wurde mir das aus Code und Datenblatt 
nicht ganz klar.

Danke für die Klarstellung.

Gruß,
Norbert

von Alex W. (a20q90)


Lesenswert?

W.A. schrieb:
> erstes Byte 0xEE (lesen) bzw. 0xEF

Das war es! Habe vergessen das &ED auf &EF zu legen

von W.A. (Gast)


Lesenswert?

W.A. schrieb:
> Mit CSB=1 liegt der Chip auf I2C-Adresse 0x76, i.e. erstes Byte 0xEC
> (lesen) bzw. 0xED (schreiben). Mit CSB=0 liegt der Chip auf 0x77, i.e.
> erstes Byte 0xEE (lesen) bzw. 0xEF (schreiben).

Sorry, da sind lesen und schreiben vertauscht (unterstes Bit Read=1, 
Write=0), also 0xED bzw. 0xEF zum Lesen und 0xEC bzw. 0xEE zum 
Schreiben.

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.