Raspberry Pi und OLED-Display

(siehe: Setup des RPi)
In einem früheren Beitrag wurde ein 0,96″ OLED Display mit einem Arduino gesteuert. Diesmal wird ein Raspberry Pi 3 B+ mit der Programmier/Scriptsprache Python verwendet.
Hier werden wird nur die I²C-Schnittstelle verwenden, daher ist bei der Anschaffung eines entsprechenden OLED-Moduls darauf zu achten.

Verwendete Bauteile

Aufbau

Das OLED-Modul lässt sich recht leicht mit dem Raspberry Pi verbinden, denn die I²C-Anschlüsse sind bereits vorgegeben:

Anschlüsse des Raspberry Pi 3 B+
Anschluss des I²C OLED-Moduls mit dem Raspberry Pi 3 B+
Abb.: Verbinden des I²C OLED-Moduls mit dem Raspberry Pi 3 B+

Vorbereitung

Standardmäßig ist beim Raspberry Pi die I²C-Schnittstelle deaktiviert und wird mit den folgenden Schritten daher zunächst aktiviert:
$ sudo raspi-config
Hier wird der Punkt "Interfacing Options" » "P5 (I2C)" mit ENTER aktiviert. Dann kann raspi-config wieder verlassen werden.
Installation einiger benötigter Pakete:
$ sudo apt-get update
$ sudo apt-get install python-smbus i2c-tools git python-pil
Dann erfolgt ein Neustart des RPi:
$ sudo reboot

Normalerweise sollte die I²C-Adresse 0x3C lauten, aber dies kann sicherheitshalber nachgeprüft werden mit dem Befehl:
$ i2cdetect -y 1
(Die Adresse 0x3C ist in der nachfolgend verwendeten Python-Library schon standardmäßig ausgewählt.)

Zur Ansteuerung des OLED-Moduls wird die zusätzlich Library BLavery/lib_oled96 verwendet:
$ git clone https://github.com/BLavery/lib_oled96
Dann wechselt man in den somit entstandenen Ordner "lib_oled96". Hier erstellen wird für die folgenden Experimente die Python-Script-Dateien.

Ex. I: Einfache Textausgabe

Für das folgende Script wird die Datei oled_hello.py angelegt:
$ nano oled_hello.py

from lib_oled96 import ssd1306
from smbus import SMBus
import time

# init OLED display
i2cbus = SMBus(1)     # 0 = Raspberry Pi 1, 1 = Raspberry Pi > 1
oled = ssd1306(i2cbus)

# clear display
oled.cls()
oled.display()

# show text and time on OLED
oled.canvas.text((5, 5), "Hello", fill=1)
oled.canvas.text((20, 20), "World!", fill=1)
oled.canvas.text((5, 35), time.ctime(), fill=1)
oled.display()

Wird das Script nun ausgeführt, sollte der Text auf dem Display angezeigt werden.
$ python oled_hello.py

Ex. II: Bild anzeigen

James Hetfield (Jaymz)
Abb.: Portrait von James Hetfield (Quelle: Album "Metallica")

Zur Anzeige des obigen (PNG-)Bildes wird folgendes Script verwendet:

from lib_oled96 import ssd1306
from smbus import SMBus
from PIL import Image

# init OLED display
i2cbus = SMBus(1)     # 0 = Raspberry Pi 1, 1 = Raspberry Pi > 1
oled = ssd1306(i2cbus)

# clear display
oled.cls()
oled.display()

draw.bitmap((32, 0), Image.open('jaymz.png'), fill=1)
oled.display()
James Hetfield auf dem OLED-Modul
Abb.: Portrait von James Hetfield wird auf dem OLED-Modul angezeigt.

Ex. III: Kamera-Bilder anzeigen

Da die Raspberry Pi Cam ebenfalls (Einzel-)bilder produziert, liegt der Schluss nahe, diese ebenfalls auf dem OLED darzustellen, um somit einen rudimentären Live-Stream der Kamera zu bekommen. OLEDs sind nicht optimal zur Darstellung von Kamera-Streams, da sie z.B. nur in diesem Fall eine einzige Farbe abbilden können.

Zunächst benutzen wird raspistill, um alle 500ms ein Bild der Kamera auf die SD-Karte zu speichern. Es wird schon das PNG-Format in der richtigen Auflösung für das OLED verwendet. Damit der Befehl als Hintergrundprozess läuft, verwenden wird nohup:
nohup raspistill --nopreview -w 128 -h 64 -e png -o /tmp/cam.png -tl 500 -t 9999999 &
Damit sollten Einzelbilder ähnlich dem Folgenden im /tmp/-Ordner landen:

Bild der Raspberry Pi Cam
Abb.: Originales Bild der Raspberry Pi Cam

Das folgende Script wird nun verwendet, um das sich ständig ändernde Einzelbild der Kamera auf dem OLED-Modul anzuzeigen:

from lib_oled96 import ssd1306
from smbus import SMBus
from PIL import Image
import time

i2cbus = SMBus(1)     # 0 = Raspberry Pi 1, 1 = Raspberry Pi > 1
oled = ssd1306(i2cbus)

while True:
    oled.cls()
    img = Image.open('/tmp/cam.png')
    oled.canvas.bitmap((0, 0), img.convert("1"), fill=1)
    oled.display()
    time.sleep(0.5)
Bild der Raspberry Pi Cam auf dem OLED-Modul
Abb.: Bild der Raspberry Pi Cam wird auf dem OLED-Modul angezeigt (Natürlich in 1 bit/pixel).

Es gibt noch die alternative, vielversprechende Library rm-hull/luma.oled/, die Live-Videos der Kamera darstellen kann. Dies habe ich aber bisher noch nicht ausprobiert.

zurück