Novinka:Alfanumerické OLED displeje
(Kategorie: Jak na to)
Napsal gripennn
05.01.2020

Malé představení a návod na úpravu alfanumerických OLED displejů na seriové rozhraní včetně knihovny.

Alfanumerické OLED displeje


Obr.1 - ilustrační obrázek (vlastní fotku se mi nepodařilo udělat v obstojné kvalitě)



Motivace

OLED displeje asi nemá smysl představovat, všichni je určitě odněkud znáte. Existují různé varianty od malých grafických displejů s plochou kolem dvou centimetrů čtverečních až po obří televize. Jednou z odnoží jsou alfanumerické OLED displeje. Zajímat by vás mohli třeba z několika níže uvedených důvodů:

  • Moduly displejů jsou plně kompatibilní s klasickými LCD s driverem HD44780 a ekvivalenty. Lze tedy používat široce rozšířené knihovny.
  • Vzhled proti klasickým negativním LCD (bílá na modré, bílá na černé a pod.) je o třídu lepší. Stejně tak i kontrast je o několik řádů větší a černé pozadí je opravdu černé a neprosvítá.
  • Spotřeba oproti negativním LCD je nižší (jas ale nejde regulovat).
  • Displeje mají bohatší znakovou sadu (můžete si přepnout EN/Jap, EN/Ruj, EUR + řecké znaky, EUR + symboly)
  • Displeje umí pracovat v grafickém režimu, kde lze ovládat každý pixel individuálně
  • Driver displeje podporuje i sériové rozhraní (po úpravě jumperů na modulu displeje)
Osobně mi jako největší přínos přišlo sériové rozhraní, které zjednodušuje připojení v různých "bastl" aplikacích. Rád bych vás tedy seznámil s postupem jak modul upravit na sériové rozhraní a stručně i s komunikačním protokolem. Pro ty z vás, kteří budou mít odvahu použít můj amatérský kód je pak na konci připraven ovladač k displeji.

Varianty

Displeje, kterých se tento text týká jsou vybaveny driverem RS0010 nebo WS0010 (též jako OLED-0010). Lze je sehnat v TME například pod názvy REC000802*, REC001602*, REC002002*, REC004002*, DEP08*, DEP16* a pod. V GME jsou k sehnání dokonce i levnější s podobným označením WEH00*. Jejich cena se pohybuje od 200kč za 8x2 ke 350kč za 16x2. Úpravu rozhraní na SPI jsem testoval na variantě 0802 a 1202. S velkou pravděpodobností bude fungovat pro všechny dvouřádkové varianty. Nejsem si jist jestli lze upravit i čtyřřádkové displeje, neboť ty jsou vybaveny dvojicí driverů. Displeje se vyrábí ve 3V a 5V variantách. Můj kus REC001202AYPP5N (tedy 5V varianta) se rozbíhala na přibližně 1.8V. Domnívám se že 5V varianty jsou univerzální, schopné pracovat v 5V i 3V systémech. Smysl 3V variant mi trochu uniká - snad možná mají nižší spotřebu.

Úprava displeje 0802

Jumper označený L_CS_H spojuje ve výchozí konfiguraci CS pin s GND. Naše aplikace bude chtít s CS manipulovat a proto je jumper nutné odstranit a nechat rozpojený. Jumper označený H_PS_L (Parallel/Serial) je z výroby propojen s VCC a volí tak variantu paralelního rozhraní. My ho musíme přepájet do polohy "L", čímž vybereme sériové rozhraní. Z datasheetu k RS0010 lze dohledat že SCL (Clock) je DB5, SDI alias (MOSI) je DB7 a SDO (MISO) je DB6. Identifikace CS si vyžádala trochu "propípávání" a našel jsem jej na pinu 15 (viz obrázek). Zajímavé je, že jsem nikdy nenarazil na jediný datasheet k displeji, který by funkci jumperů a pinout pro sériové rozhraní jakkoli dokumentoval.


Obr.2 - Displej před úpravou (tedy v konfiguraci pro paralelní rozhraní kompatibilní s HD44780)




Obr.3 - Displej po úpravě na sériové rozhraní



Úprava displeje 1202

Obdobně lze upravit displej "1202". Pojmenování jumperu pro CS se drobně liší (CSH/CSL), ale je srozumitelné. Pinout se sériovým rozhraním je následující:

Pin displeje1212131415
SPIGNDVCCSCLSDOSDICS


Obr.3 - Displej po úpravě na sériové rozhraní, odpájený CS jumper (CSH/CSL nahoře) a jumper H_PS_L (vlevo) v poloze pro SPI.



Komunikační protokol

Nechci v této problematice zabředávat příliš hluboko, takže se pokusím stručně vyjádřit jen to nejnutnější. S displejem se komunikuje pomocí SPI. Driver čte data na vzestupnou hranu clocku, můžeme tedy použít SPI MODE0 a MODE3. Komunikace začíná sestupnou hranou CS a končí vzestupnou hranou. Jako první se posílá MSB. Formát zprávy je trochu "divný", ale v datasheetech je zakreslen správně a srozumitelně. Ze začátku komunikace se vždy posílají dva bity (RS a RW) a za nimi pak následuje jeden nebo více bytů dat. Takový formát není možné realizovat pomocí 8bit paketů a to částečně znemožňuje použití HW SPI na některých MCU. Je tedy na místě sáhnout po ručním ovládání GPIO, což sebou nese úskalí dodržení časových limitů komunikace (zvláště na rychlejších MCU). Význam prvních dvou bitů je následující:

  • RS - Read/Command bit, RS=0 znamená že posíláme příkaz, RS=1 znamená že posíláme data k zobrazování
  • RW - Read/Write bit, RW=0 znamená že budeme do driveru zapisovat, RW=1 znamená, že plánujeme číst
Několik vzorových zpráv vypadá následovně:

významformát zprávypoznámka
PříkazRS(0) + RW(0) + 1Byte(příkaz)celkem 10bit
1 Byte datRS(1) + RW(0) + 1Byte(data)celkem 10bit
n Byte datRS(1) + RW(0) + 1Byte(data1) + 1Byte(data2) + ... 1Byte(data n)celkem 2+n*8 bit
Čtení stavuRS(0) + RW(1) + 1Byte(dummy) + 1Byte(odpověď)celkem 18bit, MSB v odpovědi je busy bit, zbylá část je aktuální adresa kurzoru
Čtení pamětiRS(1) + RW(1) + 1Byte(dummy) + 1Byte(odpověď)celkem 18bit, nezkoušel jsem

Knihovna

Skládá se ze dvou dvojic souborů ws0010 a oled_v1. První z nich obsahuje fyzickou vrstvu komunikace, druhý obsahuje funkce pro ovládání displeje. Testoval jsem ji na STM32L0 (32MHz). Na pomalejších MCU je možné vyřadit funkci ws_delay(). Naopak na rychlejších MCU je potřeba delay prodloužit tak aby splňoval časové parametry komunikace (zapsané v záhlaví souboru). Portování knihovny na jiné architektury by mělo být snadné, neboť nevyužívá krom GPIO žádné HW prostředky. Komunikaci je možné libovolně přerušovat v kterékoli fázi.


archiv ke stažení:oled_v1.zip


Obr.4 - foto z testů





Poznámky

  • Datasheet k WS0010 inzeruje sériové rozhraní, obsahuje jeho timing i nákres, ale neobsahuje pinout (asi nepodstatná informace)
  • Datasheet k displeji REC001202A jde v nedbalosti ještě dál a má rovnou chybně pinout (naštěstí je to patrné na první pohled)
  • Při vypínání zůstávají na displeji několik sekund artefakty. Teoreticky je bude možné potlačit softwarovým vypnutím displeje před ztrátou napájení.

Odkazy a zdroje

www.elektromys.eu
| V1.00 5.1.2020 /
| By Michal Dudka (m.dudka@seznam.cz) /




Tato novinka je z -MCU Mikroelektronika - Community Site
( http://mcu.cz/news.php?extend.4125 )