16×2 I2C-Display on Raspberry Pi

English version.

Wer einen kleinen Display am Raspberry benötigt, der ist hier richtig! Mit wenig Aufwand und ein paar wenigen Bauteilen kann man einen I2C-Display am Raspberry Pi nutzen.

Das Raspberry vorbereiten

Als erstes muss alles aktuell sein, weshalb man im Terminal den Befehl

sudo apt-get update

eingeben muss. Um auf dem Raspberry Pi auch wirklich den I2C-Bus nutzen zu können, muss man diesen zuerst aktivieren. Der erste Schritt ist es im Terminal den Befehl

sudo raspi-config

einzugeben. Daraufhin erscheint die Setup-Utility, in welcher man den Menüpunkt 8 Advanced Options auswählen muss.

001

Im nächsten Fenster muss man A7 I2C auswählen, und alle kommenden Fenster mit Yes oder OK bestätigen. Mit Finish kehrt man zurück zum Terminal.

002

Im zweiten Schritt muss das Module File um zwei Einträge erweitert werden. Dies wird erledigt, indem man zunächst

sudo nano /etc/modules

ausführt und dann am Schluss der Datei die beiden Einträge

i2c-bcm2708
i2c-dev

hinzufügt. Mit STRG+X, Yes und Enter speichert man die Datei und schließt sie.

003

Um den I2C-Bus mit Python nutzen zu können benötigt man python-smbus und die i2c-tools. Beides hohlt man sich durch den Terminal-command

sudo apt-get install -y python-smbus i2c-tools

Danach muss man das Raspberry neu starten, sodass der I2C-Bus wirksam wird. Dies kann über die grafische Oberfläche oder im Terminal geschehen:

sudo reboot

Der Aufbau

Die paar wenigen Bauteile sind:

  • Raspberry Pi 2
  • 16×2 I2C-Display
  • Logic Level Shifter

Der Logic-Level-Shifter wird benötigt, da das Raspberry mit dem logischen Level von 3.3V arbeitet, die meisten Displays jedoch mit 5V arbeiten. Solche Level Shifter gibt es bereits um unter einen Euro auf eBay zu haben. Bei diesem Preis lohnt sich das selbst machen nur noch aus Interesse daran.

Level_Shifter

Die Verdrahtung ist wie im Bild unten ersichtlich nach der folgenden Tabelle durchgeführt.

  • Level Shifter – Raspberry Pi
    • GND – GND (Pin 6)
    • HV – 5V (Pin 2)
    • LV – 3V3 (Pin 1)
    • LV1 – SDA (Pin 3)
    • LV2 – SCL (Pin 5)
  • Level Shifter – I2C Display
    • GND – GND
    • HV – Vcc
    • HV1 – SDA
    • HV2 – SCL

Untitled Sketch_Steckplatine

Der fertige Setup sieht dann in etwa so aus:

Setup

Das Display ist ein normales HD44780-Display, welches einen I2C-Rucksack bekommen hat. Diese „Rucksäcke“ gibt es einzeln, oder bereits mit dem Display verlötet.

Display

Der Code

Das Programm befindet sich auf GitHub und kann auch direkt von dort auf das Raspberry geladen werden.

Die beiden Python-files (16x2_I2C_Display.py & lcd.py) müssen in das selbe Verzeichnis auf dem Raspberry kopiert werden, da das erste File das zweite aufruft.

16x2_I2C_Display.py

Dieses Programm zeigt die IP-Addresse des Pi auf dem Display an. Dabei importiert es die Funktionen der Datei lcd.py.

Im Main ist die Herangehensweise gezeigt. Man muss den Display zuerst initialisieren, danach kann man ihm Text zum „Drucken“ schicken oder aber auch die Hintergrundbeleuchtung an- oder abschalten.

lcd.initialize()
lcd.printString("TEXT", lcd.LINE_1)
lcd.noBacklight()
lcd.Backlight()

lcd.py

Hier passiert das Wichtige – die Kommunikation mit dem Display. Diese funktioniert ähnlich wie mit einem Arduino (siehe hier). Deshalb lassen sich die Befehle des Displays auch genauso bequem senden. In der sendByte()-Funktion lässt sich erkennen, dass ich immer wieder BACKLIGHT mitsende. Das muss so sein, weil der Display ansonsten die Hintergrundbeleuchtung abdreht, und so seinen Sinn & Zweck verliert.

Über den smbus (hier als i2c deklariert) werden die nötigen Daten gesendet. Dabei wird immer die Addresse, gefolgt von den Daten gesendet. In der sendByte()-Funktion werden diese als Abfolge der Datenblöcke (Typ, Daten, Beleuchtung) gesendet. Hier wird das Delay benötigt, da der Display die Daten ansonsten nicht korrekt erhält.

Das lcd.py kann man nun (genau so wie es ist) für andere Projekte nutzen. Einfach in das jeweilige Python script mit import lcd einfügen. Allerdings muss es sich im selben Verzeichnis befinden.

Anmerkung: Man kann auch einen 20×4 Display verwenden, dazu muss man im lcd.py File einfach nur die Zeile 15 verändern (16 -> 20) und Line_3, Line_4 nutzen im printString-Befehl nutzen.

Nachbereitung

Ich möchte die IP-Adresse für 15 Sekunden anzeigen lassen, sobald der Raspberry hochgefahren ist. Hierfür muss man das Script nach dem Start ausführen lassen.

Zuerst habe ich beide Dateien in das Verzeichnis /home/pi/Autostart/ verschoben und die Datei 16x2_I2C_Display.py umbenannt in showIP.py.

Danach muss man das Terminal öffnen und folgenden Befehl eingeben:

sudo nano /etc/rc.local

Anschließend muss man den Pfad und die zu öffnende Datei angeben, in meinem Fall ist dies

/bin/sleep 15 && cd /home/pi/Autostart/ && sudo python showIP.py &
exit 0

sleep 15 bewirkt, dass das Script erst 15 Sekunden nach dem Hochfahren ausgeführt wird. Nach einigem Testen hat sich gezeigt, dass das Pi etwa 15 braucht, um eine IP Adresse abzurufen. & am Ende der Zeile bedeutet, dass das Script im Hintergrund ausgeführt wird. Das exit 0 am Ende wird von rc.local benötigt, es beendet das Script. Wenn ihr also noch andere Scripts beim Systemstart ausführen wollt, stellt sicher, dass exit 0 auch wirklich in der letzten Zeile steht.

004

Mit STRG+O speichert man das File, und mit STRG+X schließt man es. Beim nächsten Neustart sollte man dann ein ähnliches Bild wie das folgende sehen können.

IP.jpg

Bei Fragen ist ein Kommentar immer erwünscht!

 

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s