Hallo zusammen, erstmal hoffe ich das ich im richtigen Unterforum gelandet, da ich noch nicht so richtig weiß in welche Richtung das läuft, dachte ich, passt Projekte ganz gut. Worum geht es? Ich habe in meinem Auto (Audi S2 Bj. 93) einen Zeitronix ZT-2 Datenlogger. An diesen können mehrere Anzeigen angeschlossen werden mit den üblichen Telefonkabeln mit RJ11 Stecker. Ich habe nun eine Anzeige (Bilder im Anhang) die 1. zu groß ist um sie schön zu verbauen und 2. mir einen Wert ausgibt der noch weiter umgerechnet werden müsste, undzwar "User" (auf dem Bild aktuell 0,50). Die beiden oberen Werte "Lambda" und "AFR" bräuchte ich gar nicht, die werden sowieso auf einer zweiten runden Anzeige angezeigt. Was soll am Ende raus kommen? Ziel wäre es, nur die unteren beiden Werte "User" und "EGT" auf einer Anzeige angezeigt zu bekommen, sowie den Wert "User" umzurechnen mit einem gewissen Faktor. Am besten wäre die beiden Werte untereinander, oder zur Not alle 4 untereinander, also evtl ein 2x10 oder 4x10 Display, anstatt 2x20. Warum bin ich hier? ..ganz einfach, ich bin zwar beruflich Techniker für Automatisierung/Mechatronik, habe jedoch kaum Berührungspunkte mit Mikrocontrollern, LCD Anzeigen, und deren Programmierung. Bevor ich mich jetzt in das Projekt stürze und einen Haufen Zeit verbrate, wollte ich bei Leuten die in der Materie sind nachfragen ob so etwas sinnvoll machbar ist. Ich hatte auch schon in Erwägung gezogen mit einem Arduino oder Raspberry PI zu arbeiten, aber mir fehlt einfach die Erfahrung und das Wissen um abschätzen zu können ob sowas machbar ist. Ich würde mich gerne hautpsächlich mit Kaufteilen arbeiten, einfach um den Aufwand gering zu halten. Ich wäre froh um einige Einschätzungen; Ideen und Tipps zu dem Projekt. Hier folgen nun die Bilder: Display: https://abload.de/image.php?img=20200322_135954vmkvq.jpg Platinen: https://abload.de/image.php?img=20200322_140130vakrd.jpg https://abload.de/image.php?img=20200322_1402246pkgm.jpg https://abload.de/image.php?img=20200322_140330s8k3f.jpg https://abload.de/image.php?img=20200322_140338zykhm.jpg https://abload.de/image.php?img=20200322_140341x6ko1.jpg https://abload.de/image.php?img=20200322_140350fjjq5.jpg Vielen Dank und MfG Philipp
:
Verschoben durch Moderator
Philipp K. schrieb: > dachte ich, passt Projekte ganz gut Nein, passt gar nicht. Das ist für die Vorstellung fertiger Projekte, vorzugsweise in einer Form, in der das anderen auch was nutzt (also mit Bauplänen, Software etc.). Hab's verschoben.
Das ist ja offenbar eine reine "dumme" Anzeige, ohne Rückmeldung. Der MAX232 bedeutet, das ein echter RS232 Pegel vorliegt, also nicht TTL! Ich bin eigentlich nicht für Arduino, aber in diesem Fall dürfte das die einfachst Lösung sein. Also such dir ein schönes Display aus, dazu Ardu-Mini und einen RS232-TTL Pegelwandler. Mit einem Einsteiger youtube Video zur seriellen Schnittstelle dürfte das keine grosse Sache sein, auch wenn es dein erstes Mal ist.
Ach so, übel wäre natürlich, wenn die Daten verschlüsselt übermittelt werden, was ich allerdings nicht unbedingt glaube. Autoschrauber haben doch ein Notebook mit echter serieller Schnittstelle, oder? Damit kannst Du erste einmal lauschen was so alles an Daten ankommt.
@dl8dtl: Sorry fürs auswählen des falschen Unterforums, jetzt hab ich auch die Beschreibung des Unterforums gesehen.... Vielen Dank fürs verschieben! @pegel: Korrekt, handelt sich um eine reine Anzeige, es ist zwar ein Druckknopf vorhanden mit dem man den Maximalwert und die angezeigten Werte durschschalten kann, aber das wird wohl rein auf dem Display geschehen. Das klingt doch schon mal richtig gut, vielen Dank für die Top Infos! Da wäre ich so schnell von allein nicht drauf gekommen. Dann wird wohl der Plan sein ein Arduino Mini + ca. 3" Display mit SPI Schnittstelle zu nehmen. Macht es in der Programmierung und Ansteuerung einen großen Unterschied im Aufwand ob ich ein z.B. 4x10 LCD Display verwende oder ein z.B. 2,8" TFT Display? Zum Thema Laptop: Richtig erkannt. Ein Laptop mit serieller Schnittstelle ist vorhanden. Komme allerdings erst wieder in 1-2 Wochen zu dem Auto, werde dann aber mal versuchen den Traffic mitzuschneiden. Gibt es da ein Programm was besonders zu empfehlen ist? Zum Thema verschlüsselte Daten: Ich vermute auch eher nicht das die Daten verschlüsselt sind, habe heute zufällig ein Projekt auf Github für eine Android App gefunden, die per RS232 - Bluetooth Adapter die Daten auf genau meinem Datenlogger (Zeitronix Z-2) ausliest und auf dem Handy anzeigen kann. Hier mal der Link dazu: https://github.com/bnj04/Sub?files=1 Ich habe zwar keinerlei Erfahrung mit der Android App Programmierung, aber eventuell kann ich dort etwas über die Daten auf dem Bus herausfinden. Da auf dem Bus ja mehrere Sensorsignale laufen, muss es ja Identifier geben, mit denen ich die einzelnen Sensorsignale isolieren kann, und so einen Wert einem Sensor zuordnen kann.
Philipp K. schrieb: > Macht es in der Programmierung und Ansteuerung > einen großen Unterschied im Aufwand ob ich ein z.B. 4x10 LCD Display > verwende oder ein z.B. 2,8" TFT Display? Bei Ardu* musst Du dazu nur eine lib mehr einbinden, aber das wissen andere besser als ich. Bzw. eines der vielen yt Videos erklärt das. Philipp K. schrieb: > Traffic mitzuschneiden. > Gibt es da ein Programm was besonders zu empfehlen ist? Das kann jedes Terminal Programm. Es gibt sogar eins in der Ardu* IDE. Musst nur die Baudrate herausfinden: 9600, 115200 .. 7 oder 8 bit usw. Philipp K. schrieb: > Da auf dem Bus ja mehrere Sensorsignale laufen, muss es ja Identifier > geben, mit denen ich die einzelnen Sensorsignale isolieren kann, und so > einen Wert einem Sensor zuordnen kann. So hat der das für seine Android App sicher auch gemacht.
Ich bin heute mal ans Auto gekommen, und konnte mit HTerm bisschen was aufnehmen, ich hänge mal 3 Bilder mit ran. Auf 2 Bildern habe ich die Original Anzeige mit versch. Werten bei "User" aufgenommen, die anderen Werte konnte ich leider momentan nicht so einfach verändern.(Hier hat allerdings die Darstellung mit HTerm noch nicht so gut geklappt...) Auf dem 3. Bild habe ich in Rot die Werte für "User" markiert. Ich habe den Drucksensor mit Druck beaufschlagt, und es hat sich nur dieses byte geändert. Ich habe in HTerm alle "14 Character" eine neue Zeile anfangen lassen, so sind die Werte nicht mehr hin udn her gesprungen, und ich vermute, das entspricht einer kompletten Nachrichtenlänge? Ich habe hier noch ein ähnliches Projekt gefunden: http://www.css-networks.com/2017/11/arduino-zeitronix-reader-logger/ Ich dachte ich finde dort etwas raus, allerdings kann ich mir nicht wirklich erschließen wie nun die 3 Start byte aussehen sollen. Weiterhin habe ich das hier gefunden:
1 | |
2 | package com.alpinfra.subtunoid.comm; |
3 | |
4 | import java.io.IOException; |
5 | import java.io.InputStream; |
6 | import java.util.ArrayList; |
7 | import java.util.List; |
8 | import java.util.TimerTask; |
9 | import android.content.Context; |
10 | import android.os.Handler; |
11 | import android.util.Log; |
12 | |
13 | public class BTCommZeitronix extends CustomBTComm |
14 | { |
15 | private static final String TAG = "Subtunoid-BTCommZeitronix"; |
16 | // MAC-address of Bluetooth module |
17 | public static String addressBTZeitronix = "00:01:95:16:AB:94" ; |
18 | public static int rate = 100; |
19 | |
20 | public double AFRv; |
21 | public int EGTv; |
22 | public double Boostv; |
23 | |
24 | public BTCommZeitronix(Context context, Handler myHandler, Runnable myRunnable) |
25 | { |
26 | super(addressBTZeitronix, rate, context, myHandler, myRunnable); |
27 | Log.d(TAG, "...onCreation..."); |
28 | tt = new TimerTask() |
29 | { |
30 | @Override |
31 | public void run() |
32 | { |
33 | List<Byte> b = readdata(inStream); |
34 | if (b.size() > 10) |
35 | { |
36 | EGTv = asUnsignedInt(b.get(5)) * 256 + asUnsignedInt(b.get(4)); |
37 | AFRv = 1.0 * asUnsignedInt(b.get(3)) / 10.0; |
38 | |
39 | // MAP = (MAP(low) + MAP(high) * 256) / 10 Units inHg vacuum/PSI boost |
40 | if ((b.get(9) & 128) == 128) |
41 | { |
42 | //byte t = ; |
43 | Boostv = 0.0 - (asUnsignedInt((byte) (b.get(9) & 0x7f)) * 256.0) - asUnsignedInt(b.get(8)); |
44 | // conversion inhg en bar |
45 | Boostv = Boostv * 0.00295299830714; |
46 | |
47 | } |
48 | else |
49 | { |
50 | Boostv = asUnsignedInt(b.get(9)) * 256.0 + asUnsignedInt(b.get(8)); |
51 | // conversion psi en bar |
52 | Boostv = Boostv * 0.0068947573; |
53 | } |
54 | } |
55 | _myHandler.post(_myRunnable); |
56 | } |
57 | }; |
58 | } |
59 | |
60 | |
61 | private int asUnsignedInt(byte bytes) |
62 | { |
63 | int i = 0; |
64 | for (int j = 0; j < 1; j++) |
65 | { |
66 | if (j > 0) |
67 | { |
68 | i <<= 8; |
69 | } |
70 | i |= bytes & 0xFF; |
71 | } |
72 | return i; |
73 | } |
74 | |
75 | private List<Byte> readdata(InputStream is) |
76 | { |
77 | boolean stop = false; |
78 | boolean packetStarted = false; |
79 | List<Byte> buffer = new ArrayList<Byte>(14); |
80 | |
81 | int a = 0; |
82 | try |
83 | { |
84 | a = is.available(); |
85 | if (a > 28) |
86 | { |
87 | is.skip(a-28); |
88 | } |
89 | } |
90 | catch (IOException e1) |
91 | { |
92 | // TODO Auto-generated catch block |
93 | e1.printStackTrace(); |
94 | } |
95 | |
96 | |
97 | while (!stop) |
98 | { |
99 | byte[] ba = new byte[1]; |
100 | try { |
101 | is.read(ba); |
102 | } catch (IOException e) { |
103 | // TODO Auto-generated catch block |
104 | e.printStackTrace(); |
105 | stop = true; |
106 | } |
107 | byte b = ba[0]; |
108 | if (b == 0x02 |
109 | && buffer.size() >= 2 |
110 | && buffer.get(buffer.size() - 1) == 0x01 |
111 | && buffer.get(buffer.size() - 2) == 0x00) |
112 | { |
113 | packetStarted = true; |
114 | buffer.clear(); |
115 | buffer.add((byte) 0x00); |
116 | buffer.add((byte) 0x01); |
117 | buffer.add(b); |
118 | |
119 | } |
120 | else |
121 | if (packetStarted && buffer.size() <= 14) |
122 | { |
123 | buffer.add(b); |
124 | switch (buffer.size()) { |
125 | case 14: |
126 | packetStarted = false; |
127 | stop = true; |
128 | //Log.d(TAG, "...Reading..."); |
129 | } |
130 | } |
131 | else |
132 | { |
133 | buffer.add(b); |
134 | packetStarted = false; |
135 | |
136 | |
137 | } |
138 | } |
139 | return buffer; |
140 | } |
141 | |
142 | } |
Ich habe außerdem versucht mit HTerm wieder Daten an das Display zu senden, also das Display direkt per USB-RS232 Adapter an den PC, Display extern mit 5V versorgt, und die vorher gespeicherten Daten wieder zu senden. Das Display geht aus dem Standby (es wird no Data angezeigt) und zeigt die ganzen Namen der Werte, also AFR, User, EGT usw., aber keine Werte. Wie finde ich raus ob ich in Hex, Bin oder Ascii senden muss?
:
Bearbeitet durch User
Philipp K. schrieb: > Wie finde ich raus ob ich in Hex, Bin oder Ascii senden muss? Dein Problem ist eher das Protokoll. Ohne es zu kennen wird es schwierig. Es muss irgendeine Struktur haben w.z.B. 1.Wert: x, 2.Wert Y, .... Im weiteren ist die Frage ob die Werte schon im Klartext gesendet werden oder binär die noch umgewandelt werden müssen vor der Ausgabe an LCD. Versuche nachvollziehen wenn sich nur ein Wert auf eine Stelle ändert, was ändert sich im Protokoll und wo. Beispiel: Der Wert 100 im ASCII sieht so aus: 31h, 30h, 30h. Wird er aber binär als Byte übertragen, dann siehst du 64h. Das ist nur ein Beispiel.
Gibt es so etwas schönes wie GHex auch für Win? https://wiki.gnome.org/Apps/Ghex Damit kann man ein oder mehrere Byte(s) auswählen, die dann in den verschiedensten Zahlenformaten angezeigt werden. Das macht die Suche nach sinnvollen Werten bedeutend einfacher.
Erstmal vielen Dank für die Rückmeldungen und Hilfestellungen. Ich versuche nochmal etwas genauer zu beschreiben was ich herausgefunden habe. 1) Hier steht etwas zum Aufbau der Nachrichten: http://www.css-networks.com/tag/zeitronix/ > #Zeitronix Packet format, bytes[] > #[0] always 0 > #[1] always 1 > #[2] always 2 > #[3] AFR > #[4] EGT Low > #[5] EGT High > #[6] RPM Low > #[7] RPM High > #[8] MAP Low > #[9] MAP High > #[10] TPS > #[11] USER1 > #[12] Config Register1 > #[13] Config Register2 2) Hier werden die bytes wie oben genannt auch für eine andere Logging software verwendet und weiter verarbeitet, also byte 11 passt hier auch zu User1: https://github.com/RomRaider/RomRaider/blob/0f4814c8ae2fec6ee58f9e84a36a1078f404ceed/src/main/java/com/romraider/logger/external/zt2/io/ZT2Runner.java > case 12: > dataItem = dataItems.get(USER1); > if (dataItem != null) { > int raw = asUnsignedInt(buffer.get(11)); > dataItem.setRaw(raw); Weiterhin ist hier m.M.n. zu sehen wie nach den Startbytes gesucht wird: > public void run() { > try { > boolean packetStarted = false; > List<Byte> buffer = new ArrayList<Byte>(14); > while (!stop) { > byte b = connection.readByte(); > if (b == 0x02 > && buffer.size() >= 2 > && buffer.get(buffer.size() - 1) == 0x01 > && buffer.get(buffer.size() - 2) == 0x00) { > packetStarted = true; > buffer.clear(); > buffer.add((byte) 0x00); > buffer.add((byte) 0x01); > buffer.add(b); Müssten demnach nicht die Startbytes so aussehen: 0x00 0x01 0x02 ? 3) Das ganze würde sich in meinen Daten wiederspiegeln: (Siehe hierzu nochmal das angehängte Bild) Demnach würde eine Nachricht (aufgenommen von mir) so aussehen: 00 01 02 D2 C8 00 00 00 FF 80 43 19 FE FF (14 bytes in HEX) Die "19" konnte ich bereits als Wert für "User" identfizieren. 0x19 wären DEC 25. Der Angezeigte Werte ist 0,5. Würde mit /50 passen. Als ich den Sensor "USER" abgezogen habe, ging die LCD Anzeige auf 2.85 hoch. Hier die Daten dazu: 00 01 02 D2 C8 00 00 00 FF 80 43 90 FE FF (14 bytes in HEX) Als Daten kam 0x90 an, was DEC 144 entspricht. 144/50=2,88. Hier ist eine leichte Abweichung, kann aber auch sein das dass LCD Display nur bis 2,85 hoch zählt, einen höheren Wert hatte ich dort noch nie. Konnte bisher leider keinen Wert dazwischen einstellen, das müsste ich mal testen, ist aber etwas aufwändiger da der Sensor als benzindrucksensor eingesetzt wird und das Auto momentan nicht lauffähig ist. Ich bin der Meinung damit müsste ich die Daten zumindest mal auswerten können, warum nun das ganze Rückwärts, also vom Laptop auf das Display nicht klappt kann ja eventuell ganz andere Gründe haben. Ich weiß nicht wie HTerm genau sendet, ob die Baudrate auch wirklich passt etc... habe wiegeasgt mit sowas noch nie gearbeitet.
Philipp K. schrieb: > 00 01 02 D2 C8 00 00 00 FF 80 43 90 FE FF (14 bytes in HEX) Der Wert für EGT dürfte dann auch stimmen auf der Stelle 4 und 5. Dort hast du C8h, 00h. Darstellung in 16-bit Integer= 256*Hi + Lo = 0*256+ 200 = 200 (C8h auf der Stelle 4) Philipp K. schrieb: > Ich weiß nicht > wie HTerm genau sendet, Checke ob das Senden mit CR+NL terminiert ist und schalte es ab, sonst wird das Paket um 2 Bytes länger.
Genau, der Wert sollte soweit auch passen. Konnte ich aber noch nicht verifzieren ob die "200" nur Zufall sind oder nicht, komme an den Temperatursensor im Krümmer kaum noch ran, und der Motor läuft grad nicht. Das sollte ich in paar Tagen sicher sagen können. Ich denke ich werde mir jetzt mal die Hardware besorgen und los legen, für mich sieht das machbar aus, mit den Informationen die ich bisher mit eurer Hilfe (VIELEN DANK!)und anderen Projekten sammeln konnte. Zur Hardware: @pegel hat einen Arduino Mini vorgeschlagen, der hat ja nur einen Hardware serial, das heißt ich kann entweder per USB Converter Programmieren, oder serielle Daten empfangen. Wäre der Mini PRO eine Option? Soweit ich das nun verstanden habe, wäre es mit dem möglich über den USB Anschluss "Serial" zu programmieren und parallel über "Serial1" Daten von dem Zeitronix Datenlogger zu empfangen. Das würde vermutlich auch das debuggen und die Fehlersuche einfach machen. Oder habe ich hier die Funktion von Serial und Serial1 missverstanden? Als Display ist dieses hier geplant: Touchscreen 2.8" inch Zoll 240x320 SD SPI TFT LCD MCUfriend display für Arduino https://www.ebay.de/itm/Touchscreen-2-8-inch-Zoll-240x320-SD-SPI-TFT-LCD-MCUfriend-display-fur-Arduino/174185924050?hash=item288e4a45d2:g:3RoAAOSwx1ReP9Z9 Touch brauche ich vermutlich erstmal nicht, aber villeicht mal nen kleinen button einbinden zum resetten von Min./Max. Werten oder sowas. Die Kombination Mini/Micro mit diesem Display sollte ja wohl funktionieren über eine SPI Verbindung, oder ist das hier anders wegen Touch?
Welcher Ardu* es genau wird, konnte ich nicht sagen. Stecke da nicht so drin. Aber der Anbieter deines Wunsch Display hat auch ein Beispiel bereitgestellt. https://github.com/prenticedavid/MCUFRIEND_kbv/tree/master/examples/diagnose_TFT_support
Laut Hinweis in der .ino: 11. It should run on a UNO, MEGA2560, LEONARDO, DUE, ZERO, M0-PRO,
Und natürlich RS232 Pegelwandler nicht vergessen.
Danke, werde mich dann nochmnal bisschen im Internet umschauen ob das alles so zusammen passt. Ja auf der Bestellliste sind: - Arduino Mini oder Micro - Touch TFT Display - MAX3232 Pegelwandler - Stepdown von 12V auf 5V: https://www.ebay.de/itm/Step-Down-Spannungsregler-DC-4-5V-24V-Eingang-1-8V-12V-Ausgangsspannung-3A-max/183157895908?hash=item2aa50fb2e4:g:Vw4AAOSwPnNawVJk - RJ11 Kabel und Buchsen um alles Plug and Play an den Zeitronix Datenlogger anschließen zu können Also das senden vom PC an das LCD Display klappt bei mir nicht. Liegt evtl an der gebastelten 5V Spannungsversorgung, evtl kommen da Störungen auf GND oder sonst was. Werde mich damit jetzt auch nicht weiter beschäftigen, das Ziel ist es ja die Daten zu empfangen und ein neues Display zu nutzen. Das Originale fliegt ja dann raus, sieht man bei bisschen Sonne eh nix.
:
Bearbeitet durch User
Philipp K. schrieb: > Also das senden vom PC an das LCD Display klappt bei mir nicht. Das ist schlecht. Du solltest das schon zum laufen bringen. Die seriellen Einstellungen lassen sich so leichter ermitteln, als später wenn vielleicht noch Ardu* Probleme hinzukommen.
Ich kann morgen mal Screenshots von HTerm einstellen. Ich vermute es liegt eher an der Verkabelung. An dem display kommen 3 Leitungen an. GND, Plus und eine Datenleitung. Ich habe auf GND und Plus ne 5v Spannungsversorgung gehängt, das gibt vielleicht Probleme da der GND der gleiche ist wie der vom Datenanschluss...
Habe nochmals Bilder von HTerm sowie der Verkabelung angehängt. Im Bild NoDataSend schicke ich noch keine Daten, das Display zeigt "No Data". Auf dem Bild DataSend schicke ich die Hex Bytes und das Display geht aus dem Idle aber zeigt nur 0en. Ich vermute das könnte an der Verkabelung liegen. Die Spannungsversorgung von 5V über eine Powerbank teilt sich ja den GND mit dem Seriellen Anschluss. Ich musste das leider so machen, da der RS232 Converter keine 5V ausgibt um das Display zu betreiben. Edit: Das Parity Even war nur für Testzwecke eingestellt. Es geht auch mit None nicht.
:
Bearbeitet durch User
Möchte mich hier nochmal für die Unterstützung bedanken, vorallem an pegel! Hier mal der vorerst fertige, und eingebaute Stand: https://abload.de/img/1wdklf.jpg https://abload.de/img/2dskoo.jpg https://abload.de/img/3nbjnt.jpg Und noch ein kleines Video: https://www.youtube.com/watch?v=inmeuoig15M&feature=youtu.be
Gratuliere! Das sieht aus, als ob es zum Auto gehört. :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.