Das wohl kaum, es wird auf einen simplen UART Output einzelner Werte hinauslaufen, wenn er den Aufwand in Grenzen halten will.
Kompressionstester selbst bauen
-
-
Interesse ist notiert und wenn Breyker es ernst meint sind damit auch schon 4 zusammen..
Das Software Interface ist nicht so hübsch und grafisch, das würde meine Fähigkeiten auch über steigen. Das ganze läuft in der Arduino IDE also der Entwicklungsumgebung für Arduino. Man läd dort den Programmcode, kompiliert ihn für die angeschlossene Hardware und die führt dann das Programm aus. Die Ergebnisse werden von der Hardware zur IDE zurück gemeldet und dort ausgegeben. Wie erwähnt fühlen sich sicher Leute, die keine Berührungsängste mit Computern haben damit wohler. Ich habe das ganze nicht entwickelt, die Idee und das TR-01 Programm gibt es ja schon und das beruht nicht auf meinem Anstrengungen.
Ich löte nur ein paar Sachen zusammen modifiziere das Programm ein wenig:
Die Ziele dabei sind:- Ausgabe der Werte in bar
- Normierung der Werte auf 250rpm
- Berücksichtigung des aktuell herrschenden atmosphärischen DrucksWenn ihr weitere Anregungen habt bitte her damit, ich überlege dann ob das für mich machbar ist.
-
Das Programm wird natürlich eh veröffentlicht, also jeder der ein bisschen löten mag, kann sich das Ding auch einfach nachbauen..
-
Warum soll ich es nicht ernst meinen? Ich geb jedes jahr 1000de für den bock aus, da machen die drei kröten den bock auch net mehr fett!
-
Der erste Prototyp ist fertig, ich habe ein ganz gut passenden Gehäuse gefunden um den Mikrocontroller unterzubringen. Die Idee eine automatische Druckkorrektur zu integrieren habe ich wieder verworfen, ich habe es leider nicht hinbekommen die Sensoren zum Laufen zu bekommen. Was zur Zeit da ist, ist Kompressionsmessung in bar auf 250rpm normiert.
Ich werde das demnächst mal testen und hoffe es funktioniert wie gewünscht!
Leider habe ich ein Problem mit den USB to Serial Kabeln aus China, bekomme mit denen auch keine Verbindung zum Board. Ich teste das ganze jetzt mit einem anderen Kabel das funktioniert, sollte das alles hinhauen werde ich diese Kabel nachbestellen. Das ganze Teil wird dadurch leider etwas teurer, die China-Kabel haben weniger als einen € gekostet, das Kabel das funktioniert über 10.. -
Egal... bin immer noch interessiert. Finde einfach so bastellösungen viel geiler!
Zumal meine Erfahrung zeigt, das selbst gebaute "Spezial" Werkzeuge immer die besten sind. -
Wird jetzt auch nicht 'teuer' im Verhältnis.. Denke 10€ mehr, werde aber erstmal die Software testen, habe heute in Testläufen gesehen, dass irgendwas nicht so ist wie es soll. Habe morgen frei und werde nach dem Fehler suchen, nachdem ich dann einmal am Auto getestet habe kann ich verschicken..
-
Sollte nocht noch eine Vergleichmessung mit einem Mazda Tester erfolgen?
-
Ich habe vor 1000km einen Messung bei Mazda machen lassen, als Anhaltspunkt sollte das erstmal ausreichen.
-
Wenn das klappt wäre ich sofort dabei!
Das ist abgesehen von einem OBD Auslesegerät fast schon die zweitbeste Investition um den Zustand seines Fahrzeugs im Blickbzu behalten. -
So, ich habe die Programmierung überarbeitet und meinen nun das es so stimmen sollte, ich würde das gerne mal hier posten, vielleicht mag sich einer von Euch mal damit beschäftigen und feedback geben ob das alles passt so.
Die Basis des ganzen ist wie bereits erwähnt das TR01 Programm von John Doss der das ganze mit Casing entwickelt und in den USA verkauft hat (siehe Bild), John hat letztes Jahr den sourcecode hier: http://www.instructables.com/i…ngine-Compression-Tester/ veröffentlicht.
Die Schleife mit der er nach den Peaks sucht und die rpm berechnet sieht bei ihm so aus:
Code
Alles anzeigenvoid loop(){ if (firstrun==0){ //prints below text on bootup Serial.println("PSI: 000 000 000 RPM: 000"); firstrun=1; } OldTime=millis(); //record cycle begining time for RPM calculation face[0]=face[1]=face[2]=0; //zero out the faces for (i=0; i<3; i++) //the following code reads the sensor (in psi), looks for a peak pulse, assign$ { v = (analogRead(SENSOR)-103)/4.096; if (v < 0){v = 0;} while ((face[i]-v)<=5) { if(face[i]<v) face[i]=v; v = (analogRead(SENSOR)-103)/4.096; if (v < 0){v = 0;} } minimum=v; while((v-minimum)<5) { v=(analogRead(SENSOR)-103)/4.096; if (v < 0){v = 0;} if (minimum>v) minimum=v; } } time=millis(); //record cycle ending time for RPM calculation RPM=(180000/(time-OldTime));//calculate RPM
um das zu verstehen muss man wissen wie der Sensor arbeitet und was der analoge Input des arduino daraus macht. Der Sensor kann 0-200psi messen und gibt eine Gleichspannung aus, die proportional zum Druck ist: bei 0psi sind das 0,5V, bei 100psi 2,5V und bei 200psi 4,5V, das ist praktischer Weise linear. Der analoge Eingang vom arduino macht aus dieser Spannung eine Zahl, gemessen werden 0-5V DC wobei 0V die Zahl 0 ergibt und 5V 1023. Da sich der Sensor zwischen 0,5 und 4,5V bewegt sind also Zahlen zwischen 102,4 und 921,6 möglich (wobei die Kommastellen weg fallen). Das ist der Grund, aus dem John in seiner Schleife 103 vom SENSOR Wert abzieht, damit wird der Basiswert des Sensors von 0,5V zur neuen 0. Wenn man dann den Bereich von 102,4 bis 921,6 in 200psi aufteilt ergibt sich der Faktor 1/4,096, d.h. er rechnet in seiner Schleife direkt mit psi Werten. Ich habe mich dann gefragt, warum er die while Schleife bis <=5, bzw. <5 laufen lässt und das liegt daran, dass die Sensor Werte fluktuieren, also wenn ich den Sensor anschließe und einfach an der Luft lasse, bekomme ich Rohdaten im Bereich von ca. 85 bis 120, vermutlich einfach weil der Sensor nicht genauer ist und es minimale Schwankungen im Luftdruck gibt. Wenn man also wirklich streng nach größeren/kleineren Werten sucht, bekommt man auch ohne den Sensor an den Motor anzuschließen Peaks und und rpms die nichts mit der Realität zu tun haben, daher hat er die "Hürde" von 5psi eingebaut. Das schöne an der Rechnung mit psi ist, das man alles als integer machen kann und keine Kommastellen benötigt, mehr daszu später.
Meine Idee war dann, warum nicht die Peaks mit den Sensor Rohdaten berechnen? Hat den Vorteil, dass man die Konvertierung in eine Druckeinheit nur einmal am Ende machen muss und nicht einmal pro Millisekunde in der Schleife. Mein Code sieht jetzt so aus:Code
Alles anzeigenvoid loop(){ if (firstrun==0){ //prints below text on bootup Serial.println("BAR: 000 000 000 RPM: 000"); firstrun=1; } StartTime=millis(); //record cycle begining time for RPM calculation face[0]=face[1]=face[2]=0; //zero out the faces for (i=0; i<3; i++) //the following code reads the sensor (in values from 0-1023), looks for a peak pulse, assigns that to one of the faces, { //repeats the process for the next 2 faces and then moves on to the rest of the code v = (analogRead(SENSOR)); while ((v-face[i])>0) { if(v>face[i]) face[i]=v; v = (analogRead(SENSOR)); } minimum=v; while((v-minimum)<20) { v=(analogRead(SENSOR)-103); if (v < 0){v = 0;} if (minimum>v) minimum=v; } } time=millis(); //record cycle ending time for RPM calculation RPM=(180000/(time-StartTime)); //calculate RPM
Ich arbeite in der Schleife bei den Peaks mit Sensor Rohdaten um Rechenschritte zu sparen, bei den Minimas habe ich das zunächst auch versucht, hätte damit aber die "Hürde" zur Bestimmung des Minimals auf etwa das Doppelte erweitern müssen (weil die Werte dann wie erwähnt unter Normdruck um 102,4 schwanken), wenn man die 103 abzieht und Werte kleiner 0 verbietet, ist damit auch die Schwankung halbiert und ich kann 20 setzten, sonst hätte ich ca. 40 gebraucht. Die Hürde bei den Peaks braucht man aus meiner Sicht nicht, weil die Schleife nicht weiter läuft, solange es kein minimum gibt, ich habe den Code daher dahingehen geändert, dass die wirkich größste Zahl gesucht und gespeichert wird.
Am Ende hat man nun 4 Zahlen, 3 Peak-Werte in Sensor-Rohdaten und eine rpm.
Um von den Sensor-Daten auf bar-Werte zu kommen habe ich den linearen Zusammenhang zwischen beidem gesucht und multipliziere am Ende vor der Ausgabe damit:Codefloat bar_factor=0.1683290354778; //factor to calculate bar (x10) from analog sensor values dtostrf(round((face[0]-102.4)*bar_factor)/10,3,1,buf1)
Der Faktor selbst ist 0,01683290354778, ich ziehe jetzt den Offset von 102,4 ab, multipliziere mit dem Faktor mal 10, runde das auf 3 Stellen und teile dann wieder durch 10 um einen bar-Zahl mit einer Kommastelle zu bekommen, die Funktion dtostrf wandelt diese zahl dann in einen string um, so dass man sie ausgeben kann. Das ganze war für John einfachere, weil die psi Zahl ein interger ist und direkt in ein string gewandelt werden konnte.
Dann habe ich mir Gedanken über die rpm Korrektir gemacht und folgendes gefunden: https://www.rx8club.com/series…excel-application-180043/ Forumsmitglied "IOANNIStsa" sich die Arbeit gemacht das Originale Mazda Diagramm zu zerlegen und eine Excel App damit zu schreiben die eine rpm Korrektur macht, man kann das Excel Programm auf Seite 2 irgendwo runter laden was ich getan habe. https://www.rx8club.com/series…-compression-math-231810/ hier sieht man die Kurven mit denen er gearbeitet hat )Post 6). 2 Sachen fallen auf wenn man sich die Kurven ansieht, zum einen ist der Zusammenhang leider nicht linear und es sieht so aus als ob die Korrektur für jeden Druckwert gleich ist, also Wenn ich z.B. Kompressionswerte für 270rpm habe ist die Korrektur immer die gleiche um auf 250rpm zu kommen, egal ob es 8bar sind oder 4bar oder was auch immer. Weil ich jetzt nicht die komplette Matrix von Werten in das Programm übernehmen wollte (das wäre auch vom Speicher knapp geworden), habe ich mir seine Korrekturen in 10 rpm Schritten aus dem Excel tool geholt und ein Polynom 2ter Ordnung drüber gelegt, mit dem Ergebnis können nun die Kompressionswerte Drehzahl-Korrigiert werden, das ganze sieht so aus:Codefloat a0=8.5944582043344; //Polynom Fit a0 to norm values to 250rpm float a1=-4.8028702270382E-02; //Polynom Fit a1 to norm values to 250rpm float a2=5.4250515995872E-05; //Polynom Fit a2 to norm values to 250rpm float correction; //Correction value to norm values to 250rpm correction=a0+a1*RPM+a2*sq(RPM); //Calculate correction value to norm compression values to 250rpm dtostrf(round((face[0]-102.4)*bar_factor)/10+correction,3,1,buf1); //convert first face peak compression pulse to string and dump it into an array
Ich habe mich entschlossen beides auszugeben, die gemessene bar-Werte, rpm und die auf 250rpm korrigieren Werte, so dass man das auch mit einem tool der Wahl nachvollziehen kann wenn man mag.
Im Anhang habe ich ein zip gemacht, in dem der Originale Sourcecode von John, sowie mein modifizierter drin sind. Wenn Ihr Ideen habt was man besser machen kann, her damit!
Ausserdem habe ich jetzt mal alle Kosten addiert:
USB/Serial Kabel: 12€
Arduino Board: 3€
Gehäuse: 3€
Drucksensor: 11€
1/8" NPT Female auf M14x1,25 Adapter: 10€
Kleinkram (O-Ring, Lötzinn, Locite,..): 1€Zusammen 40€, für den Versand hätte ich gerne 5€. Also 45€ am Ende. Ich werde im Laufe der nächsten Woche den Adapter an meinem Motor testen wenn das klappt und die Kabel da sind, kann ich dann im Laufe der nächsten 2 Wochen verschicken.
Wenn es Läuft mache ich auch gerne einen Wiki-Eintrag wie man sich so ein Teil selbst bauen kann!
-
Sehr geil. Bin mal auf die messwerte gespannt. Die programmierung sagt mir nur Bahnhof. Kein plan davon xD.
-
Mit den Zahlen die der A/D Wandler ausgibt rechnen, als Integer, und erst am Ende in Bar umrechnen, halte ich auch für den praktischeren Weg. Super!
-
Super sache das ganze!
Selber bauen würde ich hin bekommen, aber das programmieren würde wohl in einer Selbstzerstörung des Geräts ausarten
Ich bin jetzt sehr auf die vergleichsmessung gespannt.
-
Source code sieht gut aus, sollte so definitiv stimmen.
Jetzt hängt der Rest nur noch von der Hardware ab...Wenn die Fertigung angeht, ich nehme einen.
-
Würde auch einen nehmen.
-
Also ich habe schon läger 5 Interessenten, die sich als erstes gemeldet haben bekommen ihren sofern sie noch wollen. Wenn das Interesse danach weiter groß ist, würde ich aber auch eventuell nochmal 5 bauen. Aber wie schon mal erwähnt, soll das nicht mein Hauptberuf werden, zumal ich auch echt null komma null daran verdiene (will ich auch nicht). Also lasst mich mal den ersten testen und wenn alles gut ist Bau ich die anderen 4 und dann wegen mir auch nochmal 5, aber ab da muss dann die wiki Eintrag reichen, die größte Arbeit ist dann eigentlich das zusammensuchen der Komponenten, dann sind es 8 Lötstellen und das Ding ist fertig..
-
Mein Fehler, hatte ich verdrängt, dass du für diese Stück schon so eingekauft hattest. Ok, dann wäre ich ggf. über eine Anleitung dankbar.
-
wiki Eintrag mache ich definitiv!
-
Ich habe mittlerweile selbst ein bisschen den Überblick verloren, wer jetzt einen Tester bekommt, daher musste ich es nochmal zusammen suchen und schreibe es jetzt hier hin:
1. Charge:
- Breyker
- Bernd_57
- WERRX8
- BadManRX
- Ich2. Charge:
- 8rx8
- Commander_Keen
- MeRx8
- yonaz
- InjilosWarteliste:
- Eckle4
- Erix8
- pica
- Spawn
- KleBoRIst das richtig so?
Damit wäre auch die 2 Charge (über)voll also bitte keine Anfragen mehr stellen.