Devre Şeması etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Devre Şeması etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

29 Eylül 2020 Salı

MIT App Inventor2 ile Mobil Uygulama Geliştirelim (Bluetooth Termometre)


Merhaba. Bir önceki seri termometre yazısına bir dostumdan gelen yorum, bana bu yazı için fikir verdi. Malum, seri portlu bilgisayarlar artık bulunmuyor. Sıcaklık verisini cep telefonumdan okumak istesem, telefonumda bunu okuyacak uygulama var mı? Belki evet, PlayStore'da Bluetooth'dan (BT) ham (raw) veri okuyan uygulamalar bulunabiliyor. Bu uygulama ne kadar güvenli? Neden tek işi BT'a veri göndermek/almak olan bir uygulama kamerama, mikrofonuma erişmek istiyor?

İlk akıllı telefonumda kullandığım BluetoothSPP adlı uygulama, yeni telefonumdaki Android sürümüne uyumlu olmadığından BT kontrollü arabam için bir uygulama yazmıştım. Yaptığı iş, bir byte uzunluğunda mesajlarla (daha doğrusu karakterlerle) arabayı ileri geri götürmek, döndürmek veya durdurmak. Bu uygulama için, MIT App Inventor'u keşfetmemle sıfırdan Android programlama öğrenmeme gerek kalmadı. App Inventor'la, bir satır bile kod yazmadan uygulamaları sürükle bırak tekniğiyle geliştirmek mümkün. Belki mükemmel değil ama hızlıca birşeyler geliştirmek için ideal. Güvenli mi? Güvenliğini kişisel olarak test etmedim ama MIT gibi bir kurumun malware içeren bir platform geliştirmesi kulağa pek olası gelmiyor. Üstelik günde ~60K aktif kullanıcısı (toplamda >8M kullanıcı) olan bir platformun güvenlikle ilgili sıkıntıları olsaydı, ortaya çıkardı.

App Inventor'a geçmeden önce, kullandığım donanımı ve Arduino'da çalışan yazılımı açıklayacağım. Bu arada, bu yazıda yalnızca projenin yapılabilirliğini göstermek istedim. Uygulama "yeterince" iyi çalışıyor, tasarım açısından da mükemmel değil çünkü benim uzmanlığım değil. Devreyi belki Arduino yerine mikrodenetleyiciyle yapsaydım daha basit olabilirdi ama bu da (eğer yapabilirsem) başka bir yazının konusu olsun.


Parça Listesi
Arduino Uno
Arduino Bluetooth Shield
2x 4.7K direnç
DS1621 Entegre
Breadboard
Jumper Kablo (yaklaşık 1 düzine)


Devrenin Kurulması
Devre olarak, Arduino ile I2C yazısındaki devreye Keyes Bluetooth modülünü ekleyip bunu kullandım. Orjinal devre şeması aşağıda. 

DS1621 Termometre

Bluetooth modülünün 4 pini var (yanda). RxD ve TxD bacakları sırayla Arduino'nun D3 ve D4 pinlerine takılı. Bunun özel bir nedeni yok, kodda gerekli değişiklik yapılarak herhangi bir data bacağına takılabilir. Kalan iki pin zaten Vcc ve GND. 
 
Bu arada Fritzing aşağı yukarı bir yıl önce paralı oldu. Kaynak kodları github'da açık ve derlemek isteyenler için hala ücretsiz ama Windows'ta sorunsuz derlenir mi emin değilim. Anasayfada eski sürümlerine bağlantı olmasa da dosyalar henüz fritzing.org sunucusundan silinmemiş (biraz araştırarak bulunabilir). Linux Mint ve Fedora repolarında eski sürümleri (v0.8.5, v.0.9.2) bulunabiliyor. Bu arada uygulama 8€, çok pahalı değil. Şu anda kurulu olduğu için kişisel olarak ödemeyi tercih etmiyorum ama ileride neden olmasın. Kurulum dosyası üçüncü parti sitelerde de bulunabiliyor ama bence güvenli değil.


Devrenin bütünü basitçe aşağıdaki görselde:

Arduino'da çalışan kodu I2C yazısından alıp, BT için aşağı yukarı 16 satır kod ekledim. BT modülünü farklı pine bağlamak için onuncu ve onbirinci satırdaki sabit tanımlamalarını değiştirmek gerekiyor. 

 /* DS1621 sicaklik sensorunun (I2C bus) Arduino ile kullanilmasi
 *
 * sicaklik sensorunun I2C ID'si A0 = A1 = A2 = GND ise 0x48 olacak
 */

#define DS1621 B1001000
#include <Wire.h>
#include<SoftwareSerial.h>  // BT modulu icin

const int BTRxD = 3;        // BT RxD Pin
const int BTTxD = 4;        // BT TxD Pin
// SoftwareSerial nesnesi tanimla
SoftwareSerial Serial1(BTTxD, BTRxD);

void setup()   {
  // I2C initialization
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(DS1621);
  Wire.write(0xAC);     // Access Config komutu
  Wire.write(0x02);     // Config register'a 02 yaziliyor.
                        // Output polarity bit = 1 => Active High
  delay(10);

  Wire.beginTransmission(DS1621);
  Wire.write(0xEE);     // Start Convert: sicaklik okumaya basla
  Wire.endTransmission();       // Stop bit
 
  BluetoothInit();
}

void BluetoothInit()    {   // Adi uzerinde Bluetooth initialization
  Serial1.begin(9600);
  Serial1.flush();
  // burada baska kodlar da vardi ama bu proje icin gerekli degil
}


void loop()  {
  float derece;
  byte SH, SL, X;
  char buffer[8]; // BT buffer
  // SH: Sicaklik yuksek anlamli byte
  // SL: Sicaklik dusuk anlamli byte

  Wire.beginTransmission(DS1621);
  Wire.write(0xAA);     // Read Temperature komutu
  Wire.endTransmission();

  Wire.requestFrom(DS1621, 2);
  // Read Temperature komutunu gonderdikten
  // sonra chip'ten sicaklik icin 2 byte iste
  X = Wire.available();
  if(X >= 2)  {                 // Chip'ten 2 byte geldiyse
    // Yuksek anlamli byte sicakligin tamsayi degeri SH
    SH = Wire.read();
    // dusuk anlamli byte SL sicakligin ondaligi 0x80 => 0.5
    SL = Wire.read();
  }

  delay(500); // sicakligi saniyede iki kere oku ve BT'den gonder
 
  derece = (float)SH + float(SL) / 256.0;
  dtostrf(derece, 2, 2, buffer);  // dereceyi string'e cevir.
  Serial.println(buffer);
 
  // buffer'daki veriyi BT'den gonder
  Serial1.println(buffer);
  Serial1.flush();

}

Program basitçe sıcaklık sensöründen veriyi alıyor, float olarak dereceye çeviriyor ve bu değeri metne çevirip hem seri porta hem de Serial1 olarak tanımladığım BT'a gönderiyor. Bu kodu derleyip cihaza gönderiyorum. Henüz hiçbir BT istemci bağlı olmadığından BT modülünün ışığı yanıp sönecek.


MIT App Inventor2 (AI2) ile Uygulamanın Tasarlanması
Bu bölümde telefon uygulamasının nasıl geliştirileceğini anlatacağım. AI2'yle ilgili ilk adımlar https://appinventor.mit.edu/explore/ai2/setup adresinde de açıklanıyor. İhtiyacım olan:
1- http://ai2.appinventor.mit.edu/ adresine girip google hesabıyla oturum açmak. Bu sayfanın HTTPS değil HTTP olması açıkçası çok hoşuma gitmiyor ama yapacak başka birşey yok. Bir de google hesabı yerine, bu sitede kendi hesabımızı açabilseydik güzel olurdu. 
2- Play Store'dan MIT AI2 Companion'u indirip kurmak. Bildiğim kadarıyla AI2'nin iPhone desteği yok. AI2 Companion olmadan da web arayüzünden uygulama geliştirilebiliyor ama geliştireceğim uygulamayı telefonumda denemek için AI2 Companion gerekli. 

Yukarıdaki bağlantıda birinci seçenekte anlatılan kurulumu kullanacağım. Uygulamayı telefonuma kurdum. Bilgisayarın ve telefonun aynı WiFi ağında olması gerek diyor. Benim bilgisayarım kabloyla bağlı ve herşey sorunsuz çalışıyor. Aynı ağda olması yeterli diye düzeltiyorum. 

Tarayıcıda "Start new project"e basıp, bir proje oluşturuyorum. Ben TermoBT adını verdim. Proje adı uygulamanın da adı olacak. Proje oluşturulduktan sonra açılıyor, açılmazsa "My Projects" ekranından açılabilir. Proje açıldıktan sonra yanda görüldüğü gibi Connect -> AI Companion'a tıklayınca ekrana bir kare kod ve şifre gelecek. Şimdi telefonumdan uygulamayı açıp kare kodu tarattığımda App Inventor telefonuma bağlanıyor. Bu andan itibaren web arayüzünde yaptığım herşey telefonda da görünecek. 

Ekranın sol tarafında, GUI oluşturmak için gereken bileşenler var. Bu bileşenleri sürükleyip ekrandaki sanal telefona bırakınca, ekranın solundaki menüye sırayla yerleşiyorlar. Sonradan eklenecek bileşenleri hizalamak için önce Layout sekmesinden "Arrangement"ları yerleştirmem gerek. Bunlar görünmez tablolar gibi düşünülebilir. Yerleşim için iki tane "HorizontalArrangement" ve bir tane "Vertical Arrangement"i altalta ekliyorum. Aynı bileşeni birden fazla kullandığımda onları ayırdetmek için adlarını değiştiririm. Üstteki "HorizontalArrangement"i "HorizontalArrangementTemp" olarak, ortadakini "HorizontalArrangementControls" olarak ve alttakini "VerticalArrangementMain" olarak ayarladım. Bileşenleri yeniden adlandırmak için "Components" menüsünün altında "Rename" düğmesi var. Son olarak VerticalArrangementMain'in içine bir VerticalArrangement daha yerleştirip onun adına VerticalArrangementSub diyorum. Bu Arrangement'ların kullanımı için aşağıdaki videodan yararlandım. Bu arada youtube, AppInventor için bulunabilecek en iyi kaynak:



Şimdi tekrar bileşenlere gidip "User Interface" sekmesinden iki tane "Label"i en üstteki HorizontalArrangementTemp'in içine yanyana yerleştiriyorum. Ardından ortadaki genel görünümden veya sağdaki bileşen listesinden Label1'e tıklayıp en sağdaki "Properties" bölümünde Text'i "Temperature: " (veya Derece) olarak değiştiriyorum. Aynı şekilde Label2'nin Text'ini boş bırakıyorum. Bir de Label2'nin yüksekliğini (Height) %50 (50 percent) olarak ayarlıyorum.
 

Son olarak HorizontalArrangementTemp'in özelliklerinden Width'i tıklayıp "Fill Parent"i seçtikten sonra OK diyorum. Böylece bu kutucukla işim bitti.

Ardından ikinci kutucuğa yanyana bir "CheckBox", bir de "Button" sürüklüyorum. Elbette tasarımı herkes istediği gibi yapmakta serbest ama kodları(!) yazarken adlandırmalara dikkat etmek gerekiyor. Butonun adını "ButtonReadTemp" olarak değiştirip üzerindeki metni "Read Temperature" olarak değiştiriyorum. CheckBox'un adını değiştirmiyorum ama metnini "Read automatically" yapıyorum. Bir de HorizontalArrangementControl'ün de özelliklerinden Width'i tıklayıp "Fill Parent"i seçmemle bu kutucukla da işim bitiyor (aşağıda):


Şimdi VerticalArrangementMain'in özelliklerinden, "AlignHorizontal"a "Center:3" ve "AlignVertical"a "Bottom:3" değerini atıyorum ve hem "Height" hem de "Width"i "Fill Parent" olarak işaretliyorum. İçteki VerticalArrangementSub, alt ortaya düşüyor. Onun da "AlignHorizontal" değerini "Center:3" olarak atıyorum ve içine bir butonla bir ListPicker yerleştiriyorum. Bunların hangisinin altta olduğunun çok önemi yok. Düğmenin metnini "Disconnect from device", ListPicker'ın metnini "Select Bluetooth device" olarak değiştirince, bu kutucukla da işim bitiyor. 

Soldaki bileşenlerden, "Sensors" sekmesinden "Clock"u ve "Connectivity" sekmesinden "Bluetooth Client"ı ekrandaki telefona sürüklüyorum. Bunlar görünmez kontroller. Bileşen listesinden Clock'a tıklayıp TimerEnabled özelliğini kapatıyorum ve TimerInterval özelliğini 500 yapıyorum. Bu, her 500ms'de Clock tetiklenecek anlamına geliyor. Herşey tamamlandığında ekran görüntüsü aşağıdaki gibi olmalı: 


Uygulama, bir BT cihaza bağlı değilse sıcaklıkla ilgili bileşenleri ve "Disconnect" düğmesini göstermeye gerek yok. Bir BT cihaza bağlanıldığında da "Select device" listesine gerek yok. Bu nedenle HorizontalArrangementTemp'in özelliklerine bir kere daha gidip en alttaki Visible kutucuğundan işareti kaldırıyorum. Aynısını HorizontalArrangementControls'a ve Button1'e de (Disconnect) yapıyorum. Şimdi uygulama açıldığında sadece cihaz seçme butonunu gösteriyor. Diğerleri, bağlantı kurulursa ekrana geliyor. Buraya kadar bütün tasarım tamamlandı. 


MIT App Inventor2 ile Kodlama
AI2'nin bence en güzel özelliği anladığımız anlamda kod yazmak yerine renkli parçalarla, lego oynar gibi prosedürleri oluşturabilmek. Bu bölümde BT ile ilgili kontrolleri hazırlarken aşağıdaki videodan faydalandım: 


Prosedürleri oluşturmak için üstteki yeşil barın en sağındaki "Blocks" düğmesine basıyorum. İlk oluşturacağım, ListPicker1'e basıldığı zaman BT cihazların listesini göstermesi. Bunun için soldaki bloklardan ListPicker1'i seçip içindeki olay (Event) listesinden TouchDown'a ait bloğu beyaz alana sürüklüyorum. Ardından yine ListPicker1'in olay listesinden "set ListPicker1.Elements to"yu beyaz alana bırakıyorum. Son olarak BluetoothClient1'in listesinden "BluetoothClient1.AddressesAndNames"i koyu yeşil "set ListPicker1..."in soluna yerleştiriyorum. İki parça yanyana eklendikten sonra kahverengi "when ListPicker1.TouchDown"da "do"nun hemen yanına uygun yere yerleştiriyorum. 


AI2'nin arayüzünde ne eklenirse aynı anda telefondaki uygulamaya da yansıdığını yazmıştım. Aynısı kodlar için de geçerli; uygulamayı geliştirirken aynı anda kodlar da telefona gönderiliyor. Önceden Arduino'yu bilgisayarıma bağlayıp kodu aktarmıştım. Telefonumu açıp "Select Bluetooth device" dediğim zaman BT cihazları listeleyecek (tabii ki telefonda BT açık olmalı) fakat listeyi alsak da henüz bağlanma kodu hazır değil. 

Cihaza bağlanmak için ListPicker1.AfterPicking olayını kullanacağım. Bunun içine Built-In -> Control'den "if ... then" bloğunu yerleştiriyorum. Sonra BluetoothClient1 fonksiyonlarından mor .Connectaddress'i if'in yanına ekleyip son olarak ListPicker1.Selection değerini (açık yeşil) de bunun yanına ekliyorum. Connectaddress fonksiyonu çağırılacak ve fonksiyon başarılı olursa then'in yanındaki blok işletilecek. Then'le birlikte herhangi bir handler vs. çağırmayacağım ama görsel ayarlamalar yapmam gerekiyor. 

1- Artık başka aygıta bağlanmayacağıma göre ListPicker1'i görünmez yapmalıyım:
set ListPicker1.Visible to false
2- Disconnect butonunu görünür yapmalıyım:
set Button1.Visible to true
3- Arrangement'ları görünü yapmalıyım:
set HorizontalArrangementTemp.Visible to true
set HorizontalArrangementControls.Visible to true
4- Başta sıcaklığın otomatik okunmaması için:
set CheckBox1.Checked to false

True / False değerleri Built-In -> Logical içinde bulunuyor. Koyu yeşil kutucuklar alt alta eklenebiliyor.


Şimdi telefondaki uygulamada, BT cihaz listesinden HC06'yı (Arduino modülü) seçtikten sonra modülün ışığı yanık kalacak çünkü telefon artık BT modülüne bağlı. Ama Disconnect'e bastığımda henüz bir şey olmuyor çünkü bunu yazmadım. Bağlantı kesme prosedürü, yukarıda yapılanların tam tersi olmalı. BluetoothClient1.Disconnect çağırılacak ve yukarıda görünür yaptıklarımı görünmez, görünmez yaptıklarımı da görünür yapacağım. Yazıyı çok uzatmamak için yalnız ilgili kod bloğunu paylaşıyorum: 


Artık uygulama bağlantıyı da kesiyor. Şimdi sıra, en önemli prosedür olan BT'dan veri okumada. Bunun için ButtonReadTemp'in Click olayını kullanacağım. Veriyi okumadan önce BT'un bağlı olduğunu ve ara bellekte veri olup olmadığını kontrol etmeliyim. Bağlantının kontrolü önemli çünkü bağlandıktan sonra bile cihaz bağlantısı fiziksel olarak kesilmiş olabilir. Bu nedenle ButtonReadTemp.Click olay bloğunun içine bir if ... then bloğu ekliyorum. Koşul olarak Built-In -> Logic'ten bir AND bloğu koyuyorum. Birinci koşul BluetoothClient1.IsConnected. İkinci koşul da ara bellekte okunacak birşeyler olması. Bunun için matematiksel bir karşılaştırma gerekiyor, o da Built-In -> Math içindeki eşittir bloğu. Bunu sürükledikten sonra eşittiri büyüktür yapıyorum. Eşitsizliğin soluna BluetoothClient1.BytesAvailableToReceive ve sağına yine Math içerisinden 0 (sıfır) koyuyorum.

Tüm bu koşullar sağlanıyorsa BT'dan okuduğum veriyi Label2'ye yazacağım. ButtonReadTemp'in son hali şöyle olacak: 


Uygulamaya geri dönüp "Read Temperature" düğmesine bastığımda, uygulama uzun bir süre veri okumadan bağlı kalmışsa, (ara bellekteki) bir sürü sıcaklık değeri ekranı dolduracak. Label2'nin yüksekliğini o nedenle telefon ekranının yarısıyla sınırlandırmıştım. En başta dediğim gibi bu projede hızlıca ortaya birşeyler koymaya çalıştım haliyle sonuç mükemmel olmadı. 

Ara bellek dolduğu için en iyisi veriyi otomatik okumak. Bunun için de CheckBox1.Changed olayına prosedür ekleyeceğim. Eğer CheckBox1.Checked ise Clock1'i aktifleştirip ButtonReadTemp'i pasifleştirmem gerekiyor veya tam tersi. Önceki prosedürlere göre bu oldukça basit. Bunun için bir if ... then ... else bloğu gerekli. Bu hazır olarak Control'de var ama if ... then bloğunun yanındaki mavi dişli simgesine basıp else'i sağdaki if'in içine sürükleyerek de oluşturulabilir.


Son olarak zamanlayıcı aktifleştirildiyse, ButtonReadTemp.Click prosedürünün yaptığını artık zamanlayıcının gerçekleştirmesi gerekiyor: 


Yukarıdaki prosedürü kolay yoldan oluşturmak için Read temp butonu için oluşturduğum "if ... then" bloğuna sağ tıkladım, "Duplicate"i seçip aynısını Clock1.Timer olayının içine yerleştirdim. Hepsi bu kadar. Eğer uygulama tamamen bittiyse bunu telefonuma apk olarak indirebilir ve AI2'ye gerek olmadan da kullanabilirim. Bunun için web arayüzünde, Build menüsünden "provide QR code for .apk"yı tıklamak gerekiyor. Uygulama derlendikten sonra, apk'yı indirmek için bir bağlantı ve bu bağlantıyı içeren bir QR kod ekrana geliyor. Bu adımda eğer AI2 Companion hala bağlıysa, QR kodu taramak için bağlantıyı kesmek gerek (Connect -> Reset Connection menüsüyle veya telefondaki uygulamayı kapatıp açarak). AI2 Companion'u yeniden açıp QR kodu tarattığımda -eğer telefondaki güvenlik ayarları apk kurmaya izin veriyorsa- uygulama gereken izinleri verdikten sonra kuruluyor ve bağımsız olarak kullanılabiliyor.

Oluşturulan uygulama "My Projects" menüsü altında "Export selected project (.aia) to my computer" ile bilgisayara indirilebiliyor. Benim bu yazıda hazırladığım projenin dosyası buradan indirilebilir. 

27 Aralık 2018 Perşembe

Arduino ile I2C: Üç Küçük Örnek


Merhaba. Tek cümlede değindiğim bir yazı (Mayıs 2015) dışında Arduino'dan bahsetmediğimi farkettim. Biraz bu nedenle ama daha çok kendime dökümantasyon olması için bu yazıyı yazmaya karar verdim. Düşündüğüm asıl yazıya başlayamadığımdan zaman doldurmak için yazıyorum. Bu yazıda Arduino ile I2C veriyolunun kullanımına üç örnek vereceğim.

Arduino, I2C veriyolu için kullanışlı bir arayüz sunuyor. Önceden hem PC seri portu hem de PIC serisi mikrodenetleyicilerle I2C kullanmaya çalıştım. Bunlardan sonra, Arduino'nun inanılmaz kolay olması beni şaşırttı. I2C veriyolu iletişimde iki pin kullanıyor. Yapısı eski Akbil'lere benzer. Örneklerde kullandığım entegrelerden ikisi Akbil'in de üreticisi olan Dallas Semiconductor'e (sonradan Maxim tarafından satın alındı) ait.

Arduino UNO, I2C için A4 ve A5 pinlerini kullanır. Bunların görevi sırayla SDA (Serial Data) ve SCL (Serial Clock). I2C'de iletişim, master ve slave olarak adlandırılan iki cihaz arasında gerçekleşir. Master, saat sinyalini üretir ve cihazlara adresleriyle ulaşır. Slave, veriyolunda kendi adresini gördüğünde veri üretir veya alır. SCL, iletişim için kılavuz saat sinyalidir ve SDA verinin aktığı pindir. I2C'de protokolle ilgili (iletim başlangıcı ve bitişi gibi) ayrıntılara yazıyı uzatmamak için yer vermeyip örneklere geçeceğim.

Kaynaklar:
https://www.arduino.cc/en/Reference/Board
https://www.arduino.cc/en/Reference/Wire
https://en.wikipedia.org/wiki/I%C2%B2C


AT2432 Entegresiyle Harici EEPROM
Konuya girmeden bir ara bilgi: ATmega328P mikrodenetleyicisinin (yani Arduino UNO) 1KB dahili EEPROM'u var. Bunu Arduino'yla tanışmamdan üç yıl sonra öğrendim. Sanırım EEPROM'ların belli bir okuma/yazma ömrü olduğundan kimse dahili EEPROM'u kullanmıyor (en azından ben karşılaşmadım). EEPROM kitaplığını kullanarak buna erişmek kolay (kaynak) fakat ben harici EEPROM'u tercih ediyorum.

Harici EEPROM olarak Atmel'in AT24C32 entegresini kullandım. 8 x 4096 byte'dan 32K'lık bir EEPROM (Datasheet, Google Drive). Çipte A0, A1 ve A2 olmak üzere üç adres bacağı var. Bunun anlamı şu: Her slave'in bir I2C adresi olduğunu yukarıda yazmıştım. Bu adres 7 bittir ve bu çip için 1010XXXb'dir. Bu çipte son üç bit tasarımcıya bırakılmıştır. Üç adres pini de toprağa bağlanırsa adres 1010000b; Vcc'ye bağlanırsa 1010111b olur. Böylelikle bu çipten sekiz tanesi farklı adreslerle birlikte kullanılabilir.

AT2432 EEPROM
I2C adresleri tekil olmalıdır. Yani her çipin farklı adresi olması koşuluyla teoride 128 çip aynı veriyoluna bağlanabilir. Birden fazlasının kullanımı olanaklı olan çiplerde adres bacakları bulunur.

Çipteki WP bacağı, yazma koruması (Write Protect) içindir. Yazma korumasını kullanmadığımdan toprağa bağladım. SCL ve SDA pinlerini 4.7K'lık pull-up dirençlerle Arduino'nun sırayla A5 ve A4 bacaklarına bağladım. Şeması yanda.

Fritzing, Arduino projesi'nin neredeyse resmi çizim programı. Her kitapta veya projede Fritzing çizimleri görülebiliyor. Ben PCAD ve son zamanda Eagle kullandığım için Fritzing'de çizmeye alışkın değilim. Ama Arduino ve birçok shield'ının blok şeması Fritzing'de hazır geldiğinden Arduino çizimleri için daha iyi bir seçenek yok (veya ben Eagle için Arduino blok şeması bulamadım). Fritzing'in 'Breadboard' görünümünde parçalar breadboard'a takılır gibi çizilebiliyor. Bir çok Arduino kitabı, "daha kullanıcı dostu" görünme amacıyla breadboard görünümü çizimlerine yer veriyor. Ben -eski kafalı olduğumdan olabilir- bu çizimleri kullanışsız (kablonun geçtiği veya değdiği yerler belli değil) buluyorum. Burada yalnız devre şemalarına yer vereceğim. Yine de tekrar söylüyorum, Fritzing'i henüz öğrenme aşamasındayım.

Projenin kodu aşağıda:

/* AT24C32 I2C EEPROM Ornegi */

#define MX24C32  B1010000    // 7-bit I2C adresi
#include <Wire.h>

void setup()  {
  Serial.begin(9600);
  Wire.begin();
}

void loop()  {
  char merhaba[8] = {'M', 'e', 'r', 'h', 'a', 'b', 'a'};
  byte addr = 0;
  int X;
  char t;

  // Kod 'Merhaba' string'ini EEPROM'a yaziyor ve yalniz
  // bir kez calistirilmasi yeterli, bu nedenle comment out
  //for(int i = 0; i < 7; i++)  {
  //  Wire.beginTransmission(MX24C32);
  //  Wire.write(0x00);         // Chip'e yazma komutunu gonder
  //  Wire.write(addr++);       // Chip'e yazilacak adresi gonder
  //  Wire.write(byte(merhaba[i]));     // ilgili adrese byte'i gonder
  //  Wire.endTransmission();
  //  delay(100);               // Chip hazir olana kadar bekle.
  //}

  // Asagidaki kod chip'in 00 adresine veri bulundurmayan bos
  // yazma komutu gonderiyor. Amaci 0x00 adresine seek yapmak
  Wire.beginTransmission(MX24C32);
  Wire.write(0x00);
  Wire.write(0x00);
  Wire.endTransmission();

  delay(100);

  // chip'ten 10 byte okunacak
  for(int i = 0; i < 10; i++)  {
    Wire.requestFrom(MX24C32, 1);       // Chip'ten bir byte iste
    X = Wire.available();               // Byte geldi (mi?)
    Serial.print("X = "); Serial.println(X);
    if(X >= 1)  {
      t = Wire.read();                  // Chip byte'i bus'a surduyse oku
      Serial.print("t= "); Serial.println(t);
    }
  }

  while(1);
}

Wire.write() fonksiyonuyla çipe özgü komutları gönderiyorum. Bu çipte Wire.beginTransmission() sonrası ilk iki byte adres sonraki byte veri olmak üzere yazma işlemi yapılıyor (belge s.9: "A write operation requires two 8-bit data word addresses following the device address word and acknowledgment."). Okuma, son yazma işleminin kaldığı yerden yapılıyor, o nedenle 00H'dan okumak için adres byte'ı 00H olan ve data byte'ı olmayan bir yazma komutu göndermek gerekiyor. Genel kullanım böyle, daha ayrıntılı bilgi belgede var.

Benzeri başka bir proje:
https://playground.arduino.cc/code/I2CEEPROM


DS1621 Entegresiyle Termometre
DS1621, Dallas'ın I2C termometre entegresi. (Ara not: Dallas'ın Akbil'in aynı paketinde termometreli çipi var) Bu entegre de üç adres bacağıyla aynı veriyolunda sekiz aygıta kadar destekliyor. Tout, sıcaklık alarm bacağı. Sıcaklık programlanan eşik değerini aştığında bacak lojik 1 oluyor (datasheet, google drive). Devrenin çizimi aşağıda:

DS1621 Termometre

Bu çip için hazır bir kitaplık var ama ben kullanmadım:
https://github.com/martinhansdk/DS1621-temperature-probe-library-for-Arduino

/* DS1621 sicaklik sensorunun (I2C bus) Arduino ile kullanilmasi
 *
 * sicaklik sensorunun I2C ID'si A0 = A1 = A2 = GND ise 0x48 olacak
 */

#define DS1621 B1001000
#include <Wire.h>

void setup()   {
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(DS1621);
  Wire.write(0xAC);     // Access Config komutu
  Wire.write(0x02);     // Config register'a 02 yaziliyor.
                        // Output polarity bit = 1 => Active High
  delay(10);

  Wire.beginTransmission(DS1621);
  Wire.write(0xEE);     // Start Convert: sicaklik okumaya basla
  Wire.endTransmission();       // Stop bit

}

void loop()  {
  byte SH, SL, X;
  // SH: Sicaklik yuksek anlamli byte
  // SL: Sicaklik dusuk anlamli byte


  Wire.beginTransmission(DS1621);
  Wire.write(0xAA);     // Read Temperature komutu
  Wire.endTransmission();


  Wire.requestFrom(DS1621, 2);
  // Read Temperature komutunu gonderdikten
  // sonra chip'ten sicaklik icin 2 byte iste
  X = Wire.available();
  if(X >= 2)  {                 // Chip'ten 2 byte geldiyse
    // Yuksek anlamli byte sicakligin tamsayi degeri SH
    SH = Wire.read();
    // dusuk anlamli byte SL sicakligin ondaligi 0x80 => 0.5
    SL = Wire.read();
    Serial.print(SH, HEX);
    Serial.print("    ");
    Serial.println(SL, HEX);
  }
  else
    Serial.println(X);
  //Wire.endTransmission();

  delay(500);

}

0xEE, 0xAC çip komutları. Belgenin onuncu sayfasında tüm komutlar var. Config register'a çalışma modları yazılıyor. Örn. 0x02: One Shot mode = 0, Polarity = 1. 0xEE komutuyla sıcaklık okuma çevrimi başlatılıyor ve 0xAA komutuyla sıcaklık değerleri çipten veriyoluna çekiliyor. Config register'da bir busy flag olsa da ben basitlik açısından beklemeleri delay() ile yaptım.

Bu çipin seri porttan bilgisayara bağlandığı eski bir proje var. Sonraki yazılardan birinde bunu da anlatacağım.


DS1307 Entegresiyle Gerçek Zaman Saati (RTC)
DS1307, yine Dallas firmasına ait bir saat entegresi. Bir devrede, birden fazla RTC kullanmak anlamsız olduğundan bu entegrede adres bacağı yok. Saati pille beslemek için VBAT girişi var. Arduino kapatılsa bile saat, pille çalışmaya devam ediyor. Kendime "Pili Vcc'ye bağlama" diye not almışım ama neden hatırlamıyorum. Entegre, içinde bulunan sayıcının değerleri arttırıp saniyede taşma olunca dakikayı, dakikada taşma olunca saati vb. arttırdığı 64 byte RAM olarak düşünülebilir.

DS1307 Gerçek Zaman Saati
Bu entegrenin kullanıma hazır kitleri hatta ilk anlattığım AT2432'yle birlikte kitleri var (1, 2). EEPROM'lu kitleri Türkiye'de görmedim ama EEPROM'suz olanları bilindik satıcılarda bulunuyor. Bu entegre için hazır bir kitaplık da var. Ben kendi kodumu yazdım ama iki fonksiyonu bu kitaplıktan aldım.

Entegre, 32.768 KHz kristal osilatöre gerek duyuyor. X1 ve X2 bacakları kristal osilatöre bağlı. Yedinci bacak kare dalga çıkışı, kullanmadığımdan bağlamadım. Kodun içinde gerekli açıklamalar bulunuyor:



/* DS1307 RTC entegresi icin kod. Pili Vcc ye baglama.
 * SDA, SCL'deki pull-up direncleri unutma.
 */

#include <Wire.h>
#define DS1307 B1101000

// iki fonksiyonu jeelabs'in RTC kitapligi kaynak kodundan aldim:
// https://jeelabs.org/2010/02/05/new-date-time-rtc-library/
static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }

void setup()  {
  Serial.begin(9600);
  Wire.begin();

  // Begin initialization
  Wire.beginTransmission(DS1307);
  Wire.write(0);        // once adress byte olarak 0 gönder
  Wire.endTransmission();

  Wire.requestFrom(DS1307, 1);
  int ss = Wire.read(); // sonra bir karakter oku.
  Serial.println(ss);
  // End initialization
  // Eger chip bir karakter dondurmusse calisiyordur


  /*   //  Daha once ayarlanmamissa saati ayarla
  Wire.beginTransmission(DS1307);
  Wire.write(0);
  Wire.write(0x0);  // saniye
  Wire.write(0x21); // dakika
  Wire.write(0x0); // saat
  Wire.write(0);    // haftanin gunu
  Wire.write(0x24);    // gun
  Wire.write(0x12);    // ay
  Wire.write(0x18); // yil
  Wire.write(0x10); // config register SQ Wave out @1Hz
  Wire.endTransmission();
  // */


}

void loop()  {
  Wire.beginTransmission(DS1307);
  Wire.write(0);        // address byte olarak 0 gonderiliyor
  Wire.endTransmission();

  Wire.requestFrom(DS1307, 7);  // RTC'nin 7 byte'ini oku
  /* Sozkonusu 7 byte:
   * 00H: CH Bit + Saniye BCD (00H adresinin 7. biti Clock Halt (CH)
   *      bitidir. Bu bit osilatoru durdurur. "Please note that the
   *      initial power-on state of all registers is not defined.
   *      Therefore, it is important to enable the oscillator (CH
   *      bit = 0) during initial configuration.")
   * 01H: Dakika BCD
   * 02H: Saat BCD (Saat yazmacinin 6. biti 12/24H modunu secer. Set
   *      edilmisse 12H modu secilir. Bu modda 5. bit birse PM sifirsa
   *      AM olur. 24H modunda 4. ve 5. bitler saatin onlar basamagidir.)
   * 03H: Haftanin gunu. Bu kodda kullanilmamaktadir.
   * 04H: Ayin gunu BCD
   * 05H: Ay (BCD)
   * 06H: Yil (BCD)
   * 07H: Kontrol yazmaci
   */
  uint8_t ss = bcd2bin(Wire.read() & 0x7F);     // CH bit olmadan saniye
  uint8_t mm = bcd2bin(Wire.read());            // Dakika
  uint8_t hh = bcd2bin(Wire.read());            // Saat 24H modunda
  Wire.read();                                  // Haftanin gununu okuma
  uint8_t d = bcd2bin(Wire.read());             // Gun
  uint8_t m = bcd2bin(Wire.read());             // Ay
  uint16_t y = bcd2bin(Wire.read());            // Yil.

  Serial.print(d); Serial.print(".");
  Serial.print(m); Serial.print(".");
  Serial.print(y); Serial.print("   ");
  Serial.print(hh); Serial.print(":");
  Serial.print(mm); Serial.print(":");
  Serial.println(ss);

    delay(1000);  // Her saniye oku
}

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.

12 Temmuz 2012 Perşembe

PCAD ile Baskı Devre Çizelim

Bu yazıda PCAD'le baskı devre çizimine değineceğim ve basit bir baskı devreyi çizerek göstereceğim. Yazı biraz uzun ve dolayısıyla sıkıcı olabilir. 90'ların sonunda benim görebildiğim kadarıyla amatör piyasaya Boardmaker programı hakimdi. Sonuçta o zamanlar hiçbirşey bilmeyen 15 yaşında çiçeği burnunda ergen elektronikçi adayıydım ve esnaf (çoğunlukla Pala Elektronik) ne derse onu yapıyorduk. Internet henüz tam anlamıyla yaygınlaşmadığından ve olan kaynaklara da henüz ulaşmayı bilmediğimden fazla bir seçeneğimiz kalmıyordu. Boardmaker, tek disketlik ve yanlış hatırlamıyorsam sadece baskı devre çizimi yapabildiğimiz (devre şeması çizemiyordu) bir programdı. Kitabıyla birlikte satılıyordu. Kitabını alıp bir haftasonunda bilgisayarın başında deneye deneye bitirdim ama beni tatmin etmemişti. Gel zaman git zaman seçenekler çoğaldıkça nasıl olduğunu hatırlamıyorum ama PCAD ile tanıştım. Windows altında çalışan, zengin bir dijital devre elemanı özellikle de mikroişlemci kütüphanesi bulunan (Intel 80286 bile vardı daha ne olsun) ve devre yollarını autoroute özelliğiyle kendi çizen muhteşem bir programdı. Yıllar boyu o kadar alıştım ki hala 2000 sürümünü (15.10.17) kullanıyorum ve çok memnunum. Bu kadar gevezelikten sonra programı anlatayım.



Programı açar açmaz yukarıdaki gibi bir pencere geliyor. Kullanışlı ve önemli özellikleri kenara yazdım. Yanlış hatırlamıyorsam 255 katmana kadar destekliyor ve siz programı açar açmaz 9 yada 10 katman kendisi ekliyor. Bunlardan önemli olanlar (diğerlerini ben de bilmiyorum aslında) :
  • Top: Bakır yolların olduğu katman
  • Bottom: Çift taraflı baskı devrelerde alt katman
  • Top Silk: Bakır yolların olmadığı tarafta devre elemanlarının tanımları (R2, C3, Q1 gibi) yazar ya işte o.
  • Bottom Silk: Top silk'in çift taraflı karşılığı. SMT kullanmayacaksanız çok da gerekli değil.
  • Board: Baskı devrenin sınırlarını belirleyen katman.

Program ilk defa kurulduğunda henüz kütüphaneler ekli olmuyor. Kütüphanelerde kullanacağımız devre elemanlarının hazır ölçülmüş biçilmiş şekilleri olduğundan sizi tek tek elemanı ölçüp ona göre delik koyma zahmetinden kurtarıyor. Devre elemanlarına tıklayınca liste bomboşsa kütüphaneler henüz ekli değildir. Yukarıda Library menüsünden Setup'u seçip kütüphaneleri eklemek gerekiyor. Bazı kütüphaneleri hiç kullanmadımsa da hepsini eklemeyi tercih ediyorum. Az bilinen garip bir devre elemanıyla karşılaşınca hepsini gözden geçirmek için tekrar eklemeye gerek kalmıyor.

Alt katman devredışı
Kütüphaneleri ekledikten sonra program kullanıma hazır duruma geliyor. Bundan sonra herhangi bir çizime başlamadan önce mutlaka yapılması gereken iki şey var. Birincisi katmanları belirlemek. Eğer çift taraflı bir devre geliştirmeyecekseniz Bottom'u (hatta Bottom'la ilgili bütün katmanları) kapatmakta yarar var. Options menüsünden Layers'i seçerek yada Top'un yanındaki kırmızı kutucuğa tıklayarak katmanların belirlendiği arabirimde önce Layers altında bottom'a sonra da sağda Disable düğmesine basarak alt katmanı kapatıyorum.




Bu arabirimi kullanarak Sets sekmesinde bu katmanlara ek olarak kendi katmanınızı oluşturabilirsiniz ancak bence gerek yok.

Örnek için şu adresten bulduğum basit sayılabilecek devre şemasını kullanacağım. 

Katmanları belirledikten sonra yapılması gereken ikinci iş yapılacak plaket boyutlarına karar vermek. Ben devre kartını aldıktan sonra kesme zahmetine girmemek için kafamda yaklaşık bir boyut belirliyorum. (Bu devre şu kadar alanda yapılabilir gibi...) Sonra gidip ona en yakın boyutlardaki bakırlı plakayı alıyorum ve çizimi o plakaya göre yapıyorum. Örneğin bu devreyi 5cm x 5cm'lik plakada yapalım. PCAD inç ve mil birimlerini kullandığından ölçüleri çevirmek gerek. (1 inç = 2.54cm, 1 inç = 1000 mil). Dolayısıyla 2 inç x 2 inç yani 2000 mil x 2000 mil'lik bir alan gerekli. Ekrandaki noktalar yeşil değil de beyaz olana kadar gözkararı biraz yaklaştırıyorum. Yeşil noktalar varsa sizin çözünürlüğünüz (Aşağıda ABS düğmesinin yanında mil cinsinden belirtilen değer) görüntülenen alana sığmadığından nokta sayısı azaltılır. Yakınlaştıkça beyaz noktalar görünmeye başlar. Beyaz noktaların arası sizin seçtiğiniz çözünürlüktedir.

Aşağıda Board katmanını seçip, sonra bu alanı soldaki çizgi gerecini seçip bir kareyle belirliyorum. Çizerken sağ altta çizginin uzunluğu belirtiliyor. Önce bir köşeye tıklıyorum, imleç şekil değiştiriyor, sonra diğer köşeye tıklıyorum, çizginin uzunluğu istediğim kadar olmadıysa aynı yönde biraz daha tıklayıp 2000 olana kadar çiziyorum. Sonrasında dik açıyla diğer kenarı köşesine tıklayarak belirliyorum. Dört kenarın tamamını belirleyip kare (yada istediğiniz herhangi bir şekil) oluşturduktan sonra sağ tıklayarak çizimi bitiriyorum. Board katmanının renginden bir kare oluşması gerekiyor.

Bundan sonra View menüsünden Extent diyip çizimi ekrana sığdırıyorum ve Top katmanını seçip devre elemanlarını eklemeye başlayabilirim. İlk zamanlarda devre elemanlarının nerede oldukları yada olmayan eleman için ne kullanmak gerektiği biraz sıkıcı olabilir. Önemli kütüphaneler ve içeriklerini kısaca belirtmeye çalıştım:
  1. CONNECT.LIB: DB9, DB25, dişi ve erkek slotlar (ISA, PCI gibi) için bağlantılar. 
  2. DIODE.LIB: Diyotlar
  3. PCBCONN.LIB: Connect.lib'dekine benzer bağlantılar ama daha fazla çeşit var.
  4. PCBMAIN.LIB: En çok kullanılan kütüphane. Kondansatörler, entegreler, dirençler, jumperlar ve bazı genel diyot ve transistörler bu kütüphanede bulunur.
  5. PCBSMT.LIB: SMT için gerekli devre elemanları.
  6. TRANS.LIB: Transistörler
Burada devre elemanlarını seçerken Browse düğmesine basıp şeklini görmek de olası. Eğer Browse'ye basınca şekil çıkmıyorsa o eleman baskı devre çizimi için değil devre şeması çizimi içindir. (Daha önce de belirttim PCAD'in bir de devre şeması çizimi için modülü var ancak ben onu kullanmıyorum.) Çizimi yaparken şemanın hemen altındaki delikli pertinaks çizimine sadık kalmayacağım ama elbetteki sonuçlar benzeyecektir. Pil beslemesi ve hoparlör plaketin üzerinde olmayacağından ben onlar için iki delik (PAD) atıp tel lehimlemeyi tercih edeceğim ancak potansiyometre plaketin üzerinde olacak. Butonu koymayacağım. Bir de devreyi basmadan önce protoboard'da yapıp, çalışıp çalışmadığından emin olduğumu varsayarak elemanların elimde olduklarını yani bacak aralarını bildiğimi varsayacağım. Örneğin bazı elektrolitik kondansatörlerin iki bacağı arası 100 milken diğerlerinin arası 200 mil olabiliyor. Bacakları uzatarak yada bükerek lehimleyince sorun olmaz ama tam uzaklığı neyse onu kullanmak devreye daha profesyonel bir görünüm veriyor.

Önce besleme ve hoparlör için 2şer delik (pad) ekledim.

Devre elemanlarını eklerken hangilerinin kullanılacağı biraz deneyim gerektiriyor. Örneğin standart dirençler için RES400 kullanınca tam oturuyorlar. Biraz daha tel bırakmak gerekirse RES500 kullanmak gerekli. Devre elemanları için sırasıyla devre elemanları düğmesine tıklayıp, boş bir yere tıklamak, yerleştirilecek elemanın bulunduğu kütüphaneyi seçmek (örn. PCBMAIN.LIB) ve o kütüphanenin içinden elemanı (örn. RES400) seçmek gerekiyor. Sonra kaç tane RES400 kullanılacaksa (bu örnekte üç) tıklaya tıklaya yaklaşık yerlerine koyuyorsunuz. Sonrasında sağ tuşla tıklayıp normal fare imlecine dönüyorsunuz. Benim yerleştireceğim dirençler dikeydi fakat PCAD onları yatay koydu. Hemen önce en sol üstteki fare imleçli düğmeye basıp yerleştirdiğim direncin üzerine tıklıyorum. Direnç seçiliyor, sonra klavyeden 'R' tuşuna basarak döndürüyorum. Yada fare düğmesine bastıktan sonra masaüstündeki ikonları seçer gibi dirençleri seçip çoklu seçmek ve 'R' ye basarak hepsini birden çevirmek olanaklı. Çevirdikten sonra fare imleciyle yaklaşık yerlerine sürükleyip aşağıdaki duruma getirdim.

Benzeri şekilde tüm elemanları PCBMAIN.LIB kütüphanesinden; elektrolitik kondansatör için CAP200RP, normal kondansatör için CAP200, LEDler için LED100 ve 555 için DIP8 seçerek yerleştirdim. Ancak bir tek potansiyometre için satın almış olduğuma uygun bir eleman bulamadım. Böyle durumlarda potansiyometreyi kumpasla yada protoboard'la ölçerek (protoboard'un delikleri arası 100 mil'dir) elemanın bacakları arasındaki mesafeyi bulup ona göre pad'ler yerleştirmek gerekir. Ayrıca kendi başına duran delikler anlamsız olacağından (en azından devreye bir sene sonra tekrar bakınca kesin anlamsız gelecektir.) Top Silk katmanında potansiyometrenin sınırlarını belirlemek için bir dikdörtgen atmak mantıklı olabilir.


Ben, tek başına bir dikdörtgen de çok açıklayıcı olmayacağından yazı aracını kullanarak 'POT1M' yazısını ekledim. Yazı aracını kullanmak basit. Üzerinde 'A' olan düğmeye bastıktan sonra yazının yaklaşık olarak yerleştirileceği yere tıklayıp çıkan pencerede yazıyı ekledikten sonra 'Place' demek yeterli. Yerini beğenmediğiniz yazıyı yine devre elemanına yaptığım gibi fare imleciyle seçip sürükleyebilir yada döndürebilirsiniz.

Tüm elemanları yerleştirdikten sonra geriye bağlantıları yapmak kalıyor. Bağlantıların doğrudan baskı devre yollarıyla bir ilgisi yok ancak yolları yerleştirirken bağlantıları kısa tutmakta her zaman yarar var. Uzun yolların diğer yolları kesme olasılığı artıyor. Bağlantılar ters 'N' biçimli araçla yapılıyor. Yapılacak iş ters 'N' bağlantı aracını seçmek ve bağlantı yapacağınız deliğin birini diğerine sürükleyerek elemanların bacaklarını birbirlerine bağlamak. Bağlarken ilk defa bir bağlantı yaparsanız size NET'in adını soracak. Bunlara ne ad verdiğinizin bir önemi yok ama özellikle artı besleme ve toprağın NET00000 ile NET00001 olması size sonradan kolaylık sağlayacaktır. Ben ilk önce + beslemeyi üstteki LED'in + bacağına bağlayarak NET00000 adını buna verdim sonra da GND'yi LED'in eksi bacağına bağlayıp buna da NET00001 dedim. Bir kere bağlantıya bir ad verdikten sonra bundan sonra aynı yere bağlanan her bağlantının adı da aynı olacak. Yani bundan sonra GND baskı devrenin her yerinde NET00001 olacak. Tüm bağlantılar bittiğinde özellikle 555'in civarında karışık bir görünüm olacak. Net'lerin adları burada önem kazanıyor. Devreyi kontrol etmek için sol üstteki fare imleci moduna geçip - beslemenin bulunduğu deliği seçip sonra sağ tıklıyorum. Çıkan menüde Highlight Net dediğim zaman o Net'e bağlı olan bütün delikler farklı renkte gösteriliyor. Hata kontrolü için yararlı. Seçimi geri kaldırmak için Unhighlight Net demek gerekli.

Kondansatörler, LED ve 555'in birinci bacağı eksiye bağlı olmalıydı. Demek ki sorun yok.

Aslında buraya kadar herşey tamamlandı ama tavsiye edeceğim bazı noktalar var. Gördüğünüz delikleri çapı 60mil yani 1.5mm. Eğer matkap ucunuz biraz titreşiyorsa bile bu delikleri delmek imkansız hale gelebiliyor. Matkap ucu sallanarak lehimlenecek yerleri de götürebiliyor. Benim bu duruma karşı önerim delikleri büyütmek.

Pad'e sağ tıklayınca çıkan menüden Properties'i seçip Pad Styles düğmesine basın. Herhangi birine tıklayıp Copy diyin ve istediğiniz bir adda kopyalayın. Örnekte ben P:BIR adını seçtim. Sonra Modify (Simple)'ı seçecek Width/Height değerlerini değiştirin. Çok büyük değerler deliklerin çevresinde kalan bakırların birbirine değmesine yol açabilir. Benim önerim Width (En) için 70mil Height (Boy) için de 160 mil Shape (Biçim) olarak da Oval iyidir. Değişikleri yapıp OK dedikten sonra Pad style olarak yeni tanımladığımız Pad'i seçip tekrar OK diyince artık geniş Pad yerleştirilmiş oluyor. Diğer Pad'ler için yine Properties'e gelip çıkan arabirimde Pad Style olarak yeni oluşturulmuş Pad'i seçip OK deyince diğer Pad de büyütülür. Elbette bunları tek tek yapmak sıkıcı olacaktır. Fare imlecindeyken CTRL'ye basılı tutarak hoparlöre ve potansiyometreye ait delikleri seçip hepsini bir seferde değiştirmek olası. Ancak böyle yapınca potansiyometreye ait deliklerin uzun tarafları birbirlerine yakın olacaktır. Daha düzgün olması için bir Pad daha tanımlayacağız. Bu seferkinin eni 160mil boyu 70 mil olacak. Yani eskisinin 90 derece dönmüşü olacak. Herhangi bir deliğe tıklayıp aynı şekilde özelliklerden varolan bir delik biçimini kopyalayıp en ve boy değerlerini değiştirmek yeterli.

Bundan sonra devre elemanlarının bacaklarını da bu deliklere uyduralım. Benzer elemanlar CTRL ile toplu seçilerek değiştirilebilir. Örneğin RES400'lerin tümünü seçip sağ tuşla tıklıyorum ve Properties'i seçiyorum. Çıkan arabirimde Pattern Pads sekmesine gidiyorum ve solda A ve B olarak gördüğüm iki tür deliği de seçiyorum. Normalde dikkat edilirse dirençlerin bir bacağı kare diğer bacağı yuvarlaktı. A kare olan bacak, B yuvarlak olan bacak. Genelde bu türden bir farklılaşma kutupları fark eden devre elemanlarında birinci bacağı belirtmekte kullanılır. Örneğin elektrolitik kondansatörün + bacağını yada entegrelerin birinci bacaklarını ayırdetmek için kare delik koymak mantıklıdır. Dirençte böyle bir farklılaşma olmadığından ben her ikisine de oval delik koyacağım. Her iki deliği de (A ve B) seçtikten sonra Pad Style olarak P:IKI'yi (fark etmez P:BIR de seçilebilir ama P:IKI bana daha güzel göründü.) seçiyorum ve alttaki Apply düğmesine basıyorum. Sadece A'yı değiştirirseniz sadece kare olan bacaklar değişir. Benzer biçimde LED'leri seçip her iki deliğini P:IKI yapıyorum. Burada dikkat edilmesi gereken LED'lerin bacakları birbirine yakın olduğundan P:BIR yapılırsa bakırlı yollar birbirine değecektir. CAP200 ve CAP200RP'yi birlikte seçip Properties'i seçince Pattern Pads sekmesine tıklanmıyor. Bunun nedeni daha önce dediğim gibi aslında her ikisi de kondansatör olsa bile ikisinin türünün farklı olması. Dolayısıyla aynı işlemi CAP200 için ayrı CAP200RP için ayrı yapmam gerekli. Son olarak entegre kaldı. Bunun için yine Pattern Pads de sekiz bacağını birden seçip Pad Style olarak P:IKI seçilebilir. Eğer birinci bacağın Pad'i dikdörtgen olması istenirse tekrar bir Pad tanımlayıp boyutları aynı fakat shape olarak Rectangle seçmek gerekli. Yazıyı çok uzatmamak için ayrıntısına değinmeyeceğim. Ben olduğu gibi bıraktım.

Pad'leri değiştirdikten sonra baskı devrenin görünümü.
Bu aşamada baskı devrede sadece bağlantıları tanımladım ama bakırlı yolları çizmedim. Bu biçimiyle diske kaydediyorum ancak kaydederken ASCII olarak kaydedicem. Binary olarak kaydetmemin bir zararı yok ama Autorouter'ı kullanırken zaten kendisi ASCII'ye çevireyim mi diye soracak.

Bakırlı yollar, sol üstte ikinci satırda (fare simgesinin altında) Route Manual aracıyla elle çizilebilir. Yapmam gereken Route Manual'i seçtikten sonra herhangi bir deliğe tıklamak. Tıkladıktan sonra o Net'in rengi değişecek (Highlight) sonra o Net'e bağlı başka bir deliğe tıklayıp yolu götürecem; sağ tuşla tıkladığımda da bakırlı yol çizilmiş olacak. Yol üst katmanda olduğundan, kırmızı görünecek. Diğer taraftan üzülerek belirtmeliyim ki bilgisayarın kendi algoritmasıyla çizdiği yol, en azından benim çizdiğim bütün yollardan genel olarak daha iyi oluyor ve otomatik yol çizimi basit bir devre için bile en az bir saatlik işten kurtarıyor. Otomatik yol çizimi için Route menüsü altında Autorouters'ı seçip gelen arabirimde Autorouter olarak Quick Route'u seçiyorum. Quick Route PCAD'in kendi yol çizme programı. İstenirse SPECCTRA adlı yazılım yüklenerek yol çizimi SPECCTRA'ya da yaptırılabilir. Öncelikle Quick Route'u seçip Start diyorum. Devrenin çizilmişi çıkıyor.


Bu haliyle bende +'dan LED'e giden bir yolu çizemeyip mavi renkli bağlantı olarak bıraktı. Bunun nedeni hoparlör için koyduğum Pad'lerin birbirine yakın olmalarından dolayı arasından yol geçememesi. (Ben de sonradan fark ettim). PCAD ile yol çizdirince çizilmiş yolların olduğu dosya yeniden kaydediliyor ve başına bir R harfi ekleniyor (Route anlamında). Yapılacak şey hoparlör için bıraktığımız Pad'lerin arasını açmak. Bunun iki yolu var, hiç yol olmayan 'R'siz ilk dosyaya döner, deliğin arasını açarım yada yolların olduğu dosyada deliğin arasını açar tekrar yol çizdiririm (yada elle çizerim). R'li dosyaya baktığımda kılavuz noktaların yine yeşile döndüğünü görüyorum çünkü Autorouter, Routing Grid diye bir parametre alıyor ve 25mil olarak seçili. Bunun anlamı en yakın iki yol birbirine 25 mil'den daha yakın olamaz demek. Otomatik olarak kılavuz noktalar 25mil'e indirildi ama yeterli zoom olmadığından yeşil noktalar görünüyor. İstenirse en alt satırda 100mil'e geri alınabilir. Ben ilk dosyada sağdaki deliği biraz daha sağa aldım ve tümünü yeniden çizdirdim. Başka bir seçenek de iki delik daha ekleyip baskı devrenin üst katından köprüyle birleşmeyen yolları birleştirmek.


Şu haliyle herşey hazır ama yine yapılmasını tavsiye edeceğim ufak şeyler var. Birincisi her ne kadar Autorouter kullanmak elle çizmekten daha iyi olsa da Autorouter bir algoritma olduğundan bazı şeyleri kendisi akıl edemiyor. Bir numaralı RES400'ün yukarıdaki bacağını ele alalım. Bir tane entegrenin üçüncü bacağına giden düz bir yol çıkıyor ve entegrenin altıncı bacağına giden yolun dibinden geçiyor, bir de ayrı bir yol hoparlör deliklerine giderken aynı yerden 45 derece açıyla çıkıyor. 45 derece açıyla çıkan yol anlamsız onun yerine alttaki yolla T biçiminde birleşse daha iyi olacak. Ayrıca başka bir bakır yolun o kadar yanından geçeceğine iki numaralı direncin iki bacağı arasında kocaman boşluk var. Daha yukarıdan geçse baskı devreyi basarken biraz rahatlık sağlar. Özellikle Positive20 kullanırken eksik pozlandırmada birbirine çok yakın geçen yolların arası erimiyor. Veya üçüncü dirençten gelen yol entegrenin altıncı yerine yedinci bacağına bağlansa ortalık biraz daha ferahlar. Bu nedenle Autorouter'in çizdiği yollar her zaman elle düzeltmeye ihtiyaç duyuyor. Bunu yapmak oldukça kolay. Yerini beğenmediğim devre yolunu fare imleciyle tıklayıp seçtikten Delete tuşuyla siliyorum. Silinen yolun yerini yine mavi bağlantı alıyor. Bütün beğenmediğim yolları silip Routing Manual ile sildiğim yolları elle düzeltiyorum.

Bir diğer sıkıntı da yolların çok ince olması. Aslında Net'lerin özellikleriyle (Attribute) oynayarak bir çok özelliğini değiştirmek olası. Width özelliği de bakırlı yolların kalınlığını belirleyen özellik ancak bu birçok durumda özelliği değişen Net'in bakırlı yola dönüşememesine neden oluyor. Yollar için Autoroute arabiriminde 10mil gibi bir kalınlık veriyor ki bu da çeyrek milimetre anlamına geliyor. Belki CNC tezgahta işlenebilir ama elle yapmak için çok ince, üstelik yine üretimde Positive20 kullanılacaksa sıkıntılı. Maalesef PCAD yolların kalınlığını bir seferde değiştirme gibi bir olanak sunmuyor. Yol kalınlığı değişince çoğunlukla Routing Grid parametresinde de değişiklik yapmak gerekiyor. Yol kalınlıklarını değiştirmek için iki yöntem var. Birincisi Autoroute bittikten sonra bakırlı yola çift tıklamak (yada sağ tuşla tıklayıp Properties'den) ve çıkan arabirim penceresinden yol kalınlığını değiştirmek. Yine bunu bütün yollar için ayrı ayrı yapmak gerekiyor. Ben genelde plaket üzerinde yer varsa, yollar için 40mil'i tercih ediyorum ancak yer yoksa 25mil'e kadar azalttığım da oluyor.

Çizimdeki bazı yolları biraz kenara kaydırdım yada birbirinden uzaklaştırdım. Daha sonra entegrenin altındaki yolları 25mil diğer yolları 40mil olacak biçimde değiştirdim. Küçük küçük birden fazla değişiklik yaptığım için ekran görüntüsü koymadım sadece baskı devrenin yollar kalınlaştırıldıktan sonraki halini ekledim.




Yol kalınlıklarını değiştirmek için iki yol olduğundan bahsetmiştim fakat bunun için daha önce bahsettiğim SPECCTRA gerekiyor. SPECCTRA ayrı bir baskı devre programı. PCAD'in dışarıdan bu programı çağırmak için arabirimi bulunuyor. SPECCTRA kuruluysa Autorouter olarak seçilir. İlk defa kurulduğunda SPECCTRA'nın yolunun Autorouters arabirim penceresinde ayarlanması gerekiyor. Penceredeki Command Line düğmesine bastıktan sonra programın yolunu girmek yeterli. System Log ve Extra Options'da bir hata olduğundan düzgün biçimde ayarlanamıyor. Onu olduğu gibi bıraktım. OK diyip bunları geçtikten sonra Do Wizard düğmesine basıp çıkan pencerede Auto Create DO File demek gerekiyor. DO dosyası SPECCTRA'nın bakırlı yolları oluştururken kullanacağı parametreleri içeriyor. Ben bu pencereye OK diyip sonra Autorouter penceresinde Edit as Text düğmesine basarak parametreleri düzenlemeyi tercih ediyorum. Benim ilgilendiğim iki tane parametre var. Birincisi Grid Wire. Bu PCAD'in Routing Grid parametresiyle aynı, yani yanyana iki yol arasındaki en kısa mesafenin uzunluğu. rule pcb (width 10.0) parametresi de ikinci parametre; bakırlı yolların kalınlığını belirliyor. Bu değeri arttırınca bakırlı yolları biraz daha yaklaştırmak gerekiyor dolayısıyla Grid Wire'ı azaltmak gerekiyor. Width olarak 25..40 arası, Grid Wire'da 20..25 arası fena değil. DO dosyasını düzenledikten sonra Save'e basıp kaydediyorum ve Start'a basıyorum. Bazı durumlarda SPECCTRA çalışmayabiliyor. Bu SPECCTRA'nın yada PCAD arabiriminin uzun dosya adlarını düzgün desteklememesinden kaynaklanıyor. SPECCTRA, DSN uzantılı bir dosyada hata veriyorsa sekiz karakterden uzun dosya adlarını kontrol etmek gerekiyor hatta dosyayı kök dizinine taşıyıp oradan çalıştırmak kesin sonuç veriyor. SPECCTRA düzgün çalışınca Autorouter'lar arasında seçim soruyor. Ben genelde Interactive Router'ı tercih ediyorum ama aralarında belirgin bir fark göremedim. SPECCTRA işlemini yapıp sonlanıyor ve dosyanın bitmiş biçimi PCAD'e yollanıyor.

SPECCTRA'nın Autorouter'ı bazı yönlerden PCAD'den daha güçlü. Özellikle tek katmanlı baskı devrelerde genellikle parametrelerini düzenleyince PCAD'den daha iyi yol çiziyor ama PCAD çift katmanlı baskı devrelerde çok daha güçlü. Aslında çift katman baskı devrelerde PCAD'in stratejisi yatay yolları alttan dikey yolları da üstten geçirmek. Böylece her katmanda mümkün olduğu kadar birbirine paralel yollar kalıyor. (Bu arada bunları yazarken birşey daha fark ettim. Üst taraftaki LED'i 90 derece çevirince yollar daha kolay belirleniyor. Bundan sonraki ekran görüntülerinde çevirilmiş LED'i kullanacağım.) SPECCTRA daha başarılı olsa da PCAD'deki gibi elle müdahale edilmesi gereken anlamsızca çizilmiş yollar kalabiliyor. SPECCTRA'ya yolları çizdirip elle biraz üzerinden geçtikten sonra aşağıdaki baskı devreyi elde ettim.


Herşey hazır gibi. Bundan sonra son küçük değişiklikler kaldı. Birincisi, devrenin girişine hangi ucun artı hangisinin eksi ve besleme geriliminin ne kadar olduğunu yazmak. Bu, devreye sonradan baktığınız zaman nereye kaç volt vermek yada multimetreyle nereden kaç volt okumak gerektiğini bilmek için çok gerekli. Onun haricinde ben devrenin boş bir köşesine adımı ve devreyi çizdiğim tarihi yazmayı seviyorum. Yıllar sonra bakıp ne zaman nasıl birşey tasarladığımı görmek hoşuma gidiyor. Bunları eklemek için yazı ekleme gerecini kullanmak gerek. Bir de bence en eğlenceli olan kısım baskı devreye bakır alanlar eklemek. Demek istediğim özellikle alıcı yada verici gibi devrelerde vardır. Baskı devre üzerindeki bakırlı alanlar sadece yollar geçecek şekilde yukarıdaki resimde olduğu gibi açılmaz. Onun yerine yolların sadece kenarları bakırdan ayrılır, boş alanlarda toprağa yada hiçbiryere bağlı olmayan bakırlar bırakılır. Bu hem bana güzel geliyor hem de devreyi demir3klorüre atınca erime zamanını azaltıyor. Benim gibi sabırsızsanız tercih edilebilir. Bunu yapmak için sol tarafta yazıyla çizgi arasında Place Copper Pour gereci var. Onu seçiyorum. Top katmanındayken en başta baskı devrenin sınırlarını çizgilerle belirlediğim gibi plaketin kenarlarından biraz daha içeriye bir yere Copper Pour ile benzer bir kare çizip sınırları belirliyorum. Sağ tuşla tıklayınca anlamsız bir kare oluşacak. Sonra fare imleciyle kareye çift tıklayıp Properties'den Connectivity sekmesinde NET00001'i (yani toprak) ve Style sekmesinden de Poured ile Pattern'de istediğim bir deseni seçiyorum (bence çaprazlı güzel). Backoff parametresi kalacak bakırla yollar arasında ne kadar mesafe olacağı belirleniyor. Çok yakın olmamasında yarar var. Island Removal sekmesinde istenirse belli bir alandan küçük kalmış, içerilerde kalan yada yollardan ötürü seçilen Net'e bağlantısı yapılamamış adacıklar oluşmaması sağlanabiliyor. OK dedikten sonra boş alanlardaki bakırlar bırakılıyor. İstenirse hiçbir yere bağlı olmayan bakır alanlar da bırakılabilir. Şekilde adacıklara bağlı mavi bağlantılar yollardan dolayı hiçbiryere bağlanamamış adacıklara bağlı. Bunların oluşması sorun değil.

Herşey hazır.

Şimdi bunun çıktısını almak lazım. File menüsünden Print'i seçince maalesef herşey hallolmuyor. Setup Print Jobs'a basıp hangi katmanda nelerin kağıda basılacağını seçmek gerekiyor. En üstteki Print Job Name'e herhangi bir ad yazın. Bakırlı katman için Top katmanını seçin. Baskı devrenin sınırlarını da eklemek için CTRL'ye basılı tutarak Board katmanı da seçilmelidir. En sağdaki Display Options'da Pads ve Pad/Via Holes seçili bulunmalıdır. Çift katmanlı devreler için Vias seçeneği de seçilmesi gerekir. Bu haliyle Add düğmesine tıklanır ve bir baskı işi oluşturulur. Kağıda yada PNP kağıdına baskı alınacaksa bu hali yeterlidir. Asetata baskı alıp Positive20 ile çalışılacaksa Display Options'da Mirror'u da seçmek gerekebilir. Ayrıca bakırsız taraf için devre elemanlarının sembolleri, değerleri hatta şekilleri yani Top Silk katmanı basılacaksa ayrı bir çıktı almak gerekir. Bu nedenle başka bir Print Job Name daha verilir ve bu sefer Top Silk, Board katmanları seçilir. Ref Des, Type, Value vb. gerekli değerler seçilir. Çift taraflı devrenin alt katmanı için de ayrı iş tanımlamak gerekir. Close düğmesine bastıktan sonra Print Preview ile baskı kontrol edilebilir yada Generate Printouts ile seçilen işler varsayılan yazıcıya yollanır. (Başka yazıcıyı Print Setup ile değiştirin.) File menüsünde görüleceği üzere PCAD'in Gerber yada Drill çıktısı da var yani CNC tezgaha doğrudan çıktı yollamak da mümkün.

Biraz uzun bir yazı oldu. Bir CAD programının bildiğim kadarını etraflıca anlatmaya çalıştım artık ne kadar başarabildimse. Bundan sonra bir ara zamanım olursa çizilmiş baskı devrenin nasıl üretileceğini anlatacağım.