Das OLEDM204 von Electronic Assembly ist ein ganz nettes OLED Display. Ich verwende es für ein größeres Homeautomationprojekt in einem Panel zur Anzeige des Status.

 

OLEDM204 Display Demo

Das Display ist aber sehr "zickig" ist was die Initialisierung angeht. Man muss wirklich alle Kommandos und das Timing genau kontrollieren, weil das Display sonst einfach dunkel bleibt. Hier ist die Beschreibung von EA etwas dürftig.

Nachfolgend die Schritte die man unbedingt beachten muss.

1. SPI Bus LSB First

Normalerweise sind die meisten SPI Bausteine auf MSB First eingestellt, das Display benötigt zwingend LSB First.

2. Das Display muss vor Benutzung ordentlich "geresettet" werden. Resetleitung disoplay pin 12 High->LOW->High , wobei LOW für mindestens 50ms anstehen muss. Ein übliches RC-Glied tuts definitiv nicht - oder man verwendet einen RESET Baustein.

3. Initialisierungssequenz

Auch hier ist die Reihenfolge und die richtige Byteorder essentiell: Beispiel einer Initsequenz

    oled_m204_send_cmdx(hspi,0x2A);    // Set "RE"=1
    oled_m204_send_cmdx(hspi,0x79);    // Set "SD"=1
    oled_m204_send_cmdx(hspi,0x81);    // set contrast command
    oled_m204_send_cmdx(hspi,dim);    // set contrast value
    oled_m204_send_cmdx(hspi,0x78);
    oled_m204_send_cmdx(hspi,0x28);
    oled_m204_send_cmdx(hspi,0x2A);

Jedes Kommando an das Display wird mit 3 Bytes übertragen, wovon das erste Byte wahlweise 1F=CMD oder 5F=DATA bedeutet. Ein 8-bit Kommando wird in jeweils 2 Bytes übertragen.

Jede 3-Byte(!) Sequenz muss  mit chip select High->LOW begonnen werden und am Ende wieder LOW->High beendet werden.

Wichtig ist auch die SPI Polarität: CLK-Phase und CLK Polarität. Auch das hatte mich viele Stunden gekostet.

  /* SPI2 parameter configuration*/
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_LSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 10;

Hier noch die Pinbelegung am STM32:

 

STM32F103RB Pinout for OLED M204
STM32F103RB Pinout for OLED M204

Nachfolgend das Zip-File mit den C-Quellen. Es war mein erster Test des STM Cube IDE HAL Layers -

Vorweggenommenes Fazit: Ist doch ganz brauchbar. Man gibt zwar schon recht viel Kontrolle des Programmcodes ab - aber im Prinzip funktionierts ganz gut.

Der Hauptgrund für mich war, das man mit dem CUBE IDE und dem HAL Layer einen viel besseren Überblick über die verwendeten Pins und Subsysteme des jeweiligen Prozessors bekommt die man gerade in Benutzung hat. Insbesondere wenn man alle(!) SPI-, I2C-Busse,UARTS, CAN-Bus und Timer verwendet geht ganz schnell die Übersicht verloren. Das Argument das man mit dem HAL Layer immer bei der STM-Serie bleiben muss ist zwar im Prinzip richtig, aber bei den ARM Core Routinen muss man seinen Code auch immer an den jeweiligen Prozessor und Hersteller anpassen.

Ich habe die Library für das OLED M204 Display im Rahmen eines größeren Projekts erstellt und für diesen Artikel einfach herausgelöst. Man muss daher gegebenenfalls noch die stm32f1xx_it.c core files anpassen.

Nachtrag: Im Zipfile ist jetzt ein komplettes HAL Projectfile was man mit CubeIDE direkt öffnen kann.

Und hier noch die Pin-Belegung wahlweise für SPI1 oder SPI2:

 *      SPI1 Interface:
 *      OLED Display = Function => Olimexino Pin = STM32 Pin:
 *      Pin 12 = RESET => D2  = PA0
 *      Pin  5 = SCLK  => D13 = PA5
 *      Pin  6 = MOSI  => D11 = PA7
 *      Pin  7 = MISO  => D12 = PA6
 *      Pin 19 = CS    => D7  = PA9
 *
 *      SPI2 Interface:
 *      Pin 12 = RESET => D30 = PB11 // D2  = PA0
 *      Pin  5 = SCLK  => D32 = PB13
 *      Pin  6 = MOSI  => D34 = PB15
 *      Pin  7 = MISO  => D33 = PB14
 *      Pin 19 = CS    => D31 = PB12

Zur automatischen Steuerung der Jalousien und Rolladen benötige ich einen Helligkeitssensor der unabhängig die Tageshelligkeit misst. Bis dato habe ich einen einfachen analogen LDR verwendet der über einen analogen Eingang des AVR einfach den Spannungsabfall misst und so "einen" Helligkeitswert bestimmt. Der ist dann jedoch weder kalibriert noch besonders reproduzierbar. Also sollte ein richtiger Sensor her.

Da es nichts Adäquates auf dem Markt gab welches meinen Ansprüchen genügte und - ganz wichtig - die Helligkeit/Soneneinstrahlung über CAN-Bus ausgeben kann, habe ichs eben selbst entwickelt.

Als Sensor habe ich einen kalibrierten "echten" Halbleitersensor verwendet, der mit SPI oder I2C ausgelesen werden kann. Hier habe ich den TSL2561 von TAOS mit I2C-Bus verwendet. Es gibt den gleichen Sensor auch für SPI-Busanschluss. Der Sensor kann mit 16 Bit-Auflösung einen Dynamikbereich von 1:1.000.000 erfassen. Er kann die Helligkeit in zwei Kanälen ch0 und ch1 mit unterschiedlichen (Licht)-Frequenzbereichen messen -  um sowohl den Infrarotpegel als auch den klassichen Helligkeitspegel zu erfassen. Eigentlich recht einfach. Der Sensor ist ein ausgezeichneter Umgebungslichtsensor der zwei Sensorelemente in einem winzigen Gehäuse vereint. Das Gehäuse ist 2.6mm * 3.8mm groß und erfordert zwingend SMD-Bestückung. Als Alternative kann man auch den aktuellen TSL25721 von AMS verwenden. Der hat nochmals einen erheblich weiter gesteigerten Dynamikbereich von 45.000.000 : 1. Allerdings stimmen da dei Anschlussbelegungen der beiden Chips nicht ganz überein und in der Software müssen die Registeradressen angepasst werden.

Pin TSL2561 TSL2572 -1,-2,-3 Function
1 +Ub +Ub  
2 ADR SCL  
3 GND GND  
4 SCL LDR  
5 INT INT  
6 SDA SDA  

Hier muss also nur die SCL-Leitung statt an Pin4 an Pin 2 geleitet werden.Auf der PCB ist dazu ein 0-Ohm Widerstand oder eine Brücke passend zu löten. Aber noch folgende Warnung: Der TSL25721 ist sehr schwer von Hand zu löten.

Zur Ansteuerung und zu Realiserung des CAN-Busses habe ich einen STM32F103CB-Prozessor verwendet. Dies ist ein kleiner Cortex-M3 Prozessor in TQFP 48 Gehäuse (6*6mm).

Die Schaltung soll in einem kleinem ABS-Gehäuse (50*52mm) untergebracht werden und im Hausbussystem mit 4-Draht-Bus (12V DC, GND und CAN+ und CAN-) angesprochen werden können.

Der Sensor bekommt noch einen kleinen LWL-Lichtleiter der an der Rückseite des Gehäuses bis zu 50mm herausschauen kann. Dadurch kann die Elektronik "innen" sein und der LWL-Stab über ein kleines Loch im Fensterrahmen kann nach draußen schauen. Dadurch stimmt zwar die Sensorkalibrierung im Infrarotbreich sicher nicht mehr, aber es krabbeln eben auch keine Insekten in die Elektronik die feuchtigkeitsgeschützt im Innenraum bleiben kann.

Fotos folgen noch.

Das Schaltbild im EAGLE-Format gibts übrigens unter dem nachfolgenbden Link:

Die Platine findet sich hier:

 

 

Der Sensor befindet sich auf der Rückseite der PCB und schaut dann unten am Gehäuse heraus.

 

Software

Die Software zum Betrieb des Boards habe ich in C geschrieben. Diese übernimmt die Funktionen zum zyklischen Auslesen des Helligkeitssensor per I2C oder SPI, sowie die Bedienung des CAN-Bus.  Über einen 3-poligen Pfostenstecker kann man per ASCII-Terminal (z.B. Hyperterm oder Putty) einige Einstellungen (z.B. CAN-Bus Addresse, zyklisches Versenden der Messwerte, oder nur auf Anfrage per Buskommandio, oder beides) des Boards vornehmen und im Flashspeicher abspeichern. Dies ist aber eben nur für die Programmierung nach dem Flashen der Firmware. So kann man mehrere Helligkeitssensoren auf einem Bus betreiben. Ich verwende die Elektronik so, daß ich zyklische CAN-Bus Telegramme mit der aktuellen Helligkeit versende. So können einzelne Rolladen und Jalousiekontroller selbstständig auf Helligkeitspegel reagieren. Zusätzlich versendet die Software die Werte noch auf Anfrage.

Sobald ich die Software mit der Hardware ausreichend getestet habe, gibt es diese zum Download ebenfalls hier.

 der Platine als ELF-Flashfile.

 

Nachtrag:

Ich habe jetzt auch die Software ür den TSL 2572 geschrieben. Funktioniert im Prinzip nahezu gleich. Dieser Sensor war mir aufgrund des hohen Dynamikbereichs dann doch lieber. Den Sensor habe ich jedoch jetzt mir einem kleinen Breakoutboard in einer Plexiglaskuppel im Deckel des Gehäuses untergracht. Über den LWL-Lichtleiter kam bei niedrigen Helligkeiten doch zuwenig Licht durch.

Lichtsensor auf Breakoutboard für Plexiglaskuppel (Schauglas eines Ölsichtfensters)

Das Breakout-Board war nötig, da man den Sensor - für Testaufbauten etc. - sonst nahezu nicht verarbeiten kann.

Hier jetzt der Link zur :

 

Die DOG-M Display Serie von Electronic Assembly sind sogenannte Display-on-Glass LCD-Displays die sehr kompakt und preiswert sind. Hier folgt jetzt ein Beispiel wie man diese an der Cortex-CPU von ST STM32F103RB betreiben kann. Ich verwende das EA DOG-M162 Display mit 2 Zeilen a 16 Character oder auch das DOG-M163 mit drei Zeilen. Das nachfolgende Bild zeigt das Display auf einem Experimentierboard als 2-zeiliges 162er Display oder als 3-zeiliges 163er Display:

 

 

Die meisten CPUs werden mit 3.3V betrieben - daher wird hier auch nur darauf eingegangen wie man diese Displays unter 3.3V betreibt und programmiert. Zunächst muss man wissen, dass das Display bei unterschiedlichen Betriebsspannungen unterschiedlich initialisiert werden muss, sonst schaltet sich die integrierte Ladungspumpe nicht ein und das Display bleibt dunkel.

Hier kommt das wichtigste - die Initialisierungssequenz des DOGM 162/163 für SPI Mode bei 3.3V:

0x39 0x1C 0x55 0x6D 0x74 0x38 0x04 0x01 0x06

 

Für die Initialisierung des SPI Busses benötigt man ebenfalls umfangreiche Einstellungen und es bedarf auch zusätzlicher Funtionen wenn man mehrere SPI-Devices auf demselben Bus betreiben will.

Die Programmierung der SPI1 Clock erfolgt durch den folgenden Befehl:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC| RCC_APB2Periph_SPI1, ENABLE);

Im Beipielprogramm wird dies richtig programmiert.

Entwickelt und getestet habe ich das Programm auf dem STM32 Olimexino Board von Olimex.

Der Anschluss an den Prozessor erfolgt nach folgendem Ausschnitt aus dem Datenblatt des Displays:

 

Der Anschluss an das Olimexino STM32-Board erfolgt über die SPI1 Schnittstelle und ist wie folgt:

* SPI Connections STM32F103     DOG-M Connections
* D6    : PA8     CS                nc
* xD10    : PA4     SPI1 NSS        RS Pin 39 yellow
* xD11    : PA7     MOSI1            SI Pin 28 white
* D12    : PA6    MISO1            nc    - Display data cannot be read back
* xD13    : PA5     SCK                CLK Pin 29 blue

Unter dem folgenden Link findet sich ein Beispielprogramm sowie eine DOGM Library für den STM32 Prozessor.  Eigentlich einfach zu benutzen - man benötigt nur wenige Funktionen:

dogm_display_string(char *string) um einen Text auszugeben und

void dogm_cursor( uint8_t row, uint8_t column ) um vorher den Cursor an die richtige Stelle zu setzen. 

Weil ich auch schon mehrfach danach gefragt wurde finden sich hier ein paar Tipps zur eigenen Herstellung von gedruckten Schaltungen. Im Web finden sich viele Anleitungen wie das grundsätzlich funktioniert und was man dazu benötigt, daher sind hier nur noch ein paar Tipps und Tricks aufgeführt.

Mittlerweile gibts ja - dank Internet - auch hier sehr preiswerte Anbieter die Platinen in guter Qualität erstellen und liefern, sodass man sich die handwerkliche Chemiearbeit sparen kann. Dennoch ist, wenn man dringend UND preiswert eine Platine benötigt, durchaus noch Bedarf an schneller Herstellung. denn meist will man keine 14 Tage auf die Lieferung warten. Die Selbstherstellung dauert im Mittel auch nur 1h.

Was braucht man überhaupt:

  • Platinenmaterial (einseitig, zweiseitig beschichtet)
  • Platinenentwurf (und damit auch ein Programm um diese zu erstellen z.B. Eagle, Target, Altium usw.)
  • Film zum Belichten
  • Belichtungsgerät
  • Entwicklerbad
  • Ätzbad
  • Stripper

Das klingt nach aufwendigem Vorgang, aber es ist eigentlich doch recht einfach. Mittlerweile schaffe ich es innerhalb einer Stunde eine Platine zu fertigen. Dies aber nur wenn man einen Platz hat wo man eben mal hingehen kann und die Arbeiten einfach machen kann (Garage, Keller usw.). Wenn man das jedoch in einer Etagenwohnung machen will, sollte man sich eine "große" Entwicklerschale (die gabs früher im Fotozubehörladen) von 50*50cm anschaffen. In der kann man dann alle Utensilien aufbewahren und macht auch keine "Chemieflecken". Diese Schale kann man dann z.B. auf dem Küchentisch oder in der Dusche aufbauen und auch schnell wieder wegräumen.

Zum Schalten von 230V AC lasten eignen sich neben Relais auch sogenannte Halbleiterschalter.  Diese haben den Vorteil dass die Kontakte nicht verbrennen können und quasi ewig halten. Zum Schalten von Rolladenmotoren habe ich die Sharp S202S12 sowie die S202S02 getestet. Diese Halbleiterrelais sind von Sharp und können opto-isoliert angesteuert werden. Laut Datenblatt können die Schalter zum Schalten von ohmschen Lasten bis 400V verwendet werden. Der Unterschied zwischen den beiden Varianten ist, dass der S202S12 bereits eine sogenannte Snubber-Circuit - also ein RC Glied eingebaut hat. Dies reduziert Induktions- und Gegenspannungen beim Schalten von induktiven Lasten.

Da ich im Web kaum Berichte oder Erfahrungen zum Thema "Schalten von Rolladenmotoren mit Halbleiterrelais" gefunden habe, musste ich es wohl selbst herausfinden.

Hier ist übrigens ein Bild des Sharp-Relais im Vergleich mit einer 3mm-Leuchtdiode.

 

Die Größe ist für die Leistung von 8A rms wirklich sehr klein. Die Ansteuerung des Relais kann mit 10-15mA erfolgen. Laut Datenblatt soll das Relais 4kV-Isolationsspannung haben. Damit ist es perfekt für den Einsatz in meinen Rolladen- und Jalousiesteuerungen zum Einsatz auf PCBs.

Zum Testaufbau habe ich einen Rolladenmotor mit

  • Relais ohne Snubber
  • Relais und externem Snubber
  • Halbleiterschalter mit Nulldurchgangsschalter
  • Halbleiterschalter mit Nulldurchgangsschalter und eingebautem Snubber

getestet. Hierzu habe ich die einzelnen Aktoren von einem Microkontroller ansteuern lassen und die Störungen und Signale auf den Versorgungsgleitungen (3.3V) gemessen. Teilweise habe ich Transienten mit bis zu 40V gemessen. Dies wohlgemerkt hauptsächlich bei induktiven Lasten. Ohmsche Lasten sind in allen Fällen problemlos gewesen.

Grundsätzliches Problem sind die Störungen die durch den Ausschaltvorgang bei induktiven Lasten auftreten. Hier wird bei normalen Relais durch die Relaiskontakte ein Störsignal in der Erregerwicklung induziert.

Wie zu erwarten war ist die reine Relaisschaltung die Problematischste. Sobald man eine externes RC-Glied über die Kontakte schaltet ist es schon erheblich besser - aber immer noch bis zu 8V über der Versorgungspannung der Relais.

Die zweitbeste Lösung ist das Schalten mit dem Halbleiterschalter und Nulldurchgangsdetektor.  Hier werden auch noch große Störsignale erzeugt - aber das fast ausschliesslich beim Abschalten.

Am besten schneidet - wie zu erwarten war - das Relais mit Nulldurchgangsschalter und eingebautem Snubber ab. Hier sind nur noch leichte Störungen auf den Versorgungsleitungen.

Übrigens die 400V/600V benötigt man bei 230V Netzspannung unbedingt (ich sage nur Wurzel 2). Damit ergibt sich eine Spitzenspannung von 325V bei ohmschen Lasten. Natürlich sind die gemessenen Signale nicht representativ, da der Aufbau, Abstand zu stromführenden Leitungebn und natürlich die Last einen Einfluss haben. Im Vergleich sollte man aber das Ergebnis bewerten können.

Nachfolgend finden sich einige Screenshots der Transienten beim Abschalten der Last.

 Fazit:

Zum Schalten von Rolladenmotoren eignen sich Halbleiterrelais durchaus. Die Sharp S202S12 Optorelais konnte ich im Wechselbetrieb mit Rolladenmotoren betrieben. Die Störungen sind erheblich geringer und man braucht auch keine externen Entstörglieder.

Sofern man induktive Lasten schalten möchte, kann die Spannung ohne weiteres auf das 2-3-fache der Nennspannung ansteigen. Durch den im Halbleiterschalter eingebauten Snubber wird die Gegeninduktionsspannung erheblich reduziert.

Langzeiterfahren werde ich hier noch nachtragen.

ACHTUNG: Beim Aufbau von Schaltungen am 230V-Netz ist äußerste Vorsicht geboten. Auch mit den optoisolierten Halbleiterrelais ist auf ausreichenden Sicherheitsabstand beim Aufbau und Test zu achten. Schaltungen müssen vor Inbetriebnahme in ein allseitig geschlossenes Gehäuse eingebaut sein.

Zum Test immer einen Sicherheitstrenntrafo verwenden.