Sosyal Medya  

FacebookTwitterDiggLinkedinRSS Feed
   

   
   

Radio Frequency baş harflerinin kısaltması olan RF 3kHz ile 300GHz arasında çalışabilen radyo frekanslarıdır. Günümüzde kablosuz olarak haberleşen tüm sistemler RF teknoljisini kullanmaktadır. RF modüller, dataları genellikle  ASK (Amplitude Shift Keying), FSK(Frequency Shift Keying) veya OOK(On-Off Keying)  modülasyon teknikleriyle gönderip alırlar. FSK ve OOK modülasyon teknikleri kısa, orta ve uzun mesafe data aktarımları için, ASK modülasyon tekniği de kısa mesafe data aktarımları için kullanılmakta. Bu yazımda; UDEA firması tarafından üretilen ATX-34S verici ve ARX-34C alıcı RF modüllerini, Hi-Tech C programlama dilini kullanarak PIC mikroişlemciler ile çalışmasını anlatacağım.

Kablosuz haberleşmede bilgiyi doğru ve en hızlı şekilde karşıya aktarmak önemlidir. Bunun için yazılımınızın iyi bir algoritmayla oluşturulmasının yanı sıra, donanımınızın da çok iyi bir şekilde planlanıp tasarlanması gerekmekte. Bu yüzden RF modüllerle uğraşmak çetin bir iştir. RF haberleşmede, en güvenilir data aktarım tekniği FSK, hata payı en yüksek olan data aktarım tekniği de ASK'dır. Eğer hassas işlerle uğraşıyorsanız FSK data aktarımını sağlayan modülleri tercih etmenizi öneririm. Yalnız, ne kadar ekmek o kadar köfte hesabı, RF modüllerin kalitesi ve iletim mesafesi arttıkça maliyeti de artmakta. Bu yüzden, en fazla 100-150 metrede haberleşecek ve çok hassas işleri olmayan herkes genellikle ucuz fiyatından dolayı ASK modülasyon tekniğini kullanan RF modülleri tercih ediyorlar. ASK modülasyon tekniğini kullanan ATX-34S verici ve ARX-34C alıcı modülleri, Türkiye'de en çok kullanılan RF'lerdir. 433MHz'de haberleşen bu modüller, 200m'lik iletim mesafesine sahiptir. Çevresel faktörlerden çok fazla etkilenmesine rağmen, iyi bir tasarım ve yazılım ile bir çok kısa mesafeli uygulamalarda rahatlıkla kullanabilirsiniz.

ATX-34S Verici Modülü

ATX-34S verici modülü; VCC, GND, Data ve Anten pinlerinden oluşan 4 bacaklı minik bir karttır. Veri göndermeden önce karşıdaki modülün veri almaya hazır olması için önce 5 byte ön uyarıcı, sonra da 10 byte senkron bilgisi gönderilir. Daha sonra veri gönderimi gerçekleşir. Ön uyarıcı bilgisi 0xAA veya 0x55 değerleri olması UDEA firması tarafından tavsiye edilir. Senkron bilgisi de 5 byte 0x00, 5 byte 0xFF olmalıdır.

TX : ön uyarıcı + Senkron + data1+.....+dataX

Göndereceğiniz iki veri arasına gecikme girerse, tekrardan ön uyarıcı ve senkron bilgilerini göndermeniz gerekmekte. Modülle ilgili daha detaylı bilgileri buradan indirebilirsiniz.

ARX-34C Alıcı Modülü

Verici tarafından gönderilen ön uyarıcı bilgisi ARX-34C tarafından değerlendirilmez. Senkron bilgisi geldiğin ise alıcı modül, gönderici modül ile aynı frekansta çalışmaya başlar. Daha sonra veri bilgisi alınır.

PIC16F628 ile Verici - PIC18F4580 ile Alıcı Kontrolü

ASK modülleri havadan bile nem kaptığı için, yazılım ve donanım kısmı iyi düşünülerek oluşturulmalıdır. ASK modülasyon tekniğine sahip RF modülleri en sağlıklı şekilde kontrol etmek için, mikrodenetleyicilerin USART birimini kullanılır. Ayrıca havadan çok fazla gürültü kapan bu modüllere, doğru bilgiyi aktarmak için filtreleme yapılmalıdır. Böylece bizim isteğimiz dışında gelen tüm bilgiler filtre sayesinde bertaraf edilir. Geriye sadece bizim gönderdiğimiz bilgi kalır. Ayrıca alıcı kısımda USART alıcı kesmesi aktif edilirse, hiçbir veri kaybı yaşamazsınız.

ATX-34S alıcı ve ARX-34C verici modüllerinin kullanımını gösteren örnek program aşağıda verilmiştir. Yazılım, Microchip firması tarafından geliştirilen MPLAB programında, Hi-Tech-C PIC programlama dili kullanılarak geliştirilmiştir.

MPLAB programını buradan ücretsiz olarak indirebilirsiniz.

Hi-Tech-C Complier'ı buradan indirebilirsiniz.

Mikro denetleyici olarak alıcı kısımda PIC16F628A, verici kısımda ise PIC18F4580 entegreleri kullanılmıştır.

Verici

/********************************************
PIC16F628A ile USART protokolü kullanılarak
ATX-34S RF modülü ile veri gönderme...
Yazar: Muhammet EFE
********************************************/

#include <htc.h>
#include <stdio.h>

__CONFIG(CP_OFF & CPD_OFF & LVP_OFF & BOREN_ON & MCLRE_ON & PWRTE_ON & WDTE_OFF & FOSC_INTOSCCLK);

typedef unsigned int uint;
typedef unsigned char uchar;

#define TX_TRIS TRISB2
#define BAUD 51

#define B1 RA1

uchar Veri[] = {0xAA,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xCA,0x00}; // 16. bit filtre biti, 17.bit Data
uchar MOD=0;
uchar Kilit=0;

void PIC_Init(void)
{
	CMCON=7; // Tüm çıkışlar dijital yapıldı
	TRISA=0x00; // PORTA çıkış yapıldı
	TRISB=0xFF; // PORTB giriş yapıldı
	PORTA=0; PORTB=0;
}

void USART_Init(void)
{
	TX_TRIS = 0; // Tx bacağına bağlı pin çıkış yapıldı
	SPBRG = BAUD; // Baudrate 1200 yapıldı
	TXSTA = 0b00100010; // USART TX modu açıldı, RX modu kapatıldı
	RCSTA = 0b10000000; // USART iletişimi etkinleştildi.
}

void Gonder(void)
{
	uchar i= 0;
	for(i=0;i<17;i++)
	{
		while(!TRMT);
		TXREG = Veri[i];
	}
}

void main(void)
{
	PIC_Init();
	USART_Init();
	while(1)
	{
		if(!B1) // Butona basılınca bir kez 0xEF değerini gönder
			if(!Kilit){
				Veri[16]=0xEF; Gonder(); Kilit=1; 
			}
		else{
			if(Kilit){
				Veri[16]=0; Gonder(); Kilit=0; // Butondan elimizi çektiğimizde bir kez 0 değeri gönder.
			}		
	}
}

Alıcı

#include <htc.h>
#include <stdio.h>

#pragma config IESO = OFF, OSC = XT, FCMEN = OFF, BOREN=BOHW
#pragma config BORV=2, PWRT=ON, WDT=OFF, MCLRE=ON, LVP=OFF, CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF

typedef unsigned int uint;
typedef unsigned char uchar;

#define RX_TRIS TRISC7
#define BAUD 51

uchar Veri,Data=0;
uchar k=0,j=0;
void PIC_Init(void)
{
	TRISA=0; TRISB=0; TRISC=0; TRISD=0;
	PORTA=0; PORTB=0; PORTC=0; PORTD=0;
	
}
void USART_Init(void)
{
	RX_TRIS = 1; //USART RX pini giriş yapılıyor
	SPBRG = BAUD; // BAUD 1200 olarak ayarlandı
	TXSTA = 0b00000010; // TX modu kapalı
	RCSTA = 0b10011000; // USART ve RX modu açık

	INTCONbits.GIE = 1;
	INTCONbits.PEIE = 1; // USART alma kesmesi aktif edildi
	PIE1bits.RCIE = 1;
	
}
void main(void)
{
	PIC_Init();
	USART_Init();
	LED=0;
	while(1)
	{
		switch(Veri)
		{	// Veri değerini herhangibir şekilde kullanabilirsiniz. Ben burada sadece örnek verdim...
			case 0: Dur(); break;
			case 1: Ileri(); break;
			case 2: Geri(); break;
			case 3: Sag(); break;
			case 4: Sol(); break;
			case 5: Yukari(); break;
			case 6: Asagi(); break;
			default: Dur();break;
		}
	}
	
}

static void interrupt Kesme(void) // Kesme Fonksiyonu
{
	INTCONbits.GIE=0; //Tüm kesmeler kapalı
	if(RCIF)	// USART veri mi aldı?
	{
		Data = RCREG; // Ön alıcı
		if(k==1) // Veri filtreleniyor...
		{
			LED = ~LED;
			k=0;
			Veri = Data;
		}

		if(Data==0xCA && k==0) k=1;
		RCIF=0;
	}
	INTCONbits.GIE=1; // Tüm kesmeler açık
	
}

Yukarıdaki program diferansiyel tahrikli robot projesinde bizzat denenmiştir. Umarım sizle için faydalı bir yazı olmuştur. Bir sonraki yazımda görüşmek üzere.

Sağlıcakla Kalın...

Yorumlar   

+1 # Serhat 08-05-2013 06:01
Kardeşim hiç durmak yok çok faydalı paylaşımlar . Devamını dilerim :)
Cevap | Alıntıyla Cevapla | Alıntı
+1 # huzame 03-09-2013 12:38
Merhabalar uzun zamandır ben de bu konu ile uğraşıyorum gerçekten bir çok zorlukla karşılaştım. Ben filitrelemedeki 0xCA (0b11001010) sayısını neye göre seçtiğinizi sormak istemiştim. Paylaşım için çok teşekkür ederim. Yazılarınızı takibe devam ediyorum. kolay gelsin
Cevap | Alıntıyla Cevapla | Alıntı
0 # Super User 13-10-2013 07:32
0xCA sayısı tamamen keyfi seçilmiştir. Gürültüleri filtrelemek için, gürültü olarak gelme ihtimali düşük bir sayı seçmek istedim. Dilerseniz siz başka sayılar da kullanabilirsin iz
Cevap | Alıntıyla Cevapla | Alıntı
0 # huzame 13-10-2013 21:41
Teşekkürler cevabınız için çalışmalarınızı takibe devam ediyorum. Başarılar dilerim.
Cevap | Alıntıyla Cevapla | Alıntı
0 # slayizm 21-02-2014 08:57
Paylaşımlarını takip ediyorum. Çalışmalarının ve başarılarının devamını dilerim.
Cevap | Alıntıyla Cevapla | Alıntı
0 # Muhammet 26-07-2014 22:40
Güzel bir makale olmuş. Emeğinize, yüreğinize sağlık. Makalelerinizi ilgiyle takip ediyorum.
Cevap | Alıntıyla Cevapla | Alıntı

Yorum ekle


Güvenlik kodu
Yenile

   
   
© muhammetefe.com