DOGM163-LCD an STM32 mit SPI und 3.3V betreiben
Neulich hat der Schnäppchenjäger in mir neue Beute erlegt, und zwar LCD mit der Bezeichnung EA DOGM163 S-A zusammen mit Hintergrundbeleuchtungen der Bezeichnung EA LED55X31-A. Das Ganze zu einem Preis, bei dem ich gleich 5 Stück bestellt habe. Hätte ich gewusst, dass die Teile funktionieren und ich sie zum Laufen bekomme, dann hätte ich sicher noch mehr bestellt. Nun sind sie natürlich schon ausverkauft. Aber hätte ich mehr bestellt, etwa 20 Stück, dann hätte sicher Murphys Law zugeschlagen und ich hätte mit allen 20 nichts anfangen können und das Geld zum Fenster heraus geworfen.Das DOGM163 ist eigentlich ganz pfiffig. Hintergrundbeleuchtung und Leuchtkristall-Panel sind getrennt, so dass man Hintergrundfarbe und LCD-Modell selbst wählen bzw. kombinieren kann. Beim Schnäppchen gab es natürlich keine Auswahl, sondern fest gelb/grün und 3 Zeilen Text à 16 Zeichen. Und als Backlight-Modul Amber. Aber das finde ich eigentlich ganz schön und 3 Zeilen sind praktisch. Hoffentlich sind die Zeichen am Schlus nicht zu klein. Aber das wird sich bald zeigen...
Zusammenlöten
Die Pins des LCD werden in das Hintergrundbeleuchtung-Modul eingeschoben, was ein ziemliches Gefummel ist, denn die Beinchen sind dünn und die Löcher winzig im Durchmesser. Und ein paar Beinchen waren natürlich schon verbogen. Da hat sich jemand eine halbe Sekunde Zeit gespart und die Teile superschnell und blind in den Antistatikschaum gesteckt und ich darf dann 5 Minuten damit verbringen, die Beinchen wieder 100%ig auszurichten, damit sie durch die Löchlein passen. Vielen Dank - such dir einen anderen Job!Dann werden die Pins auf der Rückseite verlöten und LCD und Backlight eine Einheit. Außer den 20 Pins für das LCD oben gibt es noch 4 Pins für die zwei LEDs im Backlight.
Leider schauen die Beinchen nach dem Einstecken nicht mehr so weit raus, so dass es noch gerade so geht, das LCD in ein Breadboard zu stecken, wobei es auch zu breit ist und man keine Jumper-Kabel mehr nebendran einstecken kann. Man muss schon zwei Breadboards benutzen.
Auf der anderen Seite ist das Modul mit nun 5.5 mm Höhe (ohne die herausschauenden Pins) sehr flach. Was allerdings auch geht, die Beinchen (die man hoffentlich sparsam und sauber verlötet hat) in Präzisionsbuchsenleisten (einreihig, die mit den runden Löchern und Beinchen) zu stecken, da passen die nämlich wunderbar rein und man hat wieder lange (und vor allem feste) Anschlussbeinchen für das Breadboard. Das macht die Sache natürlich ein bisschen höher, ist klar, wenn man das LCD auf Absätze stellt.
Anschließen
Das Datenblatt ist nicht so sonderlich übersichtlich, aber folgende Infos konnte ich finden:Zu beachten beim Betrieb bei 3.3V und Nutzung von SPI:
- es gibt zwei LEDs für die Hintergrundbeleuchtung: A1 (Anode 1) und C1 (Kathode 1) und A2 und C2. Diese müssen über einen Vorwiderstand von min. 14 Ohm bei 3.3V angeschlossen werden, damit sie ihre Laufzeit von 100'000 h erreichen. Ein bisschen mehr schadet sicher nicht, das Display muss ja auch nicht grell strahlen. Ich habe einen Widerstand mit 22 Ohm benutzt
- zwischen Pin 21 (-) und Pin 22 (+) muss ein Kondensator mit 100 nF bis 1 µF angeschlossen werden. Ich habe hier einen 1 µF Elko benutzt.
- Pin 23 geht an GND
- zwischen Pin 24 (+) und Pin 25 (-) muss ein Kondensator mit 470 nF bis 2.2 µF angeschlossen werden Ich habe hier ebenfalls einen 1 µF Elko benutzt.
- an Pin 25 und 26 wird 3.3V angeschlossen und GND an Pin 27
- An Pin 28 (SI, Slave In) kommt SPI MOSI, also der STM32-Pin PA7.
- An Pin 29 (CLK, Clock) kommt SPI Clock (SCK), also STM32-Pin PA5.
- Pins 30 bis 36 werden auf High (3.3V) und Pin 37 (RW) auf Low (GND) gezogen.
- An Pin 38 (CSB) kommt SPI Chip Select (SS), also STM32-Pin PA4
- Pin 39 (RS, Command/Data) kommt an einen freien Pin am Mikrocontroller. Da habe ich PA0 genommen.
- Pin 40 (REset) kommt ebenfalls an einen freien Pin an der Blue Pill, bei mir PA1.
- Die Anzeige hat bei mir nur mit Soft-SPI am STM32 funktioniert, aber das stellen wir später in der Firmware ein.
Die LEDs sind im Schaltplan nicht beschaltet, es gilt das oben Gesagte. Auch sollte man die Warnung im Datenblatt beachten:
Betreiben Sie die Beleuchtung nie direkt an 5V/3,3V; das kann zur sofortigen Zerstörung der LEDs führen
Library besorgen
Auf lcd-module.de findet man das Datenblatt zum Display und das Datenblatt zum Controller ST7063.Außerdem findet man dort einen Link zu Arduino meets EA DOG und dort einen Link zu der Zip-Datei Arduino meets EA DOGM081 DOGM162 DOGM163.zip.
Und in diesem Archiv findet man dann einen Ordner Arduino Library/DOGM_7036, der die beiden Files dogm_7036.cpp und dogm_7036.h enthält. Und auf diese beiden baut der nachfolgende Source auf, mit dem ich nach einigem Hin und Her dann doch noch das Display zum Laufen gebracht habe:
Source-Code
defines.h
// DOGM163 LCD
#define PinSS PA4
#define PinRS PB0
#define PinReset PB1
#define PinSpiClk PA5
#define PinSpiMOSI PA7
#define PinDogBackLED PB2
main.cpp bzw. dogm163.ino
/////////////////////////////////////////////////////////
// (C) 2020 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich ueber Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: http://cool-web.de/arduino/ //
/////////////////////////////////////////////////////////
#include <Arduino.h>
#include <SPI.h> // für DOGM163 LCD
#include "dogm_7036.h"
#include "defines.h"
dogm_7036 DOG;
byte arrow_down[] = {0x04, 0x04, 0x04, 0x04, 0x15, 0x0E, 0x04, 0x00}; //pattern for own defined character
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(PinSS, OUTPUT);
pinMode(PinRS, OUTPUT);
pinMode(PinReset, OUTPUT);
pinMode(PinDogBackLED, OUTPUT);
pinMode(PinSpiClk, OUTPUT);
pinMode(PinSpiMOSI, OUTPUT);
Serial.begin(115200);
for (int i=0; i < 4; i++) { // Reset-Indikation und auf serielle Schnittstelle warten
digitalWrite(LED_BUILTIN,LOW);
delay(250);
digitalWrite(LED_BUILTIN,HIGH); // und erstmal aus
delay(250);
}
//DOG.initialize(10,0,0,9,4,0,DOGM163); //SS = 10, 0,0= use Hardware SPI, 9 = RS, 4= RESET, 0 = 3.3V, EA DOGM163-A (=3 lines)
//DOG.initialize(PinSS, 0, 0, PinRS, PinReset, 0, DOGM163); // Hardware-SPI funktioniert nicht
DOG.initialize(PinSS, PinSpiMOSI, PinSpiClk, PinRS, PinReset, 0, DOGM163);
DOG.contrast(16); //bester Kontrast für 3.3V und den eingesetzen 22 Ohm Widerstand
DOG.displ_onoff(true); //turn Display on
DOG.cursor_onoff(false); //turn Curosor blinking on/off
DOG.define_char(0, arrow_down); //define own char on memory adress 0
DOG.position(8,2);
DOG.ascii(0); //show own defined char (adress 0, see DOG.define_char())
DOG.position(8,3);
DOG.cursor_onoff(true); //turn Curosor blinking on/off
delay(5000);
DOG.cursor_onoff(false); //turn Curosor blinking on/off
}
void loop() {
DOG.clear_display(); //Clear the whole content
DOG.position(1,1); //set Position: first line, first character
DOG.string("DOGM163 / ST7036"); //show String
DOG.position(1,2); //set Position: second line, first character
DOG.string("Soft SPI at 3.3V");
DOG.position(1,3);
DOG.string("www.cool-web.de");
delay(5000);
}
Test des Displays
Und mit diesem Source lief dann das Display endlich:Auf dem Foto erscheint die Schrift auf dem DOGM163 eher gelb-grün, in Wahrheit ist sie aber mehr bernsteinfarben und eigentlich recht angenehm.
Wenn man die Hintergrundbeleuchtung ein- und ausschaltbar machen möchte, dann schließt man die LEDs nicht an 3.3V an, sondern an einen Pin des STM32, den man dann mit digitalWrite() auf High oder Low setzen kann.