(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.
Das OLED-Modul lässt sich recht leicht mit dem Raspberry Pi verbinden, denn die I²C-Anschlüsse sind bereits vorgegeben:
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.
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
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()
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:
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)
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