|
LCD Ekranlar, ITunes/Media Player ve .Net |
|
Gönderiliyor lütfen bekleyin... |
|
|
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. Bu işin
nasıl yapıldığını anlatmadan önce bu sitedeki Caner Şahanın "C# ile
Paralel Port Kontrolü" adlı makalesini incelemenizde fayda var. O makalede
paralel port ile ilgili detaylı bilgi bulunmaktadır. Projemize geçmeden önce LCD
ekranların yapısından ve MediaPlayerda çalan şarkıların bilgilerini nasıl
çekebilecemizden bahsedeceğim.
LCDnin 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 Perpada 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 16lı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
4te 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 LCDnin 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.
MediaPlayerdan 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-innin 2 işlevi bulunmaktadır. Birincisi
şarkı, şarkıcı, albüm isimlerini ve şarkı süresini Media Playerda title barda
yazması, ikinci ve bizim için önemli tarafı ise registryde ş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 4te de gördüğünüz gibi çalan şarkının bilgileri registrye
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 registrye gibip isteğimiz bilgileri çekecektir. Registrye
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 Playerda çalan şarkının registry den alınmış bilgileridir. Alınan
bilgileri labellara 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 stringi 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
8de projemizin son hali görünmektedir. Hepinize iyi çalışmalar...
- Resim 8 -
Uygulamayı indirmek için tıklayınız
Sami Ventorero (Bilgisayar Müh.)
[email protected]
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)
Makale:
LCD Ekranlar, ITunes/Media Player ve .Net C#, Visual C# ve .NET Sami Ventorero
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|