GPIO, Projekte

LCD Touch Display (3.2″) am Raspberry Pi

Früher oder später überlegen sich die meisten Bastler einen Touchscreen anzuschaffen. Kleinere Touchscreens gibt es bereits ab 10-20€, die Vorteile sind (besonders was eine GUI für z.B. die Hausautomation angeht) aber groß und der Aufwand relativ gering, wie ich zeigen werde.

Ich benutze als Beispiel einen 3.2 Touchscreen von Sainsmart, allerdings kann auch jeder andere unterstützte Touchscreen genommen werden.



Zubehör

 

Wer, wie ich, das ganze zusammen löten möchte und ein aufsetzbares Shield auf den TFT machen möchte, braucht noch eine 2×20 Buchsenleiste, eine  Lochrasterplatte sowie Lötutensilien.

 

Aufbau

Hier gibt es zum einen jene Pins, die direkt mit dem Pi verbunden werden. Diese sehen wie folgt aus:

sainsmart wiring
Hierbei kannst du D_Penirq an jeden freien GPIO stecken, du musst dies nur später angeben. Ich habe GPI23 genommen.
Die weiteren Pins des Displays müssen über die Bausteine verbunden werden. Manche Pins des Pi’s (wie MOSI, SLCK, …) werden öfters gebraucht, dies sollte beim Verbinden beachtet werden. Die Verbindungen sind folgendermaßen (Links die Pins vom Pi, rechts jene vom Display).

 

Die Verbindungen von GND der Bauteile sind der Übersichtlichkeit zuschulde nicht eingezeichnet, müssen aber natürlich trotzdem mit GND des Pi’s verbunden werden.
Außerdem sind die Ausgänge nicht alle, wie eingezeichnet, auf der rechten Seite, sondern verteilt. Daher schauen wir uns die verschiedenen Bauteile im Einzelnen an:

74HC4040 (Datenblatt)

74hc404074hc4040_pins

 

74HC4094 (Datenblatt)

74hc4094

 

74HC04 (Datenblatt)

hc04

Dieses Bauteil hat mehrere Inverter. Wir benötigen nur eines davon. Zum Beispiel kannst du Pin 1 (1A) als Eingang nehmen (Ausgang von 74HC4040) und Pin 2 (1Y) als Ausgang zum Pin 5 (WR) des Displays.

 

 

 

 

 

 

Software

Zu allererst muss das System den Platz der ganzen SD Karte einnehmen, falls du das schon gemacht hast, kannst du es überspringen. Falls nicht, geht es mit

sudo raspi-config

Im Menü wählst du „Expand Filesystem“ (erster Punkt) und bestätigst (auch die Frage nach dem Neustart).

Außerdem muss sichergestellt sein, dass SPI aktiviert ist:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

Kommentiere die entsprechende Zeile aus:

#blacklist spi-bcm2708

 

Nun laden wir die Treiber (was einige Minuten dauern kann) und starten neu:

sudo REPO_URI=https://github.com/notro/rpi-firmware BRANCH=latest rpi-update
sudo reboot

Anschließend

sudo modprobe fbtft_device name=flexfb rotate=1 speed=16000000 gpios=reset:25,dc:24

und

sudo modprobe flexfb debug=3 width=240 height=320 regwidth=16 setaddrwin=2 init=-1,0x00,0x0001,-1,0x03,0xA8A4,-1,0x0C,0x0000,-1,0x0D,0x080C,-1,0x0E,0x2B00,-1,0x1E,0x00B7,-1,0x01,0x2B3F,-1,0x02,0x0600,-1,0x10,0x0000,-1,0x11,0x6068,-1,0x05,0x0000,-1,0x06,0x0000,-1,0x16,0xEF1C,-1,0x17,0x0003,-1,0x07,0x0233,-1,0x0B,0x0000,-1,0x0F,0x0000,-1,0x41,0x0000,-1,0x42,0x0000,-1,0x48,0x0000,-1,0x49,0x013F,-1,0x4A,0x0000,-1,0x4B,0x0000,-1,0x44,0xEF00,-1,0x45,0x0000,-1,0x46,0x013F,-1,0x30,0x0707,-1,0x31,0x0204,-1,0x32,0x0204,-1,0x33,0x0502,-1,0x34,0x0507,-1,0x35,0x0204,-1,0x36,0x0204,-1,0x37,0x0502,-1,0x3A,0x0302,-1,0x3B,0x0302,-1,0x23,0x0000,-1,0x24,0x0000,-1,0x25,0x8000,-1,0x4f,0x0000,-1,0x4e,0x0000,-1,0x22,-3

Dein Display sollte nun schwarz werden. Um nun das Terminal bzw. den Desktop zu starten musst du folgendes eingeben:

Konsole

con2fbmap 1 1

Desktop

FRAMEBUFFER=/dev/fb1 startx

 

Soweit so gut. Du wirst sehen, dass der Touchscreen allerdings noch nicht funktioniert. Dazu stoppst du ggf. mit STRG+C die Anwendung und gibst ein:

sudo modprobe ads7846_device debug=1 cs=1 speed=2000000 model=7846 swap_xy=1 x_min=300 x_max=3800 y_min=700 y_max=3400 x_plate_ohms=60 pressure_max=255 gpio_pendown=23 keep_vref_on=1

Wobei gpio_pendown=23 die Nummer des GPIOs angibt (oben als GPIOxx bezeichnet).

Wenn du das Display im Querformat benutzt, wird der Touch noch spiegelverkehrt sein, daher müssen wir xinput installieren:

sudo apt-get install xinput

Nun können wir den Desktop erneut starten:

FRAMEBUFFER=/dev/fb1 startx &
DISPLAY=:0 xinput --set-prop 'ADS7846 Touchscreen' 'Evdev Axis Inversion' 1 1

Die zweite Zeile „spiegelt“ die Touch Achsen erneut.

 

Dauerhaftes starten

Um das Display (mit Touch) automatisch beim Start zu initialisieren, müssen 3 Dateien bearbeitet werden.

1. Die Module beim starten laden lassen.

sudo nano /etc/modules

Ans Ende der Datei kommen folgende Zeilen:

fbtft_device name=flexfb rotate=1 speed=16000000 gpios=reset:25,dc:24
flexfb debug=3 width=240 height=320 regwidth=16 setaddrwin=2 init=-1,0x00,0x0001,-1,0x03,0xA8A4,-1,0x0C,0x0000,-1,0x0D,0x080C,-1,0x0E,0x2B00,-1,0x1E,0x00B7,-1,0x01,0x2B3F,-1,0x02,0x0600,-1,0x10,0x0000,-1,0x11,0x6068,-1,0x05,0x0000,-1,0x06,0x0000,-1,0x16,0xEF1C,-1,0x17,0x0003,-1,0x07,0x0233,-1,0x0B,0x0000,-1,0x0F,0x0000,-1,0x41,0x0000,-1,0x42,0x0000,-1,0x48,0x0000,-1,0x49,0x013F,-1,0x4A,0x0000,-1,0x4B,0x0000,-1,0x44,0xEF00,-1,0x45,0x0000,-1,0x46,0x013F,-1,0x30,0x0707,-1,0x31,0x0204,-1,0x32,0x0204,-1,0x33,0x0502,-1,0x34,0x0507,-1,0x35,0x0204,-1,0x36,0x0204,-1,0x37,0x0502,-1,0x3A,0x0302,-1,0x3B,0x0302,-1,0x23,0x0000,-1,0x24,0x0000,-1,0x25,0x8000,-1,0x4f,0x0000,-1,0x4e,0x0000,-1,0x22,-3
ads7846_device swap_xy=1 debug=1 cs=1 speed=2000000 model=7846 x_min=230 x_max=3900 y_min=200 y_max=3700 x_plate_ohms=80 pressure_max=255 gpio_pendown=23 keep_vref_on=1

Dies sind die selben Befehle wie zuvor verwendet. Hast du also andere GPIOs und/oder Einstellungen, solltest du diese anpassen. Mit STRG+O und STRG+X speichern und beenden.

2. Autologin

sudo nano /etc/inittab

Du musst die obere Zeile suchen (z.B. mit STRG+W) und auskommentieren (mit #). In der nächsten Zeile fügst du die beschriebene Zeile ein.

#1:2345:respawn:/sbin/getty --noclear 38400 tty1
1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1

3. X starten

sudo nano /etc/rc.local

Nach den Kommentaren fügst du die folgenden Zeilen ein (wieder Befehle von oben; falls geändert auch hier ändern). Das sleep 3 sorgt dafür, dass vor dem kalibrieren X vollständig laden kann.

su -l pi -c "env FRAMEBUFFER=/dev/fb1 startx &"
sleep 3
su -l pi -c "DISPLAY=:0 xinput --set-prop 'ADS7846 Touchscreen' 'Evdev Axis Inversion' 1 1"

 

Du kannst nun neustarten und wirst merken, dass das Display gleich starten sollte:

sudo reboot

 

Im zweiten Teil gehe ich noch auf Anpassungen (wie Kalibrierung) ein.

Bei Fragen solltest du einen Blick in das fbtft Wiki werfen oder sie in den Kommentaren stellen.

 



, , , , , ,


20 Kommentare

  1. Manfred sagt:

    Hallo, ich war froh endlich eine Lösung gefunden zu haben, damit mein Display funktioniert, aber leider geht es nicht. Equipment Raspberry Mod2 ( 900Mh, 1GB, Display SainSmart 3.5 inch 320*480 ) Vorgehensweise:
    Neues Raspbian Image
    Grundkonfiguration gemacht incl. SPI enable,
    sudo apt-get update
    sudo apt-get upgrade
    sudo rpi-update
    sudo reboot -> Alles gut Raspberry startet und steht zur Verfügung.
    Dann nach dieser Zeile schauen
    sudo nano /etc/modprobe.d/raspi-blacklist.conf – Wird nichts angezeit, leere Datei

    danach
    sudo REPO_URI=https://github.com/notro/rpi-firmware BRANCH=latest rpi-update
    sudo reboot
    und das wars dann –> Raspberry startet neu und bleibt beim Regenbodenbild stehen also es kommen keine Textzeilen. Hast du einen Ansatz woran dies liegen könnte.
    Ich habe zwar einige Images getestet, welche zum Display passen, aber die bleiben alle beim bootvorgang stehen.

    Hilfe wäre super, weil diese Anleitung würde genau das erfüllen was ich möchte.

    VG
    Manfred

    • Felix sagt:

      Hallo Manfred,
      bist du sicher, dass es ein 3.5 und nicht 3.2″ Display ist? Das Display sollte auf jeden Fall kompatibel sein.
      Hast du auch mal die von fbtft bereit gestellten images probiert?

      LG Felix

  2. Sascha sagt:

    Hallo, ich habe genau das selbe Problem.
    Raspi ist über HDMI an nen Monitopr angeschlossen.
    System fertig konfiguriert (wheezy vom 05.05. drauf).
    Und dann genau wie bei Manfred:
    sudo REPO_URI=https://github.com/notro/rpi-firmware BRANCH=latest rpi-update
    sudo reboot
    und danach auf dem HDMI nur noch ein Regenbogenbild.
    Der TFT weiß.
    Bereits zwei weitere Male getestet, Ergebnis immer das selbe.

    Und ja, ich habe den 3,2″ von Sainsmart dran.

    Gruß
    Sascha

    • Felix sagt:

      Seltsam. Ich hatte es mit einem Image von 12.14 versucht (und auch ohne HDMI), da hat immer alles wunderbar funktioniert. Ich kann dir grade nicht genau sagen, weshalb das so ist, vermutlich wurde irgend etwas in Raspbian (oder fbtft) geändert. Bekommst du denn zu keinem Zeitpunkt auf dem Touchscreen etwas angezeigt? EIne falsche Verkabelung kannst du ausschließen, nehme ich an?
      Ansonsten könntest du noch direkt bei den Machern von fbtft nachfragen: https://github.com/notro/fbtft/issues
      LG Felix

  3. Sascha sagt:

    Hallo Felix.

    Verkabelung jetzt bereits zweifach kontrolliert, Fehler kann ich nicht feststellen, zumal die Pinbelegung in der Kurzanleitung mittlerweile sehr gut dargestellt ist.
    Habe auch das fbtft-image ausprobiert, mit dem kommt es nicht einmal zum bootvorgang – hat noch den 3.16.x.x-kernel, das neueste wheezy hat immerhin schon 3.18.x.x – bin mir nicht sicher, ob der 3.16.x.x den Raspi 2 unterstützt, dazu bin ich nicht tief genung eingestiegen. Aber laut ELV (dort habe ich das Display bestellt) soll der Raspi 2 unterstützt werden.
    Werde bei den MAchern nachfragen und dann hier Rückmeldung geben.

    Gruß
    Sascha

  4. grode sagt:

    The module is compatible for Raspberry pi 2?

  5. Viktor sagt:

    Hallo zusammen,

    ist es möglich auch das folgende Display anzusteuern?

    http://www.jyetech.com/Products/FunctionModules/LCD_module/105-13700-00A.pdf

    Ich hatte ein Bausatz DSO138 das nicht richtig läuft. Hier wollte ich das 2,4 Zoll Display nun am Pi2 nutzen.
    Ich hoffe ihr könnt mir helfen.

    Vielen Dank für eure Hilfe und viele Grüße
    Viktor

  6. Viktor sagt:

    Hi Felix,

    vielen Dank für deine Antwort.

    Auf der Herstellerseite steht:
    Supports two types of TFT controllers (ILI9341 and ILI9325/9328).
    http://www.jyetech.com/Products/LcdScope/e138.php

    Ich habe noch die Pins DB16/17 dafür beräuchte ich doch einen zusätzlichen 74HC4094 oder ?
    Ich bin leider kein Experte darin, daher sorry wenn ich frage.

    Ich habe mir vor kurzen den Pi2 gekauft mit dem Ziel sich in die Materie einzuarbeiten, was nicht gerade leicht ist, da ich sonst mit soetwas nichts zu tun hatte. Es macht aber Spaß.
    Müsste dann nicht auch der Treiber angepasst werden?

    Gibt es gute Seiten wo ich mehr Grundlagen lernen kann, damit ich vllt selber mir soetwas erarbeiten kann?

    Vielen Grüße
    Viktor

    • Felix sagt:

      Hallo Viktor,
      wenn du fbtft verwenden willst, brauchst du auch den 74HC4094 IC. Allerdings bin ich mir immer noch nicht sicher, ob dein Display von fbtft überhaupt unterstützt wird.
      Je nachdem wie vertraut du mit dem Thema schon bist bzw. wie viel Hintergrundwissen du hast, kann es sehr aufwendig sein, einen Framebuffer zu schreiben, daher ist es in dem Fall einfacher ein Display zu verwenden, welches von fbtft untersützt wird oder selbst einen Controller integriert hat und ggf. über HDMI angeschlossen werden kann (Touch seperat).
      LG Felix

    • Viktor sagt:

      Hi Felix,

      vielen Dank für deine Antwort. Du hast Recht, es lohnt sich wahrscheinlich nicht. Ich werde mir ein passendes Display kaufen.

      Vielen Dank und beste Grüße
      Viktor

  7. Raffa sagt:

    Hallo zusammen,

    Ich seh ihr versteht die Materie der Displays super 😉

    Ich habe ein Touchscreen 3.5″ Display von KeDei LCD ( Treiber: http://en.kedei.net/raspberry/raspberry.html).
    Ich habe diese online bestellt für den Raspberry Pi 2 , was auch super funktioniert.
    Nun mein Problem: Ich habe mir 2 Displays bestellt, da der Raspi 3 gerade rauskam und ich dachte die seinen kompatibel.
    Ich probierte den v5.0 Treiber normal auf dem Pi zu starten, das Display zeigte ein paar Sekunden das richtige Bild an, doch als ich die Maus bewege, fing das Display an einige Teile nur noch verpixelt zu laden.
    Ist es nicht möglich den Treiber irgendwie umzuschreiben das dieses Display auf der Version 3 funktioniert? Ich habe davon leider eher wenig Ahnung, würde es aber gerne versuchen und wäre daher um eure Hilfe sehr froh.

    • Raffa sagt:

      Sorry^^ Liebe Grüsse und Danke!

    • Felix sagt:

      Hallo Raffa,
      sicher ist es möglich den Treiber umzuschreiben, aber um das zu testen bräuchte man das spezielle Display (was ich nicht habe). Außerdem würde das je nach Aufwand eine Weile dauern, deshalb würde ich einfach mal etwas warten. Einige Anwendungen und Treiber sind noch nicht für den Pi 3 optimiert, aber ich denke, dass sich das in naher Zukunft ändert.
      LG Felix

    • Raffa sagt:

      Hallo Felix,

      Ok, ja, ich konnte nicht genau einschätzen wieviel Arbeit das macht, aber sowas habe ich mir schon gedacht. 🙂 Naja, die Produzenten der Firma wirken nicht sehr seriös, habe sie dennoch einmal angefragt wie es in derZukunft mir dem Pi3 aussieht.
      Dennoch vielen Dank für die rasche Antwort!
      Hast du trotzdem noch zwei, drei Stichworte nach welchen ich googeln kann um ein wenig Einsicht in diese Materie zu bekommen? 🙂

      Liebe Grüsse

      Raffa

    • Felix sagt:

      Hallo Raffa,
      das stimmt leider, so einen Displaytreiber zu schreiben (inkl. Buffer etc.) ist nicht ohne. Du kannst dir das Wiki (+Forum) von fbtft ansehen, das ist die Bibliothek, die ich für das Display verwendet habe: https://github.com/notro/fbtft/wiki

  8. Maya Mitsume sagt:

    hi

    ich finde dein Tutorial rund um den Raspberry genial und sehr nützlich. Super! 😉
    Was mir aber aufgefallen ist, wenn am Raspberry Pi ein
    Touch- Display (z.bsp. das 3,2″ mit den 3 tasten) auf der Gpio leiste aufgesteckt wird keine Gpios übrig sind. Hat man da noch die Möglichkeiten, weitere Gpio’s zu nutzen? Irgendwie sind alle dann belegt. würde ja auch erfahren wollen, ob in wie weit ich das Display an den SPI port anschließen könnte (Diplay an SPI und Touch an DSI) ????
    Gerade in meinen Projekten (Ausstellung Dioramen mit Automation) brauche ich zusätzliche Gpio’s, die ich mittels GPIO-Expander bereitstellen möchte.
    Ich nutze den RaPi 1 B ….

  9. Bodo sagt:

    Hallo ,
    Ich habe 2 Fragen an Euch, bin erst am Aufbau und den ersten Tests.

    Im init String ist mir vor jedem byte + 1 word eine -1 (FF) gesetzt ist, welche nicht zur Initialisierung des TFT gebraucht wird.
    Kann es sein das die -1 vom Treiber als Marke oder ähnliches gebraucht wird?

    Das /WR Signal wird aus Q3 generiert +negation das sieht dann im Test so aus:

     Takt    4     8   12   16      32
     Q2   ___|---|___|---|______|
     Q3   ______|--------|______|--
    /WR   ------|_______|-------|_____

    /WR wird also schon beim 8ten Bit auf low fallen, was für den TFT Controller gültige Daten bedeutet , Ist das nicht zu früh ?

    Bitte helft mir bei diesen 2 Fragen, vielen Dank.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!