tarafından Guido Socher (homepage)
Yazar hakkında:
Guido, Lınux'u sadece işletim sistemlerinin nasıl çalıştığını
öğrenmenin ilginç olduğu için değil, aynı zamanda onu tasarlayan kişiler
yüzünden sevmektedir.
Türkçe'ye çeviri:
Erdal MUTLU <erdal(at)linuxfocus.org>
İçerik:
|
Linux sunucunuz için LCD denetim panali
Özet:
Bu yazıda Hitachi HD44780 LCD paneli ve Atmel firmasının
AT90S4433 AVR 8-Bit RISC Mikroişlemcisini kullanarak
bir LCD denetim paneli tasarımı yapacağız.
İki parça da çok kullanılan ve pahalı olmayan parçalardır.
Denetim paneli üzerinde kullanıcıdan giriş yapmasını sağlayan iki adet tuş
ve bilgisayarı denetleyen bir mekanizması vardır.
IP adres, ağmaskes (netmask), geçişyolu (gateway) değiştirme, bilgisayarı
kapatma, istatistikleri okuma, kısaca yapmak istediğiniz her şeyi
yapabilirsiniz, çünkü mantık, perl programı ile oluşturulmuştur ve
kolayca değiştirilebilir. Panel bilgisayarınıza RS232 seri kablosu ile
bağlanmıştır.
Bu yazı için en azından Linux ortamında çalışan AVR yazılım geliştirme
ortamını yüklemeniz gerekmektedir. Nasıl yapılacağını
AVR Mikroişlemcisini GCC ile
programlamak yazısından öğrenebilirsiniz.
Giriş
Bu aygıt basit olarak daha önce kullanılan donanımların fonksiyonelliğini
birleştirmektedir:
Ancak, yeni tasarımımız bunun çok ötesine gitmektedir. Kullanıcı etkileşimi
için tuşlar eklemektedir ve sunucunun donanımını denetleyen mekanizma içermektedir.
Bunlara ek olarak donanım bir analog giriş hattı içermektedir. Bunu
hernekadr burada kullanmıyorsak da, sözgelimi sıcaklık ölçen bir
algılayıcı bağlayabilirsiniz.
Bunu tasarlayabilmek için bazı hobisel elektronik yeteneklere sahip olmanız
gerekmektedir. Kullanılan donanımlar pahalı değildir ve yaklaçık olarak 40
Euro kadar tutmaktadır.
Bu paneli yapmamızın arkasında yatan düşünce, sunucuyu klavye ve ekran
kullanmadan yönetebilmektir. Linux çok sağlam bir işletim sistemidir ve
kolayca uzaktan yönetilebilinir. Ancak, ilk baplantı yapılırken IP adresi,
ağmaskesi ve geçişkapısı gibi bazı ayarlarların yapılması gerekmektedir.
Bu panel, bu ayraların yapılmasına olanak tanımaktadır.
Sunucu odasında iken, sunucunuzu kapatmanıza imkan vermektedir.
Panelin tasarımı oldukça geneldir. Tüm "sunucuya özel"
kısımlar perl programı ile yazılmıştır. Tüm donanım, tuşların durumu,
paneldeki metin, LED'ler ..., ASCII komutlar ile denetlenmektedir.
Dolayısıyla bu tasarımı kullanarak kendi mp3 çalarınızı yapabilir veya tost makinanızı
denetleyebilirsiniz, yada aklınıza ne gelirse.
Nelere gereksiniminiz var
Gerekli olan parçalar şunlardır:
1 x Atmel At90S4433 Mikroişlemcisi
1 x 28pin 7.25 mm IC socket
1 x 16pin IC socket
1 x MAX232
1 x küçük 5V röle
1 x 4MHz kristal
2 x LEDs (yeşil ve kırmızı)
1 x BC547 NPN transistör
1 x BC557 PNP transistör
4 x 1uF kapasitör (common or biased)
2 x 27pF seramik kapasitör
1 x 10nF kapasitör
1 x 100nF kapasitör
3 x direnç 4k7
2 x direnç 2k2
1 x direnç 10K
1 x direnç 3k3
2 x direnç 100 Ohm
3 x direnç 470 Ohm
3 x direnç 1k
1 x direnç 220 Ohm
1 x 4K7 potansiyometre (mümkün olduğu kadar küçük)
1 x Z-diyot 4.3V
2 x küçük dokunmatik tuşlar
1 x küçük standart diyot(e.g 1N4148, yada herhangi ucuz diyot)
1 x 2 satır 20 karakter LCD panel, HD44780 uyumlu arayüz.
Benim bütün gördüğüm LCD panelleri 14 veya 16 (bacaklı) iğneli
idi ve HD44780 uyumlud idiler. İsterseniz 3 veya 4 satır paneller de
kullanabilirsiniz, ancak o zaman yazılımı biraz değiştirmeniz gerekecektir.
Bunlara ek olarak RS232, kablolar ve güç kaynağına gereksiniminiz olacaktır.
Eğer, iki satır paneliniz varsa, ince alüminiyum metal kapağa
yerleştirebilir ve böylece sunucunuzun 5.25" lik gözüne
yerleştirebilirsiniz.
Çizimler ve baskı devre
Baskı devre tasarımı ve şemalar için Linux için olan eagle yazılımını
kullandım. Müthiş bir yazılımdır, ancak etkin bir şekilde kullanabilmek için
biraz deneyime gereksiniminiz olacaktır. Kişisel kullanımlar için
olan bedelsiz sürümünü cadsoftusa.com adresinde
elde edebilirsiniz.
Çizim (daha büyük resim için üzerine tıklayınız):
Baskı devre (daha büyük resim için üzerine tıklayınız):
Yazıcıdan daha kolay basmak için baskı devrenin beyaz arka plan renklisi:
beyaz arkaplanlı baskı devre (Not: Bu baskı devre oluşturmak için
gerekli olan dosya değildir.)
Sıkıştırlmış eagle dosyaları (Not: Bazı akıllı itenernet gezginleri dosyaları
çekerken açmaktadır.)
Devre
Yukarıdaki devreyi kısaca açıklayacağım. AT90S4433 3 adet bağlantı noktası
(port) vardır : PB, PC ve PD. PC analog veya digital giriş bağlantısı olarak
kullanılabilir. Tüm bağlantı noktaları digital veya analog giriş ve çıkış
olarak kullanılabilir. Bu, yazılım tarafından DDR (Data direction register) aracılığı ile
denetlenmektedir. Biz 23. bacak (pin) hariç tümünü kullanacağız (0 veya 5 V).
Max232 gerilim seviye dönüştürücüsüdür. RS232, +-10V kullanılmaktadır ve Max232
bunu 0-5V'a çevirmektedir. 1. bacakta (reset pin) AT90S4433'nin Brownout
denilen bir şey vardır. Bu devre sayesinde, elektrik ile ilgili sorunlar
yaşanması durumunda, MİB'nin (CPU, Merkezi İşlem Birimi) yanlış komutlar
çalıştırmasını engellemektedirç Böylece, elektrik sorunlarından dolayı
oluşabilecek, genel birtakım sorunların yaşanması engellenmiş olur.
Bu elektrik sorunları, elektrik verildiğinde veya kesildiğinde, bir iki
mili saniye süresinde oluşabilir. Temel olarak üstlendiği işlev, mikroişlemcinin açılmasını
(başlatılmasını) sağlamaktadır.
Bazılarınız, itransformatöre paralel olarak neden bir diyot bulunduğunu ve
sanki hiçbir görevi yokmuş gibi gözüktüğünü merak edecektir. Bu çok önemli
bir diyottur! Relay'i kapattığınızda, transformatör tarafından çok yüksek
bir gerilim oluşturulacaktır ve mikroişlemci bundan zarar görebilir.
Bu gerilimin güç kaynağın ürettüği gerilim ile ters kutupludur. Diyot çok
ucuz ve küçük olabilir, herhangi başka bir özelliği yoktur. Ancak, olması
çok önemlidir.
İki adet tuş, şemada "DIGITAL IN PUSH BUTTON" ile gösterilen yere bağlanması
gerekmektedir. Tuşlara basıldığında, PD3 ve PD6'yı topraklama ile olan bağlantıyı
sağlanmaktadır.
Baskı devre nasıl yapılır
Baskı devreyi oluşturabilmek için öncelikle
postscript dosyasını (linuxlcdpanel.ps.gz)
saydam kagıda basmalısınız. Mimarlar için olan mağzalarda Regulus tarafından
üretilen ve Sinolit adı verilen ve genellikle offset baskı için kullanılan bir kağıt bulacaksınız.
Buna alternatif olarak 60gr'lık kağıt + saydam sprey ( pausklar 21 Kontakt Chemie'den) dır.
Sinolit kullanmanın avatajı, Lazer yazıcıların toneri kağıda iyi
yapışmaktadır ve iyi kontrast yaratmaktadır.
Eğer, Postscript yazıcınız yoksa diye, Postscript dosyasını
PDF dosyasına
çevirdim. Ancak, kalitesi daha kötüdür.
Bakır kaplı plakaların çözünme süresi kullanılan ışık kaynağına bağlıdır.
Ev ortamındaki ışıklar kullanıldığında 1 ila 2 dakika sürmektedir.
Normalde dış ortamın ışığını da kullanabilirsiniz, ancak güneşten gelen
ışınların doğruda plaka üzerine gelmesini önleyiniz, çünkü güneş ışığı çok
fazla gelmektedir. Ana plakayı oluşturmadan önce ufak plakacıklar ile bir
iki deneme yapabilirsiniz.
|
Baskı devre plakasının asitle işlenmeden önceki hali |
Plakayı daha sonra NaOH (Natriumhydroxid) ortamında birkaç dakika tutmanız gerekmektedir.
Oluşan baskı devreyi bu işlemden sonra çok dikkatli bir şekilde denetlemeniz
gerekmektedir. Ben genellikle Edding 780 siyah kalem kullanarak yolları biraz daha
kalınlaştırmaktayım. Bunu yapmamın nedeni, Eagle ile oluşturulan yolların
hobi kullanım için çok ince olmaktadır.
|
Delikler delinmeden önceki baskı devre |
Not: Üreticiler için röle adlandırılması ve bacak yapısı hakkında
bir anlaşmaya varmaları bazen imkansız gibi. Ben Matsushita firmasının
ürettiği 5V'luk küçük bir röle kullandım. Eğer, sizin rölenin bacak yapısı
bundan farklı ise, baskı devrenizi buna göre değiştirmeniz gerekecektir.
Hazır olduğunuzda baskı devrenizi FeCl3 (Ferric Cloride) içinde
oluşturabilirsiniz. FeCl3 oda sıcaklığında gayet iyi sonuçlar vermektedir.
En iyi sonuçları, baskı devrenizi dikey tuttuğunuz durumda
elde edebilirsiniz. Bakır iyonları demir ıyonlarında daha ağırdır ve
küçük yassı bir tübü FeCl3 ile doldurursanız, o zaman bakır iyonlar devrenin
olduğu yerde birikeceklerdir.
Devre hazır olduğu zaman Edding boyasını turpentine ile temizleyiniz.
Mikroişlemci için yazılım
Mikroişlemci için olan yazılım aşağıdaki dosylara göre düzenlenmiştir:
- lcd.c, lcd.h, lcd_hw.h:
Bu genel avr LCD kütüphanesidir. Peter Fleury'nin (http://jump.to/fleury)
çalışmasına dayandırılmıştır. Bu sürüm biraz değiştirilmiştir ve
daha esnek bir yapıya sahiptir. Bunun sayesinde LCD donanımını,
Mikroşlemcinin herhangi bacağına bağlanmasını sağlamaktadır. Tek yapmanız
gereken lcd_hw.h dosyasındaki tanımları değiştirmenizdir.
- avr-util.c, avr-util.h:
çeşitli gecikme zamanları elde etmeye yarayan fonksiyonlar.
- uart.c, uart.h:
Bu RS232 için kütüphanesidir. Donanım kesmelerini kullanmaktadır.
Bilgisayardan her karakter alınışında, SIGNAL(SIG_UART_RECV) fonksiyonu
çalıştırılacak ve gelen bilgi geliş katarından karakter katarına
kopyalanacaktır. LCD için tasarlanan komut dili öyle tasarlanmıştır ki,
her komut yeni satır karakteri ile bitmektedir. Yeni satır karakteri
alındığı anda, bir bayrak (uart_rx_linecomplete) açılmakta (set) ve
veriler hazır duruma getirilmektedir. Bunun anlamı LCD'ye komutları hiç
durmadan göndermemelisiniz, tersine arada biraz (milisaniye mertebesinde)
beklemeniz gerekmektedir. Her komuta karşılık bir onaylama (ok) veya
err (hata) olacaktır. Dolayısıyla, perl sürücü programı bunlara bakarak
bir sonraki komutu gönderebilir.
- analog.c, analog.h:
Analogtan digitale çeviren program. Buda kesme tabanlıdır. Tek bir
analogtan digitale çevirme işlemi başlatılmaktadır ve daha sonra program
ADC register'dan SIG?ADC kesmesini okumak için beklemektedir.
- hardwarewd.c, hardwarewd.h:
Bu watchdog dur. Biz içeride zamanlayızıyı nabızlamak için 1024'e bölme işlemi kullanmaktayız.
Zamanlayıcı 16 bit registerdir ve taşma oluştuğu zaman 8 bit depişkenli geri sayım yapılacaktır.
4MHz'lik kristal ile, değişkenimizi her 16 saniyede bir geri sayım
yapmamız gerekecek. Perl programı bilgisayarın hala hayatta olduğunu,
değişkene belli aralıklar ile büyük bir değer atayarak denetlemektedir.
Eğer, bunu başaramazsa (bilgisayar tıkandığında) değiikenin değeri sıfıra
kadar azalacktır ve sıfıra eriştiğinde röle bir klik-klak ile bilgisayarı
donanımda yeniden (reset) başlatacaktır.
- linuxlcdpanel.c:
Bu ana programdır. Bu program sürekli olarak RS232'den gelecek komutları
ve tuş basmalarını denetleyecektir.
Yazılımı daha iyi anlayabilmek için Mikroişlemci ile birlikte gelen
belgeleri okumanızı tavsiye ederim. Belgeleri www.atmel.com'dan veya yazının
referanslar kısmından elde edebilirsiniz.
Ancak, kullanabilmek için yazılımı anlamanız gerekmektedir.
Yapmanız gerek şey, linuxlcdpanel-0.7.tar.gz dosyasını
indirme sayfasından)
elde edip, aşağıdaki komutları çalıştırmanız yeterlidir:
make
make load
Hatta önceden derlenmiş yazılımı dahi kullanabilirsiniz.
make loadprebuild
Çok kolay. Mikroişlemciyi nasıl programlayabileceğinizi
AVR Mikroişlemcisini GCC ile
programlak yazısından öğrenebilirsiniz.
LCD panelin denenmesi
LCD paneli sunucunuz 5V'luk iç güç kaynağından beslenmek üzere
tasarlanmıştır (kırmızı kablo=5V, siyah kablo=toprak). Ancak,
ilk başta doğrudan bilgisayara bağlamamalısınız. Bağlantı sırasında ve devreye
bağlantı sırasınd ufak bir hata yapmış olabilirsiniz. Bilgisayarın
güçkaynağı çok güçlüdür ve hem bilgisayarınız hemde devreniz çok kısa bir
sğrede dumanlar altında kalabilir. İlk denemeyi, elektronik olarak
düzenlenmekte ve gücü sınırlı olan bir dış güçkaynağı ile deneyiniz!
Daha sonra yazılımı EEPROM'a yukarıda anlatıldığı gibi yükleyiniz.
Bundan sonra LCD üzerinde, kaymakta olan "linuxfosucus.org" yazısını göreceksiniz.
Şimdi RS232 kablosunu bağlayınız:
MAX232 14. bacağı CTS (DB-9 8. bacak)
MAX232 7. bacağı RXD (DB-9 2. bacak)
MAX232 13. bacağı TXD (DB-9 3. bacak)
Ayrıca, DTR, DSR ve CD kendi aralarında bağlamalısınız
(DB-9 4. bacak, 6. ve 1. bacaklar)
Bu, yukarıda verilen devre çiziminde güzel bir şekilde görülmektedir.
Seri hattı kullanabilmek için önceden ayarlamak gerekmektedir.
linuxlcdpanel-0.7.tar.gz kaynak kod arşivi ttydevinit adında bir program
içermektedir. Bu program tam bu ayarlama işlemi için yazılmıştır.
Diyelim ki, paneli COM1 (ttyS1) bağladığınızı varsayalım, o zaman aşağıdaki
komutu çalıştırmanız gerekmektir:
./ttydevinit /dev/ttyS1
Artık seri hattınız 9600 hızına ayarlanmış durumda ve siz LCD paneliniz ile
"konuşmaya" başlayabilirsiniz. İki adet xterm penceresi açınız. Birinde
"cat /dev/ttyS1" komutunu, diğerinde "cat > /dev/ttyS1" komutunu
çalıştırınız. Şimdi l=11 (LED 1 aç) veya l=10 (LED 1 kapat) komutlarını
verebilirsiniz. İlk xterm penceresinde LCD panelinin, verdiğimiz komutları
"ok" ile onayladığını göreceksiniz.
Var olan tüm komutlar README.commands
dosyasından verilmiştir.
Kaynak kod arşivinde ttytest.pl adında bir perl programı vardır.
Bu programın yaptığı herşey, belli aralıklar ile kırmızı LED'ı açıp
kapatmakdır. Program LCD panelinin kullanımı öğretme amaçlı yazılmıştır.
Programa bakarsanız, biraz perl bilmekle kendi programlarınıza temel olarak
kullanabilirsiniz.
Watchdog'un bağlanması
Watchdog benimsenmiş değer olarak kapalıdır. Açmak için w=1 komutunu
kullanabilirsiniz ve süreaşımını s=x, buradaki x 1 ile 255 arasında bir
değerdir. Sözgelimi s=10ö watchdog'un süreaşımı zamanınını 10*16sn=160sn
olarak belirleyecektir. Sürücü program süreaşımını periyodik olarak
ayarlaması gerekecektir ki watchdog çalışacaktır. Eğer, sunucunuz
tıkanırsa, sürücü programınız süreaşımını ayarlamayacktır ve watchdog
çalışacaktır. Biliyorum Linux sunucuları hemen hemen hiç tıkanmamaktadır,
ancak eğer tıkanırsa, onu yeniden başlatacak hiç kimse olmayacaktır, çünkü
sunucu son iki yıl boyunca hiç sorunsuz çalışmıştır ve kimse yerini
bilmemektedir.
Watchdog bir kere çalışmak üzere tasarlanmaıştır, çünkü makinayı yeniden
başlattığında, büyük bir olasılıkla sistem denetleme süreci çalışacaktır ve
bu arada watchdog tekrar sistemi yeniden başlatılmasını istemeyiz.
Sunucu çalıştığı zaman sürücü programı onu tekrar aktif hale getirmesi
gerekecektir.
Watchdog'u fiziksel olarak bağlamak için, sunucunuzun reset (yeniden
ayarlama veya başlatma) tuşuna giden iki kabloyu bulmanız gerekmektedir.
Yeniden başlatma tuşuna paralel olarak watchdog'un rölesine bağlamak
gerekmektedir.
Watchdog nasıl kullanılır
Watchdog, sistemin herzaman için programları çalıştıracağına garanti
getirmektedir. Ancak, sanaldoku veya veritabanı sunucusunun düzgün
çalıştığını ve cevap verdiğini garanti etmemektedir. Bunun için crontab için
özel programlar yazmanız veya başka programlar kullanmanız gerekecektir.
Crontab'ın çalıştığına ve diğer programları çalıştırdığına oldukça emin
olabilirsiniz.
Her 15 dakikada bir çalışan ve sanaldoku sunucunuzdan bir dosya indiren
bir kabup programı yazabilirsiniz. Ancak, sanaldoku sunucunuzun oldukça
yoğun olabileceği ve bazı isteklere cevap veremeyeceğini hesaba katmanız
gerekecektir ve sözgelimi en son 10 isteğe cevap vermez ise, sanaldoku
sunucunuzu veya bilgisayarınızı yeniden (watchdog aracılı ile değil, yani
reset tuşunu kullanmadan) başlatabilirisiniz.
Sunucunuzda çalışan uygulamaların yanısıra, disk kullanımını da
denetlemelisiniz. Sözgelimi, aşağıdaki komut, bilgisayarınızdaki herhangibir
bölmenin %80 veya daha fazla dolu olması durumda birşeyler geri
gönderecektir:
df | egrep ' (8.%|9.%|100%) '
Bu da tabii ki, cron işi olarak periyodik denetlemek amacıyla kullanılabilir.
Sunucudaki programlar
LCD panelimizin hemen hemen tüm mantığı llp.pl adı verilen perl programı
ile oluşturulmuştur. Bu programı /usr/sbin/ dizinine kopyalayınız.
Daha sonra ttydevinit dosyasını /usr/bin dizinine ve kaynak kod dizini
içindeki etc dizininde yer alan ifconfig_llp.txt dosyasını da /etc dizinine
kopyalayınız. Şimdi, ifconfig_llp.txt dosyasını adresleri gereksiniminize
göre değiştiriniz:
NETMASK=255.255.255.0
IPADDR=10.0.0.4
GATEWAY=10.0.0.2
Şimdi /etc/rc.d/init.d/network dosyasının bir yedeğiniz alınız ve kaynak kod
dizininde yer alan etc/network dosyasını buraya kopyalayınız. Bu program
sadece RedHat ve Mandrake için geçerlidir. etc/network_all_distributions
dosyası daha basit ve genel olarak tüm Linux dağıtımları ile çalışacaktır,
ancak init-rc dosyalarınızın yerini belirtmeniz gerekecektir. Bunlar
dağıtımdan dağıtıma farklılık göstermektedir.
Eğer, COM2 kullanmıyorsanız, /etc/rc.d/init.d/network dosyasında yer alan
aşağıdaki satırı
/usr/sbin/llp.pl /dev/ttyS1&
gibi değiştiriniz.
Aşağıdaki komutu çalıştırarak
/etc/rc.d/init.d/network start
LCD panelinizi çalışırken görebilirisniz.
Not: IP adresleri ile istediğiniz gibi oynayabilirsiniz, çünkü ancak makina
yeniden başladığında, yaptığınız değişikler devreye girmektedir.
Dolayısıyla, yaptığınız değişikleri makinayı kapatmadan önce eski haline
getirmelisiniz veya /etc/ifconfig_llp.txt dosyasını değişitirebilirsiniz.
Çetele dosyaları
llp.pl dosyası çetele bilgilerini /var/log/llp.log dosyasına yazmaktadır.
Bu çetele dosyası çok yavaş bir şekilde dolacaktır. Dolayısıyla otomatik
olarak dosyayı döndürmek gerekmeyecektir. Eğer, döndürmek isterseniz
logrotate gibi bir programdan yararlanabilirsiniz. Döndürdükten sonra
uygulanması gereken bir komut yoktur. Logrotate'in yapılandırım dosyasına
aşağıdaki satırları ekleyebilirsiniz:
/var/log/llp.log {
nocompress
monthly
}
Çetele dosyası, sistem yeniden başlatıldığında, IP adres (IP, GW geçiş
kapısı, ağ maskesi) değişikliğinde veya watchdog tarafından yeniden
başlatıldğında kayıtlar içerecektir. Doğal olarak, watchdog süreaşımlarını
çetele dosyasına yazması mümkün değildir, çünkü sistem tıkanmıştır, ancak
yenbiden başlatıldığında çetele dosyasına kayıt edilecektir.
Paneli kullanırken
Aşağıda, LCD panelinin bir kaç ekran görüntüsü verilmiştir. Bunalr panel
tarafından sağlanan tüm hizmetler değildir. Bundan fazlası vardır ve siz
kendiniz de eklemeler yapabilirsiniz.
Ana ekran. Bir isim (bu durumda linuxfocus), yük durumu ile toplan çalışma
süresini göstermektedir.
IP yapılandırma menüsü.
Su anda değiştirilmekte olan IP adresi görüntü örneği.
Geçiş kapısı (benimsenmiş yol tanımı) nasıl değişitirildiğinin örneği.
Sonuç
Bu LCD panelini oluşturmak hobi olarak elektronik ile uğraşmış olmak
gerekmektedir. Ancak, çok fazla karışık bir şey değildir. Bizim LCD panel,
benim gördüğüm tüm denetim panellerinden daha fazla fonksiyonellik
sağlamaktadır ve hem geneldir hemde oldukça ucuzdur.
İyi denemel :-)
Referanslar
Bu yazı için görüş bildiriminde bulunabilirsiniz
Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
2002-06-12, generated by lfparser version 2.27