Sonuçlar 1 to 1 of 1

Konu: Analog Giriş ve Basit Robot Gözü

  1. #1
    UFB16
    Guest

    Default Analog Giriş ve Basit Robot Gözü

    Analog Giriş ve Basit Robot Gözü


    Tüm elektronik hobi okurlarına merhaba. Geçen ay paralel port üzerinden DC motor kontrolünü anlatacağımı söylemiştim. Fakat ondan önce Sayısal/Analog veri dönüşütürücülerine değinmek gerektiğini farkettim. En azından bir DC motor hız kontrol devresi yapabilmemiz için, böyle bir dönüşüme ihtiyacımız olacaktır. Bu ay analog sinyalleri sayısal veriye dönüştürmekten bahsedeceğiz ve robotların etrafındaki cisimleri algılamasını sağlayacak basit bir robot gözü uygulamamız olacak.

    Bizim bu güne kadar uğraştığımız sinyallerin hepsi sayısaldı. Yani sinyalin “1” yada “0” olması durumunu inceliyorduk. Dolayısı ile lojik voltajımızın değeri, “1” olduğunda +5 Volt, “0” olduğunda ise 0 Volt oluyordu. Analog sinyallerde ise bu voltajın değeri 0 ile 5 volt arasında değişebilir. Bir ADC ile (Analog – Digital Converter) fiziksel değerleri ( ısı, basınç, kütle, ışık yoğunluğu ) sayısal değerlere çevirebilirsiniz. Böylece PC ‘nizi dış dünyayı izleme aracına çevirebilirsiniz. Daha sonra bu ölçümler sonucunda üzt düzey kararlar vermeye programlayabilirsiniz. Örneğin oda sıcaklığı belli bir dereceye ulaştığında PC ‘nizle ısıtma sistemini kapatabilirsiniz.

    Bir sıcaklık sensörü, elde ettiği sıcaklığın sonucunda bize 0-5 volt arasında bir değer verebilir. Biz de bu değer üzerinden gerekli dönüşümü yaparak hangi voltajın hangi sıcaklığa denk geldiğini hesaplayabilir ve işlemler yapabiliriz. Herhangi bir ölçüm sonucunda elde edeceğimiz voltaj eğer 5 volt ise bu voltajı ADC ile sayısal veriye dönüştürdüğümüzde elde edebileceğimiz değer 255 olacaktır. Kısacası 0 ile 5 volt arasındaki analog değerler, 8-bitlik sayısal veriye dönüştüğünde 0-255 arasında değerlere denk gelecektir.
    Analog-Dijital dönüşüm yapılabildiği gibi bunun tam tersini de yapmak mümkündür. Örneğin DATA pinlerine göndereceğimiz 0-255 arası sinyaller ile 0-5 Volt arasında bir voltaj gerilimi elde etmeniz mümkün olabilir. Kullandığınız ADC ve DAC (Digital-Analog Converter) tipine göre analog giriş değerleri değişebilir. Örneğin 255 sayısal sinyali ile +12 volt elde edebilmenizde mümkün olabilir.
    Daha önceki uygulamalarımızda paralel portun STATUS pinlerini kullanarak bir tür veri girişi gerçekleştirmiştik. Bu ay ki uygulamamızda paralel portu kullanarak ilk gerçek veri girişini gerçekleştireceğiz. Paralel portun DATA pinlerini bugüne kadar sadece veri çıkışı için kullandık. Yeni teknolojiye sahip paralel portlarda bu DATA pinlerini 8-Bitlik veri girişi için kullanmata mümkündür. Bu işlemi gerçekleştirebilmek için ana kartınızın BI-DIRECTIONAL port tipini desteklemesi gerekmektedir. Bilgisayarınızın BIOS ayarlarına girdiğinizde, paralel port tipini değiştirmeniz mümkün olacaktır. DATA pinleri ile veri girişi yapabilmemiz için port tipinizi BI-DIRECTIONAL yapmalısınız.
    Bu güne kadar uygulamalarımızı hep paralel port üzerinde gerçekleştirdik. Fakat uygulamalar geliştikçe bu port bize yetersiz kalmaya başlayacak. Öyle uygulamalar olacak ki, hem 8-bit veri girişi hemde 8-bit veri çıkışını aynı anda yapmamız gerekecek. Bu sebeple, önümüzdeki ay, paralel port üzerinden çalışan 8255 programlama kitini tanıtacağım. Bu kit sayesinde, aynı anda 3 sayısal çıkış yada giriş yapmamız mümkün olacak. Bu kitin diğer bir faydası ise, gerçekleştirdiğimiz uygulamalarda oluşabilecek bir hata sonucu paralel portunuzu yakma riskinin önüne geçebilmemiz. Bu sayede uğrayabileceğimiz en büyük zarar en fazla bir kit parası kadar olacaktır.
    Bi-Directional paralel port ile veri girişi STATUS portundan farklıdır. STATUS portu ile girişi, pinin üzerindeki “1” lojik voltajı topraklayarak gerçekleştiriyorduk. DATA portları ile veri girişini ise, bu pinlere lojik voltaj göndererek gerçekleştirebiliyoruz. Bu yazımda ilk kez Visual Basic komutlarının dışında, C++ ve DELPHI komutlarından da bahsedeceğim. DATA portundan veri okumak için INP komudunu DATA portunuzun adresinde kullanmanız gerekmektedir.Çok basit olarak paralel porta veri göndermekten ve almaktan tekrar bahsetmek istiyorum. Paralel portunuza verilen adres üç alt porta şu şekilde dağılır. Örneğin paralel portunuzun taban (base) adresi h0378 olsun. Bu durumda;
    DATA portu h0378
    STATUS portu h0378 + 1 yani h0379
    CONTROL portu ise h0378 +2 yani h037A olur.
    Paralel port kontrolü için Visual Basic yada C++ kullanacağız. Visual Basic altında OUT komudunu yada C++ altındaki OUTPORTB kullanarak DATA portuna 0-255 arasında gönderdiğimiz sayısal değer ile istediğimiz data pinlerinin lojik değerlerini “1” yapabiliyoruz. Data pinlerinden bir tanesinin “1” olması o pinin +5 Volt olması anlamına geliyor. DATA portundan 8 bitlik veri çıkışı alabiliyoruz. DATA portuna hiçbir veri göndermediğimiz zaman ki değeri “00000000” dır. Dikkat ederseniz 8 tane “0” var. Örneğin data portuna 25 değerini gönderelim. 25 değerinin ikilik sayı sisteminde karşılığı “00011001” dir. Bu durumda D4, D3 ve D0 pinlerine karşılık gelen lojik değerler “1” olduğundan o pinler +5 Volt olacaktır. Bu ayki uygulamamızda ise Bi-Directional port desteği sayesinde DATA portlarındaki veriyi okuyacağız. Yani D4, D3 ve D0 pinlerine karşılık gelen pinlere +5 voltluk lojik voltaj uyguladığımızda, bu porttan okuyacağımız değer 25 olacaktır.
    Paralel port üzerinde CONTROL portununa ait 4 tane pin vardır. Bu pinlerden C0,C1,C3 pinleri tersinmiştir. Yani tersinmiş olan bu pinlere veri göndermediğimiz zaman durumu “1” dir. Bu pinlerden bir tanesine veri gönderdiğimizde o pinin durumu “0” olacaktır. Diğer bir deyişle CONTROL pinlerinin düşük olan 4 bitine “1111” yazmanız halinde konnektördeki bitler “0100” olacaktır. Tersindirme olayına önceki sayılarımızda daha detaylı değinmiştik.

    C++ ile PORT GİRİŞ/ÇIKIŞ Komutları
    C++ altında veri giriş çıkış komutlarının kullanımı aşağıdaki gibidir. Bu komutları kullanabilmek için kütüphane dosyasını programınıza #include etmelisiniz.
    Veri göndermek için : OUTPORTB (port_adresi,byte)
    Veri almak için : Byte = INPORTB (port_adresi)
    DELPHI ve Assembly kullanımı ile PORT GİRİŞ/ÇIKIŞ Komutları
    // Gönderen : Yusuf Sertaç Gürsel < yusuf@sertac.com >
    {$R *.DFM}
    procedure portout(IOport:word;value:byte);assembler;
    asm
    xchg ax,dx //port'a değer göndermek
    out dx,al
    end;
    function portin(IOport:word):byte;assembler;
    asm
    mov dx,ax //port'taki değeri okumak için
    in al,dx
    end;

    Veri göndermek için : PORTOUT (port_adresi,byte)
    Veri almak için : Byte = PORTIN (port_adresi)




    Sayısal – Analog dönüştürücü (ADC) devresi :

    Devre için ihtiyacımız olan malzemeler;

    1 x ADC0804 Analog sayısal dönüştürücü,
    1 x 150 pF Kondansatör,
    1 x 10mF Kondansatör (isteğe bağlı)
    1 x 10K direnç,
    1 x BP109 yada uyumlu foto transistör
    1 x 1.5 Volt kalem pil

    Bir ADC entegresini programlamak oldukça kolaydır. Aynı Haziran sayısında anlattığım LCD panel kontrolüne benzer. ADC yi programlayabilmek için veriyi okuyacağımız DATA pinlerinin dışında, ADC nin RD ve RW pinlerini kontrol etmek için 2 tane CONTROL pinine, ERROR kontrolü içinde 1 tanede STATUS pinine ihtiyacımız olacak. Kullandığımız ADC0804, National Semiconductor firmasının yaygın olarak kullanılan analog-sayısal dönüştürücülerinden biridir. Entegrenin yapısı hakkında daha detaylı bilgi için http://www.national.com adresine bakabilirsiniz.



    ADC0804
    Pin İşlevi
    1
    Toprak (Ground)
    2
    RD Okuma Modu
    3
    WR Yazma Modu
    4
    CLK in Sayaç giriş (150pF Kondansatör ile sağlanacak)
    5
    intr (Hata kontrolü için Kesme üretir)
    6
    Analog V+ (Analog giriş)
    7
    Analog V- (Analog giriş)
    8
    Analog Toprak
    9
    Vref/2 (Devreye bağlamıyoruz) NC (Not Connected)
    10
    Sayısal Toprak
    11-18
    D7-D0 (Sayısal Çıkışlar)
    19
    CLK R Sayaç
    20
    Vcc +5 Volt çalışma Voltajı



    CONTROL portuna göndereceğimiz veriler ile ADC ‘yi şu şekilde programlıyoruz;

    Önce CONTROL portuna “32” sayısal değerini göndererek, C0 pinini “0” pini yüksek yapıyoruz. Neden? Çünkü C0 pini donanım tarafından terslenmiştir. Dolayısı ile pine “0” gönderdiğimiz zaman o pin +5 volt oluyor. Sonuçta ilk işlem C0 pinine bağlı olan RD pinini yüksek yapmak oluyor. Ardından, “36” sayısal değeri ile de WR pinini de yüksek yapıyoruz. Böylece entegre ADC veri dönüşümü için ayarlanmış oluyor. Daha sonra dönüştürülmüş sayısal değeri okumak için C2 pini yüksek tutulurken, C0 pini düşük yapılıyor. Veri bu sırada okunuyor ve hemen ardından C0 tekrar yüksek yapılıyor.



    Biraz karışık bir işlemmiş gibi gözüküyor fakat. Her zaman söylediğim gibi bu işleri kavrayabilmenin en kolay yolu bol bol uygulama yapmak. Okuyarak anlayamadığınız birçok kavramı uygulama sırasında anlamanız mümkün oluyor. Yani size söyleyeceğim, ben size sadece kapıları gösterebilirim. Kapılardan geçmek size kalıyor. Matrix filminde Morpheus, falcıya girmeden önce Neo ‘ya böyle söylemişti :-)

    Örnek programlarımız, ADC ‘nin 6 ve 7 numaralı konnektörlerine uygulanan 0-5 volt arası değerlerin 0-255 arasındaki sayısal değerlerini ekrana yazdırmaya yarıyor. Örneğin bu analog çıkışlara birtane kalem pil bağladığınız zaman ekranda elde edeceğimiz değer 70-80 arasındadır. Gerçektende 5 volt için elde edilecek değer 255 ise, 1,5 Volt için ise yaklaşık değer tam dolu bir pil için 76 ‘dır.

    ADC ‘nin RD ve WR konnektörlerine gönderilecek CONTROL portu sinyalleri
    Veri
    İşlev
    C7
    C6
    C5
    C4
    C3
    C2
    C1
    C0
    32
    RD (2) girişini yüksek (1) yapar.
    X
    X
    X
    X
    0
    0
    0
    0
    36
    RD (2) ve WR (3) girişlerini aynı anda yüksek yapar.
    X
    X
    X
    X
    0
    1
    0
    0
    37
    WR (3) ‘yi yüksek , RD (2) ‘yi düşük yapar
    X
    X
    X
    X
    0
    1
    0
    1


    ADC entegreleri oldukça hassastır. Yani ortamdaki voltajdan kolayca etkilenebilir. Elinizle analog girişlere dokunduğunuz zaman bile, ekrandaki sayısal değerde 1-2 derecelik bir artış meydana gelecektir. O bakımdan devreyi ortam voltajlarından etkilenmeyecek bir şekilde yapmanız gerekmektedir. Örneğin toprak olarak birbirinden farklı toprak kanallarını kullanmanızı öneriyorum. Paralel port üzerinde 18-25 arası pinler topraktır. ADC nin 8 ve 10 numaralı konnektörlerini birbirinden farklı topraklara bağlamak bu etkilenmeyi azaltacaktır.


    Elde edilen sayısal değerler ile bazı kararlara varmadan önce, tavsiyem elde edilen değerlerin ortalamasını almak ve belli bir aralıkta ise bir işlem yaptırmak. Şimdi anlatacağım robot gözü uygulamasında bu yöntemden yararlanmanız mümkün.

    Cisimin uzaklığını ışık şiddeti ile algılama (Basit Robot Gözü):

    Temel olarak gerçekleştireceğimiz uygulama oldukça basit. LEGO ‘nun Mindstorms serisi ile birlikte gelen ışık sensörü ‘de aynı mantık ile çalışmaktadır. Geçen ayki sayısımızda Foto transistör kullanarak STATUS pinlerinden bir tanesini tetiklemiştik. Şimdi ise foto transistör üzerine düşen ışık sayesinde, transistörün değişen iç direncini kullanarak ışığa bağımlı bir analog sinyal elde edeceğiz. Sonuçta foto transistöre bir cisim yaklaştığında üzerindeki ışık kaynağı azalacak ve iç direnç artacaktır. Direnç arttığında ise analog sinyalin değeri düşecektir.


    Foto transistörlerin normal transistörlerden tek farkı beyz ucundan yapılan tetiklemenin ışık şiddeti kullanılarak yapılmasıdır. Bu bakımdan genelde foto transistörlerin Beyz uçları kullanılmaz. Transistörün üzerinde küçük bir mercek bulunur. Tetikleme işlemi, bu merceğe ışık gönderilerek yapılır. Uygulanan ışığın şiddetine göre Emiter-Kollektör arasındaki iç direnç değişir ve yükün akımı kontrol edilebilir. Işığın şiddeti ile Emitör- Kollektör arası iç direnç ters orantılıdır. Yani Işık şiddeti arttıkça Emiter-Kollektör arası iç direnç düşecektir.

    Buradaki tek dezavantajımız, foto transistörün gün ışığından etkilenmesi. Foto transistörü ADC ‘nin analog girişlerine bağladığınızda ekrandan okuduğunuz sayısal değer normal aydınlatmada, 100-150 civarındadır. Transistöre cisim yaklaştıkça, yani ışık şiddeti düştükçe okunan bu değer 5-10 lara kadar düşebilmekte. Böylece cismin yaklaştığını anlamak mümkün olmakta.

    Eğer çok aydınlık bir ortamda iseniz, okunan bu değişimlerin değerleri farklı olacaktır. Bu problemden kurtulmak için ise ortam ışığının değerini robotunuza bildirmek yeterli sayılır. Bunun için robotun önüne koyacağınız cisim algılama amaçlı foto transistörlerin yanında, robotun tepesine öndeki cisimlerin gölgelerinden etkilenmeyecek birkaç foto transistör yerleştirmek ve bu transistörlerden okunan değerler ile bir ortam ışığı sayısal değeri belirleyip, bu değerler üzerinden çalışma yapmak. Bunun için ise robotların vazgeçilmez gereksinimi olan yapay zeka programlama işin içerisine giriyor.

    ADC veri okuma programı C++ kodu
    Kaynak: http://www.ucl.ac.uk/~ucapwas/ppadc.html#include #include // Sabit değişkenler tanıtılıyorconst c0=1, c1=2, c2=4, c3=8;const s0=1, s1=2, s2=4, s3=8;void main(){ // Port adresleri ayarlanıyor unsigned base, data, stat, ctrl; base=0x278; data=base; stat=base+1; ctrl=base+2; unsigned char value; int lc; for (int sample=0; sample<3000; sample++) { // ADC ‘den veriler okunuyor outportb(ctrl, 32); delay(50); // Gecikme için outportb(ctrl, 36); delay(50); // Dönüşüm işlemi tamamlanana kadar bekle (S3+, pini, Yüksek olana kadar) lc=0; do { lc++; } while (((inportb(stat) & s3)==0)); outportb(ctrl, 37); // set C0- ('D' pin 1 Düşük yapar)delay(50); value=inportb(data); outportb(ctrl, 36); // unset C0- ('D' pin 1 Yüksek yapar) delay(50); cout << "ADC degeri: " << (unsigned int)value << endl; }}ADC veri okuma programı VISUAL BASIC kodu
    Sub Command1_Click()
    Dim value as integer,t as integer,i as integer
    value = 0
    FOR i = 0 TO 30000
    OUT &H278 + 2, 32
    FOR t = 1 TO 15000: NEXT t ‘ Gecikme için
    OUT &H278 + 2, 36
    FOR t = 1 TO 15000: NEXT t
    DO WHILE (((INP(&H278 + 1) AND 8) = 0))
    OUT &H278 + 2, 37 ‘ set C0- ('D' pin 1 Düşük yapar) FOR t = 1 TO 15000: NEXT t
    value = INP(&H278)
    OUT &H278 + 2, 36 ’ unset C0- ('D' pin 1 Yüksek yapar) FOR t = 1 TO 15000: NEXT t
    Label1.Caption = value
    Label1.Refresh
    LOOP
    NEXT
    End Sub


    Bir diğer olasılıkta robotunuzun tamamen karanlık bir ortamda kalması. Düşünülenin tam tersine karanlık ortamlar robotların yön bulabilmeleri için mükkemmel ortamlardır. En önemlisi ortam ışığı yoktur. Foto transistörün arkasına yada yanına bir ışık kaynağı takılır. Robot ilerleyince, eğer önüne bir cisim çıkarsa arkadan gelen bu ışık cisim üzerinden foto transistörün merceğine yansır. Böylece cisim algılanır. LEGO ‘nun ışık sensörü, karanlık ortamlar için üzerinde bahsettiğimiz prensipte çalışan dahili bir led barındırmaktadır.

    Son anlattıklarım biraz teoride kalıyor çünkü, üzerinde paralel port ve bir PC taşıyan bir robot yapmak biraz zor olabilir. Ama tabiki imkansız değil. İleride PIC programlamayı öğrendiğimizde, bu devreleri PC ‘den bağımsız hale getireceğiz. LEGO ‘nun daha öncede bahsettiğim Robot tasarımı için geliştirilmiş Mindstorms serisi ile gelen RCX modülü, bu ışık değerini sayısal olarak algılayabilmekte ve bu değerler üzerinden motorları kontrol edebilmektedir. Zaten RCX kontrol devresi MIT üniversitesi labaratuarlarında, gerçek robotik devreler için geliştirilmiş bir çip içermektedir.


    (elektronikhobi.com)
    Last edited by UFB16; 08-07-08 at 17:58.

Similar Threads

  1. Bu robot her yere sığıyor-Solucan Robot
    By KPSS-2011 in forum Bilim ve Teknoloji haberleri
    CEvaplar: 0
    Son Mesaj: 30-11-11, 09:44
  2. Analog Saatin Grafik LCD’de Gösterilmesi
    By The Avatar in forum Projeler
    CEvaplar: 0
    Son Mesaj: 20-06-09, 02:06
  3. FlyTV Prime analog TV kartı driver
    By mustafa01_48 in forum Teknik yardım-Donanım Birimleri
    CEvaplar: 2
    Son Mesaj: 23-01-09, 00:51
  4. FlyTV Prime analog TV kartı driver
    By mustafa01_48 in forum Drivers(Sürücüler)
    CEvaplar: 1
    Son Mesaj: 25-09-08, 11:10

Tags for this Thread

Bookmarks

Gönderme izinleri

  • Yeni Konu açamazsınız
  • Konulara cevap yazamazsınız.
  • Eklenti gönderemezsiniz.
  • Mesajlarınızı düzenleme izniniz yok.
  •