OLED-Display-Recycling V1.6 [07.10.2011]

Tags: Stand Alone, Beispielscreens, , , , serielle Schnittstelle, Melodieklingel, I2C-HP03-Sensor

Da es derzeit (06/2009) weder bei "Angelika" noch beim "großen Zeh" oder anderswo bezahlbare OLED-Displays gibt, habe ich mich mal umgeschaut und bin neben Billigst-MP3-Playern auf folgendes Blutzuckermeßgerät gestoßen:

Bezugsquelle: 1-2-3-Risiko (<10€ incl. Versand!) oder hier mal vorbeischauen.

Eigenschaften: 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt / 31x25 mm aktiv

Ich habe das Teil für 5,00 € ersteigert und es nicht als kostenloses Testgerät vom Hersteller bekommen! ;-)

Das Datenblatt war dank der Beschriftung neben dem Controller (SSD1325) schnell gefunden.

Die größte Herausforderung nach dem Öffnen und Extrahieren des Displays bestand in der Kontaktierung. Bei einem Pinabstand von 0.5mm sollte man für einen ersten Probeaufbau einen guten Tag erwischen und weder zuviel noch zu wenig Kaffee/ Tee oder sonstige Drogen zu sich genommen haben! ;-)

Für den späteren Gebrauch empfiehlt sich natürlich unbedingt eine sichere Verbindung mit Hilfe eines Adpters. Der "mitgelieferte" Flachbandkonnektor leistet dafür optimale Dienste und ist recht einfach auszubauen.

Pinbeschaltung:

 

Da nur die seriellen Leitungen vom OLED-Controller weggeführt sind, braucht man sich um die parallele Ansteuerung keine Gedanken machen!

Nach dem Verbinden mit einem Host-Controller gehts ans Programmieren. Hier gibt es keine großen Tricks oder Stolperfallen, wenn man beachtet, daß der Wert für Multiplex Ratio (Cmd: 0x08) nicht 0x3F sondern 0x4F ist. ;-) Nähere Infos zur Initialisierung befinden sich mit Controller-neutralen Quelltextfragmenten im Zip-File.


Stand Alone Inbetriebnahme

Eine andere Möglichkeit der Inbetriebnahme - ohne großen Lötaufwand - besteht in der Nutzung der OnBoard-Peripherie (mega168, DC Step-Up-Regler, OLED-Adapter, Tasten, etc.). Die ISP-Pins des ATmega168PV (Signature: 0x1E 94 0B) befinden sich auf der rechten Seite des Boards. -> Demo incl. GCC-Sourcecode
Flashkommando für den AVR910-Programmer 3.8:
"avrdude -c avr910 -P com1 -b 115200 -p m168 -x devcode=0x35 -F -U Oled.hex"

 

 

Wenn man sicherheitshalber den großen Atmel-IC QFP100 ASIC?/FPGA? entfernt, kann man auch die Tasten (geg. GND -> also interne PullUps am mega168 einschalten!) nutzen:
Der RXD-Pin ist per Pad auch gut erreichbar und läßt sich als Eingang für serielle Daten z.B. eines GPS-Empfängers nutzen.


Dank an die User des µC-Boards für die hilfreichen Tipps und Ideen!


Pinbelegung des AVR mega168 (16kB Flash / 1kB RAM / 512Byte EEPROM):

8
PB7
7
PB6
17
PB5
(ISP_SCK)
16
PB4
(ISP_MISO)
15
PB3
(ISP_MOSI)
14
PB2
13
PB1
OLED_CS
12
PB0
OLED_LOAD
29
PC6
(ISP_RST)
28
PC5
rechte Taste
27
PC4
linke Taste
26
PC3
25
PC2
OLED_RST
24
PC1
OLED_DC
23
PC0
11
PD7
10
PD6
9
PD5
OLED_12V
2
PD4
OLED_SCLK
1
PD3
mittlere Taste
32
PD2
31
PD1
OLED_SDIN
30
PD0
RXD

 



Zur Veranschaulichung noch eine Skizze zum Byteformat des Displaymemorys:

 

Um ein Pixel darzustellen werden 4Bits benötigt - damit lassen sich die 16 Helligkeitsstufen codieren (0=dunkel, 7=50% Helligkeit, 15=volle Helligkeit). Mit einem Byte werden also 2 Pixel adressiert! (jeweils eins im High-Nibble und eins im Low-Nibble). Will man das erste Pixel im gelben Rahmen mit 50% Helligkeit darstellen und das zweite Pixel ausschalten, würde man also eine 0x80 senden!


Um ein Zeichen anzuzeigen, muß man erst ein Schreibfenster öffnen: Kommando 0x15 (Spalte) gefolgt von einem Byte mit dem Spaltenanfang und einem Byte mit dem Spaltenende, dannach das Kommando 0x75 (Zeile) mit einem Byte der Startzeile und einem Byte mit der Endzeile.

   

 

horizontale Linie - 5x1 Pixel

write_cmd(0x15);
write_cmd(0x07);
write_cmd(0x07+2);
write_cmd(0x75);
write_cmd(0x0);
write_cmd(0x0);
write_dat(0xff);
write_dat(0xff);
write_dat(0xf0);

// Set Column Adress -> Spalten
// Begin 7
// End 7+2 -> 7..9
// Set Row Address -> Zeile
// Begin 0
// End 0
// 2 helle Pixel

// 2 helle Pixel
// 1 helles + 1 dunkles Pixel

senkrechte Linie - 3x1 Pixel write_cmd(0x15);
write_cmd(0x07);

write_cmd(0x07);
write_cmd(0x75);
write_cmd(0x00);
write_cmd(0x02);
write_dat(0xf0);
write_dat(0xf0);
write_dat(0xf0)
// Set Column Adress -> Spalten
// Begin 7
// End 7
// Set Row Address -> Zeile
// Begin 0
// End 2
// 1 helles + 1 dunkles Pixel
// 1 helles + 1 dunkles Pixel
// 1 helles + 1 dunkles Pixel

Scrolling

write_cmd(0x23);

write_cmd(0x00);
write_cmd(0x26);
write_cmd(0x01);
write_cmd(0x16);
write_cmd(0x10);
write_cmd(0x2F);
delay_ms(1000);
write_cmd(0x2E);

// disable wrap around in x-direction
// during scrolling
// Horizontal scroll
// Horizontal scroll by 1 column
// Scrolling 16 rows
// Set time interval between each
// scroll step as 128 frames
// Activate scrolling

// Deactivate scrolling
// Achtung: dannach laut Datenblatt Display
// neu beschreiben (ROM-Masken-Bug? ;-)))



hier noch noch ein paar Beispielscreens:

...und mit Graustufen:

Für die Konvertierung von 16 Graustufen BMP-Files (4 Bit pro Pixel / unkomprimiert / Breite: Vielfaches von 4) habe ich noch ein kleines Tool geschrieben, welches hier verfügbar ist. (es finden sich aber auch zahlreiche weitere Tools im Netz, falls man es nicht einfach selbst schreiben will/kann: µC-Thread, Bitmap to Hex Converter, Bmp2Asm, ...)






kleine GPS-Beispielanwendung:

Dafür wurde sicherheitshalber der Atmel-IC QFP100 entfernt und der RXD-Pin mit einem GPS-Modul (NMEA 9600 8N1) verbunden. Mit dem Programm ist der ATmega168 nur knapp 50% ausgelastet - bei Codeoptimierung gibt es noch reichlich Einsparpotential. Vielleicht reicht es sogar noch für eine SD-Card Anbindung, um aus der Anwendung einen GPS-Logger zu bauen. Eine erste Version des Quellcodes incl. Hexfile gibts hier. ;-)


Kurzzeitwecker mit 7-Segment-Anzeige:

Für den Bau des Kurzzeitweckers benötigt man keine zusätzlichen Bauelemente. Lediglich zwei Umbauten sind notwendig: 1. Entfernung des Atmel QFP100 und 2. Verbindung des Buzzers (Piezoschallwandlers) mit Masse und mit PB2 (gut zu erreichen am Widerstand(?) neben dem 32kHz Quarz -> siehe Foto). Nachtrag: Zur Verbindung mit PB2 reicht auch eine kleine Zinnbrücke zwischen einem Via und dem Buzzer-Pad (siehe roter Kreis!)

Die Bedienung erfolgt mit den drei vorhandenen Tasten und ist hoffentlich selbsterklärend! ;-) Nach 30sec ohne Tastendruck und ohne aktivem CountDown schaltet der Controller das Display ab und geht in den Power-Down-Mode. Eine kurze Betätigung der mittleren Taste weckt ihn wieder auf. Die jeweils letzte eingestellte Zeit wird im EEPROM abgespeichert und bei einem erneutem Aufruf als Voreinstellung angezeigt. Quellcode incl. Hexfile V0.4 gibts hier.


DCF77 Funkuhr:

Mit Hilfe eines älteren DCF77 Empfängermoduls habe ich mal das 'Multifunktionsgerät' zur Funkuhr umgebaut. Der Atmel-IC QFP100 wurde entfernt und der RXD-Pin wurde mit dem invertierten DCF-Pin des Empfängers verbunden. (soweit die Theorie, in der Praxis habe ich noch ein 74HCT125 dazwischengeschaltet, da das Ausgangssignal etwas schwach war - mit einem Modul aktuellerer Bauart ging es aber auch ohne Treiber!)

Zum DCF77-Protokoll finden sich zahlreiche ausführliche Beschreibungen und Codebeispiele im Netz - daher hier nur eine kurze Zusammenfassung (Hexfile hier):

Bit / Sekunde Beschreibung
0
Start einer neuen Minute immer log. '0'
1..14
verschlüsselte Wetterinformationen der Firma MeteoTime GmbH
15
Rufbit
16
'1' falls am Ende der akt. Stunde Umstellung auf Winter od. Sommerzeit
17
'1' Sommerzeit (MESZ), '0' Winterzeit (MEZ)
18
'1' Winterzeit (MEZ), '0' Sommerzeit (MESZ)
19
'1' falls am Ende der akt. Stunde eine Schaltsekunde eingefügt wird
20
Startbit immer log. '1'
21..27
Minute (1, 2, 4, 8, 10, 20, 40)
28
Even-Parity von Bit 21-27 (Minute) '1' bei ungerader Anzahl Einsen
29..34
Stunde (1, 2, 4, 8, 10, 20)
35
Even-Parity von Bit 29-34 (Stunde)
36..41
Tag (1, 2, 4, 8, 10, 20)
42..44
Wochentag (1, 2, 4)
45..49
Monat (1, 2, 4, 8, 10)
50..57
Jahr (zweistellig; 1, 2, 4, 8, 10, 20, 40, 80)
58
Even-Parity von Bit 36-57 (Datum)
59
Sync-Bit: keine Modulationsänderung

In dem Video hört man gut den Unterschied zwischen logisch '0' (ca. 100ms high) und '1' (ca. 200ms high) und die ausgelassene (stumme) 59. Sekunde. In der zweiten Zeile wird die Pulslänge angezeigt und unterhalb der Uhrzeit kann man live die Decodierung von Minute, Stunde, Tag, Wochentag, Monat und Kalenderjahr verfolgen. In der letzten Zeile stehen die drei Even-Parity-Bits (0, falls Anzahl der 1er gerade).





Displaymodul über die serielle Schnittstelle ansteuern:

Für ein kleines AVR-Projekt brauchte ich schnell eine Ausgabe auf einem Display. Da das vorhandene 2x16 LCD aber im 3.3V Betrieb eine negative Kontrastspannung benötigt (ich weiß, die kann man an jedem Max232 o.ä. abgreifen) habe ich eine Firmware für das OLED-Modul geschrieben, mit der man es über die serielle Schnittstelle ansteuern kann.

Lediglich zwei Umbauten sind notwendig: 1. Entfernung des Atmel QFP100 (sicherheitshalber) und 2. Verbindung von PD0 (RXD) entweder über Schnittstellenwandler (Max3232 o.ä.) an die serielle PC Schnittstelle oder direkt an einen µController (Masse nicht vergessen!).

Mit bekannten Tools wie HTerm, BrayTerminal (V1.9b 27.08.2011) oder BinTerm kann man dann das Display testweise ansteuern. Die Voreinstellung ist 9600-8-N-1 und PowerDown 60sec nach dem letzten empfangenen Zeichen. PowerUp und Debug-Screen sind über die mittlere Taste erreichbar. Download hier im µC-Forum.

Implementierte Befehle in Version 0.1:

Befehl Beispiel (Ergebnis siehe Bild 3)
? -> zeigt Version/Sleeptime
hoch -> schaltet ins Hochformat
quer -> schaltet ins Querformat
cls -> löscht das Display
txt [0..16],[0..9],"text",[0..15] txt 2,0,Hello World ! (Font 5x7)
txtb [0..9],[0..5],"text" txtb 0,2,Big World! (Font 8x12)
rect [0..50],[0..79],[0..50],[0..79] rect 10,70,40,79 (Rechteck)
sleep [xxx] sleep 090 (ShutDown in 90sec)



kleine Melodieklingel:

Hier wurde das Programm aus dem µC-Forumsbeitrag Klingel mit 100 Melodien an die BZM-Hardware angepaßt. Durch Druck auf die mittlere Taste wacht der Controller auf und spielt eine zufällige Melodie (von 100 verfügbaren Melodie) ab.

Erforderliche Umbauten: 1. Entfernung des Atmel QFP100 und 2. Verbindung des Buzzers (Piezoschallwandlers) mit Masse (kleines Stück Draht -> siehe großer roter Kreis) und mit PB2 (kleine Zinnbrücke zwischen einem Via und dem Buzzer-Pad -> siehe kleiner roter Kreis!)

Testversion V0.1 incl. Sourcen (in Überarbeitung!)


I2C / IIC - per SW (mit HP03 Temperatur- + Drucksensor):

Um I2C-Bausteine am Oled-BZM zu betreiben, braucht man nur zwei zusätzliche Pull-Up-Widerstände (ca.10k). Da die Hardware I2C-Pins des AtMega168 belegt sind, wurde der I2C / IIC -Bus per Software umgesetzt.

Zum Test war gerade ein Drucksensor zur Hand: (HP03 - temperature and pressure sensor). Dieser benötigt noch einen 32kHz Takt und einen Schaltpin (siehe Datenblatt). Quellcode incl. Hexfile V0.3 gibts hier.

SCL PB5 (I2C_SW / ISP_SCK)
SDA PB3 (I2C_SW/ ISP_MOSI)
XCLR PB6 (nur bei Messung high)
MCLK PD6 (32kHz)



Mikrocontroller.net:

µC-Hauptthread zum Thema dieser Seite

µC-Artikel mit gesammelten Infos zum Gerät

AVR-Tutorial - Pflichtlektüre

AVR-GCC-Tutorial - Pflichtlektüre


BZM in anderen Foren:

Arduino-Forum: 1, 2, 3

BASCOM-Umsetzung der OLED-Ansteuerung im BASCOM-Forum


Links zu anderen OLED-Projekten:

SSD0323 OLED Pictiva 128×64x4 am Parallel Port

Project von TechDesign OLED 96×64 Pixel mit SSD1303 + PIC example

Net-Enabled Alarm Clock 128×64 Pixel OLED Display

icPlan.de SSD0323 128×64 Pixel SSD1303 96 x 64 Pixel + ATmega32

OpenWatch - Open Hardware Projekt - ATmega168 + 96 x 36 Pixel


AVR Tools und Anleitungen:

WinAVR - Windows AVR-GCC

Atmel AVR Studio - Entwicklungsumgebung (IDE) für Assembler und C

Burn-O-Mat - grafische Oberfläche für avrdude

AVR910-Programmer 3.8 - mit serieller Schnittstelle

USBasp - USB Programmer für Atmel AVR Controller

USBAVR-ISP - AVR Lab: u.a. Programmieradapter

101x64 Pixel SW-Display (LCD mit Backlight)


sonstige unterhaltsame Links: ;-)

Fefes Blog - der alltägliche (Verschwörungs-) Wahnsinn

Book2: gratis online Sprachen lernen, mit jeweils 100 mp3-Files!
Book2: Learn languages online for free with 100 audio (mp3) files!

Bestatterweblog

Radio1, Player

Hitradio Ö3, Silverlight-Player :-(




Änderungshistorie:

07.10.2011 - V1.6 Überarbeitung Links + 4bpp_bmp2c_V2.0.zip
27.03.2011 - V1.5 Überarbeitung Links + BitmapConverter
  . . .
  21.06.2009 - V0.1: Start der Seite OLED-Display-Recycling


Anmerkung + konstruktive Kritik sowie Links zu anderen OLED-Projekten sind jederzeit willkommen. Von "Empörungsbekundungen" a la: "Wie kann man bloß den Diabetikern die lebenswichtigen Meßgeräte so zerbasteln?" bitte ich höflichst abzusehen! ;-)


</OLED-Display-Recycling V1.6>

Get this page as PDF


zurück