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
- SainSmart 3.2 TFT LCD Display
- 2x 74HC4094
- 1x 74HC04 (Hex Inverter)
- 74HC4040
- Jumper Kabel
- Breadboard
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:
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)
74HC4094 (Datenblatt)
74HC04 (Datenblatt)
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.
33 Kommentare
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
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
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
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
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
The module is compatible for Raspberry pi 2?
Yes, why not?
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
Hey Viktor,
du findest hier eine Auflistung der kompatiblen (getesteten) Displays: https://github.com/notro/fbtft/wiki/LCD-Modules
Wichtig ist dabei, dass der Controller unterstützt wird, dazu konnte in der PDF aber nichts finden.
LG Felix
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
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
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
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.
Sorry^^ Liebe Grüsse und Danke!
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
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
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
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 ….
Hey,
die GPIOs kannst du recht einfach erweitern, z.B. mit einem Port Expander: Raspberry Pi GPIOs mittels I2C Port Expander erweitern – Teil 1. Jedoch wird es wahrscheinlich ein Mehraufwand den Code dementsprechend umzuschreiben, daher würde ich alle anderen GPIOs, welche nicht für das Display benutzt werden, an den Expander auslagern.
Diese kleinen Displays sind allerdings nicht über den DSI Port ansprechbar. Dafür aber das offizielle 7″ Touch Display (welches auch um einiges besser was Bild und Steuerung angeht, ist): Offizielles 7″ Raspberry Pi Touch Display vorgestellt
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 ….
Hey,
die GPIOs kannst du recht einfach erweitern, z.B. mit einem Port Expander: Raspberry Pi GPIOs mittels I2C Port Expander erweitern – Teil 1. Jedoch wird es wahrscheinlich ein Mehraufwand den Code dementsprechend umzuschreiben, daher würde ich alle anderen GPIOs, welche nicht für das Display benutzt werden, an den Expander auslagern.
Diese kleinen Displays sind allerdings nicht über den DSI Port ansprechbar. Dafür aber das offizielle 7″ Touch Display (welches auch um einiges besser was Bild und Steuerung angeht, ist): Offizielles 7″ Raspberry Pi Touch Display vorgestellt
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:
/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.
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:
/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.
Hallo,
ich habe das Problem, dass unter der Shell das Programm super läuft, aber wenn ich es aus einer Datei.py aufrufe erscheint die folgende Fehlermeldung:
>>>
Traceback (most recent call last):
File „/home/pi/Python/test_display.py“, line 8, in
import lcddriver
File „/home/pi/Python/lcddriver.py“, line 95
print „Unknown State!“
^
SyntaxError: Missing parentheses in call to ‚print‘
>>>
Hat jemand einen Tip für mich.
Danke Johannes
Du nutzt wohl Python3. Mach Klammern um das Print:
print("...")
Hallo,
ich habe das Problem, dass unter der Shell das Programm super läuft, aber wenn ich es aus einer Datei.py aufrufe erscheint die folgende Fehlermeldung:
>>>
Traceback (most recent call last):
File „/home/pi/Python/test_display.py“, line 8, in
import lcddriver
File „/home/pi/Python/lcddriver.py“, line 95
print „Unknown State!“
^
SyntaxError: Missing parentheses in call to ‚print‘
>>>
Hat jemand einen Tip für mich.
Danke Johannes
Du nutzt wohl Python3. Mach Klammern um das Print:
print("...")
hallo felix
welche displays kann man eigentlich über DSI verwenden, außer dem 7″?
Danke
Es gibt soweit ich weiß noch eine Hand voll Hersteller, die für den DSI Port Displays entwickelt haben, aber bis auf das offizielle habe ich bisher keines ausprobiert.
hallo felix
welche displays kann man eigentlich über DSI verwenden, außer dem 7″?
Danke
Es gibt soweit ich weiß noch eine Hand voll Hersteller, die für den DSI Port Displays entwickelt haben, aber bis auf das offizielle habe ich bisher keines ausprobiert.