Pic Basic ile IR alıcı kumandası için yazılım desteği

Başlatan sinasos, 05 Ocak 2014, 01:38:06

sinasos

Merhaba arkadaşlar,
12f675 ile TV kumandasıyla çalışan on-off ve/veya pwm kontrollü bir devre yapıyorum. kumanda sinyallerini TK19 yardımıyla aldım ve 12f675'e tanıttım. herhangi bir TV kumandasıyla pic'ten sinyal alıyorum. bu kısma kadar herşey normal ancak takıldığım nokta pwm kısmı. çünkü bunu çalıştırabilmem için kumandayı devreye tanıtıp tuşları kaydettirmem ve sonrasında diğer tuşlara veya başka bir kumandaya basıldığında tepki vermesini önlemem gerekiyor. 3-4 gündür araştırıyorum ama ne tür bir algoritma kurmam gerekiyor ve hangi komutları kullanmam gerekiyor bilemiyorum. yardımcı olursanız sevinirim.
şeması ve kodları aşağıda


'****************************************************************
'*  Name    : 12f675                                            *
'*  Author  : sinasos                                           *
'*  Notice  : Copyright (c) 2003                                *
'*          : All Rights Reserved                               *
'*  Date    : 27/12/2013                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE INTRC_OSC, MCLR_off, PROTECT_OFF, WDT_OFF
CMCON = 7
ANSEL = 0
TRISIO = %010010
GPIO = 0       
Define OSCCAL_1K 1
ON INTERRUPT GoTo KESME
dalga var word(13)
degisken var Byte
komut Var Byte
symbol tus=gpio.1
symbol giris=gpio.4
symbol cikis=gpio.0
symbol buzer=gpio.5
SYMBOL program=gpio.2
clear
read 0,komut

basla:
if tus=1 then gosub kesme

PuLSIN giris,0,dalga(0)
if dalga(0) < 200 then
goto basla
Endif

for degisken=1 to 12
pulsin giris,0,dalga(degisken)
next  degisken

goster:
if dalga(1) < 100 then
komut.bit0 = 0
Else
komut.bit0 = 1
endif
if dalga(2) < 100 then
komut.bit1 = 0
Else
komut.bit1 = 1
endif
if dalga(3) < 100 then
komut.bit2 = 0
Else
komut.bit2 = 1
endif
if dalga(4) < 100 then
komut.bit3 = 0
Else
komut.bit3 = 1
endif
if dalga(5) < 100 then
komut.bit4 = 0
Else
komut.bit4 = 1
endif
if dalga(6) < 100 then
komut.bit5 = 0
Else
komut.bit5 = 1
endif
if dalga(7) < 100 then
komut.bit6 = 0
Else
komut.bit6 = 1
endif
if dalga(8) < 100 then
komut.bit7 = 0
Else
komut.bit7 = 1
endif
If komut.bit7 = 0 then 
komut = komut + 1
Endif
If komut = 10 then
komut = 0
Endif
write 0,komut
if komut=>1 then high buzer:pause 200:low buzer
if komut=>1 then toggle cikis
pause 100

kesme:  'bu kısmı proğram butonuna bastığımda TV kumandasının istediğim
        'tuşlarını (+, - ve on/off tuşları) tanıtabilmek için hazırlıyorum.
        'işte bu kısım eksik.....
read 0,komut

return
goto basla


ete

IR kumandaların tekniği hangi firma tarafından geliştirilmiş ise onun protokolüne bağlıdır. Dünyada yaygın kullanılan protokoller , sony nin SIRC protokolü, Phillps in RC5 protokolü, NEC protokolü, Nokia protokolü gibi protokollerdir. Hamgi sistemde çalışacak isen önce ona ait protokolü iyice öğrenmen gerekiyor. Sonra protokole uygun olarak gelen sinyalleri alıp ayıklaman ve içinden cihaz ve tuş kodlarını çekmen gerekiyor. Bu sitede AkılDefterim2 diye bir pdf dosyası ara. Bu dosyada ır kumanda ve protokollur konusunda detaylı bilgi mevcut.
Ayrıca aşağıdaki linkte Sony protokolünü kullanan bir sistemide yayınlamış idim onu inceleyebilirsin. Zaten yazdıklarında çoğunlukla Sony protokolüne ait gibi gözüküyor.
Ete

sinasos

Alıntı yapılan: ete - 05 Ocak 2014, 08:38:36
IR kumandaların tekniği hangi firma tarafından geliştirilmiş ise onun protokolüne bağlıdır. Dünyada yaygın kullanılan protokoller , sony nin SIRC protokolü, Phillps in RC5 protokolü, NEC protokolü, Nokia protokolü gibi protokollerdir. Hamgi sistemde çalışacak isen önce ona ait protokolü iyice öğrenmen gerekiyor. Sonra protokole uygun olarak gelen sinyalleri alıp ayıklaman ve içinden cihaz ve tuş kodlarını çekmen gerekiyor. Bu sitede AkılDefterim2 diye bir pdf dosyası ara. Bu dosyada ır kumanda ve protokollur konusunda detaylı bilgi mevcut.
Ayrıca aşağıdaki linkte Sony protokolünü kullanan bir sistemide yayınlamış idim onu inceleyebilirsin. Zaten yazdıklarında çoğunlukla Sony protokolüne ait gibi gözüküyor.
Ete

Ete hocam öncelikle ilginize çok teşekkür ederim.
1.'si site içerisinde arama yaptım ama akıldefterim2.pdf dosyasını bulamadım. ekleyebilirseniz sevinirim.
2.'si *ben bu devreyi tasarlarken evrensel olarak düşünmeyi tercih ediyorum. tek bir kumanda olsa sorun yok ! ama ben bunu yaptığımda istediğim kumandayı önce okutmayı sonra bu komutu icra etmeyi istiyorum. bunu yapabilmek için mutlaka IR protokolünü uygulamam mı gerekiyor. bunun genel bir yolu yokmu ? örneğin TK19dan gelen sinyalleri alıp bunu eproma kaydetsem sonradan da bu sinyaller geldiğinde komutu icra etsem olmazmı tarzında soruyorum. ve birde bunun yolunu  :-[

ete

Link aşağıda. Önce bu dökümanı incele sonra hala aynı soruları soracak isen yeniden sorarsın.

https://dl.dropbox.com/u/25364674/Ak%C4%B1l%20Defterimv2.pdf

Yine Ir kumanda konusu ile ilgili bir mesaj ekinde kayıt etmiştim.
http://etepic.com/index.php/topic,167.msg6015.html#msg6015

Ete

sinasos

Ete hocam teşekkürler....!
şimdi taşlar yerine oturmaya başladı. eklediğiniz dökümanı okuyorum. tamamlamış sayılmam ama sanırım işime yarayan bölümleri görmeye başladım. sizin bahsettiğiniz bu kısımdı sanırım.

Alıntı Yap
Alıcı modülünüzün programını ve donanımını Data kopyalama mönüsü veya
tuşuna uygun hale getirdiğinizde inferruj datayı kopyalamanız mümkündür.

Burada programınız data kopyalama modu seçildiğinde kopyalama rutinine
yönlenmeli ve Start, Lead-in veya Data biti kontrolü için beklemeye başlamalıdır. Bu
bilgilerden herhangi biri alındığında (yani kopyalanacak vericinin herhangi bir tuşuna
basıldığında) bu bilginin hangi protokole uyduğunu Start LOW süresi içerisinde tespit
ederek data alımına hazır hale gelebilmelidir.

Ancak ilk bilgi geldiğinde bu bu protokolün SHARP ait olduğunu tespit etmesi
halinde, bu protokolde start biti olmaması nedeniyle gelen bu ilk bilgiyi cihaz kodunun
ilk biti olarak kaydedebilmeli ve son gelen iki bitin kontrol biti olduğunuda bilmesi
gerekmektedir.

Dikkat edilecek diğer bir noktada tespit edilen protokolün NOKIA veya RC5
olması durumunda Start biti gelmesine karşın ilk bitin ikinci yarısında HIGH durumu
oluştuğunu bilerek NOKIA için 500 us ve RC5 için 900 us LOW bilgisinin HIGH den
önce olduğunu anlayabilmesi gerekmektedir.

Bundan sonraki aşama bu vericinin kullandığı protokol bilgisi dahilinde cihaz
kodunun toplam sayısı ve ardı sıra gelen bitlerden hangileri olduğu tespit ederek
vericinin yolladığı cihaz kodunu tespit edebilmelidir.

Son aşama ise aynı protokol bilgisi dahilinde tuş kodunun toplam sayısını ve
yine ardı sıra gelen bitlerden hangileri olduğu tespit ederek vericinin yolladığı tuş
kodunu da tespit edebilmelidir.

Program bu şekilde kopyalanacak vericinin her seferinde tek bir tuşunu
kopyalayabilme yeteneğine sahipken son aşamanın uygulanması yerine sizin
programınız tarafından ilgili protokolün tüm tuş komutları bilinmesi halinde son
aşama yapılmadan, kopyalanacak vericinin protokolünün ve cihaz kodunun tespit
edilmesi yeterli olacak ve kopyalama devreniz, yazılımınız sayesinde o kumandanın
tüm yeteneklerine sahip olabilecektir.

Kısaca sonlandırmak gerekirse kopyalanacak vericinin tek bir tuşuna
basılması sizin yazılımınız tarafından vericiye ait tüm bilgilere sahip olunması için
yeterli olacaktır. Ancak kopyalanan data yollanırken ITT protokolü için Lead-out ve
SHARP protokolü için son iki kontrol bitinin yollanılması da ayrıca gerekecektir.
peki bunu nasıl gerçekleştireceğim. tüm protokolleri 12f675 içine sığdırmam sanırım mümkün değil. ama evrensel protokollerin başlangıç ve bitiş bitlerini yazsam olabilirmi ? olabilirse bunu nasıl yapabilirim? bu konuda yardımınızı rica ediyorum.
***Aslında ben bunu tıpkı bir resim veya ses gibi düşünmüştüm. önce resmi çek veya sesi kaydet sonra karşılaştır... ama anladığım kadarıyla böyle olmuyormuş ! veya oluyorsa bile bunu ben çözemedim...
teşekkürler...

ete

Anladığım kadarı ile piyasada akıllı kumanda diye satılan aletin bir kademe daha iyileştirilmiş olanını yapmak istiyorsun.
Öncelikle sana başarılar dilerim. İşin daha çok başındasın. BU aleti yapmaya başlamadan önce normal tek bir protokolü okuyup algılama işini halletsen daha uygun olurdu. Daha sonra bir diğer protokolu tanımlama işini daha sonra bir diğerini derken topu topu 3-5 adet kullanılan protokol var zaten. Hepsini teker teker hallettikten sonra onları birleştirip istediğin aleti yapabilirdin.
IR protokollerinin tamamı zaman bazlı ve bit formatlı çalışır. Hemen hepsinde ortak özellik bir header sinyali olmasıdır. Sinyal başıda diyebileceğimiz bu sinyalin süresi ve şekli protokol hakkında biraz olsun bilgi verir. Buda yetmez bazen bit sürelerini ve şekillerinide hesabın içine katman gerekir.
Şimdi şöyle bir şey söylemişsin "başlangıç ve bitiş bitlerini yazsam olabilirmi" ne anlama geliyor bu diyelimki başlangıç biti HIGH ama süresi? hepsinde farklı olabilir. Kimi high ile başlar kimi low ile başlar ama ikinci parametre daima bit süresidir.
Aynı şey bitiş bitleri içinde geçerlidir. Bitiş biti sana bir şey ifade etmeyecek zaten. Bu bit ya cihaz kodu yada tuş kodu bitine ait olacak ve basılan tuşa bağlı olarak farklılık gösterecektir. Anlayacağın kestirmeden gitmenin sana yalnızca zaman kaybettirecğini unutma. Sana pdf dosyasını oku demekle işin senin düşündüğün kadar kolay olmadığını kendin anla demek istemiştim. Önce anla şu  protokolleri sonra kendi önerilerini kendin tart bakalım bir işe yarayabilecekmi?

Bütün protokolleri tanıyabilecek bir program değil 12F675, 16F628 hafızasına bile sığacağını sanmıyorum. Ama el elden üstündür derler belki sen sığdırabilirsin.

Son olarak sana sormak isterim bir IR kodu nasıl çözülür yada çözülmelidir. ? Bu konuda bir fikir yada algoritma geliştirebildinmi ? Hemen belirteyim ki tek algoritma bütün kodları çözümlemek için yeterli değil maalesef.
Bu arada IR-Göz dediğimiz aletin gelen sinyali ters çevirdiğinide hesaba katman gerekiyor bunu unutma yada göz çıkışına tekrar gelen sinyali bir kere daha ters çeviren bir transistör eklemen gerekir.

Ete

sinasos

merhaba hocam;
Alıntı YapŞimdi şöyle bir şey söylemişsin "başlangıç ve bitiş bitlerini yazsam olabilirmi" ne anlama geliyor
sormuşsunuz. bunu sanırım yanlış ifade etmişim kusura bakmayın. yıldırım beyin tezinde ki son satırı kasdetmiştim aslında.
Alıntı YapKısaca sonlandırmak gerekirse kopyalanacak vericinin tek bir tuşuna basılması sizin yazılımınız tarafından vericiye ait tüm bilgilere sahip olunması için yeterli olacaktır. Ancak kopyalanan data yollanırken ITT protokolü için Lead-out ve SHARP protokolü için son iki kontrol bitinin yollanılması da ayrıca gerekecektir.


Alıntı YapSon olarak sana sormak isterim bir IR kodu nasıl çözülür yada çözülmelidir. ? Bu konuda bir fikir yada algoritma geliştirebildinmi ? Hemen belirteyim ki tek algoritma bütün kodları çözümlemek için yeterli değil maalesef.
henüz bir algoritma geliştiremedim. Bir hastam var onunla ilgilenmem gerektiği için cevaplara bile bakamıyorum. kafam karışık hocam. ama siz ilgilendiniz çok teşekkür ederim.

sinasos

hocam ayrıca bir arkadaşım şu öneride bulundu !
Alıntı YapIR kumanda kopyalama konusuna gelince hiç protokollerle uğraşmak istemiyorsan yapacağın en pratik yöntem TK19 dan çıkan sinyallerin high ve low sürelerini geliş sırasıyla eepromuna aynen kaydetmek. Daha sonra gelen sinyallerle kayıt aldığın sinyalleri karşılaştırarak eşitlik aramak işini pratik bir şekilde çözecektir.
bu şekilde sizce mümkün olabilirmi ? olursa da nasıl bir yol izlemem gerekli  (resim, ses kaydetmekteki kastımda olduğu gibi)
ayrıca şu şekilde bir açıklamada okudum yapılabilirlik mümkünmüdür sizce?
Alıntı YapBelki aradığın gibi bir yöntem vardır onu bilemiyorum ama ben kullancığım kütüphaneyi ve nasıl çalıştığını anlatayım.
her 50usec da bir çalışacak bir interrrupt kuruluyor. Bu interrupt içinde IR alıcıdan gelen sinyal kontrol ediliyor. Header yakalandığında 50usecler sayılmaya başlıyor ve bir buffera yazılıyor. Durum geçişlerinde sayıcı sıfırlanıyor ve buffer indexi arttırılıyor. Sinyal alımı tamamlandığında bufferın uzunluğuna ve header süresine bakarak hangi protokol olduğu anlaşılıyor. Bufferın tümü incelendiğinde de 1e ve 0a denk gelen süreleri protokol standardındaki sürelerle karşılaştırarak sinyalin değeri anlaşılıyor.

İstersen kütüphane kullanmadan 1 ve 0 geçişleri arasındaki süreleri buffera kaydedersin ve sonraki sinyalleri belirli bir tolerans vererek bu bufferla karşılaştırırsın.
Ya da kütüphaneyi kullanıp kumanda protokol türü ve değerini kaydedip, sonraki gelen sinyalleri bu kayıtla karşılaştırırsın. Birden fazla sinyal kaydetmeyi düşünüyorsan kütüphane daha mantıklı bence.

ete

Verilen akıllar ile arkadaşın kullandığı yöntem pek hoşuma gitmedi. Sebepleri şunlar;
Öncelikle protoklleri araştırıp kaç çeşit bit (low ve High olarak) var araştırmak gerekir. Kimisinde 3 değişik bit kimisnde 5 kimisinde 6 değişik bit var. Bunlardan yola çıkarak bir tespit yapılması en azından çok zor olur. Diğer taraftan birebir eşitlik aranırsa iş dahada zorlaşır. Örnek veriyorum. İlk okumada  diyelimki 123us olarak kayıt ettiğin bir süreyi sonradan 121 olarak okuma ihtimalin çok yüksek ne olacak bu ikisi eşit olmayacak ama aslında eşit olan bitleri gösteriyor olacaklar.
Dah afarklı bir algoritma düşünmek gerek.
Kesme yöntemi ile her 50us de bir kesme oluşturarak kesmeleri saymak da pek akıllıca olmasa gerek. Onun yerine yükselen kenar için PORTB.0 kesmesi açıp gelen HIGH palsinde programın kesmeye girmesini sağlamak sonra kesme içinde kesme yi düşen kenar için ayarlayıp TMR1 sayacınıda sıfırlayıp aktive etmek gerek. Böylece HIGH süresini hassas bir şekilde almak mümkün olacaktır.  Benzer şekilde aynı işi LOW süresi (önce düşen kenar sonra yükselen kenar şeklinde) ölçmek içinde kullanabilirsin. Programı zorlayarak varsa birden fazla LOW kaydı almak ve birden fazla high kaydı almak uygun olacaktır.
Ancak dediğim gibi bunların çok yardımcı olacağını sanmıyorum. İşe şu anda yarı yarıya konsantre olmuş durumdayım. Aslında dediğimi yapsan (yani sen konsantre olsan) ve protokolleri iyice incelesen sonrasında hangisini hangi metodla tespit edeceğini daha sağlıklı düşünebilirsin.

Ete

Powered by EzPortal