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) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor 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) // RS232 ayarları yapılıyor 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ışı 18 setup_timer_1(t1_disabled); // T1 zamanlayıcısı devre dışı 19 setup_timer_2(t2_disabled,0,1); // T2 zamanlayıcısı devre dışı 20 setup_adc_ports(no_analogs); // ANALOG giriş yok 21 setup_adc(adc_off); // ADC birimi devre dışı 22 setup_ccp1(ccp_off); // CCP1 birimi devre dışı 23 setup_ccp2(ccp_off); // CCP2 birimi devre dışı 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) // RC1 ucu sıfır ise (Kızıl ötesi alıcı, veri aldıysa) 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
37 38 39 40 41 42 printf(lcd_putc,"f"); delay_ms(500); // LCD temizleniyor // 0.5 saniye bekleniyor Verici Programı; #include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor. 01 02 #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları 03 04 #use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor 05 06 #use rs232(baud=2400, xmit=pin_c6, stop=1, parity=n) // RS232 iletişim ayarları yapılıyor 07 08 09 /******************* ANA PROGRAM FONKSİYONU *************************/ 10 void main () 11 12 setup_psp(psp_disabled); // PSP birimi devre dışı 13 setup_timer_1(t1_disabled); // T1 zamanlayıcısı devre dışı 14 setup_adc_ports(no_analogs); // ANALOG giriş yok 15 setup_adc(adc_off); // ADC birimi devre dışı 16 setup_ccp2(ccp_off); // CCP2 birimi devre dışı 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); // PWM sinyalinin görev saykıl oranı belirleniyor 20 setup_ccp1(ccp_pwm); // CCP modülü PWM çıkışı için ayarlanıyor 21 22 while(1) // Sonsuz döngü 23 24
printf("yusuf Bulbulr"); // Seri port çıkışından (TX) bilgi gönderiliyor 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.