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.
C++ altinda veri giris çikis komutlarinin kullanimi asagidaki gibidir. Bu komutlari kullanabilmek için kütüphane dosyasini programiniza #include etmelisiniz.
Veri almak için : Byte = INPORTB (port_adresi)
// Gönderen : Yusuf Sertaç Gürsel < yusuf@sertac.com >
{$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 almak için : Byte = PORTIN (port_adresi)
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.
ADC0804 |
Pin Islevi |
1 |
Toprak (Ground) |
2 |
RD Okuma Modu |
3 |
WR Yazma Modu |
4 |
CLK in Sayaç giris (150pF Kondansatör ile saglanacak) |
5 |
intr (Hata kontrolü için Kesme üretir) |
6 |
Analog V+ (Analog giris) |
7 |
Analog V- (Analog giris) |
8 |
Analog Toprak |
9 |
Vref/2 (Devreye baglamiyoruz) NC (Not Connected) |
10 |
Sayisal Toprak |
11-18 |
D7-D0 (Sayisal Çikislar) |
19 |
CLK R Sayaç |
20 |
Vcc +5 Volt çalisma Voltaji |
Ö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.
Ö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 ‘nin RD ve WR konnektörlerine gönderilecek CONTROL portu sinyalleri |
|||||||||
Veri |
Islev |
C7 |
C6 |
C5 |
C4 |
C3 |
C2 |
C1 |
C0 |
32 |
RD (2) girisini yüksek (1) yapar. |
X |
X |
X |
X |
0 |
0 |
0 |
0 |
36 |
RD (2) ve WR (3) girislerini ayni anda yüksek yapar. |
X |
X |
X |
X |
0 |
1 |
0 |
0 |
37 |
WR (3) ‘yi yüksek , RD (2) ‘yi düsük yapar |
X |
X |
X |
X |
0 |
1 |
0 |
1 |
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
O
UT &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 : http://rtk.iku.edu.tr/