LCD etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
LCD etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

29 Kasım 2018 Perşembe

Karakter LCD'de Özel Karakterleri Tanımlama


Merhaba. Bu yazı LCD yazısının devamı gibi ama donanımla değil yalnız yazılımla ilgili olacak. Önceki yazıda söz ettiğim sorunların çözümüne değineceğim ve LCD'de özel karakterler nasıl tanımlanıyor onu göstereceğim. Maalesef özel karakter tanımlama konusunda internette kaynak az sayıda. Bu iş örneğin Arduino gibi daha yüksek seviyeli platformlarda bir fonksiyonla yapılabiliyor.

Bu anlatımda önceki bölümdeki olay sırasına uymaya çalışacağım.

Pinlerle İlgili Sorun
İlk yaşanan sorunda, ekrana hiç karakter yazdıramamıştım. Aklıma, aslında karakterlerin ekrana yazıldığı ama göremediğim geldi, çok önce bunu yaşamıştım. LCD kontrast (3) pinini 4.7K - 2.2K değerinde bir dirençle toprağa bağlamak basit bir devre için yeterli, ben de öyle yapacaktım ama "acaba göremiyor muyum?" düşüncesiyle kontrastı ayarlamak istediğimden sabit direnci potansiyometreyle değiştirdim. Arka ışıklandırma da, LCD pin 15 Vcc ve pin 16 GND olmak üzere LED'lere bağlı. Yeşil ekranlarda ışıklandırmaya gerek olmuyor. Ben de ışıklandırmayı kullanmak istemediğimden yeşil LCD seçmiştim. 

Devreyi kolaya kaçmadan tekrar kurduğum halde sorun çözülmemişti. Kodun sonundaki outb(0, BASE) satırını outb(255, BASE) olarak değiştirip veri pinlerine gelen gerilimi kontrol ettim. Bunlarda sorun yoktu. Sonra koddaki delay parametresini voltmetrenin okuyabileceği yavaşlığa getirip (3 sn) E ve RS pinlerine baktım. E, her adımda kapanıp açıldığı halde RS'de hareket yoktu. Kullandığım pin bağlantı şemasını aşağıda var:

PP Sinyal
DB25 Pin
Centronics Pin
IC In
IC Out
LCD Sinyal (Pin)
nStrobe(C0)
1
1
IC2_17
IC2_3
E (6)
nSelect (C3)
17
36
IC2_15
IC2_5
RS (4)
Data0 (D0)
2
2
IC1_2
IC1_18
D0 (7)
Data1 (D1)
3
3
IC1_4
IC1_16
D1 (8)
Data2 (D2)
4
4
IC1_6
IC1_14
D2 (9)
Data3 (D3)
5
5
IC1_8
IC1_12
D3 (10)
Data4 (D4)
6
6
IC1_17
IC1_3
D4 (11)
Data5 (D5)
7
7
IC1_15
IC1_5
D5 (12)
Data6 (D6)
8
8
IC1_13
IC1_7
D6 (13)
Data7 (D7)
9
9
IC1_11
IC1_9
D7 (14)

Kurulum sırasında yararlandığım kaynakta [ http://www.interfacebus.com/Design_ieee1284b_Connector_PinOuts.html ] nSelect için 13. pini gösteriyor. Burayı yanlış anlamışım çünkü aslında 13, bir giriş pini. Benim normalde kullandığım kaynakta [ https://www.lammertbies.nl/comm/cable/parallel.html ] yönler de gösteriliyordu. Çıkışı 36. pinden değil 13. pinden alıyormuşum, bu pin de giriş olduğundan hep lojik 1'deymiş. Bu arada jumper kabloların (renkli olanlar) ucundaki plastiğin eni, Centronics'in port aralıklarından fazla olduğundan çift sayılı portlarda tel; tek sayılılarda jumper kablo kullandım (örnek). Önce temassızlıktan şüphelendim ama öyle olsa kod her çalıştırıldığında farklı sonuçlar üretirdi. Sinyallerin portlarla ilişkisine de ileriki paragraflarda değineceğim.

Bu arada LCD'deki DELAY parametresinde üst sınır olmamasına dair şöyle bir video var:


lcdKomut() Fonksiyonundaki Sorun
Fonksiyon ilk haliyle aşağıdaki gibiydi:

void lcdKomut(unsigned char veri)    {
    outb(veri, BASE);
    outb(8   , CTRL);    // RS = 0; E = 1
    usleep(DELAY);
    outb(9   , CTRL);    // RS = 0; E =0
    usleep(DELAY);
}

Nedense bu haliyle her komut gönderdiğimde ardından gönderdiğim veri iki kere gidiyordu. Yani Deneme123 yerine DDeneme1123 oluyordu. Bunun, paralel port denetleyicisinin pini yeterince hızlı lojik 0'a çekememesi, daha E = 0 olmadan bir sonraki C komutunun veriyi veriyoluna sürmesi olduğunu düşünsem de aynı davranışı uzun DELAY parametrelerinde bile gözlemledim. Koddaki 9'u 1'le değiştirdim ve sorun düzeldi. Bununla ilgili olarak çok sevdiğim bir görsel var:


Sorun çözüldüğü için uzun uzun araştırmak istemedim. Belki osiloskopla gidip gelen sinyalleri tekrar incelemek gerekir ama dediğim gibi uğraşmak istemedim.

Paralel Port Durum ve Kontrol Sinyalleri
Sinyallerden bahsetmişken durum ve kontrol sinyallerine de kısaca değinmem gerekir. Paralel portta üç grup sinyal bulunur: veri, durum ve kontrol. Bu gruplardaki sinyaller sırayla BASE, BASE+1 ve BASE+2 portlarıyla kontrol edilir. Veri sinyalleri basittir: BASE porta hangi byte yazılırsa, [2-9] pinlerinin değeri ona göre ayarlanır ve öyle kalır. Durum sinyalleri yazıcının durumunu okuma amaçlı olduğundan giriş için kullanılabilir. Örn. yazıcı bir kesme isteği ürettiğinde, kağıt bittiğinde veya sıkıştığında vb.

nStrobe ve nSelect, kontrol sinyal grubundadır. Kontrol grubu, bağlı yazıcıyı kontrol etmek için vardır ve "active low" sinyallerdir. Bu nedenle sinyalin başına "n" veya "~" ile gösterilir. nStrobe, bilgisayar yazıcıya veri gönderirken saat sinyali olarak kullanılır ve her veri değişiminde set etmek gerekir. nSelect, yazıcı seçildiği zaman set edilir. Kontrol yazmacı 0x378 + 2 = 0x37A portunda, sırayla nStrobe ve nSelect sinyali bu portun 0. ve 3. bitlerindedir. Dolayısıyla nStrobe'u lojik 0 yapmak için porta 1 yazmak, nSelect'i lojik 0 yapmak için porta 8 yazmak gerekir.

LCD Komutları ve Özel Karakter Tanımlama
Önceki yazıda LCD komutlarından bazılarını kullandım ama hepsine değinmedim. Aslında LCD'lerle uğraşırken 3-4 tane komut yeterli. Ben LCD'lerle çalışırken şu görseli kullanıyorum: https://goo.gl/images/QHtKee . Google görsellerinde "lcd commands" aratınca benzeri bir çok sonuç çıkıyor. En doğrusu, her zaman LCD'lerin datasheet'ini esas almak ama hızlıca birşeyler yapmak için 60 sayfa belge okumak zor. Ben drive'a bir tane datasheet yükledim. Bununla CGRAM'i programlayıp LCD'de kendi karakterlerimi oluşturacağım.

CGRAM, character generator RAM adında fontların tutulduğu bellek. DDRAM ise ekranda görünen hücrelerdeki karakterin kodunu tutan bellek. DDRAM'e bir veri yazıldığında CGRAM/CGROM look-up tablosu olarak kullanılıyor. CGRAM programlanabilir olup kullanıcıya kendi karakterlerini oluşturma olanağı veriyor. Datasheet'te, CGRAM'i adreslemek için 6 bit ayrılmış görünüyor ama standart bir LCD'de bu bitlerin hepsinin kullanıldığına emin değilim. CGRAM'in adresi sıfırdan başlıyor, bu arada.

Sayfa 24, Tablo6'da komut tablosu var. Önce komutla, kaçıncı karaktere yazacağımı bildirmem gerek. CGRAM'i adreslemek için 0b01XX XXXX komutunu vermeliyim. Buradaki X'ler adres olduğundan sıfırıncı adres için operand 0x40. s31'de CGRAM'e verinin lcdVeri() ile gönderilebileceği yazıyor. Yazılacak karakter 5 bit genişliğinde bitmap verisi olarak gönderilmeli, bu da önceki sayfalarda var. Dikkat edilmesi gereken bir konu da CGRAM'a yazılırken LCD ekran kapatılmalı.

Karakter tanımlamak için eski kodu biraz değiştirdim. Tanımlamalar, lcdVeri() ve lcdKomut() fonksiyonları aynı. Sadece main()'i aşağıya yapıştırdım:

int main(int argc, char* argv[])    {
    int i;

    if(ioperm(BASE, 3, 1))    {
        fprintf(stderr, "Access denied to %x\n", BASE);
        return 1;
    }

    lcdKomut(0x38);    // 8 bit, 2 satir, 5x7 px
    lcdKomut(0x08);    // ekrani kapat

    const unsigned char ozelkarakter[] = {
        // gulen surat gibi birsey
        0B01110, 0B10001, 0B11011, 0B10001,
        0B11011, 0B10101, 0B10001, 0B01110,
        // gulen suratin tersi
        0B10001, 0B01110, 0B00100, 0B01110,
        0B00100, 0B01010, 0B01110, 0B10001,
        // maca
        0B00100, 0B01110, 0B11111, 0B11111,
        0B10101, 0B00100, 0B01110, 0B00000,
        // sinek
        0B00000, 0B01110, 0B10101, 0B11111,
        0B10101, 0B00100, 0B01110, 0B00000,
        // kupa (kalp)
        0B00000, 0B00000, 0B01010, 0B11111,
        0B11111, 0B01110, 0B00100, 0B00000,
        // karo
        0B00000, 0B00100, 0B01110, 0B11111,
        0B11111, 0B01110, 0B00100, 0B00000
    };



    lcdKomut(0x40);   // 0. CGRAM adresi
    for (i = 0; i <= 47 ; i++)
      lcdVeri(ozelkarakter[i]);

    lcdKomut(0x01);    // ekrani sil
    //lcdKomut(0x80);    // satirbasi
    lcdKomut(0x0F);    // ekrani ac, kursor blink

    lcdVeri('D'); lcdVeri('e'); lcdVeri('n');
    lcdVeri('e'); lcdVeri('m'); lcdVeri('e');
    lcdKomut(0xC0);    // ikinci satir
    lcdVeri('1'); lcdVeri('2'); lcdVeri('3');
    lcdVeri(' '); lcdVeri(' '); lcdVeri(' ');

    // ozel karakterler
    lcdVeri(0x00); lcdVeri(0x01); lcdVeri(0x02);
    lcdVeri(0x03); lcdVeri(0x04); lcdVeri(0x05);
 
    outb(0, BASE);
    return 0;
}

Bu kodla özel karakterler tanımlandı ve ekrana basıldı:


30 Ekim 2018 Salı

Karakter LCD için 3.3V TTL Sinyalleri 5V'a Yükseltelim


Merhaba. Bir önceki yazıda, anlatacağım olayların birbirinden bağımsız olduğunu söylemiştim ama bu kısmen doğru. Önceki yazıda hazırladığım masaüstü makina bana paralel portu için gerekliydi. Maalesef artık paralel portlu makinalar bulunmuyor. Paralel porta ihtiyacınız varsa bunun için özel üretilen PCI kartlardan almak gerekiyor. USB-Paralel port çeviriciler standart paralel port arayüzü sunamıyor. Standart arayüzden kastım 0x378 veya 0x3BC portu. Paralel port, LCD devresi için gerekliydi. Bu yazıda hepsinden biraz bahsedeceğim. Bu arada benim favorim 0x3BC ama kullandığım BIOS port seçimini desteklemiyor. Bu yüzden 0x378'i kullanmak zorunda kaldım.

Paralel portu kullanmadan önce BIOS'tan, açık olduğunu ve uygun bir modda çalıştığını kontrol ettim. Aslında uygun mod için belli bir kastım yok, port açıksa en basit "Output only" bile yeterli.

Sözünü ettiğim makinaya USB ile CentOS kurdum. dmesg çıktısından paralel portunu da kontrol ettim.

[root@xxxxxxxx ~]# dmesg | grep -i parport
parport_pc 00:08: reported by Plug and Play ACPI
parport0: PC-style at 0x378, irq 7 [PCSPP]

Köşeli parantezde portun modu yazıyor. Benim portum standart paralel port (SPP) olarak çalışıyor. Çift yönlü paralel port için [PCSPP, Tristate], Enhanced Parallel Port (EPP) için [PCSPP, Tristate, EPP] ve Extended Capabilities Port (ECP) için [PCSPP, Tristate] ile birlikte parantez içinde ikincil port adresi yazmalı. Aklımda kaldığı kadarıyla SPP, tek yönlü 50KB/s hızla çalışıyor. Çift yönlü mod aynı hızda ama adı üzerinde çift yönlü; EPP veya ECP'den biri 500KB/s'den 2MB/s'ye kadar hızlı çalışıyor. Yazının konusu bu olmadığından fazla detayına girmek istemiyorum.

Yapmak istediğim devrenin şeması şöyleydi:
Devre şeması (orjinali: http://www.aljaz.info/elektro/lcd/lcd-lpt.htm)
İlgili kaynağı takip etmedim ama benim kullandığım kaynaktaki devre şeması da pull-up dirençler dışında bunun aynısınıydı. Proje basit olduğundan herkesin aynı devreyi kurması çok da şaşırtıcı değil.

Devreyi kurup LCD'ye yazması gereken kodu* çalıştırdığımda ekranda bir çıktı yoktu. Farklı şekilde denesem de sonuç değişmedi. LCD yerine LED'ler bağladım ve kodun çalışma hızını saniyede bir karaktere kadar düşürdüm. Fazla ayrıntısına girmeyeceğim. En son port gerilimini ölçtüğümde sorunun portun 3.3V çıkış vermesi olduğunu buldum. Aslında emin olmak için LCD'nin datasheet'ine bakıp 3.3V'un TTL'deki kararsız bölgeye düştüğüne emin olmam gerekirdi ama bunu yapmadım.
(*): LCD kodunu yazının sonlarına doğru bulabilirsiniz.


Paralel portla 366 Celeron makinada da uğraştığımı düşününce çok sürpriz değil. Test için aşağıdaki kodu kullandım.

#include<stdio.h>
#include<sys/io.h>

#define BASE 0x378

int main(int argc, char* argv[])        {
    if(ioperm(BASE, 1, 1))      {
        fprintf(stderr, "Access denied to %x\n", BASE);
        return 1;
    }
    outb(1, BASE);
    return 0;
}

https://commons.wikimedia.org/wiki/File:IEEE_1284_36pin_plughead.jpgKod en düşük anlamlı biti set edip çıkıyor. En düşük anlamlı bit, hem DB25 paralel portta hem de Centronics portta ikinci pine karşılık geliyor. Bu arada "Centronics port", aslında Centronics firması tarafından geliştirilen ve çift yönlü paralel portu tanımlayan IEEE 1284 standardı için kullanılıyor. Benim kastettiğim, port değil yanda fotoğrafını koyduğum bağlantı. Bu bağlantı yukarıdaki benim fotoğrafta da görülebiliyor.

Bu bağlantının asıl adı Micro Ribbon Connector'müş. Fotoğraftaki, yazıcılarda kullanılan 36 pin'li konektör. Ben ağız alışkanlığıyla Centronics port demeye devam edebilirim.

Pinleri karıştırmamak için porta 1 yerine 255 gönderilirse tüm data pinlerindenden [2-9] +3.3V alınabilir.

74HC244 Bağlantı şeması
Internette bulabildiğim kadarıyla bu gerilim farkından özellikle CNC'ciler şikayetçi. 6502.org forumunda, port 1K'lık veya 4.7K'lık pull-up dirençlerle bağlanarak 5V'a çıkarılabileceği yazıyordu [ burada ], bunu güvenilir bulmadığım için denemedim. Bunun yerine aklıma 8-bit tristate buffer entegresiyle girişleri yükseltmek geldi. Bu iş için 74HC244 entegresini kullandım. Datasheet'ine baktığımda lojik 1 için minimum giriş gerilimi 2.0V. Yani paralel porttan aldığım 3.3V'u girişe lojik 1 olarak uygulayıp çıkışta 5V alabilirim.

Bunun için yukarıda şemasını çizdiğim basit bir devre kurdum. Entegrenin enable pinini kullanmadığım için bunu toprağa bağladım. Bir tane de 100nF kondansatör koydum. Yalnız LCD'yi 8 bit modda çalıştırdığımdan LCD'nin RS ve E pinleriyle birlikte 10 bite ihtiyacım vardı. Bu nedenle iki tane 74HC244 kullandım. +5V'u sabit disk bağlantısından, GND'yi paralel port şasisinden kullandım. İlk denemeyi tek pinle yaptım. Sonuç olumlu.


Fotoğraftaki twisted pair kablo +5V. Eski CAT5 kabloları böyle değerlendiriyorum. Şemadaki 100nF kondansatörü breadboard'da koymaya üşendim. Üstte girişten okuduğum, altta da çıkıştan okuduğum gerilim görülüyor. O halde artık tüm pinleri entegreler üzerinden LCD'ye bağlayıp deneyebilirim.


Devrenin son hali yukarıdaki fotoğrafta. Aslında kontrastı sabitleyip arka ışıklandırmayı kullanmayacaktım ama pinlerden birini hatalı bağladığım için sorun yaşadım. Ekranı mı göremiyorum yoksa veride mi sorun var, anlamak için bağladım, sonra da geri sökmedim. Kod aşağıda: 

#include<stdio.h>
#include<sys/io.h>

#define BASE 0x378    // Base port adresi
#define CTRL 0x37A    // Kontrol portu adresi
#define DELAY 3000    // Busy wait icin

void lcdKomut(unsigned char veri)    {
    outb(veri, BASE);
    outb(8   , CTRL);    // RS = 0; E = 1
    usleep(DELAY);
    outb(1   , CTRL);    // RS = 1; E = 0
    usleep(DELAY);
}

void lcdVeri(unsigned char veri)    {
    outb(veri, BASE);
    outb(0, CTRL);    // RS = 1, E = 1
    usleep(DELAY);
    outb(1, CTRL);    // RS = 1, E = 0
    usleep(DELAY);
}


int main(int argc, char* argv[])    {
    if(ioperm(BASE, 3, 1))    {
        fprintf(stderr, "Access denied to %x\n", BASE);
        return 1;
    }

    lcdKomut(0x38);    // 8 bit, 2 satir, 5x7 px
    lcdKomut(0x01);    // ekrani sil
    //lcdKomut(0x80);    // satirbasi
    lcdKomut(0x0F);    // ekrani ac, kursor blink

    lcdVeri('D'); lcdVeri('e'); lcdVeri('n');
    lcdVeri('e'); lcdVeri('m'); lcdVeri('e');
    lcdKomut(0xC0);    // ikinci satir
    lcdVeri('1'); lcdVeri('2'); lcdVeri('3');
 
    outb(0, BASE);
    return 0;
}

Aslında paralel portun kontrol yazmacı, veri yazmacının 2 fazlası. Bu nedenle ikinci define, "#define CTRL BASE+2" olsa daha iyi. DELAY parametresi, LCD ekranın komutları işlemesi için gereken süre. Bunu 300 µs'ye kadar indirdiğimde bu kodda sorun yaşamadım ama başka kodlarda yaşadım. 3 ms, deneme yanılmayla bulduğum bir değer. Eğer R/W pinini kullanıyor olsaydım LCD ekranın busy flag'ini D7 bitinden okuyabilirdim. DELAY için üst sınır bulunmuyor.

lcdKomut() fonksiyonu komut göndermek için, lcdVeri() fonksiyonu da veri göndermek için iki fonksiyon. Bunların çalışması sırasında pinlerin değerini kodun açıklamasına yazdım. Komut gönderildikten sonra E = 0 olması RS pininin değerinden önemli. E = 0'a hemen çekilmezse anlayamadığım biçimde kendisinden sonra gelen veri iki kere gönderiliyordu. Bu sorunu ayrıntılı ele almak üzere ileri bir yazıya sakladım.

main() fonksiyonunda LCD'ye temel komutları gönderdim. 0x80 komutunu kaldırdım çünkü hatırladığım kadarıyla 0x01 komutu zaten 0x80'i içeriyor. Veri gönderme fonksiyonuyla ekrana yazacağım verileri gönderdim. Kürsör veri gönderildikçe kendiliğinden ilerliyor. 0xC0 komutu ikinci satır başına gidiyor. Eğer ikiden fazla satır olsaydı diğer satırlara gitmek için başka komutlar var.

Bu yazı TTL gerilim değeriyle ilgili olduğundan burada bitiriyorum. Pin  bağlantı tablosu, bağlantıda yaşadığım sorun ve başka LCD komutlarıyla ilgili ayrı bir yazı daha yayınlayacağım.

24 Mart 2013 Pazar

PNP Kağıdı ile Baskı Devre Yapımı (Hem de Çift Taraflı)

Bu yazının konusu, başlıktan da anlaşılacağı üzere internette 80bin tane baskı devre yapımını anlatan kaynağa bir tane daha eklemek. Fakat bu yazının diğerlerinden farkı biraz hüzünlü bir yazı olması.

Zaten kendiliğinden uzun bir yazı olacak o yüzden bari girişi fazla uzatmayayım. PNP kağıdı (press and peel) baskı devre yapımında şu ana kadar denediğim yollar arasında en pratik ve en iyi sonuçları aldığım yol. Onbeş yıl içerisinde devreyi asetat kalemiyle bakırlı plaketin üzerine çizmekten, Positive20'ye kadar bir çok yolu denedim. Kalemle çizmek iğrenç görünümlü devreler yapmak için vazgeçilmez çözüm. Positive20 ile veriyolları olan bir devreyi yapmak olanaklı ama doğru pozlama süresini bulmak için en az 4-5 NaOH banyosu yapmak gerekmişti. Bu denemelerden sonra uzunca bir süre beni tatmin edecek bir yol bulamadığımdan, kafamda (yada PCAD'le) tasarladığım devreleri kendim yapmaktan vazgeçtim. Bu arada Karaköy'de az sayıda devreyi basan firmalar da var.

PNP kağıdı dediğim aslında asetat gibi A4 boyutlu bir kağıt ancak tek tarafında mavi pudra gibi bir kaplaması var. Lazer yazıcıdan kağıdın mat olan kaplamalı yüzüne çıktı almak gerekiyor. Ondan sonra lazer baskısı sıcaklıkla kolaylıkla bakırlı plakete transfer edilebiliyor. Internetteki bazı kaynaklarda PNP kağıdına para vermeyin kuşe kağıt hatta dergi kağıtları bile iş görür yazıyor. Ben kuşe dergi kağıdıyla denediğimde toner baskısının yarısı kuşe kağıda yapışık kaldı. Demir3klorüre atmak için yeterli kalitede değildi. Diğer yandan internetteki kaynaklarda dergi kağıdı kullanın denmesinin nedeni dergi kağıdının neredeyse bedava olması. PNP kağıdı Karaköy'de yada Yazıcıoğlu'nda 25TL civarına satılıyor. Üstelik eğer kağıdın tamamı kullanılmayacaksa geri kalanını atmak gerekiyor yada kalanını kullanılabilir duruma getirmek için kırk takla atmak gerekiyor.

Bu kadar girizgahtan sonra konuya geleyim. Bu defa, daha önce çok isteyip bir türlü cesaret edemediğim çift taraflı baskı devre yapmaya karar verdim. Çift taraflıyı yapmak tek taraflıdan daha zahmetli ancak çift taraflıyı yapan tek taraflıyı rahatlıkla yapabilir yada başka bir deyişle burada anlatılan teknikle tek taraflıyı yapmak zaten daha kolay. Benim yaptığım devre biraz karmaşık olduğundan [ http://electronics-diy.com/lc_meter.php ] PCAD'de tek taraflısının yollarını çizdiremedim. İki üç köprüyle halledilebilecek gibi bile değildi. Diğer taraftan yapan adam sayfasında tek taraflısını yapmış hem de benimkinin yarısı boyutunda bi plaket kullanmış. O da biraz benim kazmalığımdan. Zaten en son bir durum değerlendirmesi de yapacağım bu konuyla ilgili.

İlk yapılması gereken baskı devreyi bilgisayarda çizip çıktısını almak. Resimde de görüldüğü gibi ben daha önce daha ufak bir devre yaptığım PNP kağıdını kullandım. PNP kağıdı kullanıldığında mavi kaplaması üzerindeki baskıyla birlikte bakırlı plakete aktarılıyor. Dolayısıyla o alan boşaldığından kullanmak olanaklı olmuyor. Elbette ki çoğumuz A4 boyutunda devreler yapmıyor. Ben bu durum için şöyle yapıyorum: Üst katmanın çıktısını kağıdın soluna almak için çizimde plaketin sağına üst katmanda yer alan bir çizgi ekledim (plaketin dışında). Aynı şekilde alt katmanın çıktısını da aşağı kaydırabilmek için sadece alt katmanda bulunan bir çizgiyi çizimin altına ekledim. Kağıda aldığım deneme çıktısında aşağı ötelemek için kullandığım çizgi görünüyor.

İlk adım: PNP kağıdına çıktı almak.

Burada çift taraflı çizim için bir zorluk da eğer iki tane PNP kağıdı yoksa aynı kağıda iki kere çıktı almak zorunda olmak. Dolayısıyla çıktıların yanlışlıkla üst üste binmemesi için mutlaka müsvedde kağıda çıktı almayı tavsiye ederim. Yapılacak en ufak bir hata 25 TL'ye mal olabilir. Üstelik kağıttaki çıktı, devre elemanlarının bacaklarının tam oturup oturmadığını yada ince yolların düzgün görünüp görünmediğini yada birbirlerine değip değmediğini kontrol etmek için de yararlı. Bu arada çok önemli bir hatırlatma; üst katmanın çıktısında ayna görüntüsü, alt katmanın çıktısında normal çıktı almak gerekiyor.


Düzgün bir çıktı aldıktan sonra ilk yapılması gereken her iki tarafı bakırlı plaketi cifle iyice temizlemek. Cif plaketteki yağ birikintilerini alıyor ve hafif kumlu olduğundan çok ince zımpara gibi temizliyor. İnce zımparayla temizlemek de olanaklı ama bence cif daha iyi sonuç veriyor. Çift taraflı devre için PNP kağıdını her iki taraf için bakırlı plakete uygun kesip önce tek bir tarafını mümkün olan en az sayıda bant kullanarak sabitledim. Az bant kullanmak önemli çünkü ütüyle baskı yaparken bantların zamkı eriyeceğinden uğraştıracaktır. Bunu yaptıktan sonra ütüyü iyice ısıtıp PNP kağıdının parlak tarafından ütülemek gerekiyor. Ütülerken önemli bir püf noktası da bir iki kat tülbent kullanmak. Tülbent üzerinden ütülemenin avantajı ütünün metalinin PNP kağıdını bozma yada kaldırma gibi bir riski kalmıyor. Diğer taraftan ütünün altı da bantların zamkıyla bozulmuyor ve ütülemek rahat oluyor. Üstelik sıcaklığı da daha düzgün dağıtıyor. Bakırlı plaketin üzerine iyice bastırarak yaklaşık 3dk kadar ütülemek gerekiyor. Ütüleme bittikten sonra da PNP kağıdını hemen kaldırmadan bakırlı plaketin iyice soğuması önemli. PNP kağıdını soğumadan kaldırınca baskı plaketin üzerine iyice yapışmadan kalkıyor. (Kağıdı kaldırırken kağıda yapışık kalıyor.)

Tülbent mühim.

Ben plaketin bir tarafını bastıktan sonra PNP kağıdını sökmedim. Onun yerine 0.5mm'lik via delme uçlarıyla baskı devrenin iki köşesinde baskı devrenin deliklerine karşılık gelen iki delik açtım. Diğer tarafı ütülerken kullandığım bantların zamklarını alkolle iyice temizledim. Temizlenmemiş plaket zaten resimde görülüyor. Bunların iyice temizlenmesi önemli çünkü alt tarafı ütülerken baskı yapışmayabilir yada demir3 klorürde zamklı parçalar erimeden kalabilir.

Kılavuz delikler ve zamk artıkları.

Açtığım delikleri diğer tarafın kılavuzu olarak kullanarak plaketin diğer tarafına ait PNP kağıdı parçasını yapıştırdım. Sonuçta her iki taraftaki delikler karşılıklı gelmeli. Çift taraflı baskı devre için bu adım en önemli adım. Eğer arka tarafla ön taraf arasındaki kayma 1mm'den bile daha fazla olursa bütün plaketi çöpe atıp herşeye yeniden başlamak gerekir. Üstelik işin kötü yanı yapılan hata bütün delikleri açtıktan sonra farkedilebilir. 

Diğer tarafı da iyice ütüledikten ve baskı devre iyice soğuduktan sonra PNP kağıtlarını kaldırdım. PNP kağıdının bakırlı plaket üzerindeki çıktısı resimdeki gibiydi. Resme dikkatli bakılırsa baskı devre üzerine yapışmayan kısımlar ve PNP kağıdında lazer baskının kaldığı kısımlar görülebilir. Örneğin alttaki PNP kağıdının üst köşesi çıkmamış, büyük olasılıkla orası ütülerken yeterince ısınmamıştı. Toprağa bağlı ızgara haricinde çok fazla çıkmamış yol yoktu. Özellikle mikrodenetleyicinin bacakları arasından geçen 0.5mm'lik yollar çıktıysa geri kalanları asetat kalemiyle baskı devre üzerinden düzeltmek daha kolaydı. Sonuçta görüldüğü gibi PNP kağıdıyla oldukça profesyonel görünümlü devreler yapmak olanaklı. Asetat kalemiyle yaptığım düzeltmelerden sonra ve demir3klorüre göndermeden hemen önce devre plaketi aşağıdaki resimdeki gibi görünüyordu:



Bu arada asetat kalemi sanırım baskı devre kalemi olarak da satılıyor ancak bildiğim kadarıyla baskı devre kalemi, devre yolları eridikten sonra çıkmayan yollar üzerinde düzeltme yapmak için iletken izler bırakan bir kalem. 

Bütün bu işler bittikten sonra baskı devreyi her zaman olduğu gibi demir3klorür banyosuna atıp yolları eritmek gerekiyor. Burada yine bilmeyenler için dikkat edilmesi gereken bir kaç nokta var. Eğer demir3 klorür sıcaksa daha iyi etki ediyor. Bunun için iki yol var. Birincisi çözeltiyi bir beherde ısıtmak ancak ısınırken sağa sola sıçrayabiliyor. Diğer yol da çözelti kadar kaynar suyla çözeltiyi ısıtmak. Bu daha iyi ancak çözeltiyi seyreltiyor. Her ikisi de etkili. Çözelti soğuk olsa bile sadece eritme süresi uzuyor. Sadece sabırlı olmak gerekiyor. Bu arada çizimler bittiğinde gece yarısıydı. O yüzden üstteki resimler daha karanlık. Banyoyu ertesi sabaha bıraktığımdan yandaki resim gün ışığında çekildi o nedenle daha aydınlık.

Banyo tamamlandığında toner ve PNP kağıdının mavi maddesi baskı devrenin üzerinde kalıyor (haliyle). Diğer kaynaklarda bunları temizlemek için aseton kullanın yazılmış. Aseton işe yarasa da bol bol aseton kullanarak en az 2-3 dk iyice ovalamak gerekiyor. Cif'le ovalamak da pek sonuç vermiyor. Zımpara kağıdıyla daha kolay temizleniyor ama zımpara kağıdıyla temizlemek de çok ince yollara zarar verebilir. Bütün olasılıkları saydıktan sonra ben kendi kullandığım yolu söyleyeyim; benzinle silmek özellikle Türkiye'de çok pahalı sayılabilecek bir yol olsa bile kaplamalar benzinle sanki toz alır gibi kolaylıkla temizlenebiliyor. 

Benzinle silinmiş, sabunla yıkanmış, kurulanmış. Tertemiz.

Devreyi temizledikten sonra delikleri delmeye başladım. Via'ları (iki yüzey arasındaki geçişler) delmek için 0.5mm'lik uçlar kullandım. Normal delikler için 0.8mm yada geniş ayaklı elemanlar için 1mm. Via'lar için normalde çok ince yüzük şeklinde deliğin içini dolduran metaller var. [ Bir via normalde nasıl olmalı? ] Başka bir yol da iletken bir boya kullanmak. Fakat maalesef bu kadar profesyonel malzemeleri ben İstanbul'da (her iki yakada da yani ne Karaköy'de ne de Yazıcıoğlu'nda) bulamadım. Belki de ben doğru kelimelerle aramıyorumdur. Bahsettiğim iletken boya şu video'da kullanılıyor ancak videoda yapılan yol benim için fazla profesyonel:


Bense çok daha basit bir yolla devrenin via'larından bi tel geçirip onu her iki tarafa da lehimledim. Delikleri delmek için delme tezgahı kullanıyorum. Delme tezgahıyla daha rahat deliniyor. Delikleri kolay delmek için baskı devreyi hazırlarken delikleri de boşluk olarak yazıcı çıktısına aktarmak gerekiyor. Yani baskı devre eritildiği zaman hiçbir pad'in ortasında bakır olmayacak, hepsinde bir delik olacak. Deliğin çevresindeki bakır çok hafif bir yükseklik sağlıyor böylece matkap ucunun sağa sola yalpalaması azalıyor. Bütün delikleri deldikten sonra alt ve üst tarafta ne kadar kayma olduğuna baktım. Diğer tarafta fazla kayma yoktu, en kaymış delik bile bir noktasında bakırla temas ettiğinden lehimi biraz bol kullanarak sabitlenebilirdi. Bir sonraki resimde artık deliklerin tamamının delinmesi bitmiş, vialar lehimlenmiş. Kuvvetli ışıkta son bir defa daha iki tarafın ne kadar birbirine örtüşüp örtüşmediğini denetlerken:



Örtüşme testinden hemen sonra devre elemanlarını lehimlemeye başladım. Elemanların daha yarısı lehimlendiklerinde, yavaş yavaş gerçek bir devre gibi görünmeye başlamıştı. Ancak sonradan acı bir biçimde fark edeceğim üzere çift taraflı baskı devre lehimlemek de tek taraflısını lehimlemek gibi basit bir iş değildi. Uzun bacaklı parçalar için hiç sorun yok ancak kısa bacaklı entegre soketi yada konektör gibi parçaları lehimlerken üst tarafta lehimlemek için yeterli yer kalmıyor. Bu arada normalde bu tür çift taraflı devreler "plated through hole" yani pad'lerin içerisinde de yüzükler olduğundan her iki taraftan da iyice lehimlemek gerekmiyor. Benim öyle bir olanağım olmadığından ben fakir çözümünü tercih ettim. Bu da şöyle; dirençleri, kondansatörleri lehimledikten sonra bacaklarının fazlasını çöpe atmıyorum. Normal teller (zil teli vb.) 0.6mm civarındayken parçaların bacakları 0.4mm civarında. İnce, ancak bir deliğe sokarken bükülmeyecek kalınlıkta tel de iş görür. Entegre soketini lehimlerken üst tarafını tamamen sokmayıp alt tarafta yalnızca tellerinin ucu görünecek kadar soktum. Böyle yapınca üst tarafta kalem havanın ucu girecek kadar yer kaldı. Bu iş için ucu temiz ve sivri bir havya gerekiyor. Ucu kütleşmiş bir havya varsa ucunu eğeleyip sivrileştirmek yada yenisiyle değiştirmek şart. İşe başlamadan önce lehim süngerinde iyice temizledim. Üst tarafı lehimlemek zahmetli olduğundan ne kadar az lehim yaparsam o kadar iyi. Bu nedenle üst tarafta bağlantısı olmayan bacakları not aldım. Sadece bağlantısı olan bacakları soketin plastiğini eritmeden ve bacakla yolun bağlantısı olduğuna emin olarak lehimledim. Hatta iş bittikten sonra multimetreyle temas olup olmadığını denedim. Buraya kadar herşey iyi. Sonra arka yüzü çevirip arka yüzdeki deliklere dirençlerden artan ince telleri sokup, soketin bacaklarına değdiğine emin olana kadar iyice bastırdım ve arka tarafından tekrar lehimledim. Bütün iş bittikten sonra arka taraftaki yolların temas edip etmediğini de denedim. Sonuçta herşey mükemmel çalışıyordu.

Bununla ilgili bir kolaylık daha tasarım aşamasındayken yapılabilir. Entegre soketi gibi çift taraflı baskı devrede lehimlemesi zorluk çıkaracak devre elemanlarının yollarının sadece alt tarafta kalmasını sağlamak için PCAD'de DIP soketin, tamamı üst katmanda yer alan tek bir keep-out alanı içerisine alınmalıdır. Böyle yapıldığında yollar otomatik çizilirken keep-out alanından geçirilmez. Keep-out alanı yalnızca üst katmanda yer aldığından autorouter program bütün bağlantıları alt katmanda yapmaya zorlanır. Eğer tek bir keep-out ile olmazsa her iki sıra bacağın aynı şekilde iki küçük keep-out alanına alınması da olanaklı ancak benim devremde her ikisi de yolların çizilmesinde sorun çıkarıyordu.

Daha önceki paragraflarda yazmamıştım; resimdeki DIP8 soket dibine tel sokularak lehimlendi fakat DIP18 soketi dalgınlıkla doğrudan tek taraflı gibi lehimlediğimden sökmem gerekti.

Lehim pompası ve sökülen entegre soketi

Yapılmış lehimi sökmek için lehim pompası yada lehim sökme pompası diye satılan aletler var. Alet yaylı bir pompa gibi, sıkıştırılıyor ve düğmesine basınca atıyor yani eski haline dönüyor. Eski haline dönerken içindeki piston ucundan havayı çekiyor ve lehim sıvıyken lehimi de emiyor. Sonra fazla lehimi biriktikçe içinden atıyor. Kullanması oldukça basit ve fiyatı da 15 TL civarında.


Lehim pompasını kullanarak DIP18 soketi söküp tekrar daha önce bahsettiğim gibi lehimledim. Çift taraflı devreyle çalışırken çok kolaylıkla hata yapılabiliyor. Bu nedenle bir lehim pompası yada başka bir lehim sökme çözümü olması iyi olur. Örneğin eğer arka taraftan sokulan tel üst tarafa değmezse söküp tekrar lehimlemek gerekecektir.

Benzer bir durum konektörde ve rölede de başıma geldi. Onları da biraz uğraşıp aynı teknikle alt katmandaki deliklerden tel sokarak sorunsuz lehimledim. Son olarak bir sıkıntı da muhtemelen amerikan ve avrupa standardının uyuşmaması nedeniyle yaşadım. PCAD'le çalışırken bir inç'in binde biri olan mil birimiyle çalışmak gerekiyor. Elbette tasarım için 1 mil çok küçük, ben çoğunlukla 100mil ve katlarıyla çalışıyorum. Örneğin hazır devre elemanlarından bir direnç 400 mil uzunlukta yani 10.16mm. PCAD, yolları çizdirirken genellikle 25mil'lik bir ızgara üzerinde çalışıyor ve 10mil'lik yollar kullanıyor. Yani birbirine yakın iki yol arası 0.635mm olabilir ve yolun kalınlığı da 0.254mm olabilir. Elbette bu kalınlıklar kısıtlı da olsa değiştirilebiliyor yada otomatik yol çizimi işlemi bittikten sonra elle ayarlanabiliyor.



PCAD'de konektörlerin pinleri arası 100mil olarak tanımlanmış yani 2.54mm. Ancak benim satın aldığım konektör muhtemelen avrupa standardı kullandığından bacakları arası 2mm civarındaydı. Daha kesin ölçüm yapabilmek için 10 pin arasındaki uzunluğu ölçtüm ve yaklaşık olarak 2cm buldum. Bu da demek oluyor ki buna dikkat etmek gerekli. Ben konektörü amacına uygun kullanmadığımdan (kondansatör oturtmak için kullanıcaktım) altı pini birden lehimlemek yerine 3+3 biçimde lehimledim. Yalnızca üç bacak olduğundan pinleri fazla eğip bükmeme gerek kalmadı. Yaptığım başka bir yanlışlıksa LCD ekranı, doğru dürüst dişi ve erkek konektörlerle bağlamak yerine 40 kanal IDE kablosunu biraz yamultarak kullanmak oldu. Konektör kullansaydım lehimlerken çok fazla uğraşmam gerekmeyecekti.

Tüm devre elemanları lehimlendiğinde devre kartının son durumu resimdeki gibiydi.

Buraya kadar baskı devrenin yapılışını anlattım. Daha sonra PIC16F84A'nın kodunu yazdırıp onu da taktım. Yazının en başında bahsettiğim hüzün hani nerede diye soracak olursanız asıl hüzün zaten bundan sonra başlıyor. Maalesef devreye elektrik verdikten sonra devre çalışmadı. Devrede bir sorun yoktu ancak büyük olasılıkla lehimleme yada çizimde yaptığım bir hatadan dolayı devreyi çalıştıramadım. Devre çalıştığında maalesef aşağıdaki gibi saçmaladı:

Mutsuzluk.

Maalesef hayat bazen ne yapmak gerektiğini değil ne yapmamak gerektiğini öğretiyor. : ) Gelelim He-Man sonundaki Orko gibi ders çıkarma kısmına. Öncelikle devrenin çalıştığına eminim çünkü hiçbir devreyi protoboardda yapmadan baskı devresini kurmam. Birinci hata burada oldu. Yandaki resmin tarihine baktığımda 08.07.2012'ydi. Devre şemasını PCAD'e taşıdım ancak bir türlü tek taraflı yolları çizmeyi başaramadım, hemen çift taraflı çizime girişmeden önce biraz daha deneyeyim dedim, dolayısıyla sonraya erteledim. Ondan sonra araya CCNA sınavı girdiğinden fazla bakamadım ve tekrar projeye döndüğümde aradan 4-5 ay geçmişti. Internetteki devre şeması nasılsa internette durur diye diskime kaydetmedim fakat tekrar aradığım zaman şemanın ikinci versiyonu yayınlanmıştı (Şu anda üçüncü versiyonu var). Şemada çok fazla değişiklik yoktu ancak bazı bağlantılar değişmişti. Diğer bir hata da PCAD'e devre elemanlarını eklerken elemanların değerlerini yazmadım (direnç 100 ohm, kondansator 1mF gibi). Çizimlere tekrar geri döndüğümde 19 Ocak'tı ve devre şemasını da bulamayınca elimde sadece delikler ve deliklere hangi elemanın lehimleneceği bilgisi kalmıştı. Yeni şemadan eskisini çıkarmaya çalıştım ancak bazı yerlerde tahmin yürütmek zorunda kaldım. Bu arada eski şemada bazı elemanların değerleri açık olarak üstüne yazılmamış, örneğin C3 için açıklamada bu kondansatör için C1'le aynı değerde seçin gibisinden açıklamalar vardı. Bunları ben kendim tahmini değerleriyle protoboard'u oluşturmuştum.

Çıkarılacak birinci ders, devre şemasını asla atma ve internetteki kaynakların değişmeyeceğine güvenme. İkinci ders şemaya sonradan yapılan bütün eklemeleri şemaya ekle ve baskı devreyi tasarlarken mutlaka devre elemanlarının değerlerini de yaz. Normalde seri üretim devrelerde devrenin bir tarafına bakır katmanın üzerine hangi elemanın lehimleneceği bilgisi bulunur ancak elle üretirken boya katmanını yapamadığımdan çok dikkate almıyorum aslında almak lazım. Kodun içine yorum yazmak kadar önemli bir durum. Bir tavsiye de bu kadar uğraşmaktansa dealextreme.com'dan Çin malı kondansatör/bobin ölçer almak daha pratik. "Capacitance Inductance Meter" diye aratınca bir sürü çeşidi çıkıyor.

Sonuçta devrenin çizilip üretilmesi arasında geçen 2 aylık sürede ayırabildiğim bütün boş zamana yazık oldu. Bundan sonra devrenin hatasını anlamaya çalışacağım. Protoboard üzerindeyken LCD ekranın aydınlatması vardı ancak baskı devre üzerinde arka plan aydınlatması gelmiyordu. Dolayısıyla +5V bazı yerlere gitmiyor olabilir yada yanlış yere lehimlenmiş yüksek dirençli bir eleman nedeniyle onun ötesinde elektrik gitmiyor olabilir. Son olarak, devreyi indirdiğim yerde PIC'in kaynak kodu var mı bilmiyorum ama ilk versiyondaki kod bende vardı. PIC'i programlarken bu kodu kullandım.