28 Haziran 2010 Pazartesi

rf alıcı verici modüller için test uygulaması

Fatih Erdem arkadaşımızın bloğunda yayınladığı çok faydalı bilgiler bulunan bir yazı. Bu tip rx tx modüllerle uğraşanlar için karşılaştıkları sorunlarda kılavuz olacaktır. Yazının kaynağına buradan gidebilirsiniz.

Hazırlayan: Fatih Erdem

Çok yaygın olarak kullanılan en basit RF alıcı-verici modüller ilk çalıştırılması sırasında sorun çıkarabilmektedir. Ben bu zamana kadar UDEA’nın atx-arx ve Keymark’ın modüllerini kullandım. Bu modülleri farklı amaçlar için çalıştırmıştım aradan zaman geçtikten sonra farklı uygulamar için bu modülleri kullanmak istediğimde ilk yazdığım koda dönüp bakmak durumunda kaldım. Çünkü her kod bu modülleri çalıştırmıyor. Yaygın bir görüşe göre bu basit modüllerin en büyük sıkıntısı uyku, veri göndermediğimiz zaman alıcı modül gelecek ilk veri için hazırlıksız durumda oluyor, tabiri caizse uyuyor. Verimizi kendisine sağlıklı bir şekilde ulaştırmak için önce alıcıyı uyandırmak (demodülasyon için clock işaretinin düzgün geldiğine emin olmak-eğer senkron demodülasyon yapılıyorsa-) gerekiyor. Bunun için de verimizden önce bir takım işaretler(uyandırma işareti) gönderiyoruz. UDEA nın uygulama notlarında hem bu işlem yapılmış hem de senkronizasyon için bazı düzenlemeler yapılmış. Keymark’tan ise ses yok, katalog bilgisini bile zor bulabiliyoruz ya da ben bulamadım.

(yukarıda) Solda udea, sağda keymark çifti.

Geçtiğimiz günlerde bu iki modül için de minimum test devresi ve minimum test yazılımı oluşturmaya karar verdim ve iki modül için de denedim, denemeler başarılı. Modülleri test etme aşamasına gelmeden önce donanım ile alakalı problemleri aşmış olmamız gerekiyor, devrenizi kurup son haline getirdiğinize kanaat getirdikten sonra tüm gerilimleri voltmetrenizle kontrol ettiniz mi? Keymark modüller için verici besleme geriliminin 3V olduğuna emin misiniz? Her iki(alıcı-verici) devre için de besleme gerilimlerinin iyi regüle edilmiş olduğuna emin misiniz? Nitekim ben deneme yaparken kullandığım şarjlı pilin pic i çalıştırdığını ama çok kararlı olmadığını fark edip pili şarj ettikten sonra kullandım.

Bir de bu modülleri kullanmak isteyen arkadaşların ilk aklına gelen test devresi verici tarafın data girişine DC uygulayıp alıcı tarafın data çıkışında led yakmak oluyor. Bu benim zamanında hiç düşünmediğim bir olaydı. Belki de DC bir işaretin modüle edildiğine hiç rastlamadığımdandır. Bahsettiğim test devresinde(çalıştığını görüp emin olduğum) bu olayı denedim, verici girişine DC(5V) verdim ve alıcı çıkışına bir led bağladım, led yanıyordu ama girişi toprağa çektiğimde de yanıyordu. Yanma dediğim de kararlı bir yanma değil, seğirme şeklinde(her iki durumda da). UDEA teknik döküman sayfasında modüller için UHF bandında ASK(amplitude shift keying) kullanıldığı söylenmiş. Şimdi bu(ASK) ON-OFF keying şeklinde de olabilir yani modüllerimiz lojik 1 için 433 MHz lik bir işaret gönderirken lojik 0 için hiç bir şey göndermiyor veya farklı genlik seviyeleri kullanılmış olup lojik 1 için A genliğinde 433 MHz lik bir işaret gönderirken lojik 0 için B genliğinde 433 MHz lik bir işaret gönderiyor olabilir. Eğer ilki gibiyse verici girişini toprağa çektiğimizde hiçbir şey göndermiyoruz demektir, alıcımız ortamdan ne gürültü alıyorsa ona göre ledi yakacak demektir. Alıcı modülün data pininin led sürme kabiliyeti ise ayrı mesele… Yani bana sorulursa bu modüllerle DC gönderme işi uygun değil. Eğer uzaktan kontrol etmek istediğiniz elemanlar led, röle gibi bir bitle kontrol edilecek elemanlar ise PIC kullanmaksızın PT2262-PT2272 çiftini kullanarak rf modüller üzerinden güvenli bir şekilde veri gönderebilirsiniz.

Gelelim kendi test devremize, öncelikle biz test verisi olarak kullandığımız mikro(PIC)lar tarafından desteklenen RS232 protokolüne göre ‘A’ veya ‘B’ verilerini göndereceğiz ve alacağız(DC değil). Dolayısıyla her iki tarafta da PIC olacak, kutumda 16F628(verici) ve 16F628A(alıcı) vardı ben onları kullandım. Kodları diğer pic lere uyarlayabilirsiniz.

Testimiz şöyle:
alici.hex ve verici.hex dosyaları uygun PIC lere yüklendiyse şemadan da takip edebileceğiniz gibi:
Alıcı tarafta A0 ve A1 pinlerine bağlı iki ledimiz var, bu ledler şuna göre yanıyor: Eğer son gelen veri ‘A’ ise A1 pinine bağlı led yanacak, eğer son gelen veri ‘B’ ise A0 pinine bağlı led yanacak. Verici tarafta ise B4 ve B5 pinlerinden en fazla bir tanesini toprağa çekeceğiz. Eğer B4 pini toprakta B5 pini VDDde ise ‘A’ gönderiyoruz, B4 pini VDDde B5 pini toprakta ise ‘B’ gönderiyoruz. Bu işlem için “buton” kullanmayalım, boşta bıraktığımız kablolarla istediğimiz pini toprağa çekme işlemi yapalım. Yapılacak nihai işlem bir pini toprakta diğer pini VDDde bırakmak ve test için toprak-VDD sırasını değiştirmek. Böylece herhangi bir durumda (’A’ gönderirken veya ‘B’ gönderirken) verimizi kısa bir sürelik değil sürekli gönderiyor olacağız, tabiri caizse alıcımızı veri yağmuruna tutacağız. Bu durumda alıcı modülün uyanmama, geç kalma gibi bir sorunu olmuyor. Alıcı için verimizi alabileceği en kesin durumu sağlıyoruz.
Her testin bir geçme-kalma şartı vardır, bizim testimizin şartı ledlerin yanıyor olması değildir, gönderdiğiniz veriyi değiştirdiğinizde alıcıda yanan ledin değişmesidir. Yani devrenizin doğru değişikliğe doğru cevabı vermesidir. Nitekim alıcıdaki ledlerin yanması çok olası bir durum, şöyle ki: verici kısmı çalıştırmadan önce alıcı kısmı çalıştırın, ne görüyorsunuz? Bir süre sonra ‘A’ verisine ait led yandı veya ‘B’ verisine ait led yandı… Bu verileri bizim göndermediğimiz kesin(verici devrenin beslemesi bağlanmadı) peki kim gönderiyor? Nasıl olur da biz veri göndermeden alıcımız sanki doğru verileri almış gibi ledleri yakıyor!
Bu bir şekilde oluyor arkadaşlar, çevreden gelen bazı etkiler modülleri yanlış yorumlatabiliyor. Bu gözlem modüllerin ne gibi yanlış anlaşılmalara yol açabileceği açısından faydalı bir gözlem(verici devreyi çalıştırmadan alıcı devreyi çalıştırıp olup biteni gözleme).
Bu yüzden modülleri test ederken doğru değişikliğe doğru tepkiyi vermelerinin gerektiğini söyledim.
Öncü veri kullanarak bu yanlış anlaşılma durumunun çok büyük ölçüde önüne geçebiliyoruz, dileyen arkadaşlar ekteki dosyalarda pre_alici.c ve pre_verici.c ye bakabilirler. Ancak bizim şu anki konumuz modülleri en basit şekilde çalıştırmak, doğru değişikliğe doğru tepki verdiğini görmek. Devreyi proteusta çizip simüle ettim(kablolu haliyle), kurduğum devre simülasyon ortamındakinden farksız sadece kablo yerine modülleri bağladım:



Bu arada bu test devresi ve vereceğim test yazılımında iki modül de gayet başarılı bir şekilde çalışıyor ancak keymark biraz nazlandı, bir kaç defa reset attım sonra düzgün çalışmaya başladı. Bir de yazarken aklıma geldi keymark modülleri birbirinden 1m kadar uzaklaştırıp denemekte fayda olabilir. Son olarak modüllerimizi yakın mesafede test ettiğimiz için anten bağlamaksızın çalıştırabiliyoruz. Aynı test devresini daha uzak mesafelerde denemek için 50 ohm empedanslı 17 cm uzunluğunda anten kullanabilirsiniz. 50ohm luk anteniniz yoksa 17cm lik metal bir tel kullanabilirsiniz(50 ohm luk antene göre daha düşük verimle çalışacağını kabullenerek)

verici.c

//UDEA ve Keymark RF atx arx alıcı-verici modüller için test programı, 6 Mayıs 2008
//verici.c
//fatiherdem.net
#include <16f628.h>
#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=600, xmit=PIN_B2, rcv=PIN_B1)

void main(){
output_high(pin_b3); //calisma gostergesi
while(1){
if(!input(pin_b4) && input(pin_b5)){
putc('A');
}
if(!input(pin_b5) && input(pin_b4)){
putc('B');
}

}
}

*

alici.c

//UDEA ve Keymark RF atx arx alıcı-verici modüller için test programı, 6 Mayıs 2008
//alici.c
//fatiherdem.net
#include <16f628a.h>
#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=600, xmit=PIN_B2, rcv=PIN_B1)

void main(){
char a=0;
output_low(pin_a0); //cikislari temizle
output_low(pin_a1);
output_high(pin_b3); //calisma gostergesi

while(1){
a=getc();
if(a=='A'){
output_high(pin_a1);
output_low(pin_a0);
}
if(a=='B'){
output_high(pin_a0);
output_low(pin_a1);
}

}
}

Bir resim:

İlgili tüm dosyalar:
Simülasyon(proteus) + kod(verici.c, alici.c, pre_verici.c, pre_alici.c, *.hex)

Modüllerin Katalogları (UDEA ve Keymark için)

Çalışmayla ilgili resim-video (60 Mb) (Öğretici içerik notu: %15)