Hallo Zusammen, Ich habe hier einen ESP32 mit ILI9341 am Laufen und kann soweit die LVGL Demos kompilieren und laufen lassen. Mein Problem ist das ich die Touch Funktion einfach nicht vernünftig kalibriert bekomme. Den Abgleich mache ich über TFTeSPI Abgleich. Wenn ich die Touch Daten in den LVGL code eintrage und dann die Beispiele mit diesen Daten Laufen lasse dann sind die Touch Koordinaten ziemlich daneben. Desweiteren habe ich keinen Hinweis gefunden wie man den Encoder hinzufügen kann. Wäre schön wenn sich hier jemand damit befasst hätte und sein Wissen teilen könnte. Besten Dank
Semmel schrieb: > Den Abgleich mache ich über TFTeSPI Abgleich. Aha! Und was ist TFTeSPI? Kann man das essen? Sind wir alle so allwissend wie du? Semmel schrieb: > Desweiteren habe ich keinen Hinweis gefunden wie man den Encoder > hinzufügen kann. Desweiteren habe ich keinen Hinweis gefunden was du mit "der Encoder" meinst. Desweiteren habe ich keinen Hinweis gefunden wohin du etwas hinzufügen willst.
Für den Touchscreen kommt es auf den Treiber an, man braucht die Rohwerte oder muss auf diese zurück rechnen können wenn die Korrekturfaktoren gelesen werden könnnen. Es gab bei älterem lvgl6 auch mal ein Beispiel dafür, finde ich aber gerade nicht mehr. für einen Encoder gibt es ein template, die Funktionen encoder_init() und encoder_read() muss man aber selber bereitstellen, es gibt ja viele verschiedene Encoder. https://docs.lvgl.io/master/porting/indev.html https://github.com/lvgl/lvgl/blob/master/examples/porting/lv_port_indev_template.c weiter weg schrieb: > Aha! Und was ist TFTeSPI? Kann man das essen? Sind wir alle > so allwissend wie du? dann einfach mal die Fresse halten wenn du keine Ahnung hast? Helfersyndrom hat Kontrolle über dich gewonnen?
:
Bearbeitet durch User
Vielen Dank für die Antworten bisher. J. S. schrieb: > Für den Touchscreen kommt es auf den Treiber an, man braucht die > Rohwerte oder muss auf diese zurück rechnen können wenn die > Korrekturfaktoren gelesen werden könnnen. Das ist mir klar daher schrieb ich auch... Semmel schrieb: > Den Abgleich mache ich über TFTeSPI Um es genauer zu beschreiben, im LVGL Source Code ist ja der Hinweis... 'Set the touchscreen calibration data, the actual data for your display can be acquired using the Generic -> Touch_calibrate example from the TFT_eSPI library'
1 | uint16_t calData[5] = { 388, 3500, 307, 3493, 3 }; |
2 | tft.setTouch( calData ); |
Die Werte dann in den LVGL Code eingetragen und ich bin ziemlich daneben. Zum Beispiel die Tastatur, ich drücke den Buchstaben u und das v reagiert. Das ist ziemlich weit weg. Da der Abgleich als solcher Funktioniert und innerhalb des TFTeSPI Triebers auch sehr genau funktioniert (Hier gibt es ein Beispiel mit einer Art Taschenrechner) kann eigentlich ja nur der LVGL Treiber die Ursache sein. > Es gab bei älterem lvgl6 auchmal ein Beispiel dafür, finde ich aber > gerade nicht mehr. Wäre klasse wenn du da nochmal nachsehen könntest. Zum Drehgeber / Encoder. Danke für den Hinweis auf die Templates. Es gibt in der Tat ein entsprechendes .h und .c file mit dem Hinweis: 'Copy this file as "lv_port_indev.c" and set this value to "1" to enable content' Was soll dann weiter mit den beiden Files passieren ? Der Treiber wird ja über sehr viele Schalter ala 'ifndef' gesteuert. Die Dateien einfach umzubenennen und den Schalter auf 1 zu setzen reicht hier nicht aus. Ich vermute die Dateien müssen anschließend zum Projekt hinzugefügt werden ? im Gegensatz zum lv_conf.h reicht es nicht aus einfach nur die Einstellungen vorzunehmen. Was mir hier helfen würde ist eine Schritt für Schritt Anleitung, in dem Sinne mache 1, 2, 3, 4... etc. Ich kann natürlich die Dateien dem Projekt hinzufügen und dann den Encoder Teil hinzufügen aber auch hier ist mir nicht wirklich klar was dieser liefern muß ? einen Treiber für nen Drehencoder habe ich selbst geschrieben, der Teil wäre kein Problem. Was aber braucht LVGL zurück ? Insgesamt finde ich die Library nicht wirklich gut dokumentiert oder ich habe hier einfach ein Verständnisproblem. Wie dem auch sein, jeder Hinweis würde mir helfen. weiter weg schrieb: > Aha! Und was ist TFTeSPI? Kann man das essen? Naja, wenn du mit den Begriffen nichts anfangen kannst, dann kennst du auch nicht die Antwort auf meine Frage. Sollte dich das Thema interessieren dann schau mal hier: https://github.com/Bodmer/TFT_eSPI Es ist der Grafiktreiber für das ILI-9341 Display was ich in Verwendung habe. Auf diesen setzt dann wiederum der LVGL Treiber auf, siehe: https://github.com/lvgl/lv_port_esp32 Besten Dank für eure Hilfe.
Semmel schrieb: > Um es genauer zu beschreiben, im LVGL Source Code ist ja der Hinweis... welcher Code ist das genau? Im lvgl Repo ist ein ESP32 Beispiel, aber das ist auch schon etwas älter und benutzt noch lvgl V7. Die Touch Kalibrierung ist da fixed in Konstanten die über KConfig im IDF gesetzt werden. Der Standardtreiber benutzt dann diese Konstanten in xpt2046_corr(). Hast du diese geändert? Der Encodertreiber ist ausreichend beschrieben wie ich finde, der wird zyklisch aufgerufen, darf also nicht blockieren und muss nichts/rechts/links liefern. Wie die Funktionen heißen ist auch egal, die werden ja als input driver registriert und man kann auch mehrere registrieren.
J. S. schrieb: > welcher Code ist das genau? Im lvgl Repo ist ein ESP32 Beispiel Kannst du mir mal nen Link setzen. Ich habe mal meinen Testcode angehangen. J. S. schrieb: > Die Touch Kalibrierung ist da fixed in Konstanten die über KConfig im IDF > gesetzt werden. Wie du im Anhang sehen kannst, wird einfach 'screenWidth' und 'screenHeight' gesetzt und der TFTeSPI Treiber mit den Konstanten geladen. In KConfig ist da nix. Die einzige Konfigurationsdatei die ich verwende ist die 'lv_conf.h'. J. S. schrieb: > Der Standardtreiber benutzt dann diese Konstanten in xpt2046_corr(). > Hast du diese geändert? Wie gesagt, ich habe da nichts angefasst, wo ist die zu finden ? Was ich herausgefunden habe ist, dass der Treiber und die lvgl unterschiedliche Auffasungen von screenWidth & screenHeight haben. Vertausche ich die beiden Werte (320 mit 240 und umgekehrt) in
1 | static const uint16_t screenWidth = 320; |
2 | static const uint16_t screenHeight = 240; |
zu
1 | static const uint16_t screenWidth = 240; |
2 | static const uint16_t screenHeight = 320; |
Dann passt der Touch Abgleich perfekt und alles ist da wo es sein soll aber die Anzeige zeigt im Landscape alles in Portrait an :-) also am rechten Bildrand fehlt dann einfach etwas. Touch passt dann aber genau :-) Strange. Also irgendwo beißen sich da TFTeSPI und LVGL. Der Encoder Mechanismus ist jetzt klar, danke für die Erklärungen. Ich verwende die aktuelle Version.
Semmel schrieb: > Wie gesagt, ich habe da nichts angefasst, wo ist die zu finden ? den lvgl Treiber benutzt du nicht, sondern du registrierst ja my_touchpad_read() als input driver. Und diese benutzt das touch Lesen von eTFT, hier kannst du also die Orientierung anpassen:
1 | /*Set the coordinates*/
|
2 | data->point.x = touchY; |
3 | data->point.y = touchX; // oder evtl. screenWidth - touchY; |
Genauso kannst du den Encoder Treiber bauen, eine weitere indev Struktur anlegen wie in Zeilen 102ff und eine neue Funktion my_encoder_read() bauen. Die muss dann wie in der Doku die Strukturmember entsprechend setzen, also z.B.
1 | data->enc_diff = enc_get_new_moves(); |
2 | if(enc_pressed()) |
3 | data->state = LV_INDEV_STATE_PRESSED; |
4 | else
|
5 | data->state = LV_INDEV_STATE_RELEASED; |
das muss also nicht aus einem lvgl Treiber kommen. So kann man auch auf Hardware Buttons irgendwelche Funktionstasten legen.
Danke nochmal für deine Hinweise, soweit ist alles klar. Das Problem bezüglich Touch ist nicht die Orientierung sondern die Skalierung (Raw Value XY falsch zugeordnet). Ich kanns recht einfach lösen in dem ich es selbst neu skaliere und mir hierfür nur die Rohen Werte von dem TFTeSPI Layer hole. Die Skalierung sitzt dann einfach zwischen den beiden Treibern.
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.