OLED-Displays mit Arduino

So nehmen Sie Anpassungen vor, um OLED-Displays für den Shootduino und andere Anwendungen zu betreiben.

In Pocket speichern vorlesen Druckansicht
OLED
Lesezeit: 5 Min.
Von
  • Florian Schäffer
Inhaltsverzeichnis

In der aktuellen Make 3/17 berichten wir von den unerwarteten Schwierigkeiten, als wir bei der Entwicklung unserer Shootduino-Platine (als kostenlose Leseprobe verfügbar) ein einfaches OLED-Display suchten. Basierend auf der Spielekonsole in Make 5/15 wollten wir ein Kit zum Selberbauen zusammen stellen. Neben der Suche nach der passenden Hardware, gab es auch einige Hürden mit der Software zu meistern. Im Heft hatten wir dafür nicht genügend Platz, so dass wir Ihnen hier zeigen, welche Schritte notwendig sind, um den Quellcode anzupassen. Auch wenn Sie vielleicht nicht gerade mit OLEDs kämpfen, finden Sie im Beitrag vermutlich dennoch interessantes Hintergrundwissen, das Sie im Programmieralltag nutzen können.

Shootduino wie wir ihn auf den Maker Faires zeigen

Gegebenenfalls empfiehlt es sich, den Artikel Arduino Bibliotheken einbinden und verwalten zu lesen, in dem wir erklären, wie Sie Libraries in der Entwicklungsumgebung verwalten und bearbeiten können.

Auf dem passenden Display wurde sofort das Adafruit-Logo angezeigt, das im Spiel beibehalten wurde, weil Adafruits Libraries benutzt werden. Allerdings wird nur die obere Hälfte vom Logo und des Spielfeldes gezeigt. Es sieht aus, als würde jede zweite Displayzeile übersprungen.

Auf dem Display wird nur die obere Hälfte der Grafik gezeigt

Auf der Downloadseite zum Shootduino ist der Quellcode angeboten. Die Arduino IDE sieht es aber nicht vor, dass auch die fertig compilierte Binärdatei als HEX-File benutzt werden kann. Diese Datei wird beim kompilieren erzeugt und auf den ATmega übertragen, dann aber wieder aus dem temporären Ordner gelöscht, so dass der normale Anwender nichts davon mitbekommt. Für Einsteiger mag das sinnvoll sein – mehr über die Funktionsweise und Mechanismen der Mikrocontrollerprogrammierung lernt man so aber nicht. Für ein fertiges Projekt wäre es eigentlich logisch, auch die HEX-Datei zu veröffentlichen, so dass man beim Nachbau nur diese übertragen muss. Stattdessen ist man bei der Arduino-IDE gezwungen, sich den Quellcode und die passenden Bibliotheken zu besorgen und das Programm neu zu übersetzen. Durch die nicht passende Lib kommt es zum Fehler in der Darstellung.

Neben dem Quellcode (der bei Arduino als Dateisuffix nicht das übliche .cpp sondern .ino aufweist) gibt es noch Include-Dateien, die auch als Libraries oder Bibliotheken bezeichnet werden. Diese benutzen dann die Endung .cpp und .h für die zugehörigen Header-Dateien, in denen meistens Konfigurationseinstellungen und Funktionsdeklarationen (Prototypen) zu finden sind. Arduino ist beim Umgang mit diesen Dateien wenig einsteigerfreundlich. Ein Teil der Include-Dateien wird üblicherweise im gleichen Ordner oder einen Unterordner abgelegt, wie die Datei mit dem Hauptprogramm (.ino). Hierbei handelt es sich dann meistens um Bibliotheken, die der Anwender selbst erstellt hat. In einem weiteren Ordner werden all die Bibliotheks-Dateien gespeichert, die aus externen Quellen stammen.

Für den Shootduino werden zwei zusätzliche Bibliotheken benötigt: Adafruit_GFX und Adafruit_SSD1306. Die erste stellt Grafikroutinen zur Verfügung und macht keine Probleme. Mit der zweiten werden OLEDs angesteuert, die über einen Controller vom Typ SSD1306 verfügen. Weil die Libraries nicht beim Quellcode für das Programm dabei waren, wurden sie für das Projekt vom Autor nachträglich über die IDE installiert, da es ansonsten beim Übersetzen des Quellcodes zu Fehlermeldungen kommt. Der Haken ist nur: In den bereits angesprochenen Header-Dateien hat der Autor Einstellungen vorgenommen, um das Verhalten der Bibliotheken anzupassen. Eine der möglichen Einstellungen betrifft die Bildschirmauflösung.

Fehlermeldung beim Compilieren, weil die Library fehlt

Die fehlerhafte Darstellung auf dem Display bei dem nur die obere Hälfte gezeigt wird und jede zweite Zeile leer bleibt, liegt nämlich daran, dass in Adafruit_SSD1306.h die Auflösung 128×32 eingestellt ist, die Displays aber über 64 Zeilen verfügen. Sie müssen also in der Header-Datei diese (und gegebenenfalls andere) Werte anpassen.

Die Entwicklungsumgebung behauptet, die Datei nicht öffnen zu können

In der Header-Datei finden Sie am Anfang die Einstellungen (im konkreten Fall etwa ab Zeile 70):

//   #define SSD1306_128_64
#define SSD1306_128_32
// #define SSD1306_96_16

#if defined SSD1306_128_64 && defined SSD1306_128_32
#error "Only one SSD1306 display can be specified at once in SSD1306.h"
#endif

Wie Sie sehen, sind die erste und dritte Anweisung in diesem Abschnitt mit "//" auskommentiert, so dass nur #define SSD1306_128_32 gültig ist. Damit wird eingestellt, wie groß das Display ist. Im weiteren Codeverlauf wird noch geprüft, ob die Einstellungen gültig sind und mehr. Hierbei handelt es sich also um die Standardeinstellung für diese Bibliothek (in der jetzigen Fassung). Spätere oder frühere Versionen, die Sie sich vielleicht installiert haben, können hier jederzeit andere Werte vorgeben. Für unser Projekt war das Fatal, denn als der Artikel vor zwei Jahren geschrieben wurde, hat der Autor entweder eine Bibliothek benutzt, bei der eine andere Auflösung eingestellt war oder er hat das geändert (und leider vergessen zu erwähnen), was Sie jetzt auch erledigen müssen: Kommentieren Sie die Zeile #define SSD1306_128_32 aus und entfernen Sie die Kommentarzeichen vor der ersten Direktive:

#define SSD1306_128_64
// #define SSD1306_128_32
// #define SSD1306_96_16

Wenn Sie die Datei jetzt speichern und das Hauptprogramm (in unserem Fall Shootduino.ino) neu übersetzen und auf den Arduino übertragen, zeigt das Display die vollständige Grafik an.

Hier endet unser Ausflug in die Bibliotheksverwaltung und die Anpassungen für die verwendeten OLEDs. Weitere Anpassungen für den verbauten Controller sind eventuell erforderlich und werden im Heft gezeigt. (fls)