Technikkram – Display „SH1106“ an einem Raspberry Pi

Man bekommt dieses Display für ~5€ direkt aus China oder für gut 8€ aus Deutschland. Letzteres habe ich gewählt, da ich nicht so risikofreudig bin. Ich habe eines mit I²C- und nicht mit SPI-Bus gewählt!
Das SH1106 ist ein 1Bit OLED-Display, das per I²C-Bus angesteuert wird, es also kein „normaler Bildschirm“, sondern wird als (zusätzliches) Anzeige genutzt. Es ist recht klein und hat 128×64 Pixel. Der I²C-Bus kann viele Geräte gleichzeitig ansteuern bzw. beherrbergen, hat aber insgesamt nur eine begrenzte Datenrate, ich meine, das sind beim Raspberry Pi, den alten, den ich dafür nutze, 400kbit/s.

Raspi-Vorbereitung und Verdrahtung

Es gibt dazu bessere Tutorials mit Bildern. Ein „dmesg |grep i2c“ auf dem Raspberry Pi spuckt entsprechend, wenn man den I²C-Bus als root/su („superuser“) mit dem tool „raspi-config“ unter „Interfacing Options“ -> „I2C“ eingeschaltete hat, ein „i2c /dev entries driver“ aus, die module i2c_bcm2835 und i2c_dev sollten denn geladen sein. Dann funktioniert schonmal der I²C-Bus. Nun noch das Paket „i2c-tools“ installieren.
Ein I²C-Bus kann einige Geräte auf einem Bus verwalten. Jedes Gerät auf dem Bus „meldet“ sich mit einer Adresse, das heißt allerdings auch, daß jedes Gerät eine andere Adresse haben muß. Die Adressen werden auf den Geräten selbst festgelegt. Im Falle des SH1106 ist die fix auf 0x3c festgelegt. Das SH1106 hat 4 Pins: GND, VCC, SDA und SCL.
GND = Ground, also „Masse“ und geht am Raspberry Pi auf den Pin Nr. 6 oder 9
Vcc = 3,3V und geht auf den Pin Nr. 1
SDA = Serial Data und geht auf den Pin Nr. 3
SCL = Serial Clock und geht auf den Pin Nr. 5
Hat man alles verdrahtet und startet den Rasperry Pi mit dem SH1106 neu, müßte ein „i2cdetect -y1″ (=“schau mal nach, was es so alles auf dem I²C-Bus 1 gibt“) folgendes ausgeben:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — 3c — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

Da sieht man, daß es ein Gerät mit der Adresse „0x3c“ gibt.

Ansteuern mit Python

Zum Ansteuern unter Python habe ich es zunächst mit Python 2 versucht, merkte aber, daß das nicht funktionierte. Ich habe gelesen, daß man besser Python3 nehmen sollte. Also mußte ich erstmal das Paket „python3-pip“ installieren, das wegen einer großen Abhängigkeit zu zahlreichen anderen Paketen eine kleine Installationsorgie wurde. Die nächste Orgie muß man anschließend mit einem „pip3 install luma.oled“ veranstalten, da es von Debian/Raspian die entsprechenden Python-Pakete nicht gibt. Aber zum Glück gibt es ja den Python-Paketmanager pip bzw. pip3. Damit sind die nötigen Python-Bibliotheken installiert.

Mein Ziel war es, eine Anzeige zu basteln, die mehrere Sachen abwechselnd anzeigt. Ich fand ein Pythonscript, mit dem ich schonmal schreiben/“malen“ konnte. Allerdings habe ich nicht herausgefunden, wie man das Display löscht. Schreibt man etwas anderes über die vorher beschriebene Stelle, sieht man beides auf einmal, als würde man auf ein Blatt an derselben Stelle 2 Dinge übereinanderschreiben.

Meine Lösung fand ich in einem „virtuellen Bildschirm“, den ich einfach mal gut doppelt so hoch gemacht habe. Den lasse ich vollschreiben und sage anschließend „zeige abwechselnd den oberen oder unteren Teil“.

Entsprechende Pythonscripte habe ich auf Github mit kurzen Erklärungen in den Scripten veröffentlicht. Ich denke mal, dieses Display läuft an vielen anderen Einplatinenrechnern, die einen I²C-Bus haben (Banana Pi, Cubietruck etc.), auch.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.