Makale Özeti

Daha önce kasa modifikasyonu ya da paralel port programlama ile uğraşanlar küçücük LCD ekranların boyundan büyük işler yapabildiklerini bilirler. Bu yazımda size MediaPlayer ya da iTunes ta çaldığınız bir parçanın LCD ekrana nasıl yazılabileceğinden bahsedeceğim. Böylece kasanıza ya da harici bir kutuya bağlayabileceğiniz LCD ekranı ile yeni bir görünüm elde edeceksiniz.

Makale

Ne yapacağız;


Daha önce kasa modifikasyonu ya da paralel port programlama ile uğraşanlar küçücük LCD ekranların boyundan büyük işler yapabildiklerini bilirler. Bu yazımda size MediaPlayer ya da iTunes ta çaldığınız bir parçanın LCD ekrana nasıl yazılabileceğinden bahsedeceğim. Böylece kasanıza ya da harici bir kutuya bağlayabileceğiniz LCD ekranı ile yeni bir görünüm elde edeceksiniz.Projemize geçmeden önce LCD ekranların yapısından ve MediaPlayer'da çalan şarkıların bilgilerini nasıl çekebilecemizden bahsedeceğim.

LCD'nin yapısı;


Aslında bu yazımda size uzun uzun LCD (Liquid Crystal Display) 'lerin tarihinden ve yapısından bahsetmeyeceğim. Merak edenler internette bol bol kaynak bulabilirler. Bizim için asıl önemli olan bu küçük ekranların bilgisayar ile iletişimleri ve verilerin bilgisayarda nasıl işlenip gönderilmesi gerektiğidir.
En başta belirteyim bu ekranları temin etmek çok kolay. Karaköy Selanik Pasajında ya da Perpa'da 10$ a satılmakta. Bizim kullanacağımız 2 x 16  bir LCD ekran olacaktır. Farklı boyutlarda ve fiyatlarda ekranlarda bulmak mümkün. Bu ekran tipini seçmemin nedeni fiyatının ucuz olması ve bu projemiz için yeterli olmasıdır.

Standart  LCD ekranlar 8 bit ile programlanır ve 5Volt ile çalışırlar. İhtiyacınız olan voltajı adaptör ya da bilgisayarın içerisindeki hard-disk kablosu ile almanız mümkündür. Ben voltametre ile ölçtüm biçtim  uygun buldum (Resim 1). Benim önerim hard-disk kablosunu kullanmanız (Resim 2). Resimde de gördüğünüz gibi siyah uçlar topraktır. Kırmızı +5V, Sarı ise +12V gerilimi sağlamaktadır. Yaklaşık 1$'a alacağınız hard-disk gerilim uzatma kablosunu kesip sarı ucunu kullanacağız. Kasaya monte edeceğimiz LCD ekranlarında kablo dertlerinden kurtulmuş oluruz.

                  - Resim 1 -

                    - Resim 2 -

Standart 2 x 16'lık LCD panellerde 14 uç bulunur (Resim 3). Bunların 8 tanesi paralel portun DATA pinlerine bağlanır. Aşağıdaki tabloda LCD ekranın pinlerinin bağlantıları verilmektedir. 15 ve 16 numaralı ayaklar ise LCD panelinin ışığını yakmak için kullanılır.

Pin Sembol İşlev
1 Vss Power supply (GND)
2 Vdd/Vcc Power supply (+5V)
3 Vee/Vo Contrast adjust
4 RS 0 = Instruction input / 1 = Data input
5 R/W 0 = Write to LCD module / 1 = Read from LCD module
6 E Enable signal
7 DB0 Data pin 0
8 DB1 Data pin 1
9 DB2 Data pin 2
10 DB3 Data pin 3
11 DB4 Data pin 4
12 DB5 Data pin 5
13 DB6 Data pin 6
14 DB7 Data pin 7
        

                                            - Resim 3 -

Tabloda belirtilern bağlantılar çok açıklayıcı olmayabilir. Bu yüzden Resim 4'te bağlantı şemasıda* belirtilmiştir. Biraz lehim yapmasını bilen arkadaşlar bu bağlantıyı kolaylıkla yapabilirler. Bağlantımız bittikten sonra işin rahat kısmına yani kod kısmına geçeceğiz.

                                                 - Resim 4 -

Daha öncede bahsettiğim gibi bu projede amacımız LCD'nin yapısı üzerinde uzun uzun çalışmak değildir. Asıl önemli olan bilgisayarımızdan LCD panelimize verileri gönderebilmektir. Yazının aşağısında kaynaklar bölümünde LCD ekran yapıları ile ilgili kaynak siteleri inceleyebilirsiniz. Evet en sonunda geldik işin zevkli tarafına yani kodlamaya...

LCD panele veri göndermek;

Paralel Port ile herhangi bir işlem yapabilmek için öncelikle inpout32.dll dosyasını "WINDOWS/system32" klasörü içerisine kopyalamanız gerekmektedir. Bu dll dosyası paralel protundan veri iletişimini sağlamaktadır. Projemizde de bu dll dosyasını çağırmak için öncelikle PortInterop.cs adında bir c# dosyası yaratmalıyız. Aşağıdaki kodda da belirtildiği gibi PortAccess adında bir sınıf oluşturuyoruz. PortAccess.Output metodu sayesinde paralel portumuzdan dışarıya artık veri gönderebilecek duruma geldik. Bundan sonra LCD panelimize veri gönderebilmek için PortAccess.Output metodunu kullanacağız.

 using System;
using System.Runtime.InteropServices;

public class PortAccess
{

[DllImport("inpout32.dll", EntryPoint = "Out32")]
public static extern void Output(int adress, int value);

[DllImport("inpout32.dll", EntryPoint = "Inp32")]
public static extern int Input(int adress);
}

Şimdi ise MediaPlayerda çalan müzük bilgilerinin nasıl çekildiğini göreceğiz. Daha sonra ise projemizde LCD ekrana MediaPlayerdaki müzik bilgilerinin nasıl yazıldığını göreceğiz.

MediaPlayer'dan veri çekme (ve iTunes);

Windows Media oynatıcısı bir çok plug-in içermektedir. Bizimde bu projede ihtiyacımız olan plug-in "Windows Media Player 9 Series Fun Pack" sitesinde bulunmaktadır. Bu siteden Blogging Plug-in programını kurup çalıştırmalısınız. Bu plug-in Media Player 9 ve 10 ile çalışmaktadır. Bu plug-in'nin 2 işlevi bulunmaktadır. Birincisi şarkı, şarkıcı, albüm isimlerini ve şarkı süresini Media Player'da title barda yazması, ikinci ve bizim için önemli tarafı ise registry'de şarkı bilgilerinin yazılmasıdır. Bu sistemin tasarlanmasının asıl amacı adından da belli olduğu gibi blog sitenize o anda çalan şarkı bilgilerinin yazılmasıdır(blogging programı gerekli). Bu programı kurduktan sonra Start --> Run --> regedit yazın, daha sonra ise HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\CurrentMetadata bölümüne gelin. Resim 4'te de gördüğünüz gibi çalan şarkının bilgileri registry'e yazılacaktır. Daha sonra programımız sayesinde bu bilgileri buradan çekip LCD ekrana yazmayı göreceğiz.

                                                    - Resim 4 -

Geldik eğlenceli bölüme şimdiye kadar uyguladıklarımızı projemizde birleştireceğiz.

 private void Form1_Load(object sender, EventArgs e)
{
Microsoft.Win32.RegistryKey currentMetadata = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\MediaPlayer\CurrentMetadata", false);

string title = currentMetadata.GetValue("Title", "Belirtilmemis") as string;
string album = currentMetadata.GetValue("Album", "Belirtilmemis") as string;
string author = currentMetadata.GetValue("Author", "Belirtilmemis") as string;
string duration = currentMetadata.GetValue("durationString", "Belirtilmemis") as string;

label1.Text = title;
label2.Text = author;
label3.Text = duration;
label8.Text = album;

notifyIcon1.ShowBalloonTip(2, "Şimdi Çalıyor", author + '\n' + title + " (" + duration + ")" ,ToolTipIcon.Info);

writetoLCD(title, duration);

currentMetadata.Close();

}

Programımız derlenip çalıştığında ilk yapacağı şey daha öncede bahsettiğim gibi registry'e gibip isteğimiz bilgileri çekecektir. Registry'e Microsoft.Win32.RegistryKey sınıfı ile kolaylıkla ulaşabiliriz. Daha sonra title, album, author ve duration adında 4 adet string oluşturalım. Bu stringler Media Player'da çalan şarkının registry den alınmış bilgileridir. Alınan bilgileri label'lara yazıyoruz (Resim 5). Eğer şarkıda bazı bilgiler eksikse "Belirtilmemistir" yazacaktır. Daha sonra ise Toolbarda da şarkı bilgilerinin görünmesi için notifyIcon sınıfını kullandım (Resim 6). Burada sadece notifyIcon sınıfınında nasıl kullanıldığını göstermek istedim. İsterseniz bunu kullanmayabilir ya da farklı metodlarla farklı özelliklerde katabilirsiniz.

                     - Resim 5 -

 

               

     - Resim 6 -

 

writetoLCD fonksiyonunda ise şarkının adı ve süresi çağırılıyor. Bu string değerlerini ise LCD panelimize yazdırıyoruz.

 private void writetoLCD(string title, string duration)
{

PortAccess.Output(data, 1);
PortAccess.Output(control, 8); Thread.Sleep(1);
PortAccess.Output(control, 9); Thread.Sleep(1);


int a;
char[] line1_ch_buffer, line2_ch_buffer;
string line1_st_buffer, line2_st_buffer;

line1_st_buffer = title;
line1_ch_buffer = line1_st_buffer.ToCharArray();
line2_st_buffer = duration;
line2_ch_buffer = line2_st_buffer.ToCharArray();

HangiSatir(1, 1);
for (a = 0; a < line1_ch_buffer.Length; a++)
{
int delay = 100;
PortAccess.Output(control, 4); Thread.Sleep(1);
PortAccess.Output(data, (int)line1_ch_buffer[a]);
Thread.Sleep(delay);
PortAccess.Output(control, 5); Thread.Sleep(1);
}

HangiSatir(2, line1_ch_buffer.Length);
for (a = 0; a < line2_ch_buffer.Length; a++)
{
int delay = 100;
PortAccess.Output(control, 5); Thread.Sleep(1);
PortAccess.Output(control, 4); Thread.Sleep(1);
PortAccess.Output(data, (int)line2_ch_buffer[a]);
Thread.Sleep(delay);
PortAccess.Output(control, 5); Thread.Sleep(1);
}
}

Görüldüğü gibi kısa bir kodumuz var. PortAccess.Output(data, 1) kodu LCD ekranımızı temizlemeye yarar. Daha sonraki 2 satır kod ise paralel portun kontrol bitlerine değer atar. Bu değerlerin ne olduğu ve neye göre atandığı hakkındaki bilgileri yazının sonundaki kaynaklardan bulabilirsiniz. Daha öncede belirttiğim gibi burada amacımız LCD ekran yapısını ya da paralel port yapısını incelemek değil.

line1_ch_buffer ve line2_ch_buffer karater dizisini oluşturmamızın amacı şarkı adını(line1_st_buffer) ve süresini(line2_st_buffer) LCD ekrana karakter karakter aktarmamızdır. Bu yüzden her string'i karakter dizi kümesine dönüştürdük. HangiSatir fonksiyonu ise LCD ekranımızda yazacağımız karakter dizisinin hangi satırda olması gerektiğini belirtir. for döngüsünü ise her karakteri tek tek LCD ye göndermemizi sağlar. Ben her karakterin gönderilmesi için bir gecikme olmasını istedim. Bu yüzden delay adında bir int değişkeni kullandım. Böylelikle her karakter yazıldıktan sonra program 100ms beklemekte. Bu bence ekranda daha hoş gözükmekte. Yalnız unutmamak gerekir ki Thread.Sleep sınıfını kullanmak için kodumuzun başına "using System.Threading;" yazmamız gerekli. Bu sınıfı çağırmadan Thread.Sleep sınıfını çağıramayız. Şimdi ise kısaca HangiSatir sınıfını inceleyelim;

 private void HangiSatir(int line, int column)
{
      PortAccess.Output(control, 8);

    if (line == 1)
      PortAccess.Output(data, 127 + column);

   if (line == 2)
  {
     int sayi = 39 - column;
     for (int i = 0; i <= sayi; i++)
    {
          PortAccess.Output(control, 4); Thread.Sleep(1);
          PortAccess.Output(data, 16);
          PortAccess.Output(control, 5); Thread.Sleep(1);
    }
  }
}

Bu sınıfta beni en çok şaşırtan durum satırı belirleme oldu. Normal koşullarda birinci satırda yazmak için (public static extern void Output(int adress, int value)) value değerine 128, ikinci satıra yazmak için ise 128+64 yani 192 belirtmemiz gerekir. Bunu belirttikten sonra paralel porttan göndereceğimiz veri LCD de isteğimiz satırda yazılıyor. Gerek türkçe gerekde ingilizce kaynaklarda yapı bu şekilde belirtiliyor. Benim bitirme tezim paralel port üzerinden ev otomasyonuydu bu yüzden farklı LCD modelleriylede (Samsung 1602, Hitachi HD44780) bunu denedim Fakat her iki modelde alt satıra geçeceğine farklı bir karakteri ekrana yazıyordu. Bu yüzden deneme yanılma yoluyla alt satıra geçmenin yöntemini buldum. İlk satırı 39 karaktere tamamlamak. Yani aslında ilk satırda 40. karaktere yazacağınız yazı 2.satırda ilk karakter olarak cıkıyor. Resim 7 de standart bir LCD ekranın karakter kümesi bulunmaktadır.

                - Resim 7 -

Sonuç;

Artık projemizin sonuna geldik. Projemizde görüldüğü gibi çok basit ve kısa bir kod derledik. LCD ekranımızı lehimlemek biraz vaktinizi alabilir. Ama en sonunda kolaylıkla yeni bir kasa modifikasyonu geliştirdiniz. Kod ya da bağlantı ile ilgili sorularınızı, bana ulaştırırsanız size yardımcı olabilirim. Resim 8'de projemizin son hali görünmektedir. Hepinize iyi çalışmalar...

                                        - Resim 8 -

Sami Ventorero (Bilgisayar Müh.)

ventorero@yahoo.com

Kaynak;

http://www.codeproject.com/csharp/cspplcds.asp (LCD yapısı ile ilgili)

*http://www.elektronikhobi.com/dokuman.asp?id=94&user_enc= (LCD yapısı ile ilgili)

http://www.microsoft.com/windowsxp/downloads/powertoys/wm_create.mspx (Media Player Blogging Plug-in)

Ornek Kodlar