Tüm elektronik hobi okurlarina merhaba. Geçen ay paralel port üzerinden DC motor kontrolünü anlatacagimi söylemistim. Fakat ondan önce Sayisal/Analog veri dönüsütürücülerine deginmek gerektigini farkettim. En azindan bir DC motor hiz kontrol devresi yapabilmemiz için, böyle bir dönüsüme ihtiyacimiz olacaktir. Bu ay analog sinyalleri sayisal veriye dönüstürmekten bahsedecegiz ve robotlarin etrafindaki cisimleri algilamasini saglayacak basit bir robot gözü uygulamamiz olacak.
Bizim bu güne kadar ugrastigimiz sinyallerin hepsi sayisaldi. Yani sinyalin “1” yada “0” olmasi durumunu inceliyorduk. Dolayisi ile lojik voltajimizin degeri, “1” oldugunda +5 Volt, “0” oldugunda ise 0 Volt oluyordu. Analog sinyallerde ise bu voltajin degeri 0 ile 5 volt arasinda degisebilir. Bir ADC ile (Analog – Digital Converter) fiziksel degerleri ( isi, basinç, kütle, isik yogunlugu ) sayisal degerlere çevirebilirsiniz. Böylece PC ‘nizi dis dünyayi izleme aracina çevirebilirsiniz. Daha sonra bu ölçümler sonucunda üzt düzey kararlar vermeye programlayabilirsiniz. Örnegin oda sicakligi belli bir dereceye ulastiginda PC ‘nizle isitma sistemini kapatabilirsiniz.Bir sicaklik sensörü, elde ettigi sicakligin sonucunda bize 0-5 volt arasinda bir deger verebilir. Biz de bu deger üzerinden gerekli dönüsümü yaparak hangi voltajin hangi sicakliga denk geldigini hesaplayabilir ve islemler yapabiliriz. Herhangi bir ölçüm sonucunda elde edecegimiz voltaj eger 5 volt ise bu voltaji ADC ile sayisal veriye dönüstürdügümüzde elde edebilecegimiz deger 255 olacaktir. Kisacasi 0 ile 5 volt arasindaki analog degerler, 8-bitlik sayisal veriye dönüstügünde 0-255 arasinda degerlere denk gelecektir.Analog-Dijital dönüsüm yapilabildigi gibi bunun tam tersini de yapmak mümkündür. Örnegin DATA pinlerine gönderecegimiz 0-255 arasi sinyaller ile 0-5 Volt arasinda bir voltaj gerilimi elde etmeniz mümkün olabilir. Kullandiginiz ADC ve DAC (Digital-Analog Converter) tipine göre analog giris degerleri degisebilir. Örnegin 255 sayisal sinyali ile +12 volt elde edebilmenizde mümkün olabilir. Daha önceki uygulamalarimizda paralel portun STATUS pinlerini kullanarak bir tür veri girisi gerçeklestirmistik. Bu ay ki uygulamamizda paralel portu kullanarak ilk gerçek veri girisini gerçeklestirecegiz. Paralel portun DATA pinlerini bugüne kadar sadece veri çikisi için kullandik. Yeni teknolojiye sahip paralel portlarda bu DATA pinlerini 8-Bitlik veri girisi için kullanmata mümkündür. Bu islemi gerçeklestirebilmek için ana kartinizin BI-DIRECTIONAL port tipini desteklemesi gerekmektedir. Bilgisayarinizin BIOS ayarlarina girdiginizde, paralel port tipini degistirmeniz mümkün olacaktir. DATA pinleri ile veri girisi yapabilmemiz için port tipinizi BI-DIRECTIONAL yapmalisiniz.
Bu güne kadar uygulamalarimizi hep paralel port üzerinde gerçeklestirdik. Fakat uygulamalar gelistikçe bu port bize yetersiz kalmaya baslayacak. Öyle uygulamalar olacak ki, hem 8-bit veri girisi hemde 8-bit veri çikisini ayni anda yapmamiz gerekecek. Bu sebeple, önümüzdeki ay, paralel port üzerinden çalisan 8255 programlama kitini tanitacagim. Bu kit sayesinde, ayni anda 3 sayisal çikis yada giris yapmamiz mümkün olacak. Bu kitin diger bir faydasi ise, gerçeklestirdigimiz uygulamalarda olusabilecek bir hata sonucu paralel portunuzu yakma riskinin önüne geçebilmemiz. Bu sayede ugrayabilecegimiz en büyük zarar en fazla bir kit parasi kadar olacaktir.Bi-Directional paralel port ile veri girisi STATUS portundan farklidir. STATUS portu ile girisi, pinin üzerindeki “1” lojik voltaji topraklayarak gerçeklestiriyorduk. DATA portlari ile veri girisini ise, bu pinlere lojik voltaj göndererek gerçeklestirebiliyoruz. Bu yazimda ilk kez Visual Basic komutlarinin disinda, C++ ve DELPHI komutlarindan da bahsedecegim. DATA portundan veri okumak için INP komudunu DATA portunuzun adresinde kullanmaniz gerekmektedir.Çok basit olarak paralel porta veri göndermekten ve almaktan tekrar bahsetmek istiyorum. Paralel portunuza verilen adres üç alt porta su sekilde dagilir. Örnegin 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++ kullanacagiz. Visual Basic altinda OUT komudunu yada C++ altindaki OUTPORTB kullanarak DATA portuna 0-255 arasinda gönderdigimiz sayisal deger ile istedigimiz data pinlerinin lojik degerlerini “1” yapabiliyoruz. Data pinlerinden bir tanesinin “1” olmasi o pinin +5 Volt olmasi anlamina geliyor. DATA portundan 8 bitlik veri çikisi alabiliyoruz. DATA portuna hiçbir veri göndermedigimiz zaman ki degeri “00000000” dir. Dikkat ederseniz 8 tane “0” var. Örnegin data portuna 25 degerini gönderelim. 25 degerinin ikilik sayi sisteminde karsiligi “00011001” dir. Bu durumda D4, D3 ve D0 pinlerine karsilik gelen lojik degerler “1” oldugundan o pinler +5 Volt olacaktir. Bu ayki uygulamamizda ise Bi-Directional port destegi sayesinde DATA portlarindaki veriyi okuyacagiz. Yani D4, D3 ve D0 pinlerine karsilik gelen pinlere +5 voltluk lojik voltaj uyguladigimizda, bu porttan okuyacagimiz deger 25 olacaktir.
Paralel port üzerinde CONTROL portununa ait 4 tane pin vardir. Bu pinlerden C0,C1,C3 pinleri tersinmistir. Yani tersinmis olan bu pinlere veri göndermedigimiz zaman durumu “1” dir. Bu pinlerden bir tanesine veri gönderdigimizde o pinin durumu “0” olacaktir. Diger bir deyisle CONTROL pinlerinin düsük olan 4 bitine “1111” yazmaniz halinde konnektördeki bitler “0100” olacaktir. Tersindirme olayina önceki sayilarimizda daha detayli deginmistik.
C++ ile PORT GIRIS/ÇIKIS Komutlari
C++ altinda veri giris çikis komutlarinin kullanimi asagidaki gibidir. Bu komutlari kullanabilmek için kütüphane dosyasini programiniza #include etmelisiniz.
Veri göndermek için : OUTPORTB (port_adresi,byte)
Veri almak için : Byte = INPORTB (port_adresi)
DELPHI ve Assembly kullanimi ile PORT GIRIS/ÇIKIS Komutlari
{$R *.DFM}
procedure portout(IOport:word;value:byte);assembler;
asm
xchg ax,dx //port'a deger göndermek
out dx,al
end;
function portin(IOport:word):byte;assembler;
asm
mov dx,ax //port'taki degeri okumak için
in al,dx
end;
Veri göndermek için : PORTOUT (port_adresi,byte)
Veri almak için : Byte = PORTIN (port_adresi)
Sayisal – Analog dönüstürücü (ADC) devresi :
Devre için ihtiyacimiz olan malzemeler;
1 x ADC0804 Analog sayisal dönüstürücü,
1 x 150 pF Kondansatör,
1 x 10F Kondansatör (istege bagli)
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 kolaydir. Ayni Haziran sayisinda anlattigim LCD panel kontrolüne benzer. ADC yi programlayabilmek için veriyi okuyacagimiz DATA pinlerinin disinda, ADC nin RD ve RW pinlerini kontrol etmek için 2 tane CONTROL pinine, ERROR kontrolü içinde 1 tanede STATUS pinine ihtiyacimiz olacak. Kullandigimiz ADC0804, National Semiconductor firmasinin yaygin olarak kullanilan analog-sayisal dönüstürücülerinden biridir. Entegrenin yapisi hakkinda daha detayli bilgi için http://www.national.com adresine bakabilirsiniz.
CONTROL portuna gönderecegimiz veriler ile ADC ‘yi su sekilde programliyoruz;
Önce CONTROL portuna “32” sayisal degerini göndererek, C0 pinini “0” pini yüksek yapiyoruz. Neden? Çünkü C0 pini donanim tarafindan terslenmistir. Dolayisi ile pine “0” gönderdigimiz zaman o pin +5 volt oluyor. Sonuçta ilk islem C0 pinine bagli olan RD pinini yüksek yapmak oluyor. Ardindan, “36” sayisal degeri ile de WR pinini de yüksek yapiyoruz. Böylece entegre ADC veri dönüsümü için ayarlanmis oluyor. Daha sonra dönüstürülmüs sayisal degeri okumak için C2 pini yüksek tutulurken, C0 pini düsük yapiliyor. Veri bu sirada okunuyor ve hemen ardindan C0 tekrar yüksek yapiliyor.
Biraz karisik bir islemmis gibi gözüküyor fakat. Her zaman söyledigim gibi bu isleri kavrayabilmenin en kolay yolu bol bol uygulama yapmak. Okuyarak anlayamadiginiz birçok kavrami uygulama sirasinda anlamaniz mümkün oluyor. Yani size söyleyecegim, ben size sadece kapilari gösterebilirim. Kapilardan geçmek size kaliyor. Matrix filminde Morpheus, falciya girmeden önce Neo ‘ya böyle söylemisti :-)
Örnek programlarimiz, ADC ‘nin 6 ve 7 numarali konnektörlerine uygulanan 0-5 volt arasi degerlerin 0-255 arasindaki sayisal degerlerini ekrana yazdirmaya yariyor. Örnegin bu analog çikislara birtane kalem pil bagladiginiz zaman ekranda elde edecegimiz deger 70-80 arasindadir. Gerçektende 5 volt için elde edilecek deger 255 ise, 1,5 Volt için ise yaklasik deger tam dolu bir pil için 76 ‘dir.
ADC entegreleri oldukça hassastir. Yani ortamdaki voltajdan kolayca etkilenebilir. Elinizle analog girislere dokundugunuz zaman bile, ekrandaki sayisal degerde 1-2 derecelik bir artis meydana gelecektir. O bakimdan devreyi ortam voltajlarindan etkilenmeyecek bir sekilde yapmaniz gerekmektedir. Örnegin toprak olarak birbirinden farkli toprak kanallarini kullanmanizi öneriyorum. Paralel port üzerinde 18-25 arasi pinler topraktir. ADC nin 8 ve 10 numarali konnektörlerini birbirinden farkli topraklara baglamak bu etkilenmeyi azaltacaktir.
Elde edilen sayisal degerler ile bazi kararlara varmadan önce, tavsiyem elde edilen degerlerin ortalamasini almak ve belli bir aralikta ise bir islem yaptirmak. Simdi anlatacagim robot gözü uygulamasinda bu yöntemden yararlanmaniz mümkün
Cisimin uzakligini isik siddeti ile algilama (Basit Robot Gözü):
Temel olarak gerçeklestirecegimiz uygulama oldukça basit. LEGO ‘nun Mindstorms serisi ile birlikte gelen isik sensörü ‘de ayni mantik ile çalismaktadir. Geçen ayki sayisimizda Foto transistör kullanarak STATUS pinlerinden bir tanesini tetiklemistik. Simdi ise foto transistör üzerine düsen isik sayesinde, transistörün degisen iç direncini kullanarak isiga bagimli bir analog sinyal elde edecegiz. Sonuçta foto transistöre bir cisim yaklastiginda üzerindeki isik kaynagi azalacak ve iç direnç artacaktir. Direnç arttiginda ise analog sinyalin degeri düsecektir..
Foto transistörlerin normal transistörlerden tek farki beyz ucundan yapilan tetiklemenin isik siddeti kullanilarak yapilmasidir. Bu bakimdan genelde foto transistörlerin Beyz uçlari kullanilmaz. Transistörün üzerinde küçük bir mercek bulunur. Tetikleme islemi, bu mercege isik gönderilerek yapilir. Uygulanan isigin siddetine göre Emiter-Kollektör arasindaki iç direnç degisir ve yükün akimi kontrol edilebilir. Isigin siddeti ile Emitör- Kollektör arasi iç direnç ters orantilidir. Yani Isik siddeti arttikça Emiter-Kollektör arasi iç direnç düsecektir.
Buradaki tek dezavantajimiz, foto transistörün gün isigindan etkilenmesi. Foto transistörü ADC ‘nin analog girislerine bagladiginizda ekrandan okudugunuz sayisal deger normal aydinlatmada, 100-150 civarindadir. Transistöre cisim yaklastikça, yani isik siddeti düstükçe okunan bu deger 5-10 lara kadar düsebilmekte. Böylece cismin yaklastigini anlamak mümkün olmakta.
Eger çok aydinlik bir ortamda iseniz, okunan bu degisimlerin degerleri farkli olacaktir. Bu problemden kurtulmak için ise ortam isiginin degerini robotunuza bildirmek yeterli sayilir. Bunun için robotun önüne koyacaginiz cisim algilama amaçli foto transistörlerin yaninda, robotun tepesine öndeki cisimlerin gölgelerinden etkilenmeyecek birkaç foto transistör yerlestirmek ve bu transistörlerden okunan degerler ile bir ortam isigi sayisal degeri belirleyip, bu degerler üzerinden çalisma yapmak. Bunun için ise robotlarin vazgeçilmez gereksinimi olan yapay zeka programlama isin içerisine giriyor.
ADC veri okuma programi C++ kodu
Kaynak: http://www.ucl.ac.uk/~ucapwas/ppadc.html
#include
#include
// Sabit degiskenler tanitiliyor
const c0=1, c1=2, c2=4, c3=8;
const s0=1, s1=2, s2=4, s3=8;
void main()
{
// Port adresleri ayarlaniyor
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üsüm islemi 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üsü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 programi 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üsü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 diger olasilikta robotunuzun tamamen karanlik bir ortamda kalmasi. Düsünülenin tam tersine karanlik ortamlar robotlarin yön bulabilmeleri için mükkemmel ortamlardir. En önemlisi ortam isigi yoktur. Foto transistörün arkasina yada yanina bir isik kaynagi takilir. Robot ilerleyince, eger önüne bir cisim çikarsa arkadan gelen bu isik cisim üzerinden foto transistörün mercegine yansir. Böylece cisim algilanir. LEGO ‘nun isik sensörü, karanlik ortamlar için üzerinde bahsettigimiz prensipte çalisan dahili bir led barindirmaktadir.
Son anlattiklarim biraz teoride kaliyor çünkü, üzerinde paralel port ve bir PC tasiyan bir robot yapmak biraz zor olabilir. Ama tabiki imkansiz degil. Ileride PIC programlamayi ögrendigimizde, bu devreleri PC ‘den bagimsiz hale getirecegiz. LEGO ‘nun daha öncede bahsettigim Robot tasarimi için gelistirilmis Mindstorms serisi ile gelen RCX modülü, bu isik degerini sayisal olarak algilayabilmekte ve bu degerler üzerinden motorlari kontrol edebilmektedir. Zaten RCX kontrol devresi MIT üniversitesi labaratuarlarinda, gerçek robotik devreler için gelistirilmis bir çip içermektedir.
Kaynak : Robot Teknolojileri Kulübü
Bizim bu güne kadar ugrastigimiz sinyallerin hepsi sayisaldi. Yani sinyalin “1” yada “0” olmasi durumunu inceliyorduk. Dolayisi ile lojik voltajimizin degeri, “1” oldugunda +5 Volt, “0” oldugunda ise 0 Volt oluyordu. Analog sinyallerde ise bu voltajin degeri 0 ile 5 volt arasinda degisebilir. Bir ADC ile (Analog – Digital Converter) fiziksel degerleri ( isi, basinç, kütle, isik yogunlugu ) sayisal degerlere çevirebilirsiniz. Böylece PC ‘nizi dis dünyayi izleme aracina çevirebilirsiniz. Daha sonra bu ölçümler sonucunda üzt düzey kararlar vermeye programlayabilirsiniz. Örnegin oda sicakligi belli bir dereceye ulastiginda PC ‘nizle isitma sistemini kapatabilirsiniz.Bir sicaklik sensörü, elde ettigi sicakligin sonucunda bize 0-5 volt arasinda bir deger verebilir. Biz de bu deger üzerinden gerekli dönüsümü yaparak hangi voltajin hangi sicakliga denk geldigini hesaplayabilir ve islemler yapabiliriz. Herhangi bir ölçüm sonucunda elde edecegimiz voltaj eger 5 volt ise bu voltaji ADC ile sayisal veriye dönüstürdügümüzde elde edebilecegimiz deger 255 olacaktir. Kisacasi 0 ile 5 volt arasindaki analog degerler, 8-bitlik sayisal veriye dönüstügünde 0-255 arasinda degerlere denk gelecektir.Analog-Dijital dönüsüm yapilabildigi gibi bunun tam tersini de yapmak mümkündür. Örnegin DATA pinlerine gönderecegimiz 0-255 arasi sinyaller ile 0-5 Volt arasinda bir voltaj gerilimi elde etmeniz mümkün olabilir. Kullandiginiz ADC ve DAC (Digital-Analog Converter) tipine göre analog giris degerleri degisebilir. Örnegin 255 sayisal sinyali ile +12 volt elde edebilmenizde mümkün olabilir. Daha önceki uygulamalarimizda paralel portun STATUS pinlerini kullanarak bir tür veri girisi gerçeklestirmistik. Bu ay ki uygulamamizda paralel portu kullanarak ilk gerçek veri girisini gerçeklestirecegiz. Paralel portun DATA pinlerini bugüne kadar sadece veri çikisi için kullandik. Yeni teknolojiye sahip paralel portlarda bu DATA pinlerini 8-Bitlik veri girisi için kullanmata mümkündür. Bu islemi gerçeklestirebilmek için ana kartinizin BI-DIRECTIONAL port tipini desteklemesi gerekmektedir. Bilgisayarinizin BIOS ayarlarina girdiginizde, paralel port tipini degistirmeniz mümkün olacaktir. DATA pinleri ile veri girisi yapabilmemiz için port tipinizi BI-DIRECTIONAL yapmalisiniz.
Sponsorlu Bağlantılar
Bu güne kadar uygulamalarimizi hep paralel port üzerinde gerçeklestirdik. Fakat uygulamalar gelistikçe bu port bize yetersiz kalmaya baslayacak. Öyle uygulamalar olacak ki, hem 8-bit veri girisi hemde 8-bit veri çikisini ayni anda yapmamiz gerekecek. Bu sebeple, önümüzdeki ay, paralel port üzerinden çalisan 8255 programlama kitini tanitacagim. Bu kit sayesinde, ayni anda 3 sayisal çikis yada giris yapmamiz mümkün olacak. Bu kitin diger bir faydasi ise, gerçeklestirdigimiz uygulamalarda olusabilecek bir hata sonucu paralel portunuzu yakma riskinin önüne geçebilmemiz. Bu sayede ugrayabilecegimiz en büyük zarar en fazla bir kit parasi kadar olacaktir.Bi-Directional paralel port ile veri girisi STATUS portundan farklidir. STATUS portu ile girisi, pinin üzerindeki “1” lojik voltaji topraklayarak gerçeklestiriyorduk. DATA portlari ile veri girisini ise, bu pinlere lojik voltaj göndererek gerçeklestirebiliyoruz. Bu yazimda ilk kez Visual Basic komutlarinin disinda, C++ ve DELPHI komutlarindan da bahsedecegim. DATA portundan veri okumak için INP komudunu DATA portunuzun adresinde kullanmaniz gerekmektedir.Çok basit olarak paralel porta veri göndermekten ve almaktan tekrar bahsetmek istiyorum. Paralel portunuza verilen adres üç alt porta su sekilde dagilir. Örnegin 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++ kullanacagiz. Visual Basic altinda OUT komudunu yada C++ altindaki OUTPORTB kullanarak DATA portuna 0-255 arasinda gönderdigimiz sayisal deger ile istedigimiz data pinlerinin lojik degerlerini “1” yapabiliyoruz. Data pinlerinden bir tanesinin “1” olmasi o pinin +5 Volt olmasi anlamina geliyor. DATA portundan 8 bitlik veri çikisi alabiliyoruz. DATA portuna hiçbir veri göndermedigimiz zaman ki degeri “00000000” dir. Dikkat ederseniz 8 tane “0” var. Örnegin data portuna 25 degerini gönderelim. 25 degerinin ikilik sayi sisteminde karsiligi “00011001” dir. Bu durumda D4, D3 ve D0 pinlerine karsilik gelen lojik degerler “1” oldugundan o pinler +5 Volt olacaktir. Bu ayki uygulamamizda ise Bi-Directional port destegi sayesinde DATA portlarindaki veriyi okuyacagiz. Yani D4, D3 ve D0 pinlerine karsilik gelen pinlere +5 voltluk lojik voltaj uyguladigimizda, bu porttan okuyacagimiz deger 25 olacaktir.
Paralel port üzerinde CONTROL portununa ait 4 tane pin vardir. Bu pinlerden C0,C1,C3 pinleri tersinmistir. Yani tersinmis olan bu pinlere veri göndermedigimiz zaman durumu “1” dir. Bu pinlerden bir tanesine veri gönderdigimizde o pinin durumu “0” olacaktir. Diger bir deyisle CONTROL pinlerinin düsük olan 4 bitine “1111” yazmaniz halinde konnektördeki bitler “0100” olacaktir. Tersindirme olayina önceki sayilarimizda daha detayli deginmistik.
C++ ile PORT GIRIS/ÇIKIS Komutlari
C++ altinda veri giris çikis komutlarinin kullanimi asagidaki gibidir. Bu komutlari kullanabilmek için kütüphane dosyasini programiniza #include etmelisiniz.
Veri göndermek için : OUTPORTB (port_adresi,byte)
Veri almak için : Byte = INPORTB (port_adresi)
DELPHI ve Assembly kullanimi ile PORT GIRIS/ÇIKIS Komutlari
{$R *.DFM}
procedure portout(IOport:word;value:byte);assembler;
asm
xchg ax,dx //port'a deger göndermek
out dx,al
end;
function portin(IOport:word):byte;assembler;
asm
mov dx,ax //port'taki degeri okumak için
in al,dx
end;
Veri göndermek için : PORTOUT (port_adresi,byte)
Veri almak için : Byte = PORTIN (port_adresi)
Sayisal – Analog dönüstürücü (ADC) devresi :
Devre için ihtiyacimiz olan malzemeler;
1 x ADC0804 Analog sayisal dönüstürücü,
1 x 150 pF Kondansatör,
1 x 10F Kondansatör (istege bagli)
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 kolaydir. Ayni Haziran sayisinda anlattigim LCD panel kontrolüne benzer. ADC yi programlayabilmek için veriyi okuyacagimiz DATA pinlerinin disinda, ADC nin RD ve RW pinlerini kontrol etmek için 2 tane CONTROL pinine, ERROR kontrolü içinde 1 tanede STATUS pinine ihtiyacimiz olacak. Kullandigimiz ADC0804, National Semiconductor firmasinin yaygin olarak kullanilan analog-sayisal dönüstürücülerinden biridir. Entegrenin yapisi hakkinda daha detayli bilgi için http://www.national.com adresine bakabilirsiniz.
CONTROL portuna gönderecegimiz veriler ile ADC ‘yi su sekilde programliyoruz;
Önce CONTROL portuna “32” sayisal degerini göndererek, C0 pinini “0” pini yüksek yapiyoruz. Neden? Çünkü C0 pini donanim tarafindan terslenmistir. Dolayisi ile pine “0” gönderdigimiz zaman o pin +5 volt oluyor. Sonuçta ilk islem C0 pinine bagli olan RD pinini yüksek yapmak oluyor. Ardindan, “36” sayisal degeri ile de WR pinini de yüksek yapiyoruz. Böylece entegre ADC veri dönüsümü için ayarlanmis oluyor. Daha sonra dönüstürülmüs sayisal degeri okumak için C2 pini yüksek tutulurken, C0 pini düsük yapiliyor. Veri bu sirada okunuyor ve hemen ardindan C0 tekrar yüksek yapiliyor.
Biraz karisik bir islemmis gibi gözüküyor fakat. Her zaman söyledigim gibi bu isleri kavrayabilmenin en kolay yolu bol bol uygulama yapmak. Okuyarak anlayamadiginiz birçok kavrami uygulama sirasinda anlamaniz mümkün oluyor. Yani size söyleyecegim, ben size sadece kapilari gösterebilirim. Kapilardan geçmek size kaliyor. Matrix filminde Morpheus, falciya girmeden önce Neo ‘ya böyle söylemisti :-)
Örnek programlarimiz, ADC ‘nin 6 ve 7 numarali konnektörlerine uygulanan 0-5 volt arasi degerlerin 0-255 arasindaki sayisal degerlerini ekrana yazdirmaya yariyor. Örnegin bu analog çikislara birtane kalem pil bagladiginiz zaman ekranda elde edecegimiz deger 70-80 arasindadir. Gerçektende 5 volt için elde edilecek deger 255 ise, 1,5 Volt için ise yaklasik deger tam dolu bir pil için 76 ‘dir.
ADC entegreleri oldukça hassastir. Yani ortamdaki voltajdan kolayca etkilenebilir. Elinizle analog girislere dokundugunuz zaman bile, ekrandaki sayisal degerde 1-2 derecelik bir artis meydana gelecektir. O bakimdan devreyi ortam voltajlarindan etkilenmeyecek bir sekilde yapmaniz gerekmektedir. Örnegin toprak olarak birbirinden farkli toprak kanallarini kullanmanizi öneriyorum. Paralel port üzerinde 18-25 arasi pinler topraktir. ADC nin 8 ve 10 numarali konnektörlerini birbirinden farkli topraklara baglamak bu etkilenmeyi azaltacaktir.
Elde edilen sayisal degerler ile bazi kararlara varmadan önce, tavsiyem elde edilen degerlerin ortalamasini almak ve belli bir aralikta ise bir islem yaptirmak. Simdi anlatacagim robot gözü uygulamasinda bu yöntemden yararlanmaniz mümkün
Cisimin uzakligini isik siddeti ile algilama (Basit Robot Gözü):
Temel olarak gerçeklestirecegimiz uygulama oldukça basit. LEGO ‘nun Mindstorms serisi ile birlikte gelen isik sensörü ‘de ayni mantik ile çalismaktadir. Geçen ayki sayisimizda Foto transistör kullanarak STATUS pinlerinden bir tanesini tetiklemistik. Simdi ise foto transistör üzerine düsen isik sayesinde, transistörün degisen iç direncini kullanarak isiga bagimli bir analog sinyal elde edecegiz. Sonuçta foto transistöre bir cisim yaklastiginda üzerindeki isik kaynagi azalacak ve iç direnç artacaktir. Direnç arttiginda ise analog sinyalin degeri düsecektir..
Foto transistörlerin normal transistörlerden tek farki beyz ucundan yapilan tetiklemenin isik siddeti kullanilarak yapilmasidir. Bu bakimdan genelde foto transistörlerin Beyz uçlari kullanilmaz. Transistörün üzerinde küçük bir mercek bulunur. Tetikleme islemi, bu mercege isik gönderilerek yapilir. Uygulanan isigin siddetine göre Emiter-Kollektör arasindaki iç direnç degisir ve yükün akimi kontrol edilebilir. Isigin siddeti ile Emitör- Kollektör arasi iç direnç ters orantilidir. Yani Isik siddeti arttikça Emiter-Kollektör arasi iç direnç düsecektir.
Buradaki tek dezavantajimiz, foto transistörün gün isigindan etkilenmesi. Foto transistörü ADC ‘nin analog girislerine bagladiginizda ekrandan okudugunuz sayisal deger normal aydinlatmada, 100-150 civarindadir. Transistöre cisim yaklastikça, yani isik siddeti düstükçe okunan bu deger 5-10 lara kadar düsebilmekte. Böylece cismin yaklastigini anlamak mümkün olmakta.
Eger çok aydinlik bir ortamda iseniz, okunan bu degisimlerin degerleri farkli olacaktir. Bu problemden kurtulmak için ise ortam isiginin degerini robotunuza bildirmek yeterli sayilir. Bunun için robotun önüne koyacaginiz cisim algilama amaçli foto transistörlerin yaninda, robotun tepesine öndeki cisimlerin gölgelerinden etkilenmeyecek birkaç foto transistör yerlestirmek ve bu transistörlerden okunan degerler ile bir ortam isigi sayisal degeri belirleyip, bu degerler üzerinden çalisma yapmak. Bunun için ise robotlarin vazgeçilmez gereksinimi olan yapay zeka programlama isin içerisine giriyor.
ADC veri okuma programi C++ kodu
Kaynak: http://www.ucl.ac.uk/~ucapwas/ppadc.html
#include
#include
// Sabit degiskenler tanitiliyor
const c0=1, c1=2, c2=4, c3=8;
const s0=1, s1=2, s2=4, s3=8;
void main()
{
// Port adresleri ayarlaniyor
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üsüm islemi 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üsü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 programi 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üsü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 diger olasilikta robotunuzun tamamen karanlik bir ortamda kalmasi. Düsünülenin tam tersine karanlik ortamlar robotlarin yön bulabilmeleri için mükkemmel ortamlardir. En önemlisi ortam isigi yoktur. Foto transistörün arkasina yada yanina bir isik kaynagi takilir. Robot ilerleyince, eger önüne bir cisim çikarsa arkadan gelen bu isik cisim üzerinden foto transistörün mercegine yansir. Böylece cisim algilanir. LEGO ‘nun isik sensörü, karanlik ortamlar için üzerinde bahsettigimiz prensipte çalisan dahili bir led barindirmaktadir.
Son anlattiklarim biraz teoride kaliyor çünkü, üzerinde paralel port ve bir PC tasiyan bir robot yapmak biraz zor olabilir. Ama tabiki imkansiz degil. Ileride PIC programlamayi ögrendigimizde, bu devreleri PC ‘den bagimsiz hale getirecegiz. LEGO ‘nun daha öncede bahsettigim Robot tasarimi için gelistirilmis Mindstorms serisi ile gelen RCX modülü, bu isik degerini sayisal olarak algilayabilmekte ve bu degerler üzerinden motorlari kontrol edebilmektedir. Zaten RCX kontrol devresi MIT üniversitesi labaratuarlarinda, gerçek robotik devreler için gelistirilmis bir çip içermektedir.
Kaynak : Robot Teknolojileri Kulübü
Son düzenleyen asla_asla_deme; 19 Aralık 2010 23:23
Sebep: konu düzenlendi