PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?

Başlatan z, 04 Nisan 2012, 13:20:25

Tagli

Gökçe Tağlıoğlu

z

Alıntı yapılan: mufitsozen - 05 Nisan 2012, 17:04:52
open source PCB programi var, inceleyerek aradiginiz cevaplari bulabilirsiniz.

http://pcb.gpleda.org/pcb-cvs/pcb.html

Hocam source kodları bulamadım. Nerede bu pcb programının kodları?

Alıntı yapılan: Tagli - 18 Nisan 2012, 13:01:58
kicad'in kodları incelenebilir.

Aynı şekilde Kicad kodlarını nereden bulacağım?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Bu kodlardan bana hayır yok. Bütüne hakim olmadan istediğim fonksiyonu çekip çıkartmam, buna ait değişkenleri ve bunların kimlerden etkilendiğini arayıp bulmam samanlıkta iğne aramak gibi.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

elektronikhobi

Aslında tam olarak bu kod bir nokta ile bir çokgenin kesişip keşişmediği test ediliyormuş. comp.graphics.algorithms.faq 2.03 numaralı sorudan aldım.

http://www.faqs.org/faqs/graphics/algorithms-faq/

    int pnpoly(int npol, float *xp, float *yp, float x, float y)
    {
      int i, j, c = 0;
      for (i = 0, j = npol-1; i < npol; j = i++) {
        if ((((yp[i]<=y) && (y<yp[j])) ||
             ((yp[j]<=y) && (y<yp[i]))) &&
            (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))

          c = !c;
      }
      return c;
    }


Tabi bu şekilleri oluşturmak için nesneye yönelik bir programla dili kullanmak daha kullanışlı olur.

import vector2;
import sdl;

struct Nokta
{
    int x = 0;
    int y = 0;
    Renk renk;

    this (int x, int y, Renk = Renk.beyaz)
    {
        this.x = x;
        this.y = y;
        this.renk = renk;
    }
}

/* */

struct Dikdörtgen
{
    Vector!(int) konum;

    int genişlik;
    int yükseklik;
    Renk renk;

    this(Vector!(int) konum, int genişlik, int yükseklik, Renk renk = Renk.beyaz)
    {
        this.konum = konum;
        this.genişlik = genişlik;
        this.yükseklik = yükseklik;
        this.renk = renk;
    }
}


Örneğin bu da D ile yazılmış temel şekiller örneği.  Sonra çizici diye bir nesnemiz olabilir ve o da kendine verilen şekilleri çizebilir. Örneğin çizgi, dikdörtgen, çember vs.. gibi..

http://bit.ly/ILxOo7

elektronikhobi

Bir de şöyle bir şey var çizgi çizmeyle ilgili. Çizgi için sadece iki noktanın koordinatlarını tutmak yeterli. Örneğin fare ile üzerine geldiğimizde farenin de iki koordinatını grafik kütüphanesi istediğimiz zaman bize verebiliyor.

Bir çizginin denklemi mx+n şeklinde. Yani grafiği direncin akım gerilim ilişkisi gibi. Aslında farenin koordinatlarını bildiğimize göre teorik olarak çizgi denkleminde bu noktayı kullanarak çizgi üzerinde karşılık gelen noktayı basitçe bulabiliriz. Ama pratikte çizgiyi çizmek için Bresenham'ın çizgi algoritması kullanılıyor. O yüzden aslında ekran piksellerden oluştuğu için çizgi aslında tam düz değil.



Ama gene aynı mantıkla kullanıcının aslında nereye tıkladığını bu algoritmada yerine koyarak çizdirebiliriz.

http://free.pages.at/easyfilter/bresenham.html

http://www.cs.toronto.edu/~smalik/418/tutorial2_bresenham.pdf

z

@elektronikhobi

BMP formatinda bir dosyada herhangi bir egime sahip uc uca bagli cizgiler olsa yazilacak bir program bu cizgilerin herbirinin baslangic ve bitis koordinatlarini nasil bulur?



Mesela dosyamizda resimdeki gibi cizgiler olsa ve programimiz x1,y1,x2,y2....x5,y5 degerlerini bulsa.

Bu soruda nasil bir mantik yurutulur?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

elektronikhobi

Ama o zaman bu işlem resim işlemeye girer.

Resim işleme de tamamen farklı bir şey. O konuyu da bilmiyorum  ::)

Örneğin wolfram alpha'ya böyle elle yazılmış bir formül vs.. verdiğiniz zaman onu okuyup gerekli hesaplamaları yapabiliyor.

Eğer bu bilgisayar ekranında bir çizim programında olsaydı. Örneğin nokta şeklinde bir nesne oluşturduğumuz zaman:

struct Nokta
{
     
    /* */
     
    this (int x, int y, Renk = Renk.beyaz)
    {
        this.x = x;
        this.y = y;
        this.renk = renk;
    }
}


dikkat ederseniz her Nokta nesnesinin kurucu işlevinde x ve y koordinatlarının geçerli bir değer alması sağlanıyor. Sonra nesneye yönelimli programlamanın bir kolaylığı olarak artık Nokta nesnelerinin her zaman geçerli olduğunu bildiğim için ik noktadan bir Çizgi nesnesi oluşturabilirdim.

struct Çizgi
{
    Nokta[2] Çizgi;

    this(Nokta bir, Nokta iki)
    {
        Çizgi = [bir, iki];
    }
}


Sonra Çizici nesnem de kendisine verilen bir çizgiyi şu şekilde çizebilirdi.

    void çiz(Çizgi çizgi, Renk renk = Renk.beyaz)
    {
      /**/
     }


Yani anlatmak istediğim bu işlemler bir baskı devre programında olsaydı. Bu değerleri bizim programımız çizgi nesnesi oluşturulduğu andan itibaren biliyor ve bunlar geçici bellekte tutuluyor. Program içinde o nesneyi oluşturduktan sonra oluşturduğumuz tüm nesnelerin koordinatlarını zaten biliyoruz. Bu bilgiler geçici bellekte tutuluyor. Bize sadece bu değerleri kullanmak kalıyor.

z

Alıntı YapAma o zaman bu işlem resim işlemeye girer.

Resim işleme de tamamen farklı bir şey. O konuyu da bilmiyorum

Yok oyle bu is resim islemeye girer deyip kenara cekilmek.

Cunku bir ustteki yazinda

Alıntı YapAma gene aynı mantıkla kullanıcının aslında nereye tıkladığını bu algoritmada yerine koyarak çizdirebiliriz.

demistin.

Bilmem alakayi kurdunmu? komsu noktalardan olusan bir dogru nerede egim degistiriyor gibi bir sorunun cevabi araniyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Çizgilerin  tek pixel genişliğinde olduğunu varsayıyorum.

Öncelikle bitmap i tarayıp  siyah bir pixel yakalanır.  Sonra iz takip edilerek çizgi izlenir. Bitmapin yapsında dolayı  0-90-45 lik eğimlerin dışında eğime sahip olan çizgiler 2sağa 1 yukarı gibi belli bi paterni takip ederek gider.
Ancak bu paterni direkt bitmap üzerinde aramak zor olacağından yüzlerce, binlerce de olsa küçük doğru parçaları oluşturmak daha kolay..
Sonra elimizdeki doğru parçalarını Douglas-Pecker gibi bir algoritmada işleyip bunu 0-90-45 den farklı bir eğime sahip tek bir doğru parçası haline getirmek mümkün..   
Douglas-Pecker de işlenirken birleştirilecek doğru uzunluklarını, açıları tanımlamak mümkün.. Yüzlerce dğru parçacığından 10 adet doğru veya abartılırsa tek bir doğru elde edilebilir. 



z

Bir zamanlar bu konuyla ilgilenmiş ve bazı programlar yazmıştım. Ancak bu programlar vektörlerden bmpye gecmeyi ve milyonlarca pixelin komşuluk ilişkilerinin tek tek sınanmasını gerektiriyordu.

Durum böyle olunca da PC nin 3x4 cm ebatlarında bir pcb için sonuca ulaşması bile inanılmaz uzun süreler alıyordu.

Konuyu biraz daha açacak olursam,

Bir pcb çizdiğinizi varsayın. Bu pcbnin mekanik yöntemlerle kazınması işleminde ben yolun iki kenarından takım yarı çapı kadar uzaktan kazımak yerine komşı iki yolun tam ortasından geçen hattı kazıtıyordum.

Bunun için herhangi bir bakır noktacığın 4 bir yöndeki komşuluklarına bakarak kazıma yörüngesinin tespiti gerekiyordu.

Fakat bu işlemleri bmp yapmak dediğim gibi zaman alan bir işlemdi.

Örnek olarak 3x4 (cm) ebatlarındaki bşr PCB yi 20um çözünürlükteki mekanizma ile işlemek için gerberden bmpye geçiş yaptığımda

30000/20=1500
40000/20=2000

yani 1500x2000  yani 3milyon pixel ile çalışma gerekiyordu.

Çizilen bir PCB de asitle eritilecek kısımların alanını minumum yapacak algortima için konuşmak isteyenler varsa dinlemeye hazırım.

Konunun özü: Birbirinden izole komşu iki bakır yol arasındaki çizgiyi bulacak bir algoritma.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

@z, bu tip bir şey kazıma süresi açısından iyi olabilir, orijinali kazımaktan en az iki kat daha hızlı..  Ama PCB yi orijinal halinden uzaklaştıracak.
Mesela başka bir başlıkta çok yakın yollar, yüksek voltaj ve atlama gibi bir konu vardı.. 

Kendi adıma orijinal görünümlü PCB çıkartmayı tercih ederim, üstelik hesabı da daha kolay.. Ama bu benim tercihim.

Önce sanki sıfır kalınlıkta uçla kazıma yapacakmış gibi vertisler-doğru parçaları yönleri ile birlikte bulunur. 
Bunun için gerber çizildikten sonra bitmap  üzerinden çalışmakta olabilir, gerberin tarif ettiği, aperture lar ile çizilmiş parça parça geometrik şekilleri poligon olarak düşünüp, bu poligonlar toplanabilir de.

Toplanmış bir poligon bize bir Net' i tarif edecek. Poligonların yönleri örneğin CW olacak..
Bu durumda yönü Y ekseninde 90 derece yukarı olan doğru parçasının sağında bakır kalacağını  biliyoruz.  Poligonların hepsi CW olduğundan 90 derece yönü olan daha doğrusu y ekseninde pozitif yönü olan bir doğru parçasının karşısında yönü negatif olan bir doğru parçası olacak. En yakın negatif yönlü doğru üzerinde çalıştığımız doğru parçasının eşleğini olur.  Bu iki doğrunun ortasından çizilecek çizgi istediğimiz kazıma izi olmalı.

En yakın doğruyu bulmak nasıl olur?
Net bir fikrim yok ama aklıma birinci poligonun bir noktasında, bu noktaya komşu iki doğrunun oluşturduğu dış açının yönünde bir doğruyu açı noktasından pcb sınırına veya yeteri kadar uzun çizip, başka bir poligona ait ve negatif yönlü bir doğru ile keşisme noktası en yakın olan doğrudur gibi geliyor.   Kesişme noktası ile birinci poligona ait nokta arasındaki doğru parçasının ortası kazınacak yolun başlangıç noktası olacak.. Birinci poligonun bir sonraki noktası için de aynı işlem yapılıp  kazınacak yolun bir sonraki noktası bulunur.
Yanlışım yoksa bu şekilde PCB de izolasyon sağlanmış olur ancak gereksiz hatta hatalı kazımalar da olacak ve gereksiz boş adacıklar oluşacak..
Kazıma izlerinin optimizasyonu gibi birşeye de kafa yormak gerekir. En azından kazıma izleri  ile doğru parçalarının kesişmesine bakılıp kazıma izleri gerektiği yerde kesilmeli . Bu yöntemde özellikle çember parçası gibi şekiller yüzlerce doğru parçasından oluşacağından zaman açısından sıkıntı çıkabilir.

Birde bakır olmayan kısmı poligon olarak düşünüp bunun üzerinde işlem yapılabilir. Bu durumda kazıma izi bu poligonun içerisinde olacağından test edilecek doğru parçalarının sayısı daha az olur. Bu durumda yöntem içeriye bakan açılar üzerinden çalışmalı..

Kafa yormak lazım.. Zamanında bu konuda düşünüp, zor geldiği için hiç girmemiştim. Deiğim gibi orijinal PCB çıkartmanın hesabı-yöntemi daha kolay..

z

Bahsettiğim yöntem orjinal pcbyi kazımaktan 2 değil belki 20 kat daha hızlı. Çünkü büyük boyutu pcb kazımalarında kazıma yollarını kendim elle çizerek sayısız pcb yaptım. Kazınması gereken mesafe inanılmaz kısalıyor.

Yüksek frekansları bilemem ama 300v DC beslemeyle çalışan devrelerde yolların aralarını 0.3mm kazıyarak sorunsuz çalıştırdım.

Neden sorun çıkmadı? Çünkü 0.3mm hava boşlupu oluştu. Kazıma sonrası oluşan kanal, 0.3mm yol mesafesini uzattı. (Toz yada nem için iki  yol arasındaki mesafe kanal yüksekliğinin 2 katı kadar uzadı)

Ben bu tip kazıma yöntemini prototip yapma aşamasında tercih ediyorum. Gün içinde bir kaç farklı pcb kazıyıp deneme mak mümkün.

Üretim aşamasında zaten orjinal PCB bastırılacak.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Alıntı yapılan: z - 20 Nisan 2012, 11:28:06
Bahsettiğim yöntem orjinal pcbyi kazımaktan 2 değil belki 20 kat daha hızlı.


Gerbere uygun şekilde kazınıp, bakırı tam boşaltmayıp, tek geçişte kazıma yapıldğı duruma göre sizin yönteminiz en fazla 2 belki 2.5 kat hızlı olabilir.  Ayrıca ekstra hesap zamanı da var. 2 hız kat farkında anlaşalım.


z

Alıntı yapılan: iyildirim - 21 Nisan 2012, 05:36:18

Gerbere uygun şekilde kazınıp, bakırı tam boşaltmayıp, tek geçişte kazıma yapıldğı duruma göre sizin yönteminiz en fazla 2 belki 2.5 kat hızlı olabilir.  Ayrıca ekstra hesap zamanı da var. 2 hız kat farkında anlaşalım.

Belki biraz abarttim belki de az soyledim.

Neden bu yonten daha hizli?

PCB uzerinde kesismeyen N yol olan bir bolumden kucuk bir kesit aldigimiz varsayalim.

Klasik usulde 2N tane, Bahsettigim metodda ise N+1 tane yol kazimasi yapmak gerekir.

2N / N+1 = ~ 2

Fakat sadece buradaki anlatima gore bahsettigim yontem 2 kat hizli demek yaniltir.

1) Pcb kazima isleminde z ekseni, kazima asamasinda once inmek kazima bitiminde ise kalkmak zorunda.

Bahsettigim yontemde z ekseni cok az sayida inip kalkma yapmak zorunda.

2) Kesici ucun, yolu paralel olarak izlemesi yerine,  elektrisel anlamda en kisa yoldan kazimasi yolu ve zamani kisaltmakta.

3) Sayet motorlara kumanda eden vector hesaplayici look a head algoritmasi kullanmiyorsa 2. maddeye bagli olarak surekli yon yada
egim degistiren her bir yolda  hizlan-sabit hizla git-yavasla-dur-hizlan-sabit hizla git-yavasla-dur  isleminindeki zaman kayiplari tamamen yok olmakta.

Bu nedenlerden dolayi bahsettigim yontem klasik yonteme kiyasla en az 20 kat daha hizlidir dedim.

Bu oran, pcb uzerindeki yollarin geometrisine ve dagilimina gore degisim gosterir.



Yukaridaki ornek pcb ciziminde siyah hatlar klasik usuldeki kazima hatlarini, kirmizilar ise benim bahsettigim yontemdeki kazima hatlarini gostermekte.

Fakat ilk hesaplama gercekten zaman aliyor. Kazima yollarinin nereden gececegini bilgisayara hesaplatmak yerine pcb ciziminden sonra ayri bir layera
kendim ciziyorum. Bu isi PC ye benden daha hizli hesaplatacagim gunler yakindir umarim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com