Kenwood uzaktan kumanda kodlarını okuma

Başlatan blueboard, 23 Şubat 2014, 20:08:03

blueboard

Ete Hocam, Kenwood marka müzik seti için uzaktan kumanda yapmaya çalışıyorum.Ancak internette bununla ilgili olarak bulabildiğim tek bilgi şu: Kenwood NEC protokolünü kullanıyor. Bu protokolü araştırdım ve ekteki word dosyasında detaylı olarak açıkladım. Şimdi yapmak istediğim şu: 16F628A ile TK19 kullanarak bir alıcı devre yapmak ve kumanda da her tuşa basıldıkça gönderilen datayı LCD ekranda görmek istiyorum( 110110010110111 gibi) Nec protokünde logic 1 ve logic 0 sürelerini bildiğim için LCD de sadece bu şekilde dataları görsem benim için yeterli olacak. Forumda sizin Sony SIRC protolü ve RC% protoklü için yazmış olduğunuz uzaktan kumanda alıcısı için yazmış olduğunuz kodları da inceledim(http://etepic.com/index.php/topic,761.0.html)   ve yapmaya çalıştığım konu ile ilgili bir PBP dosyası ekledim. PBP dosyasında eksikliklerimin olduğunu düşünüyorum,hatalarımı bildirir misiniz?
Teşekkür ederim.

ete

Elbette pek çok eksik ve kusur var . Protokolü incelersen bir data paketi şu şekilde yollanıyor.
9ms(Header-HIGH)+4,5ms(header_end_Low)+8 bit Cihaz kodu+8 bit ter cihaz kodu+8 bit tuş kodu+8bit ters tus kodu.
Gelen sinyal TK19 ile alındığı zamranacak sinyal LOWan LOW olan bitler HIGH , HIGH olan bitler ise LOW olarak alınır. Bu nedenle programı bu mantığa göre düzenlemek gerekir.
Yapılacak işlem sırası şöyle olmalı
1. Header sinyali yakala ;  Sinyal 9000us uzunlukta olacak. Pulsin komutu bunu 900 olarak okuyacak aranacak sinyal LOW olmalı. O halde PULSIN IR,0,Paket, ALınan değer 850 den küçük ve 950 den büyük ise tekrar al denilmeli.
2. Header yakalandıktan sonra 4500 us lik bir gecikme koyularak header sonu geçiştirilebilir. Pauseus 4500
3. Bunuda yaptıktan sonra sıra gelen bitleri almaya gelir. Normal şartlarda gelen bitlerin ilk parçası hep aynı olduğu için onu atlıyoruz. Bir sonraki parça olan LOW kısmını alıyoruz ancak TK19 dan dolayı bu parça low değil HIGH olarak alınacaktır.
FOR I=0 t0 7
  PULSIN IR,1,Cihaz[I]
Next
Daha sonra aynı kodun ters çevrilmiş halini atlamak uygun olur sanırım. Bunun için,
FOR I=0 to 7
  PULSIN IR,1,Paket
Next
4. Şimdi sıra Tuş koduna geliyor.
    For I=0 to 7
        PULSIN IR,1,Tus[I]
    next
5. Tuş kodunun tersini almaya gerek yok. Bu alınanlarla kod çözülebilir artık. Şimdi aldıklarımızı değerlendirmemiz gerekiyor.
Önce Cihaz kodunu oluşturalım. Okunan bit 1690us olduğundan Pulsin komutu bunu 169 olarak okuyacaktır.
Önce Cihaz koduna ait bütün bitleri 1 yapalım CihazKodu=255 sonra bu bitlerden sıfır olanları bulup bitleri sıfırlayalım.
For I=0 to 7
         if cihaz(I)<160 then cihazkod.bit0[I]=0
next,   böylece bitlerden sıfır olması gerekenleri sıfır yapmış oluruz.

Aynı mantığı tuş koduna da uygulayalım.
  Tuskod=255
For I=0 to 7
     If Tus[I]<160 then Tuskod.Bit0[I]=0
Next
Böylece bu işlemlerin sonunda elimizde hem tuş kodu hemde cihaz kodu olmuş olur.

Bir iki nokta daha ilave edeyim. Okunan bitlerin asılları 255 den büyük olmalarına rağmen Pulsin değerleri 8 bitlik sınırda kaldığından değişkenler Byte cinsinden olmalıdır.
Açıklamalara ilave olarak programı da buraya koyuyorum. Umarım çalışır.

Ete


blueboard


canbulut

hocam kodların içinde
if cihaz(I)<160 then cihazkod.bit0[I]=0

kodda bir hatalı yazım hatası var gibi "bit0" yazısına dikkat ediniz. yoksa anlayamadığım bir şeymi var? saygılar

ete

Cihazkod.Bit0[I] şeklinde bir kullanım hatalı değildir. Burada bir hata yok. Bu kullanım şeklinde Cihazkod isimli Byte değişkeninin bitlerine index (I) değişkeni kullanılarak ulaşılır.
Örneğin Cihazkod isimli değişkenin sıfır nolu bitine ulaşmak için Cihazkod.Bit0[0] yazmak yeterlidir.
1 nolu bit için Cihazkod.Bit0[1] yazılması gerekir.
Aynı komut Cihazkod.0[0]   şeklinde de yazılabilir.

Ete

canbulut

#5
teşekkürler hocam.

canbulut

#6
hocam pulsin komutu nasıldır kullanmamızı önerir misiniz? aşağıdaki resimde pulsin komutunu kullanarak nasıl 900us durumlarına göre bu gelen birdir veya sıfırdır deniyor? resimdeki puls üzerindeki çizgileri yok etmek için modülasyon yapmamız gerekir mi? Böyle bir şeye gerek var mı?




ete

#7
O resmi büyütürsen sinyalin High kısmının aslında modulasyon (muhtemelen 38 khz) frekansı şeklinde olduğunu görebilirsin. Bu durumda pulsin komutununorada kullanman yersiz olur. Pulsin ancak demodüle edilmiş sinyale uygulanabilir. IR gözler modülasyon sinyalini kaldırıp orada kesiksiz bir High görülmesini sağlarlar.
Protol önceden planlanmış bir sisteme göre verilmiş bilgi dizisidir. Dolayısıyla pulsin komutu ile bir yere varılması zor. Bilgi dizisi süreleri ayarlanmış high ve low pulslerinden oluşur. Dolayısıyla bu sinyalleri bilerek ve sıra takip ederek almak ve özellikle sürelere dikkat etmek gerekir. High beklenen yerde low bakılırsa sinyal zincirinin dışına çıkarsın ve bir şey alamazsın yada alırsın ama aldığın bir anlam ifade etmez. Bu nedenle sinyali protokol esaslarına uygun şekilde almaya çalışmak en doğrusudur.

Ete

canbulut

aslında hocam protokolünü bilmediğim sinyaller ile uğraşmak niyetindeyim ama yolun başındayım. o yüzden öncelikle bilinen protokoller üzerinden gitmeye çalışıyordum sizin bu konuya rastladım. başlangıçta bir kaç protokol ile de işlemler yapabilirim. kenwood projenizden yola çıkarak bişeyler yaptım çalışmadı. Sizde kenwood'un protokolünü bilmiyordunuz da pulsin ile mi yaptınız?
Hocam ben bilinen protokoller üzerinden de gidebilirim. ama onları da nasıl işleyeceğim hakkında bir bilgim yok :( yardımlarınızı rica ediyorum hocam.

ete

Kimi protokolde bit sırası ve onların HIGH mi yoksa LOW mu oldukları önemlidir. Kiminde ise bitlerin sırası ile birlikte bit süreleri çok önemlidir. Bu ikinci alternatif genelde çoğunluktadır.
Pulsin komutu bit süresi ölçer. Genelde protokollerde bir bit iki bitlik bir işaret ile ifade edilir.
Mesela Bir Kısa low+Uzun HIGH buna HIGH diyelim. Otomatikman Bir Kısa HIGH ve bir Uzun LOW da LOW bitine karşılık gelir.
Kod çözerken her iki bite birden bakılmaz. Daima en belirgin olan birine bakmak yeterli olur.
Yukarıdaki örneğimizde verilen KL(KısaLOw)+UH(UzunHigh) örneğine uygun olarak şöyle bir sinyalimiz olsa;
(KL+UH) - (KL+UH) - (KH+UL) - (KL+UH) - (KH+UL)
Burada rakam değerini tespit etmek için Yalnızca KL-KL-KH-KL-KH bitlerine bakmak işimizi halletmek açısından yeterlidir. Burada bit süreleride çok önemli değildir üstelik. Bu durumda yalnızca gelen bitlerin ne olduğuna bakıp onları direk almak yeterli olacaktır. Böylece alınan bitlere bakarak sayının %11010 olduğunu kolaylıkla anlayabiliriz.
Buna tanıdık bir örnek vermek gerekirse RC5 protokolünü verebiliriz. 900us lik H+L=LOW ve benzer şekilde L+H=HIGH olarak nitelendirilmektedir. O halde bu protokolde yalnızca ikinci bitlere bakarak gönderilen rakamı tespit edebiliriz. Hemde sürelerine bakmadan yalnızca bitin HIGH mi yoksa LOW mu olduğuna bakarak.
Ama çoğu protokollerde bit süreside kodun çözülmesinde etkin rol oynar. Bu nedenle protokole göre karar vermek gerekir.
Kod çözmenin birinci temeli header sinyalini yakalamaktır. Zira yollanan bilgi bir zincir yada tren katarı gibidir. Lokomotif konumunda Header sinyali vardır. Önce bu sinyal yakalanmalı ardından gelen bitler protokole uygun şekilde alınmalıdır.
Diğer önemli bir konu da kullanılan IR gözlerin aksine bir devre elemanı yok ise gelen sinyali ters çevirerek size verdiğini unutmayın. Uzun LOW şeklinde uygulanan bir header sinyali gözden uzun bir HIGH olarak çıkacaktır. Dolayısıyla programda uzun low bakmak yerine uzun HIGH olarak aranmalıdır.
Sonuçta toparlarsak yapılacak iş,
1. header sinyalini yakala
2. Ardından gelen bitlerde süre önemli ise her birini Pulsin komutu ile alıp bir dizi değişkenine kayıt et.
    Sonra süreleri irdeleyerek o bitlerin LOW mu yoksa HIGH mı olduklarına hükmet.
3. Süre değilde bitlerin Lojik durumları önemli ise o zaman 8 veya 16 bitlik bir değişkenin bitlerine bu bit leri atayarak sonuçta değişkeni elde et ve elde ettiğini karşılaştırma yolu ile ile ne olduğunu bul.

Ete

canbulut

#10
şimdi hocam buradan şunu çıkarıyorum.
1 Header yakalama nasıl olacak?
2 High ve Low süreleri nasıl hesaplanacak? KL+UH mı? KH+UL mu? PULSIN PIN,STATE,VAR komutu peryottaki parçaların HIGH veya LOW olduğunu anlar mı? State kısmının 0 veya 1 olması Low yada High durumuna bakıyor. Birisine bakarken ya diğerini kaçırıyorsak.
3 Şu aşamada süremi önemli bit mi? bilemiyorum.şu anda çünkü hiç analiz edemiyorum.
konu tam bir keşmekeş. nasıl içinden çıkacağım bilmiyorum.

ete

1.Header nedir biliyormusun? Kaç tane Header sinyali inceledin? Diğer sinyallerden farkı nedir sence ayrıcalığı nedir yani?,  Kısa anlatımla ki bunu daha öncede söyledim diğer bit lerden farklı olarak uzunca bir HIGH yada uzunca bir LOW palsi dir. Bunu yakalayacak komut yine pulsin elbette. Ama başka yollarıda var. Sinyain başında Timer1 sayacını çalıştırıp sonunda sayaç değerine bakarsan sayaç değeri kadar us süre geçmiş demektir. Al sana başak bir metodla süre ölçme. Pulsin de aynı işi yapıyor. Bütün yapman gereken puls süresi yeterli uzunluktamıdır değilmidir onu tespit etmen. Bunuda bir if saturı ile yapmak mümkün. IF SURE<5000 then Yeniden,  gibi süre 5000us den kısa ise yeniden bak gibi bir mantıkla bu işi halletmek mümkün.

2. Süreleri  Pulsin komutu hesaplıyor yada ölçüyor diyelim başka şeye ihtiyaç varmıdır?
"1 olması Low yada High durumuna bakıyor. Birisine bakarken ya diğerini kaçırıyorsak." bu yüzden header yakalanarak peşindekilerin ne olduğunu bildiğin için onları usulüne uygun olarak alman gerekiyor. Aksi halde ancak havayı yakalarsın.

3. Neyi analiz edeceğini bilemiyorsan konu hakkında daha hiç bir şey bilmiyorsun demektir. Önce otur protokolleri incele kaç tane var?, nasıl haberleşiyorlar? Onları okumak için ne yapmak lazım. ?  En önemlisi bir kaç tanesini okuyacak program vermişim (Sony_Sirc Protokolü, RC-5 Protokolü , NEC protokolü) Bu programları incele nasıl sinyal yakalamışım bitleri nasıl ayıklamışım.

Sonra kendi kodlarını yazıp denemelerini yapmaya başlaman gerek.
Bu işe ilk merak saldığımda bu kadar bilgi benim elimde olsa idi her türlü kodu çözerdim doğrusu.

Yalnızca yukarıdaki önerilerim işe yaramaz. Program bilgisi ve mantığıda gerekiyor. Neyi nasıl yapacağını biilmiyorsan nasıl çözeceksinki kodları. Sorduğun sorulardan hem program mantığı hemde protokol mantığı konusunda eksiklerin olduğu anlaşılıyor. Çalışmadan da bunları tamamlaman münkün gözükmüyor!!!!.


Ete

canbulut

#12
hocam header ı tabiki biliyorum sinyalin başladığını anlıyorum. if ile karşılaştırma yapmanızı da anlıyorum. Anlayamadığım ondan sonraki dizi oluşturmanızdı. onlarıda belirli bir süreden küçükse büyükse diye lowdur highdir diye diziye atmışsınız. "&" işleminiz ve "<<" işlemleriniz var. onlarıda anlayamadım. biraz bakayım anlarım.
Nec prokotollerinize ulaşamadım hocam onu inceleyemedim. Onu da inceleyeyim ona göre tekrar dönüş yapacağım. Çok teşekkürler.

ete

Kenwood nec protokolünü kullanıyor.!!!!

Ete

canbulut


Powered by EzPortal