21 Şubat 2016 Pazar

16f628 ile Temel RF haberleşme

Merhaba arkadaşlar bu uygulamamızda RF haberleşmenin mantığını kavramak için basit bir buton-led uygulaması yapacağız.

Devrenin amacı:
Butona her basıldığında alıcı kısmında tanımlanan "m" değişkeni bir artırılsın ve m'in değeri binary olarak B portuna bağlı ledlerle kullanıcıya aktarılsın.

Malzemeler:
2x PIC16f628a
2x 4 MHz kristal
4x 22pF kapasitör
3x buton (2 bacaklı)
9x 330 ohm direnç
3x 10k direnç
2x 1k direnç
2x 7805 regülatör
2x 0 no klemens
9 adet led
2x 18 pin soket
RF alıcı- verici modül

Öncelikle yeni başlayan arkadaşlar için"binary" ne demek onu açıklayalım. Binary, herhangi bir sayının 2 tabanında yazılmasıdır. örneğin 10 tabanında 25 sayısını 8 bit kullanacak şekilde binary olarak yazarsak:
25=00011001 olur. buradaki mantık şu şekildedir:
2x(10^1)+5x(10^0)=0x(2^7)+0x(2^6)+0x(2^5)+1x(2^4)+1x(2^3)+0x(2^2)+0x(2^1)+1x(2^0)
8 bit kullanmamızın sebebi, B portunun 8 bit olmasından kaynaklanmaktadır.
bu durumda: 11111111=255 olacağından bizim tanımladığımız m değişkeni maksimum 255 değerini alabilmektedir.

RF haberleşme:
Arkadaşla RF haberleşmede, bir PICten diğerine göndereceğimiz komutları biz kendimiz seçeriz. örneğin bu bir harf olabilir veya sayı olabilir.
mesela bir uzaktan kumandalı araba yaptık diyelim. buradaki komutları, bilgisayar oyunlarından da aşina olduğumuz W,A,S,D harflerini seçebiliriz. aşama aşama bu arabayı hareket ettirmek için gerekli olan CCS kodlarını yazalım.

verici devresi için:

#include <16F628A.h>


#use delay(crystal=4000000)
#use rs232(baud=600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8,stream=PORT1)

 yukarıdaki kod dizisi PICe RF haberleşmede hangi pinleri kullanacağımızı tanıttı.burada baud değeri en önemli noktadır. alıcı ve vericinin baud değerleri kesinlikle aynı olmalıdır. farklı olursa devre çalışmaz. bu değer ise kullandığınız Rf modülüne göre değişebilmektedir.ancak piyasada bulunan çoğu RF modul 600 de bluetooth modulleri ise genellikle 9600 değerinde çalışmaktadır.

modülleri tanıttıktan sonra sıra geldi komutları göndermeye.

putc(0b01010101);
putc('y');
putc('W);
delay_ms(5);

ilk satırda bulunan uyku halinde olan alıcıyı uyandırmak için gereklidir.
ikinci satır ise sizin devreniz etrafta bulunan parazit sinyallerden etkilenme ihtimalini azaltır. eğer onu koymaz da direk W harfini gönderirseniz havada rastgele dolaşan radyo sinyalleri de sizin devrenizi tetikleyebilir. bu harf illaki y olmak zorunda değil siz istediğiniz herhangi bir harfi seçebilirsiniz.
bunu yazdıktan sonra da 5 milisaniyelik bir bekleme süresi koymak gerekiyor. şimdi alıcının kodlarını yazalım.

#include <16F628A.h>


#use delay(crystal=4000000)
#use rs232(baud=600,parity=N,xmit=PIN_A2,rcv=PIN_A1,bits=8,stream=PORT1)

haberleşme modülünü ve hangi pine bağlı olduğunu tanıttık şimdi ise arabayı ileriye götürecek motorun B0 pinine bağlı bir transistör tarafından tetiklendiğini varsayaraktan kodlarımızı yazalım.

char e;
e = getch();
if (e=='y') {
e=getch();
if (e=='W') {
output_high(pin_b0);
}
}
kodu analiz edecek olursak: öncelikle gelen sinyalleri bir e değişkenine atıyoruz. eğer gelen sinyal y harfi ise bir sinyal alımına daha izin veriliyor. yani y harfinden önce havadan rastgele bir W sinyali gelse bile sizin arabanızı tetikleyemez.
daha sonra gelen W sinyaliyle birlikte b0 pini high yapılıyor ve motor çalıştırılıyor.

Bu arada bazı modüllerde sinyal alışverişinde problem çıkabiliyor. Eğer bir sorunla karşılaşıssanız öncelikle alıcı ve verici devresinin topraklarını birleştirerek, vericinin out pinini alıcının in pinine kabloyla bağlayın, çalışıp çalışmadığını kontrol edin eğer çalışıyorsa alıcının ve vericinin frekansları birbirini tutmuyor olabilir. bu durumda bağladığınız kabloları söküp alıcı üzerindeki bobini tornavida yardımıyla yavaşça çevirip sinyal göndermeye devam edin. Son olarak bunları denemeden önce alıcı ve vericiye 17.1 cm lik kablo bağlamayı unutmayın.
Eğer kablo bağladığınızda da çalışmıyorsa devrenizdeki bağlantılarda ya da yazdığınız kodda sıkıntı var demektir.


verici şeması:




#include <rf-verici.h>
void main()
{
set_tris_a(0xff);

while(TRUE)
   {
 output_high(pin_b7);
 if(input(pin_a2)==1)
{
putc(0b01010101);
putc('Y');
putc('A');
delay_ms(5);
}
}
}

alıcı şeması:

#include <rf-alici.h>
char e;
int m=0;
void main()
{
    set_tris_b(0x00);
    output_b(0x00);
    while(TRUE)
    {
         e=getch();
         if(e=='Y'){
             e=getch();
             if(e=='A') {
                  m++;
             }
        }
        output_b(m);
     }

}

devre için gerekli dosyalara buradan ulaşabilirsiniz.









1 yorum:

Unknown dedi ki...

Merhaba bende kristalli takım 433 mhz var. Bunları pic16f628a ya nasıl bağlayacağımı bilmiyorum. Alıcı ve vericilerde 4 er bacak var. Birisi uzun birisi kısa modül olarak. Kafam karıştı nasıl pic e bağlayacağım bilemiyorum. İletişim için mail adresi vs. verebilir misiniz? Teşekkürler.