avatar_ete

IR_HABERLEŞME PROJESİ

Başlatan ete, 21 Haziran 2015, 18:44:10

ete

Önce bir konuya açıklık getirmek gerekir. IR pinineden 25 sn boyunca lojik 1 de kalıyor?
Ir göz çıkışını pic pinine bağlamadan kumanda tuşuna basarak çıkışı aktif et ve bak bakalım yine bu çıkış 25 sn boyunca high da bekleyecekmidir. Beklemiyor ise onu kod tutuyordur. Bu durumda kullandığın göz nec protokolüne uygun olmayabilir. Nec hangi frekansı kullanıyordu unuttum.

Ete

blueboard

Ete Hocam,şimdi IR gözün data ucunu devreden ayırdım. Kumandadan herhangi bir tuşa basmıyorken  Data ucunda 4.88 Volt gerilim okuyorum. Tuşa elimi basılı tuttuğum sürece 4.42-4.45 volt aralığında geziyor. Tuştan elimi çektiğimde gerilim hemen 4.88 Volt'a geri dönüyor.

blueboard

#32
Şimdi baktım Sony 40 Khz taşıyıcı frekans, NEC ise 38 KHz taşıyıcı frekans kullanıyor.Bu arada şunu da belirtmek istiyorum; Sony için yaptığım alıcıda Pic'i PCB 'ye soket ile takıyordum. NEC için de aynı kartı kullanıyorum.

ete

En doğrusu data çıkışına skop yada lojik analizör ile bakmak. Voltaj ölçümü insanı yanıltır bence.
Öyle anlaşılıyorki göz çıkışı sürekli high da bekliyor yada göz bozulmuş sürekli high veriyor.
Şimdi hatırlamıyorum göz çıkışları içerden pulluplı mıdır acaba elinde olan birisi bakabilirmi.

Ete

blueboard

Ete Hocam,gözü değiştirdim ve denedim sonuç aynı. Farklı bir kumanda ile denedim değişen bir şey olmadı,yaklaşık 25 sn boyunca pinler high'ta kalıyor.Yanlız kumandanın gönderdiği kodlara lojik analizörde bakınca şu dikkatimi çekti; 32 bitlik paket gönderildikten bir süre sonra NEC protokünde de açıklanmış komutun tekrarı anlamında 9 ms civarı high ardından 2.25 ms low gönderiliyor.Bu kısım yazdığınız programı 25 sn boyunca kilitliyor olabilir mi? Çünkü programda 9 ms header sinyali gördükten sonra 32 bit low ve highları almaya başlıyor. Ama bizim kumandadan tekrar komutu anlamındaki 9 ms header sinyalinden sonra 32 bit data gönderilmiyor.İlgili resimleri ekledim. Resimleri yakınlaştırdığınızda tekrar komutunu göreceksiniz. Teşekkürler.

blueboard

#35
Ete Hocam, 25 sn civarı gecikmenin NEC protokolündeki Repeat Code özelliğinden kaynaklandığına artık eminim.Bu sorunu kendimce şöyle aştım:
Programda tuş ayıklama işlemi bittikten hemen sonraya 150 ms lik bir bekleme ilave ettim.Repeat Code de repeat sinyali paketin tamamlanmasından 110 ms sonra kumandadan aynı tuşa basılmaya devam ederse üretiliyordu.Ben de 150 ms bekleme ile repeat Code'yi söndürmüş oldum.Yeni kod şöyle oldu:
TUS=0
       for I=0 to 7
         IF IR_AL(16+I)>70 then TUS.0[I]=1
       next
       pause 150
       RETURN

Bu 150 ms sonunda ilgili pini lojik1 yaparak istediğim süre lojik1 de bekletip sonra lojik 0 'a çektim.
Yani :  IF TUS=%01000000 THEN  'AÇMA - KAPAMA       
        PORTB.0=1
        pause 150
        portb=0
        GOTO BASLA
oldu.
Şimdi tuşa basıp çektikçe 25 sn bekleme olmadan deneme amaçlı olarak ledi istediğim kadar yakıp söndürebiliyorum.Tek sıkıntı şurada kaldı;tuşa sürekli elimi basılı tutarsam ilk repeat codeyi atlıyor ama 110 ms sonra gelen ikinci repeat code'de  olan 9 ms high+2.25 ms low sinyali gördüğü için yine 25 sn kadar beklemeye geçiyor.
Repeat code datası tam olarak şöyle gerçekleşiyor:9 ms  high+2.25 ms low ardından 560 mikrosn high.
Ete Hocam , programa "9 ms  high+2.25 ms low ardından 560 mikrosn high." gördüğünde GOTO BASLA komutunu çalıştıracak bir ekleme yapılamaz mı? Teşekkürler.

ete

Bu IR konusu ne zaman açılsa bende merak uyandırıyor. Bilmece çözme ile eşdeğer bir duygu sanki.
NEC protokolünü daha önce incelemiş kendimce basit bir kod yazmış idim. Hiç denemek fırsatım olmadı tabiiki.
Ancak görüyorumki bazı aksaklıklar var. Bu durumda oturup yeniden inceledim protokolü. Temel kriterler şunlar.
- Header sinyali 9 ms HIGH (burst) ve 4,5ms LOW (space)
- HIGH biti 1,69 ms HIGH ve 560us LOW
- LOW biti 560us HIGH ve 560us LOW
- Repeat sinyali 9 ms HIGH (Burst) ve 2,25ms LOW
- İki Repeat sinyali arası 110 ms LOW
- Adres (Cihaz ) Kodu 16 bit lik bunun ilk 8 biti gerçek cihaz kodu sonraki 8 bit ise ilk 8 bitin ters çevrilmiş (invert edilmiş) hali
- Komut Kodu yine 16 bitlik ama ilk 8 bit gerçek Komut kodu ve sonraki 8 bit ise ilk 8 bitin ters çevrilmiş hali.
- En önemli kriterlerden biriside IR_GÖZ çıkışı gerçek sinyalin ters çevrilmişini veriyor olmasıdır. Bu tabiiki devre tasarımınada bağlıdır.
Şayet IR_GÖZ çıkışına bir NPN transistör ilave ederseniz gönderilen IR sinyalin aynısını çıkışdan demodule edilmiş olarak alırsınız.
Ama mikrodenetleyicilerle birlikte kullandığımız zaman genelde transistör kullanmıyoruz. Bu nedenle gelen sinyalin ters çevrildiğini kabul edeceğiz.

Bu durumda Header sinyali gerçekte  (9 ms HIGH + 4,5 ms LOW) şeklinde iken IR-Göz çıkışında (9 ms LOW + 4,5 ms HIGH) şeklinde çıkacaktır.
IR kodu çözmenin püf noktası header sinyalini yakalamaktan ibarettir. Bunu yakalarsanız gerisini halletmek zor değildir. Bu nedenle bu konuya odaklanacağız. Bu konuda iki alternatifimiz var. Bunlar,
A) 9 ms lik LOW yakalarız
Tercihimiz bu olursa, yalnızca 2 farklı LOW sinyali var ve ayırd etmek kolay olacaktır. Ancak dezavantajı şu, çok fazla repeat sinyali mevcut onların 9 ms lik LOW larınıda yakalamış olacağız. Bu da boşuna beklemeler yaratacaktır. Zaten bu mesajın yazılmasına konu olan sorun da bu .

B) 4,5 ms lik HIGH yakalarız .
İdeali bu gibi gözüküyor. Zira bu sinyali yakalayabilirsek header'i yakalamış olacağız. ardından gelen 32 biti alıp  kolaylıkla adres (cihaz) ve komut kodllarını ayıklayabiliriz.

Mademki A şıkkını tercih ettiğimiz zaman sorun çıkıyor bu seferde B şıkkını deneyelim diyorum.
Programın yalnızca TUSGIR etiketi altında yer alana header yakalama kısmını değiştireceğiz.
TUSGIR:
       TUS=0:CIHAZ=0
       I=0:TAMAM=0:PAKET=0
       
       while I< 30  'EN AZ 30 DEFA HEADER SİNYALİ ARAYACAĞIZ. BULURSAK NE ALA BULAMAZ İSE DÖNGÜDEN ÇIKACAĞIZ
         PULSIN IR_GOZ,1,PAKET
         IF PAKET >400 AND PAKET <500 THEN CIK '4,5ms arada bir değer olacaktır
         I=I+1
       WEND 

Bunda sonrasında header yakalanmış olacağı için diğer kodları değiştirmiyoruz.
Bu değişiklik bize ne kazandıracak? header sinyallerini atlayabilecek ve yalnızca paket başında verilen header sinyalini yakalamış olacağız.
Zira dikkat ederseniz header de 9ms lik HIGH ardından gelen 4,5ms lik LOW var. Biz bu LOW sinyalini yakalamaya çalışacağız. Çünki Repeat sinyallerinde 9ms lik HIGH ardından 2,25 ms lik LOW yer almaktadır. O halde 4,5ms lik LOW (IR çıkışında bu HIGH olmaktadır) yakalanırsa boşuna repeat sinyallerine takılmamış olacağız.
Burada kiritik bir nokta var. WHILE I<30  komut satırında yer alan 30 rakamını daha önceki programda 50 olarak kullanmış idik.
Bana kalırsa 30 rakamını önce 20 olarak denemek lazım. Sorun çıkmıyor ise öyle bırakmak hatta daha düşük değerleri denemek gerekir.
Sorun oluyorsaki sorun genelde sinyali yakalayamama ve dolayısıyla kod okuyamama şeklinde ortaya çıkar, I değeri 20-25-30-35-40-45-50 gibi değerler denenerek artırılmalıdır.

Bu kod örneği ile sorunun giderilmiş olacağını düşünüyorum.
Sonucu bildirirseniz sevinirim.
Ete

blueboard

#37
Ete Hocam, verdiğiniz bigilere göre değişiklikleri yaparak denedim. Artık Repeat Code kısmı sorun oluşturmuyor. Ama ortada hâla küçük bir sorun var. O da şu: Diyelim ki Vol + 'ya bastınız, portb.0 lojik 1 oluyor ama yaklaşık 15 sn boyunca yanık kaldıktan sonra kendiliğinden sönüyor. Bu 15 sn süre içerisinde Vol- 'ye bastığımı kabul edelim. Vol-'nin portb.1 pini de lojik1 konumuna geçiyor  ve 15 sn süre sonunda her ikisi birden sönüyor. 4 tuşun tamamına sıra ile arka arkaya basmış isem 4 led birden yanıyor ve 15 sn civarı olan sürenin sonunda hepsi birden sönüyor. Ben programda şu değişikliği yaptığımda ilgili pin 100 ms sonunda normal olarak sönüyor.
BASLA:

      gosub TUSGIR
      IF TUS=64 THEN  'SES+       
        PORTB.0=1
        pause 100
        GOTO BASLA
      endif
     
      if tus=25 THEN  'SES-
         PORTB.1=1
         pause 100
         GOTO BASLA
      ENDIF
     
      IF TUS=9 THEN   'SEEK+
         PORTB.2=1
         pause 100
         GOTO BASLA
      ENDIF             
           
      IF TUS=7 THEN  'SEEK*
         PORTB.3=1
         pause 100
         GOTO BASLA
      ENDIF

Aslında Basla döngüsünün sonunda "PORTB=0" yazıyor ama nedense programın o satıra gitmesi 15 sn yi buluyor. Bir de "PORTB=0" ı tusgir'de ilk olarak yazdım. Her iki dosyayı da ekliyorum. Teşekkürler.

blueboard

Ete Hocam , bu arada şunu da gözlemledim. Diyelim ki herhangi bir port  lojik1 konumuna geçti ve yanık kaldı. Bu esnada uzaktan kumandadan tanımlanmamış bir tuşa basarsam yanık olan led sönüyor.

ete

Tuş kodu çözüldükten sonra koda göre işlem yapma kısmında bir sorun olsa gerek.
Normalde bu tür işlerde işlem yaptıktan sonra programı başa yollarım.
Tuşa basılı olduu müddetçe program hep başa yollanır.
Kumanda dan tuşu bıraktığın zaman ise program GOTO BASLA satırına kadar gider. Çünki çözülen bir tuş kodu yoktur.
İşte oraya PORTB=0 yazılırsa tuş bırakılır bırakılmaz tuşa basılınca led yanıyor ise o led anında söner. Aşağıdakini bir dene istersen.

Ete
BASLA:

      gosub TUSGIR
      IF TUS=%01000000 THEN  'AÇMA - KAPAMA       
        PORTB.0=1
        GOTO BASLA
      endif
     
      if tus=%00011001 THEN
         PORTB.1=1
         GOTO BASLA
      ENDIF
     
      IF TUS=%000001001 THEN
         PORTB.2=1
         GOTO BASLA
      ENDIF             
           
      IF TUS=%00000111 THEN
         PORTB.3=1
         GOTO BASLA
      ENDIF
             
      PORTB=0
     
      GOTO BASLA

blueboard

#40
Ete Hocam,değişen bir şey olmadı. Tanımlamış olduğum 4 adet tuşa(7,9.25 ve 69)  sıra ile bastığımda hepsi yanıyor.Ledler yanık iken tanımsız bir tuşa bastığımda hepsi sönüyor.Tanımsız bir tuşa basmaz isem yaklaşık 15 sn sonra sönüyor.Programın son halini tekrar ekliyorum.
'****************************************************************
'*  Prog.Adı: IR_ALICI.BAS                                      *
'*  Yazan   : [*****ETE*********]                               *
'*  Notice  : Copyright (c) 2015                                *
'*          : Program hakları ETE'ye aittir izinsiz kopyalanmaz *
'*  Tarih   : 20.06.2015                                        *
'*  Versiyon: 1.0                                               *
'*  Açıklama:                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628
@ DEVICE PIC16F628, WDT_Off
@ DEVICE PIC16F628, LVP_Off
@ DEVICE PIC16F628, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F628, MCLR_Off
@ DEVICE PIC16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
'@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _DATA_CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
DEFINE OSC 4

CMCON = 7
PortA=0:TRISA=%00000001
PORTB=0:TRISB=%00000000

Paket var word 56
TAMAM VAR WORD 58
Tus   Var Byte 60
Cihaz Var Byte 61
IR_AL var BYTE(32)62

I     var Byte 100
Z     var BYTE
Led   var bit
symbol IR_Goz=Porta.0

PAUSE 300

'---------------------------------------------------------------------------
'Tus Kodları:
' Kanal+ =9 -- Kanal- =7
' Ses +  =64 -- Ses -  =25


BASLA:

      gosub TUSGIR
      IF TUS=64 THEN  'SES+           
        PORTB.0=1
        GOTO BASLA
      endif
     
      if tus=25 THEN  'SES-
         PORTB.1=1
         GOTO BASLA
      ENDIF
     
       IF TUS=9 THEN   'SEEK+
         PORTB.2=1
         GOTO BASLA
      ENDIF             
           
      IF TUS=7 THEN  'SEEK-
         PORTB.3=1
         GOTO BASLA
      ENDIF
             
      PORTB=0
     
      GOTO BASLA
     
TUSGIR:
       TUS=0:CIHAZ=0
       I=0:TAMAM=0:PAKET=0
       
       while I<15  'EN AZ 30 DEFA HEADER SİNYALİ ARAYACAĞIZ. BULURSAK NE ALA BULAMAZ İSE DÖNGÜDEN ÇIKACAĞIZ
         PULSIN IR_GOZ,1,PAKET
         IF PAKET >400 AND PAKET <500 THEN CIK '4,5ms arada bir değer olacaktır
         I=I+1
       WEND   
       IF PAKET<700 THEN RETURN
CIK:       
       PAUSEUS 50
       for I=0 to 31
         pulsin IR_Goz,1,IR_AL(I)
       next
       
       CIHAZ=0
AYIKLA:
       For I=0 to 7
         if IR_AL(I)>70 then CIHAZ.0[I]=1
       next

       TUS=0
       for I=0 to 7
         IF IR_AL(16+I)>70 then TUS.0[I]=1
       next

       RETURN
       
END

blueboard

#41
Ete Hocam,haddim olmayarak dikkatimi çeken bir şeyi aktarmak istiyorum.Sanki şurada bir mantık hatası yapıyoruz gibi geliyor.
Kabul edelim ki ses+ tuşuna bastık.Tusgir etiketine gitti ve burada 64 tespiti yapılarak geri döndü.Döndüğü yerde 64 'ün karşılığında PORTB.0=1 oldu ve led yandı.Ardından GOTO BASLA 'ya döndü ve tekrar TUSGIR'e gitti. Bu sefer Vol-'ye bastığımızı kabul edelim. TUSGIR bu sefer 25'i tespit etti. Tekrar başa döndü portb.0 hâla yanıyor iken bu sefer de portb.1 'de yanmaya başlıyor.Bu durum diğer 2 tuş için de aynı şekilde devam ediyor gibi geldi.Yani sanki hiç bir zaman PORTB=0'a ulaşamıyor gibi geldi. Bir önceki yanan ledin sönmesi için en azından şöyle yazsak daha doğru olmaz mı? portb=%00000001     , portb=%00000010 gibi  .  Tabi yanlış düşünüyor da olabilirim.


ete

#42
Vol+ ya bastıktan sonra mutlaka kumanda tuşlarını bırakıp sonra Vol- ye basman gerkemezmi?. Aynı anda hem Vol+ ya hemde Vol- ye basıyorsan ona bir lafım yok ama tuşları bıraktığın anda program hiç bir tuşa basılmadığını görüp PORTB=0 a gitmesi gerekir.
Gitmiyor ise oradaki I değerini düşür ve programa hiç Pause ekleme. Aksi halde gecikir ve gidemez elbette.
Bu mantığı yüzlerce kez denemeişimdir her seferinde gayet güzel çalışır. Ama NEC protokolünden kaynaklanan bir takım sorunlardan dolayı çalışmaz ise onu bilemem. Sorunu bulursak çözümüde üretiriz.
Bana kalırsa Vol+ ya bas led yansın. Sonra elini Vol+ dan çek ve led sönünceye kadar bekle bakalım ne kadar sürede sönecek?

Programdaki I değişkeninin kullanılma mantığı şudur. Şayet kumanda dan hiç bir tuşa basmıyor isek , header sinyali gelmeyecek demektir. O halde program boşu boşuna Header sinyaline takılmasın diye belirli sayıda header arama özelliği getirmiş oluyoruz. Ancak kumanda tuşuna basılıyor ve o anda program data bitlerinin arasında header arıyor ise veya repeat sinyalleri arasında header arıyor ise bunuda bir kaç kez tekrarlamalıdır. Aksi halde header bulamadan yok diye geri döner. Bunuda önlemek için belirli sayıda bakmasına izin veriyoruz.
Bu bakımdan I değeri ile bana kalırsa 10 vererek deneme yap. Şayet sorunsuz header bulup ledi yakıyor ise (bir kaç kez üst üste denemek gerek) dahada azaltmak mümkün bu I değerini. Taa ki sıkıntı çıkıncaya kadar.

Ete

blueboard

Ete Hocam, elbette önce Vol+'ya basıyorum ve b.0 yanmaya başlıyor.B.o yanık iken  Elimi butondan kaldırıp Vol- butonuna bastığımda bu sefer b.0 yanık iken b.1  de yanmaya başlıyor. I değerini 3'e kadar düşürdüm. Bu arada şu durum dikkatimi çekti I<30 iken yanık kalma süresi 25 sn civarı, I<15 iken yanık kalma süresi  ve I<3 iken de 3 sn civarı yanık kalma süresi gözledim. Sanki yanık kalma süresi I ile doğru orantı gösteriyor gibi geldi.

ete

Göz çıkışını bir lojik analizöre bağlayabilirsen ve çıktıyı kayıt edip resim olarak buraya koyabilirsen incelemek isterim.
Sinyalin nasıl olduğu nelerin tekrarlandığı konusunda net bir bilgiye sahip değilim. Açıklamalar bana göre yetersiz.

Ete

Powered by EzPortal