Arduino Jeti Speed Senor bis 450km/h für Jeti

gilles

User
Hallo an die Experten
Ich habe einige Speed Sensoren von RC-Thoughts hier nachgebaut.Alle funktionieren zufriedenstellend, aber leider nur bis ca. 220 km/h. Das ist für scharfe Jets zu wenig. 450 km/h sollte schon ok sein. RC-Thoughts verwendet den MPXV7002DP Sensor welcher einfach zuwenig differential Druck liefert. Nach Recherchen wurde mir der MPXV5010DP vorgeschlagen welcher bis 10KPA Diff. Druck liefert.Ich bin kein Programmierer und tue mir schwer eine Library zu schreiben.Fertige Librarys welche mit Jeti funktionieren gibt es noch nicht. OpenX geht meines Wissens auch nur bis ca. 320 km/h. Kann mir wer helfen mit einer Library oder habt Ihr eine Idee??
Gruß
Christian
 

hsh

User
Wenn du den Sourcecode zu der Bastelanleitung anschaust, siehst du, dass der Author des Artikels ( by Tero Salminen (c) RC-Thoughts 2017 ) auf die Arduino-Libraries "JetiExProtocol" und "SpeedPressure" [1] zurückgreift.
Wenn du einen Sensor mit anderer Empfinglichkeit einsetzen willst, kannst du jetzt z.B. die Codeschnippsel in [1] anpassen.

Nun stellt sich allerdings die Frage - was meinst du mit "helfen"?
Wenn sicher ist, dass dein Sensor die beschränkende Komponente ist, ist die Wahl eines Sensors mit geringerer Sensitivität natürlich eine Option.
Vom ersten Blick in die Datenblätter ist der MPXV7002DP mit Pressure Range -2.0kPa bis 2.0kPa aber nicht mit dem MPXV5010DP mit Pressure Range 0kPa bis 10kPa direkt ersetzbar... eher käme dann der MPXV7007DP in Frage...
Aber:
1) macht eine sysmetrischer Drucksensor für Geschwindigkeitsmessungen überhaupt Sinn? (es sollte ja klar sein, an welchem Schlauchanschluss der "negativere" Druck vorherrscht)
2) macht die Nutzung des AVR eigenen ADC Sinn, und wie schaut es mit der Wahl von AREF am µC und der Versorgung der (innerhalb der Spezifikation) ratiometrisch arbeitenden NXP Drucksensoren aus?
3) über welches Vorwissen verfügst du, was möchtest du erreichen/investieren/lernen/verstehen?
4) über ein UniLog + Speedsensor von SM-Modellbau nachgedacht?

mfg Harald

[1]
/*
Pressure.h - Library for pressure sensor.
Created by johnlenfr, May 15, 2014.
http://johnlenfr.1s.fr

SOURCE CODE .CPP

*/
 
Zuletzt bearbeitet:

gilles

User
Hallo Harald
Danke für deine Antwort.Ich habe jetzt einmal den Sensor 5010dp mit dem Source code speedpressure.cpp von Tero Salminen und einem 5V/16Mhz Arduino pro verwendet.Das funktioniert zwar, aber wie zu erwarten gab es ein Problem mit der Genauigkeit der km/h Anzeige.Sie lag ca. Um 30-40% zu tief verglichen mit dem 7002dp Sensor.Daraufhin bin ich hergegangen und habe das "Codegeschnippsel" in der speedpressure.cpp angepasst...einen Wert verändert ohne genau zu verstehen was ich da verändere.jetzt passt es. Geflogen bin ich noch nicht damit.Vielleicht kannst du mir folgende code Zeile die ich verändert habe kurz erklären.

pitotpressure = 5000.0f * ((air_pressure - ref_pressure) / 1024.0f) + PRESSURE_SEA_LEVEL; // differential pressure in Pa, 1 V/kPa, max 3920 Pa

Ich habe den Wert 5000.0f auf 11000.0f geändert das es passt.

Gruß
Christian
 

hsh

User
Hallo Christian,
darf ich meine Frage 3) wiederholen?
und ergänzend noch gleich weitere stellen:
-hast du dir die Datenblätter der Sensoren angesehen?
-kannst du mit den Datenblattangeben etwas anfangen?
-verfügst du über Grundkenntnisse zu Mikrokontrollern?
-hast du dir das Datenblatt des ATmega328 schon einmal angesehen und ist dir klar wie der ADC funktioniert?
-wie kommst du zu dem Eindruck, dass die Werte "passen"?

Ich habe mich noch nie genauer mit der Geschwindigkeitsmessung mit Staudruckrohren beschäftigt und meine Bastelprojekte mit Fokus auf Höhenmessung und Variometerfunktion sind schon etwas länger her. Dennoch hätte ich gesagt (ohne den Authoren der Codeschnippsel zu nahe treten zu wollen) - wirf das Zeug weg, und schreib es neu.

Soweit ich das sehe ist in Pressure::GetAirSpeed() schlicht die Bernoulli Gleichung für die Prandtlsonde [1],[2] implementiert.
In der von dir angesprochenen Zeile 36 scheint die Umrechnung von ADC-Wert auf Drucksensorwert zu erfolgen und der Offset "PRESSURE_SEA_LEVEL" addiert. Das macht jetzt aber wenig Sinn, denn laut Bernoulli interessiert uns für die Geschwindigkeitsberechung der Differenzdruck und die Dichte. Den Differenzdruck ermitteltst du aber nicht durch Messung und Differenzbildung von zwei Absolutdrücken (wäre aber auch möglich) sondern durch einen Differenzdrucksensor. In Zeile 40 wird dieser Offset ja dann auch wieder abgezogen #)
Die Dichte wiederum wird in Zeile 39 "berechnet", obwohl in der vorliegenden Implementierung nur Konstanten verwendet werden. Hier würde es Sinn machen, sich genauer mit dem Thema zu beschäftigen und eine Fehlerrechnung auszuarbeiten, ob die korrekte Dichte relevant ist oder nicht. Genauso, ob es reicht die Werte ev. beim Start zu konfigurieren (Startplatzhöhe vs. Seehöhe), oder weitere Sensoren notwendig sind (Lufttemperatur). Ich denke dabei an den Unterschied zw. Überflügen am Platz oder einem Segler der GPS-Triangle oder OLC fliegt und ev. merkliche Höhenunterschiede einkalkulieren möchte. Ich habe leider keine Zeit mich in diese Thematik einzuarbeiten, gehe aber eigentlich davon aus, dass das schon oft ausgearbeitet wurde...
Welche Differenzdrücke liegen in einem typischen Staudrucksensor denn vor?

Entsprechend könnte und sollte man da -wie gesagt - noch einmal aufräumen.
Unter der Annahme, dass die typische Datenblattangabe stimmt und sich der Sensorwert um 1V/kPa ändert, sowie der ADC 5.0V in 1024 Schritte auflöst stimmt alles. Eigentlich geht es um die Transferfunktion das Drucksensors ([3], Page6, Figure 4: Vout = VS× (0.2 × P(kPa)+0.5) ± 6.25% VFSS ) und die Umrechung unter Berücksichtigung der Referenzspannung und Auflösung des ADC. Bei einem symetrischen Drucksensor wie der MPXV7xxx Serie schaut es ein wenig anders aus, als bei der MPXV5xxx Serie bzw. in deinem Fall mit [4] und Vout = VSx (0.09 x P + 0.04) ± 5.0% VFSS.
Du musst dir die Frage stellen, welcher ADC-Wert entspricht welchem Druckwert. Dafür hast du zwei Kennlinien zur Umrechnungen zu beachten. Einmal die vom Sensor und einmal die vom ADC.

Der Offsetabgleich in Pressure::Init() ist für beide Arten nutzbar und kompensiert bis zu einem gewissen Grad auch die systematischen Offsets des ADC. Allerdings musst du beim MPXV5010 nicht nur mit den typischen 0.45V/kPa kalkulieren, sondern solltest auch den Offset der Kennlinie beachten und die 0.2V bzw. ca. 39-41 LSB die als ref_pressure ermittelt werden abziehen. Das wird dann aber eben nicht nur mit 5.0[V]/1024[LSB]/1.0[V/kPa] verrechnet ( was in Zeile 36 gekürzt wurde), sondern müsste für den MPXV5010DP etwa so ausschauen:
p[kPa] = (air_pressure[LSB] - ref_pressure[LSB]) * (Vref[V] / ADC-Auflösung[LSB]) / Sensitivität[V/kPa]
Dann sollte die Einheitengleichung hoffentlich stimmen, und weitestgehend plausible Ergebnisse herauskommen (ist aber auch gut möglich, dass ich da jetzt in der Eile genauso einen Fehler gemacht habe). Deine empirisch ermittelten 11000/1024 sind mit ca. 10.74 ja ganz gut am eigentlichen Umrechnungsfaktor für die andere Sensorkennlinie drann 5000/1024/0.45 = 10.85; Der Unterschied zwischen den beiden Sensoren ist aber 1.0 / 0.450 = 2.2222; es sollten also eher 11111.11 sein, wenn du bei dem Hack bleiben willst. Ich denke, dass da noch irgendwo ein 10^3 als Umrechnungsfaktor von [kPa] auf [Pa] mitverwurstet wurde.

[1] https://de.wikipedia.org/wiki/Anemometer
[2] https://de.wikipedia.org/wiki/Datei:Pitot_tube_with_Bernoullis_law_german.png
[3] https://www.nxp.com/docs/en/data-sheet/MPXV7002.pdf
[4] https://www.nxp.com/docs/en/data-sheet/MPX5010.pdf
 
Zuletzt bearbeitet:

gilles

User
Puh jetzt hast du mich aber überschüttet mit Formeln und Infos.
Zuerst einmal Danke dafür.
Zur Antwort deiner Frage 3: Ich bin ein ganz normaler Modellflug Pilot und experimentiere gerne. Ich hab keine Kenntnisse in Arduino Sketch programmieren hab nur Spaß Sensoren selber zu bauen.Und wenn ich anstehe frage ich halt einen wissenden und lerne.
Ich will bei dem Hack wie du es nennst bleiben,denn er funktioniert ja..und das ich mit meiner Annäherung fast richtig liege bestätigst du jetzt, ich hab den Wert nur nicht verstanden. Ich werde den Wert dann auf deinen errechneten von 11111,11f ändern und schauen ob sich was ändert. Wie ich darauf komme das die Werte passen?
Ganz einfach: Einen 7002dp (welcher ja richtig anzeigt)und einen 5010dp gleichzeitig unter Druck setzen und die Formel des 5010 solange bearbeiten bis beide Anzeigen korrespondieren.Und da bin ich eben bei meinen 11000.0f gelandet.Was vielleicht nicht schlecht wäre, die Anzeige zu "glätten" um eine zu stark springende Anzeige zu vermeiden.Vielleicht gibts da was fertiges was ich einfügen könnte..
Gruß
Christian
 

hsh

User
naja, unter der Voraussetzung, dass die 220km/h wirklich richtig gemessen wurden, sollte die Konfiguration mit dem 7002dp ja ca. 410 Counts des ADC genutzt haben und damit ein Auflösungsvermögen von ca. 0.5km/h haben.
Mit dem 5010dp sollte sich dein Messbereich um 2.2x auf ca. 480km/h erweitert haben und ca. 920 Counts bei Vollaussteuerung gemessen werden. Damit bleibt das Auflösungsvermögen etwa gleich.
Die Frage wäre jetzt, was meinst du mit springender Anzeige, was steht im Logfile bzw. was ist deine Beobachtung?

Pressure::GetAirSpeed() bildet einen Mittelwert über 8 ADC Werte. Wenn ich nicht ganz daneben liegen braucht Arudino analogRead() ca. 105µs. Demnach benötigt Pressure::GetAirSpeed() als etwas länger als 1ms.
In AirSpeed.ino wird über 20 dieser Werte ein gleitender Mittelwert gerechnet und diese Daten dann mit JetiExProtocol::DoJetiSend() abgesetzt. Wenn dir das nicht genügt, könntest du hier einfach noch stärker "glätten". Die Datenpakete sollten dann alle 150ms übertragen werden (kommt mir zwar etwas komisch vor, ist in der Library aber so vorgesehen).
Wenn dir diese 6Hz zu schnell sind, könntest du z.B. den Aufruf in Zeile #109 nicht in jedem Schleifendurchlauf aufrufen, sondern nur mit der gwünschten Übertragungsrate. Das wirkt sich dann aber auch direkt auf die Logdaten aus. Da ich keinen Jeti-Sender besitze, weiß ich nicht, ob man sich die Anzeige von Telemtriewerten nicht auch am Sender noch anpassen kann. Ich ginge davon aus, dass es mit LUA-Skripten aber auf jeden Fall möglich sein sollte, da noch weiter zu glätten.

Wenn deine Sensorwerte trotz der schon implementierten Filterung deutlich springen, solltest du dir die Spannungsversorgung von Sensor und µC genauer anschauen. Es gibt immer besseres, aber der ADC des AVR sollte bei der mehrfachen Glättung eigentlich nicht viel mehr als 2-3LSB "rauschen". 5km/h Schritte sollten da schon stabil möglich sein. Entsprechend würde ich empfehlen einmal am Schreibtisch mit einem halbwegs brauchbaren Multimeter die tatsächlichen Versorgungs- und Referenzspannungen zu kontrollieren. Sonst schadet es oft auch nicht, sich Zwischenergebnisse von Berechnungen über Debugging-Ausgaben anzuschauen. Wenn du Pech hast, kommt es mit dem größeren Wertebereich vielleicht zu einem Überlauf oder Problemen bei einer Typumwandlung, die vorher nicht aufgefallen ist. Dafür würde ich an deiner Stelle aber schlicht die Arduino Tutorials zum ADC und der Arduino Serial Plotter Funktion nahelegen.

mfg Harald
 

gilles

User
Hallo Harald
Deine ausfürliche Erklärung hat mir schon wieder weiter geholfen und ich verstehe schönn langsam den Code, was hier Zeile für Zeile gemacht wird. Ich muß jetzt einmal damit fliegen und checken wie sich die Werte verhalten. Beim 7002 waren sie im Flug ziemlich stabil.
Wenn sich das beim 5010 auch so verhält hätte ich mein Ziel erreicht.
Werde weiter berichten sobald es Wetter und Lockdown zulässt.
Gruß
Christian
 

hsh

User
Hallo Christian,
dann viel Erfolg und hoffentlich plausible Werte :)
sonst wie gesagt - bitte die Log-Daten vom Sender hier anhängen. Bei Problemen im Modell ist bei solchen Schaltungen meistens die Bordspannungsversorgung kritisch. Wenn du am Schreibtisch Probleme hast, versuch diese bitte so weit wie möglich zu reproduzieren. Ich will nichts versprechen, aber vielleicht kann ich nach den Feiertagen einmal ein Arduino ausgraben und das Programm durchgehen.
Drucksensoren kann man eigentlich recht gut mit ein paar unterschiedlich großen Spritzen, dünnen Schlauchstücken und ein paar Y-Adaptern austesten. Mit den MPXV7xxx fehlt mir die Erfahrung, aber die MPX5xxx sind hart im nehmen und tun was im Datenblatt steht. Als Referenz gäbe es sonst z.B. bei Conrad das GDH 200-07 bis 200mbar oder das GDH 200-13 bis 2bar.
 

hsh

User
Hallo,
bist du schon zum Testen gekommen?
ich habe mir das Projekt mit ein paar Debug-Ausgaben einmal kurz auf ein Arduino Leonardo geflasht und eine 10-Gang-Poti (statt eines Drucksensors) zum Testen angeschlossen. Da schauen die Ausgaben in Abhängikeit von den ADC-Werten eigentlich wie erwartet aus. Wenn mit der Spannungsversorgung alles stimmt, darf es zu keinen Sprüngen bei den Geschwindigkeitswerten kommen.
Die Haupschleife braucht ca. 1050µs, wobei die die meiste Zeit wie zu erwarten durch den Aufruf speedSensor.GetAirSpeed() verbraucht wird. Mit den Datenblattwerten des MPX5010 sollten ca. 450km/h als max. Wert ausgegeben werden.
 

gilles

User
Hallo Harald
Bei diesem Wetter leider noch keine Tests (halber Meter Schnee auf unserem Flugplatz) der Jet ist fast fertig gebaut und das Pitotrohr montiert.Als Max Wert werden 475 km/h ausgegeben.Ich bin guter Dinge das es auch so gut funktionieren wird ,wie mit dem 7002dp.Es wird noch ein weilchen dauern bis ich in der Luft bin, ich gebe dir aber auf jedenfall Bescheid sobald ich den Erstflug hinter mir habe.
Gruß

Christian
 

gilles

User
Hallo Harald
Heute war es soweit, mein Carf Rebel hatte maiden und das neue Pitotrohr mit dem 5010 Drucksensor funktioniert dank deines Inputs wirklich gut.Kein springen der Werte und alles stabil. Höchste gemessene Geschwindigkeit lag bei 320 km/h und die Landegeschwindigkeit bei ca. 70km/h. Alles plausible Werte und somit habe ich mein Ziel erreicht den Speed Sensor bis ca.480km/h zu bauen.Der entscheidende Hinweis war in der speedpressure.cpp den Wert Pitotpressure auf 11111,11f zu ändern.Das wars..
Danke
Christian
 
Oben Unten