Adafruit PiTFT 1.3" per SPI an Raspberry Zero sehr langsam

  • Hallo,


    ich habe ein Adafruit PiTFT 1.3" per SPI an einen Raspberry Zero angeschlossen. Als ersten Test habe ich zur Ansteuerung das Beispiel Python Script verwendet. Das funktioniert auch so weit, es werden Werte angezeigt.


    Ich habe das Script dann erweitert um die Anzeige der aktuellen Zeit:

    Code
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
        draw.text((x, y), "Time: " + current_time, font=font, fill="#FF00FF")

    Funktioniert auch, aber... die Bildaktualisierungsrate liegt bei 3..4 Sekunden!


    Das liegt an dem Aufruf:

    Code
        # Display image.
        disp.image(image, rotation)

    Diese Funktion braucht recht lange. Weiß hier jemand, warum das so ist? Liegt das an der Python-Implementierung?


    Eigentlich wollte ich das Display nutzen, um dort eine Trendkurve mit einer deutlich höheren Aktualisierungsrate (min. 100ms) anzuzeigen...


    - Gibt es noch eine andere Möglichkeit, Text auszugeben, als diesen vorher in ein Image zu schreiben?

    - Sollte man besser nur einzelne Bildteile neu schreiben und nicht das gesamte Bild?

    - Hat jemand vielleicht ein Beispiel, in dem die Ansteuerung schneller ist?


    Vielen Dank schon mal.

  • Go to Best Answer
  • joline Bei der verlinkten Produktseite steht ca. 15 FPS. Und im ”LEARN”-Abschnitt ein Link zu einem GIF-Player in Python.


    Wenn es langsam ist, müsstest Du mal schauen wo die Zeit bleibt und messen was wie langsam ist.

    “I will not sell my kidney on eBay

    I will not sell my kidney on eBay

    I will not sell my kidney on eBay …” — Bart Simpson

  • __blackjack__ Wie oben geschrieben, die Zeit vergeht beim Aufruf von disp.image(). Der Aufruf dieser Funktion braucht 3..4 Sekunden.


    15fps wären ja für mich ausreichend. Ich kann mir eigentlich auch nicht vorstellen, dass der Raspi und SPI dafür zu langsam sind.

  • Adafruit hat da inzwischen eine ganze Menge Abstraktionen drin. Eigentlich ist das sehr Gut, aber es könnte sein, dass hier etwas schief geht, und statt hardware SPI ein Software bit banging device angeworfen wird, ohne das du das merkst. Am einfachsten prüfen lässt sich das mit einem Oszillographen an der SPI clock Leitung.

  • Hm, ich habe leider keinen Oszi...

    Erst hat es gar nicht funktioniert und nichts angezeigt. Dann habe ich via "raspi-config" die SPI Schnittstelle enabled. Danach wurde alles wie erwartet angezeigt.


    Es gibt ein anderes Testprogramm, welches auf die beiden Taster reagiert und dementsprechend einen bestimmten Bereich einfärbt. Das funktioniert mit der Funktion "disp.fill()" und ist so ziemlich verzögerungsfrei. Probleme scheint eben die Funktion "disp.image()" zu machen.


    Nehmen wir mal an, da wird kein Hardware SPI verwendet (obwohl wie geschrieben die Programme erst nach enablen funktionierten), kann ich das auch ohne Oszi rausbekommen?

    • Best Answer

    So wie du das beschreibst würde ich meine Hypothese da erstmal nicht weiter verfolgen. Es wäre auch nicht einfach ohne Oszi. Erst recht nicht Geschwindigkeit zu bestimmen. Und die ist ja auch ausschlaggebend.


    Ich habe aber inspiriert euch deine Anmerkung mit fill nochmal geschaut: https://github.com/adafruit/Ad…t_rgb_display/rgb.py#L193


    Das wäre eine Erklärung. Installier auch mal numpy.

  • Ich habe numpy schon installiert. Aber ich habe gerade noch mal einen Hinweis auf der Adafruit Seite gefunden. Da steht ziemlich unscheinbar ganz oben im ersten Satz unter "Setup":

    Quote

    "You'll need to install the Adafruit_Blinka library that provides the CircuitPython support in Python."

    Das habe ich noch nicht gemacht. Ich hatte das überlesen und nur die Komponenten installiert, die weiter unten aufgeführt sind. Vielleicht ist das ja ein Grund. Werde ich gleich heute Abend mal ausprobieren. Da ist auch ein kleines Blinka-Test Programm dabei, was SPI checkt.


    Update:

    Interessant ist allerdings, was ich gerade im Code des Animated_Gif-Examples gefunden habe:

    Quote

    This example is for use on (Linux) computers that are using CPython with
    Adafruit Blinka to support CircuitPython libraries. CircuitPython does
    not support PIL/pillow (python imaging library)!

    Das würde sich ja dann sozusagen widersprechen. Einerseits soll man Blinka installieren (Adafruit_Blinka library that provides the CircuitPython support) und anderseits unterstützt CircuitPython aber nicht PIL...

    Edited once, last by joline ().

  • @__deets__ mit print-debugging habe ich ja herausgefunden, dass das Problem bei der Funktion "disp.image()" liegt. Dieser Aufruf braucht 3..4 Sekunden.


    Jetzt habe ich auch Blinka installiert (eine ziemliche Orgie, was dieses Script alles installiert OMG!) und es wurde nicht besser.

    Ein

    Code
     ls /dev/spi*

    liefert

    Code
    /dev/spidev0.0  /dev/spidev0.1

    Damit ist wohl auch SPI aktiviert. Ob es allerdings auch genutzt wird?...


    Ich habe mal das Script animated_gif zu Laufen gebracht. Das zeigt ein Gif einigermaßen flüssig an.


    Also das Problem ist wirklich die Funktion "disp.image()", die unverhältnismäßig lange braucht.

  • 🤷‍♂️ Alles etwas undurchsichtig. Fakt ist das Display (ich habe es an einem ESP32S2) schafft mit 20MHz die Framerate. Ich würde mal durch Print-debugging versuchen dem bottleneck auf die Spur zu kommen. Die Struktur von https://github.com/adafruit/Ad…t_rgb_display/rgb.py#L103 ist ja recht simpel.

    Magst du mal deinen Code zeigen, wie du das geschafft hast..?

    Wenn's brennt 112 hilft weiter!

  • Du kannst das print debugging auch IN den adafruit code verlagern, und da sehen, was in die Hose geht.

  • Hm, das stimmt. Muss mal suchen, wo die Datei zu finden ist. Ich nutze sonst eher Hochsprachen, Python ist noch neu für mich. ;)

    🤷‍♂️ Alles etwas undurchsichtig. Fakt ist das Display (ich habe es an einem ESP32S2) schafft mit 20MHz die Framerate. Ich würde mal durch Print-debugging versuchen dem bottleneck auf die Spur zu kommen. Die Struktur von https://github.com/adafruit/Ad…t_rgb_display/rgb.py#L103 ist ja recht simpel.

    Nutzt Du in Deinem Code auch die Image() Funktion?


    Update:
    Ich sehe gerade, in dem animated_gif Beispiel wird auch "self.display.image()" verwendet und hier läuft es einigermaßen flüssig. Komisch.

    Edited once, last by joline ().