Raspi-LCD (Tutorial)

Dieser Artikel bezieht sich auf das Raspi-LCD Modul. Der Quellcode, die Schaltung und das Video zur Software befindet sich auf der Produktseite.

An dieser Stelle möchte ich mich bei allen bedanken, die ganz im Sinne von freier Software, ihre Weiterentwicklungen, Ergänzungen oder komplett neuen Kreationen ebenfalls veröffentlichen.  Links zu Anwendungen und weiteren Projekten rund um Raspi-LCD:

Programmierung in Python von Michael Ziegler
Programmierung in PHP von Daniel Ziegler
(Video, Video)

 

1. Display

Das verwendete Display bzw. dessen Grafikcontroller wird per SPI-Schnittstelle angebunden. In der aktuellen Version wird diese in der Software emuliert (-> kein Treiber notwendig). Das Display mit seinen 128 x 64 Pixeln ist im Prinzip ein 1kByte großer Speicher, bei dem jedes Bit einem Pixel entspricht. In der Software entsprechen die Koordinaten (x/y) der linken oberen Ecke (0/0) und rechts unten (127/63). Da die kleinste Organisationseinheit ein Byte ist, werden immer 8 Pixel gemeinsam übertragen und gespeichert. Das niederwertigste Bit des ersten Bytes ist der Ursprung in der linken oberen Ecke. Es folgen dann für alle 1024 Bytes die Bits: D1=(0/1), … D7=(0/7) usw. Da sich der Speicher des Displays nur beschreiben, aber nicht lesen läßt, ergibt sich ein kleines Problem bei der pixelweisen Darstellung. Soll eine Funktion einen einzelnen Pixel ändern, müssen die anderen 7 Bit des zugehörigen Bytes ebenfalls übertragen werden. Aus diesem Grund ist in der Software ein sogenannter Framebuffer implementiert. Dieser ist ein 1:1 Speicherabbild des Displays. Sämtliche Operationen erfolgen mit dem Frambuffer. Mit der Funktion LCD_WriteFramebuffer(); erfolgt dann die Ausgabe und Anzeige auf dem Display.

Ausgabe des Textes „Hello World“:
LCD_SetFont(0);    

LCD_PrintXY(0,0 ,“Hello World“);

Zeichnen eines Rechtecks mit transparenter Füllung und zwei Pixel Linenbreite:
LCD_SetFillColor(-1);    

LCD_DrawRect(10,10,100,40,1);

Bitmaps können mit dem Programm BMP2C V1.0 in C-Arrays konvertiert werden. z.B.: const uint8 bmp_raspi[458] = { 57, 64,  0x00, … 0x00 };
Ausgabe des Bitmaps an der Position (0/0):
LCD_DrawBitmap(0,0,bmp_raspi);

2. Tasten

Die einzelnen Tasten schalten bei Tastendruck nach Masse. Da die entsprechenden GPIO PINs als Eingang mit Pullup konfiguriert werden, bedeutet  eine gedrückte Taste logisch 0, eine ungedrückte Taste logisch 1.

Die Funktion UpdateButtons(); sorgt dafür, dass der Zustand der Tasten in die beiden Variablen ButtonPressed und Button als je ein Bit gespeichert wird. Macros wie z.B.: BUTTON_PRESSED_UP, BUTTON_PRESSED_RIGHT, … ermöglichen eine komfortable Verwendung der Tastatur.

3. Hintergrundbeleuchtung

Auf dem Raspi-LCD befindet sich ein Schalttransistor zur Steuerung der LED-Hindergrundbeleuchtung. Der entsprechende GPIO-Pin kann über die Funktion SetBacklight(); angesteuert werden.

 

Der aktuelle Sourcecode ist auf der Produktseite zu finden und unter der GPL-Lizenz verfügbar. Viel Spaß damit.

43 Kommentare zu “Raspi-LCD (Tutorial)

  1. Hallo,
    wäre es denkbar, wenn Sie einen Treiber für das Projekt lcd-proc ( http://lcdproc.org/clients.php3 ) schreiben könnten?
    So könnte man aus anderen Programmen wie zB. Xbmc, VDR usw. Das LCD ansprechen.

    Ich bin sehr zufrieden mit dem Display, vielen Dank…. 🙂

    Viele Grüße, Uwe

  2. Hallo Herr Steppuhn,

    vielen Dank für die gute Einführung.
    Ein wirklich gutes Produkt.

    Die Anregung von Uwe finde ich auch gut.
    Leider bin ich noch nicht auf dem Level.

    Gruß
    Kurt

  3. trotz der Tatsache, dass ich ein absoluter Neuling in Sachen Elektronik bin, war es ein Leichtes, das Display zum Laufen zu bringen. Einzig die Lötarbeit bei Steckleiste und Taster zu Beginn war etwas frickelig. Mit etwas Geduld und einer ruhigen Hand ist es mir jedoch auf Anhieb(!!!) gelungen die Lötstellen funktionierend hinzubekommen.
    Danke für dieses Gimmick, welches für mich eine massive Aufwertung des kleinen Pi bedeutet. Ich mach mich jetzt an die Programmierarbeit.
    lg
    Jan

  4. Hi,

    das Display ist echt cool. Ich hab das Makefile so erweitert dass auch eine lcd.so rausfällt, sodass die LCD-Funktionen auch aus anderen Programmen genutzt werden können, und bin grade dabei eine Python-Library zu bauen, um eine GUI auf dem Display realisieren zu können.

    Den Code gibts unter https://bitbucket.org/Svedrin/raspilcd, vielleicht hilft es ja dem einen oder anderen 🙂

    Cheers,
    Michael

    • Hallo,

      ich habe gerade die Python Library geladen nur leider wirft er beim start folgendes:
      pi@raspberrypi /tmp/raspilcd/pylcd $ ./run.sh imgtest.py
      Traceback (most recent call last):
      File „imgtest.py“, line 8, in
      from raspilcd import RaspiLCD
      File „/tmp/raspilcd/pylcd/raspilcd.py“, line 11, in
      raspi_lcd = ctypes.cdll.LoadLibrary(„lcd.so“)
      File „/usr/lib/python2.7/ctypes/__init__.py“, line 443, in LoadLibrary
      return self._dlltype(name)
      File „/usr/lib/python2.7/ctypes/__init__.py“, line 365, in __init__
      self._handle = _dlopen(self._name, mode)
      OSError: lcd.so: cannot open shared object file: No such file or directory

      vielleicht könnten Sie hier einem Einsteiger helfen?

      vielen Dank

  5. Hallo, ich habe das Teil zusammen und angeschlossen. Leider bekomme ich den Democode nicht zum Laufen. Meine C Kenntnisse sind etwas eingerostet. Muss man nachdem man das ZIP entpackt hat nicht das raspilcd direkt starten können?
    Vielen Dank
    Gruss
    jooey

      • Das Binary kann ich zwar jetzt ohne Fehlermeldung starten, es tut sich aber nix. Neu compilieren kann ich auch nicht, da kommt das:
        gcc -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -marm -O3 -Wall -c main.c
        main.c:1: sorry, unimplemented: -mfloat-abi=hard and VFP
        make: *** [main.o] Fehler 1
        Sorry für die dummen Fragen.
        Vielen Dank
        Gruss
        jooey

  6. Hallo,

    Da ich das Display jetzt schon daheim habe, wollte ich fragen, wie das mit dem I2C ist? Sind die irgendwo zugänglich am Display?
    Ich habe noch ein 433,92MHz Sende rund Empfänger, daher würde ich noch Anschlüsse benötigen. Die per Raspberry-Remote angesteuert werden.

    Danke,
    Felix

  7. Hallo ich habe die Datei raspilcd in ein unterverzeichnis vom User pi kopiert und sie mit chmod 755 ausführbar gemacht. Die datei wird mir auch als ausführbar angezeigt aber egal wer oder ich sie aufrufe bekomme ich folgendes gesagt: „bash: raspilcd: Kommando nicht gefunden. “ Habt ihr eine Idee was ich tun kann?
    Es ist auch egal wo ich die Datei hinkopiere

    Danke brundie

  8. How to compile the source for other images. in my case kali linux
    i did the folowing to compile the demo code on kali linux:
    dos2unix makefile
    vi makefile and change the following in the code:
    -mfloat-abi=hard to -mfloat-abi=softfp
    make clean
    make

  9. Is there a linux program available to convert bpm’s to C++ array’s
    Or would it work to hexdump the bmp file and some creative use of the vi editor?
    – The reason i’m asking is:
    I made an animation using blender3D
    Let it output as 64 seperate .bmp files
    After this i would like to play these after one another on the Raspi-Lcd

  10. Hallo,

    bin gespannt auf das Display, hab es heute bezahlt und warte auf die Lieferung.
    Gibt es evtl. schon eine Java Library um das Display mit Java anzusteuern?

  11. Hallo,

    ich habe eine Ruby-Library geschrieben:
    https://github.com/tillmo/raspi_lcd und http://rubygems.org/gems/raspi_lcd .

    Zwei Fragen:
    1. ich habe die Demo in main.c großteils nach Ruby übersetzt (demo.rb). Die Hintergrundbeleuchtung kann ich ein- und ausschalten. Text und Grafik funktioniert aber erst, wenn ich einmal das C-Programm (raspilcd) gestartet habe. Woran könnte das liegen?

    2. Sowohl das C-Programm (raspilcd) als auch das Ruby-Programm muss ich als Root starten, sonst kommt ein Fehler, dass ich nicht auf /dev/mem zugreifen darf.

    • > Text und Grafik funktioniert aber erst, wenn ich einmal das C-Programm (raspilcd) gestartet habe.

      Das deutet auf einen Fehler beim Initialisieren des Displays hin.
      void LCD_Init(void); Evt. sind die Wartezeit nach dem Reset zu kurz ?

      > als Root starten, sonst kommt ein Fehler, … /dev/mem …

      Ich bin in letzter Zeit leider recht wenig dazu gekommen in der Richtung weiter zu forschen, wie man schnell und gleichzeitig ohne Adminrechte auf die IO-Pins zugreifen kann. (Über Shellbefehle ist es sehr langsam). Für Hinweise bin ich dankbar.

  12. Hello,

    I’m building a Java library to access this display from a Java programm.
    The first versions already runs.
    I have to do some improvements and after this I’ll publish it under Apache License 2.0.

    Cheers
    Stephan

  13. Hello,
    I’m appreciating that alot and cannot wait for the release. Do you have any release date in mind?

    Greetings
    Hans

    • Raspi-LCD is released month ago but out of stock at the moment. The new Version is under development (with RTC and Housing, …)

  14. Hello,

    I build a Java library to access the LCD display from Java programms.
    It’s in an early status and the planned API is very limited until now.
    But the main functionality is available.

    • Hallo und vielen Dank für die Arbeit!

      Ich benutze den Raspi erst seit wenigen Tagen und habe auch nur begrenzte Kenntnisse von JAVA (für ein einfaches Programm reicht es gerade so). Ich würde sehr gerne ein JAVA-Programm für die NEUE Version des Raspi-LCDs schreiben, allerdings ist Ihre Library nur für die alte Version (oder habe ich das falsch gesehen?), es fehlen also ein paar Knöpfe, die abgefragt werden. Wie gesagt, ich kann das leider nicht korrigieren.

      Ist eine neue Library mit Beispiel in Planung? Ich würde mich sehr über Unterstützung freuen.

      • Ich bin momentan daran eine neue Version zu entwickeln. Sogar mit Event System für die Buttons. Weiß nur nicht wann ich damit fertig werde, da ich beruflich recht viel zu tun habe.

  15. Hallo zusammen. Habe mir letztens den Raspi LCD bestellt und muss sagen, sieht schmuck aus. Bei der Inbetriebnahme und zum Ausprobieren des Demo Codes habe ich jedoch ein Problem festgestellt. Gut, vielleicht liegt es daran, dass ich ziemlich neu in der Welt des Raspi bin.
    Jedenfalls hier mein Problem: Sobald ich den Raspi LCD an meinen RPI anschliesse, startet diese nicht mehr korrekt. Das heisst irgendwo beim Initialisieren der Devices bleibt das System hängen. Angeschlossen ist der Raspi LCD über ein Kabel, also nicht direkt angeschlossen. Zudem habe ich bereits Versucht mit und ohne SPI Kernel Mode zu Starten (über die raspi-config ein resp. ausgeschaltet). Kennt jemand das Problem oder kann mir irgendwelche Tipps geben?

    • Bisher ist dieses Problem noch nicht aufgetreten. Der Democode verwendet die SPI-Pins als normale GPIO. SPI-Treiber muß keiner geladen werden.
      Ein Fehler in der Verdrahtung (Kabel) ist ausgeschlossen ?
      Wichtige wäre zu wissen, an welcher Stelle sich der Bootprozess aufhängt.

      • Danke für die Info. Ich habe mir die Verkabelung nochmals angesehen und bemerkt, dass das Pin-Layout gespiegelt war. Bei der neuen, korrekten Verkabelung, funktioniert das Raspi LCD. Danke für die Hinweise und die schnelle Hilfe!

  16. Hallo Allemann,

    ich habe mir vor einiger Zeit die erste Version des RaspiLCD bestellt und es zügig zum laufen gebracht. Es funktioniert einwandfrei aber es mangelt mir an etwas und zwar an anfängerfreundlichen Codebeispielen.

    Ich fände es schön, wenn Sie auf Ihrer Seite eine Art Forum/Board einrichten könnten, in dem man seine Erfahrungen und Codeschnipsel tauschen könnte. Ich währe bspw. brennende an einer simplen Musiksteuerung des Music Player Daemons, einer Wetterapp, einer Anbindung an LCDProc oder anderen simplen Anwendungen interessiert. Suchen nach dem RaspiLCD auf GitHub oder BitBucket enden immer nur in knappen Suchergebnissen zu Projekten, die viel Versprechen aber auch größtenteils eingeschlafen sind, dabei eröffnet die Displayplatine doch so viele Möglichkeiten zur Interaktion.
    Mittlerweile habe ich mir ein 16×2 LCD Display von Adafruit gekauft, da ich mit dem RaspiLCD als Anfänger nichts mehr anfangen kann. Das sollte nicht so sein…

    • Schade wenn das Codebeispiel nicht ganz den Erwartungen entsprochen hat. Ein 2×16 Zeichen ASCII Display ist aber nun mal deutlich einfacher zu handhaben als ein Grafikdisplay mit verdiendenen Fonts, Bitmaps und geometrischen Funktionen.
      Der Code zum Demo (http://www.youtube.com/watch?v=tdGGPOjrMNs) ist als Open Source vorab jederzeit einsehbar.

  17. Hallo alle,

    auch ich habe mir Anfang 2015 das Display bestellt, um damit einen Standalone-Hifi-Recorder zu bauen. Die Hardware war schnell zusammengestellt, und dann ging es ans Programmieren. In Analogie zum mitgelieferten Beispielcode is ein kleines C++ Framework entstanden, dass es erlaubt systematisch eine ordentliche Benutzerführung zu programmieren (nicht nur für dieses Projekt). Zur Vereinfachung der Entwicklung erlaubt das Framework außerdem eine Cross-Compile-Simulation auf dem PC oder Mac mit Hilfe der QT Bibliothek.

    Der Raps ist mittlerweile In meiner Hifi-Anlage im Einsatz und kann dank GPIO diese auch auf Zeit ein- und wieder ausschalten, um mit einem Timer aufzunehmen.

    Macht richtig Spaß!

Kommentar verfassen