Bu e kitapta infrared iletişim protokolleri ile ilgili basit bir uygulamayı anlatmaya çalışacağım. Bunu yine bir
mikrodenetleyici ile yapmamız gerekecek. Siz isterseniz 16f628a yı ya da ccp modülü olan herhangi bir
kontrollörü seçebilirsiniz.
İletişim için ayriyeten bir protokol oluşturmaya gerek yok. Zaten hazır protokoller mevcut. Seri iletişim için
hazır olan bu protokolleri kullanabiliriz. Bu yüzden 16f877 nin RS232 iletişim protokolünü kullanıyoruz. RS232
protokolü asenkron seri haberleşme protokolüdür. Şimdi bu protokolü kullanarak ınfrared led ile bilgileri kablosuz
olarak aktarmamız gerekiyor. Bunun için geçenki yazımda da değindiğim gibi ilk olarak taşıyıcı sinyale ihtiyacım
var. RS232 protokolü ile elde ettiğim bilgi sinyalini bu taşıyıcı sinyale modüle etmem gerekiyor.
Taşıyıcı sinyali controller ın CCP modülü ile elde edebilirim. Yahut herhangi bir osilatör kaynağı da
kullanabilirim. Ama şimdilik taşıyıcı sinyalini, kullandığım denetleyicin CCP modülünün pwm sinyali ile elde
edeceğim.
Sinyali şu şekilde modüle ediyoruz;
Şimdi bu devreyi göz önünde bulundurduğunuzda, bilgi sinyalimin logic-0 olduğu durumlara bakar isek ledin
yanıp sönmesi taşıyıcı sinyalin logic durumuna bağlı olacaktır. Yani eğer bilgi sinyali, logic-0 durumunda ise IR-led
taşıyıcı sinyalin durumuna göre yanıp sönecektir. Fakat bilgi sinyalinin logic-1 olduğu durumda, taşıyıcı sinyali
hangi durumda olursa olsun led yanmaz çünkü ters polarlanmış olur.
Doğal olarak ben sinyali modüle ederken aynı zaman da ters de çevirmiş oluyorum. Yani bilgi sinyalinin logic-1
durumlarını logic-0 olarak, logic-0 durumlarını ise logic-1 olarak göndermiş oluyorum. Bunun sebebi; alıcı ile
alakalıdır. Geçenki yazımda alıcının yapısından bahsetmiştim. Alıcı sinyal almadığı zamanlarda çıkışına logic-1
bilgisi gönderirken sinyal aldığında logic-0 bilgisi gönderdiği için vericiden sinyali ters çevirip yollamamız gerekiyor.
Yani aslında biz sinyali ters yolluyoruz ama alıcı o ters sinyali tekrar düze çevirip alıcı denetleyiciye yolluyor.
Uygulamada şunu yapacağım; vericiden RS232 protokolünü kullanarak alıcıya text bilgisi göndereceğim ve alıcı
bu bilgiyi alarak 300 ms aralıklarla “Yusuf Bulbul”, “Infrared Iletisim” yazılarını basacak.
Doğal olarak iki tane elektronik devre olacak. Birisi alıcı birisi verici.
Alıcı Devresi;
Verici Devre;
Taşıyıcı sinyalim şu şekilde;
Bu sinyal denetlyicinin CCP1 modülünü kullanarak ve setup_timer_2(T2_DIV_BY_1,25,1); komutu ile
oluşturulmuştur. 38khz dir.
Bilgi sinyalim;
Bu sinyal rs232 protokolünün printf(“…../r”) protokolü kullanılarak oluşturuluyor ve alıcıya text bilgileri yollanıyor.
Bu da modüle edilmiş sinyal;
Alıcı programı;
#include <16f877.h>
tanıtılıyor.
01
02
// Kullanılacak denetleyicinin başlık dosyası
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD //
Denetleyici konfigürasyon ayarları
03
04
#use delay(clock=4000000)
frekansı belirtiliyor
// Gecikme fonksiyonu için kullanılan osilatör
05
06
#define use_portb_lcd TRUE
// LCD B portuna bağlı
07
08
#include <lcd.c>
// lcd.c dosyası programa ekleniyor
09
10
#use rs232 (baud=2400,rcv=pin_C1,stop=1,parity=n)
yapılıyor
// RS232 ayarları
11
12
char data[16]; // dizi tanımlanıyor
13
14
/******************* ANA PROGRAM FONKSİYONU *************************/
15
void main ()
16
{
17
setup_psp(PSP_DISABLED);
// PSP birimi devre dışı
setup_timer_1(T1_DISABLED);
// T1 zamanlayıcısı devre dışı
18
19
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
20
setup_adc_ports(NO_ANALOGS);
// ANALOG giriş yok
setup_adc(ADC_OFF);
// ADC birimi devre dışı
setup_CCP1(CCP_OFF);
// CCP1 birimi devre dışı
setup_CCP2(CCP_OFF);
// CCP2 birimi devre dışı
21
22
23
24
25
lcd_init(); // LCD hazır hale getiriliyor
26
27
delay_ms(2000);
// İletişime başlamadan 2 saniye bekleniyor
28
29
while(1) // Sonsuz döngü
30
{
31
if (input(pin_c1)==0)
veri aldıysa)
// RC1 ucu sıfır ise (Kızıl ötesi alıcı,
32
{
33
gets(data);
// RX ucuna gelen veriyi al
34
printf(lcd_putc,"f%s",data); // LCD'ye alınan string ifadeyi
gönder
35
36
delay_ms(1200);
// 1 saniye bekleniyor
printf(lcd_putc,"f");
// LCD temizleniyor
37
delay_ms(500);
// 0.5 saniye bekleniyor
38
}
39
}
40
}
41
42
Verici Programı;
#include <16f877.h>
tanıtılıyor.
// Kullanılacak denetleyicinin başlık dosyası
01
02
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD //
Denetleyici konfigürasyon ayarları
03
04
#use delay(clock=4000000)
frekansı belirtiliyor
// Gecikme fonksiyonu için kullanılan osilatör
05
06
#use rs232(baud=2400, xmit=PIN_C6, stop=1, parity=n)
ayarları yapılıyor
// RS232 iletişim
07
08
09
/******************* ANA PROGRAM FONKSİYONU *************************/
10
void main ()
11
{
12
setup_psp(PSP_DISABLED);
// PSP birimi devre dışı
setup_timer_1(T1_DISABLED);
// T1 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS);
// ANALOG giriş yok
setup_adc(ADC_OFF);
// ADC birimi devre dışı
setup_CCP2(CCP_OFF);
// CCP2 birimi devre dışı
13
14
15
16
17
18
setup_timer_2(T2_DIV_BY_1,25,1); // Timer2 ayarları yapılıyor, PWM
sinyali frekansı=~38Khz olacak şekilde
19
set_pwm1_duty(12);
belirleniyor
// PWM sinyalinin görev saykıl oranı
20
setup_CCP1(CCP_PWM);
ayarlanıyor
21
22
while(1) // Sonsuz döngü
23
24
{
// CCP modülü PWM çıkışı için
printf("Yusuf Bulbulr");
gönderiliyor
// Seri port çıkışından (TX) bilgi
25
delay_ms(300);
// 0.5 saniye gecikme veriliyor
26
printf("Infrared Infrared/r");
27
delay_ms(300);
28
29
}
30
}
31
32
Gerekli Dökümanlar ve elektronik devre şemaları için; Kızıl Ötesi İletişim Uygulaması na bakabilirsiniz.
Download

iletişim uygulaması