Forum: Mikrocontroller und Digitale Elektronik ESP32 + LVGL


von Semmel (Gast)


Lesenswert?

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

von weiter weg (Gast)


Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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
von Semmel (Gast)


Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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.

von Semmel (Gast)


Angehängte Dateien:

Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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.

von Semmel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.