Bu ekran isminden anlaşılacağı üzere Nokia 5110 telefonlarında kullanılmaktaydı ve Philips tarafından üretilmişti. Monokrom LCD bir ekrana sahip. 48 satır ve 84 sütundan oluşmakta ve yaklaşık 5cm x 5cm boyutlarında. Bu ekran da dot matrix şeklinde olduğundan yazı yazdırmak, özel karakter kullanmak ve şekil/grafik çizmek mümkün. Ancak çözünürlüğü göz önüne alındığında bitmap görüntüleri görüntüleyebiliyor sadece.

img_20190212_200520-e1550007473466.jpg

PCD8544 diye bir arayüzü var. Bu arayüz sayesinde basit mikro işlemcilerle de kullanılabiliyor.  O yüzden Arduino ile sıkça kullanılabiliyor. 2,7-3,3 volt arası çalışma gerilimine sahip (Adafruit gibi orijinal üreticilerin ürettiği displaylar için böyle. Çin’de üretilen modeller 5 volt toleranslı. Vcc olarak 3.3 volta bağlasak da Arduino’dan gelen 5V digital çıkışlarla çalışıyor. Orijinal modellerde bu çıkışlar akım koruma dirençleri ya da lojik 5 v>3.3 v dönüştürücülerle kullanılıyor. Zaten bizim kullandığımız Çin malı olanların üzerinde 3v-5v yazısı var). Çok düşük akımla çalışabiliyor; Ortalama 6 mA akım çeken ekran, ekrandaki tüm satırlar ON durumundayken (arka ışık da açık halde) dahi 10 mA civarında akım çekiyor. SPI (Serial Peripheral Interface) haberleşme protokolü kullanıyor. Bu seri haberleşme protokolü, mikro denetleyicilerle; sensörler, shift register’lar, SD kartlar gibi çevre birimleri ile kolay haberleşmede kullanılıyor. Veri iletimi bir saat(clock) ve veri(data) hattı ile kolayca sağlanıyor. Bunun avantajı Nokia5110 ekranını çalıştırmak için sadece 5 kablo bağlantısına ihtiyaç duyuyorsunuz. 7-segment display’i hatırlayın. Tek bir basamak/karakter için 8 kabloya ihtiyacımız vardı.

Seri haberleşme hatırlıyorsanız bilgisayar ile Arduino arasında da kullanılıyordu. Ancak bu aynı sistem değil. Orada Tx ve RX hatlarında sürekli veri iletimi sağlanıyordu. Her bir veri grubuna bir başlama ve bir bitiş bit’i eklenmek durumundaydı. Başlangıç bit’i veri geldiğini, bitiş bit’i de o veri grubunun sona erdiğini belirtiyordu. O seri iletişime Asenkron iletişim deniliyor. Bir osilator olmadığından hız (boud rate:9600 gibi) belirleniyor.  Burada kullanılan veriler zaten bir saat sinyali ile kontrol edildiğinden bu fazladan bit’lere ihtiyaç olmuyor. Saat  sinyali veri ile senkronize şekilde çalışıyor. Hız da olabildiğince fazla. Ayrıca saat sinyali veriyi yollayan tarafından üretilir (Bu tabiki de mikro denetleyicidir), Bu sinyali ürettiği için de ona “master” (efendi, kontrol eden), veri alana da “slave” (köle, komut alan) denir. MOSI(master out, slave in) hattı verinin mikre denetleyiciden çevre birimine , MISO(Master in slave out) da çevre biriminden mikrodenetleyiciye veri/komut taşıyan hattın adıdır.

Bu avantajlarından dolayı Arduino ile Nokia5110 ekranı sıkça kullanılır. Basit oyunlardan(Tetris gibi) tutun da osiloskop ekranı olarak kullanılan örneklere kolayca ulaşabilirsiniz. Ayrıca bir aydınlatma ışığının(mavi ve yeşil olanları var) olması da bir avantaj.

bacaklar

Üzerinde 8 pin bulunmakta:

  1. RST: Reset pini. LOW olduğunda yeniden başlatma yapıyor.
  2. CE-Chip Enable: Veri alınmasını sağlıyor. (Birden fazla çevre birimi ile SPI haberleşme olduğunda hangisi ile iletişim varsa onun enable edilmesini (veri almasını) kontrol ediyor).
  3. DC-Data/Command: 1602 LCD ekrandaki ile aynı. HIGH ile veri LOW ile komut yolluyoruz.
  4. Din- Serial Input: Verilerin gönderildiği hat.
  5. Clk-Clock: Saat  bilgisi hattı.
  6. Vcc: 2,7-3,3 Volt besleme.
  7. BL:Back Light : Arka plan aydınlatma. En fazla 3,3 volt.(ben 5v uyguladım, birşey olmadı)
  8. Gnd-Ground: Toprak (-) bağlantısı.

 

Gelelim devremize;

ilk 5 pini Arduino’ya sırasıyla bağlıyoruz:

RST:11, CE(CS):12, DC: 10, Din(MOSI):9, Clk(SCK):8.

Vcc ve BL hatlarını 3,3 volta, Gnd yi de yine Arduino’nun GND’sine bağlıyoruz. Hepsi bu kadar.

devre şeması

Koda gelince. Yine kütüphaneyi eklemek zorundayız. Google’a yazınca birçok sitede bulabilirsiniz. Ama benim (basic) indirdiğim site:

http://www.rinkydinkelectronics.com/library.php?id=44

Sonra üst menüden:

Taslak> Lİbrary Ekle> .ZIP kitaplığı ekle

Sonra indirdiğimiz dosyayı seçerek ekliyoruz. Bu bağlantıdan sonra, önce örnek görmek için:

Dosya> Örnekler> LCD5110_Basic>Arduino (AVR)>LCD5110_Bitmap4

çalıştırın. Ekranda Arduino sembolü yanıp sönüyorsa bağlantılar ve yüklemeler tamam demektir.

Taslak> Lİbrary Ekle> LCD5110_Basic yüklenmeli. Böylece programın ilk satırı;

#include <LCD5110_Basic.h>

olarak ekrana gelmeli. Daha sonra bir LCD nesnesi oluşturmamız gerekir. Ben yine ismini abc olarak seçtim:

LCD5110 abc(SCK, MOSI, DC, RST, CS);

parantez içine sırasıyla ismi yazılan bağlantıların, Arduino’nun hangi bacakları olduğunu tanımlıyoruz, yani devre bağlantıları ile ilgili. Sonra burada kullanılacak olan yazı tiplerini çağırıyoruz.

extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];

Bu ekranda üç boy/tip karakter kullanabiliyoruz:

SmallFont: küçük yazı; küçük/büyük harfler, rakamlar, noktalama işaretleri, özel karakterler kullanılabilir. Her bir karakterin boyutu 6×8 piksel. Bu ekran 84 yatay, 48 dikey pikselden oluşuyor. Yani satır kavramı yok. Bu yazı modunda 6 satır yazılabiliyor(toplam 48 nokta olduğundan). Toplam yan yana yazılabilecek karakter sayısı da en fazla 14 oluyor. Bu ekranda sığabilecek karakterden fazla karakter girilirse, sığmayanlar gözükmüyor.

MediumNumbers: Orta Boy sayılar(nokta, eksi  ve denktir işaretleri de dahil). Bir sayının boyutu 12×16 piksel. En fazla alt alta 3 karakter yazılabiliyor. Yan yana ise 7 karakter olabiliyor.

BigNumbers: Büyük Boy Sayılar. Sadece sayılar yazılabiliyor (nokta, eksi ve denktir işaretleri de).  14×24 piksel olup, ekranda ancak iki satır görülebiliyor. Yatay olarak yazılabilen büyük sayı ise en fazla 6 adet.

sonra void setup() kısmında;

abc.InitLCD(); abc dosyasını başlatır. 1602 LCD ekranda ve seri iletişimde de benzer komutlar vardı. Bu satırdan sonra 5110 ile ilgili her komut abc. ile başlamalı.

abc.setContrast(60); Ekranın kontrast ayarı yapılır. Parantez içerisine 0-127 arası tam sayı girilir. 70 civarı güzel görünüyor. Kendiniz deneyerek ayarlayabilirsiniz. Ayrıca bu komutun en güzel tarafı yazmayı unutabilirsiniz. Bu satır hiç yazılmazsa varsayılan olarak kendisi  70 değerine ayarlıyor.

Artık void loop kısmına geçebiliriz. Burada;

abc.clrScr(); Ekran temizliği yapar. Her zaman programa bunu yazarak başlamanızı tavsiye ederim.

abc.setFont (SmallFont); Yazdırmak istediğimiz şeyden önce yazı fontunu ayarlamaya yarar. Parantezin içinde MediumNumbers ya da BigNumbers olabilir.

abc.print(yazı, yatay başlangıç  pozisyonu, dikey başlangıç  pozisyonu); Yazmak istediğimiz yazıyı tırnak içerisinde, Türkçe karakter kullanmadan yazıyoruz. Virgülden sonra yazının kaçıncı dikey pozisyondan başlamasını istiyorsak onu yazıyoruz. 0 yazarsak en soldan başlıyor. Bu bölüme; LEFT, CENTER, RIGHT da yazılabiliyor. Yani sola yanaşık, ortalı ya da sağa yanaşık yazabiliriz.

abc.printNumI(Tamsayı, yatay başlangıç  pozisyonu, dikey başlangıç  pozisyonu );

Tamsayıları (Integer) yazdırmak için kullanılır. Önce tam sayı, sonra sütun sonra satır. Burada eklenebilecek iki değer daha var. önce kaç basamak olarak yazdırmak istediğimizi seçebiliriz. Sonra da öndeki boş basamakların ne ile doldurulabileceğini. Örnek:

abc.printNumI(25, CENTER, 24, 3,”0′);

abc.printNumF(Ondalık Sayı, ondalık basamak sayısı, x,  y);

Ondalıklı sayıları (Float) yazdırmak için kullanılır. Önce ondalıklı sayı nokta ile ayrılmış olarak, sonra ondalık kısmın basamak sayısı, yatay ve son olarak da dikey başlangıç konumu. Ondalık kısım 1 ile 5 arası bir tamsayı olmalı. Burada da eklenebilcek bölümler var. düşey konumdan sonra virgül konularak; ondalık sayının gösteriminde aradaki nokta yerine hangi karakteri kullanmak istiyoruz. Tek tırnak  (‘ ‘)arasına bunu yazıyoruz. daha sonra istersek bu sayıyı toplam kaç basamak olarak göstermek istediğimizi de ekleyebiliyoruz. Hatta sonraki seçim olarak fazlalıkların karakter ile doldurulmasını istediğimizi de yine tek tırnaklar arasında yazıyoruz. Yani ondalıklı sayı yazdırırken parantezin içine toplam 7 özellik girebiliyoruz. Örnek mi!

abc.printNumF(22.4, 3,  0, 0, ‘*’, 8, ‘_’);

 

IMG_20190213_211436

22.4 sayısı; ilk satır ilk sütundan itibaren, ondalık kısmı 3 basamaklı, toplam 8 karakter olarak, ondalık nokta yerine * ve en baştaki boş yerler de – doldurularak yazılacaktır. En baştaki boşlukların sayısını hesaba katarken ondalık noktayı da dahil etmemiz gerekiyor. Ekrandaki görüntü yandagörülüyor.

IMG_20190213_211828

abc.invert (1); ekranın negatifi alınır. Parlak yanan karakterler karanlık, karanlık olan karakterler parlak olur. Parantez içindeki sayı 0 yada “false” olursa eski haline döner. O halde 1 yerine de ….?

 

IMG_20190213_211909

invertText(1); Sadece karakterlerin negatifi alınır tüm ekran yerine. Yine parantez içine; 0 ya da “false”yazılarak eski haline döndürülür.

 

Burada bahsedilecek birkaç komut:

abc.enableSleep(); Uyku modu. Ekran tamamen kapanır. Ancak arka plan aydınlatma hariç ekran kapanır. Bu arada arka plan için benim  önerim bir Arduino digital (hatta analog!) çıkışa bağlanıp LDR ile parlaklık ayarlanabilir.

abc.disableSleep(); Uyku modundan ekranı çıkartır. Fakat uyku modundan çıkıldığında ekran açılır ama boş gelir.

Buraya kadar Ekrana yazılar yazmayı ve komutları öğrendik. Asıl ekrana bir resim dosyası ekleme bölümü var.

Önce Siyah ve beyaz olabilecek bir resim bakıyoruz. Resmi herhangi bir resim editöründe düzenliyoruz. Ben sadece paint bildiğimden, önce resmi yeniden boyutlandı’dan pixel olarak 84×48 içinde bir değer seçiyoruz.

Sonra iki yöntem olabilir:

  1. Uygun pikselleri seçip dosyayı jpg/png/gif uzantılı olarak kaydediyoruz. Sonra; http://www.rinkydinkelectronics.com/t_imageconverter_mono.php sitesine gidip dosya seç’i tıklıyoruz. İstenen dosyayı yükleyip, “Make File” butonuna tıklıyoruz. o da bizim için dosyayı .c uzantılı hale getiriyor ve download ediyoruz.
  2. Uygun pikselleri seçip dosyayı bmp uzantılı kaydediyoruz. Sonra; http://en.radzio.dxp.pl/bitmap_converter/sitesinden indirdiğimiz dönüştürücüyü kuruyoruz.File>Load image den bmp uzantılı dosyamızı seçiyoruz. Sonra File>Save output diyoruz. ve dosyamızı .c uzantılı olarak kaydediyoruz.

dönüştürücü

Her iki şekilde de elimizde .c uzantılı bir bitmap resim dosyası var.

Artık kod sayfasına geçebiliriz. Kodumuzun olduğu sayfada Taslaklar>Dosya ekle’den .c uzantılı dosyamızı seçiyoruz. Karşımıza çıkan sayfa sizi korkutmasın! Bu aslında resmimizin Arduino’nun anlayacağı dilde kodlanmış hali.

bitmap_ard

Zaten yukarı baktığınızda bunun kod sayfasının komşusunda olduğunu görürsünüz. Sol üstten program sayfasına dönünce;

extern uint8_t “c.uzantılı dosyanın ismi”[];, mesela dosyanın ismi logo.c ise:

extern uint8_t “logo”[];

şeklinde bu dosyayı çağırmamız gerekir. Bazı kullanıcılar yukarıdaki resimde gördüğünüz sayıların tamamını koda yapıştırıyorlar. O zaman extern komutuna gerek kalmıyor.

Neyse sonuçta kodumuza logo’yu tanıttık. Şimdi onu nasıl yazdırıyoruz? Komutumuz:

abc.drawBitmap(X, Y, logo, 52, 48);

Parantez içindekiler; X: Logonun yerleştirileceği yerin X konumu.

Y: Logonun yerleştirileceği yerin Y konumu.

logo: yukarıda extern edilen şeklin adı (burada logo).

52: Logonun yatay pixel sayısı.

48: Logonun düşey pixel sayısı.

Yukarıdaki örnek aslında benim logomun  örnekleri. Logomun boyutları 52×48 piksel. Bunu en başa yerleştirirsek sağda boşluk kalıyordu. Çünkü ekran yatayda 84 piksel. 84-52=32 piksel kalıyor. Bunu logonun her iki tarafına 16 piksel olarak eşit paylaştırmak için logoyu 16. pikselden itibaren yerleştirmek gerekiyor. O zaman bu kod satırı:

abc.drawBitmap(15, 0, logo, 52, 48);

olacak, ve benim logom ekranı ortalayacaktır. Bitmap videoda zaman nedeniyle işlenememiştir. Gerek olursa onun için de bir video hazırlarız.

Hoşça kalın…

 

Kaynak:

https://components101.com/nokia-5110-lcd

https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all