Kütüphanesiz IR uzaktan kumanda kodlarının çözülmesi

Bu yazımda, IR uzaktan kumanda kodlarını kolay bir şekilde nasıl bulabileceğinizi anlattım. Arduino kullananlar bilirler. IR kütüphanesi vardır ve o programı kullandıklarında, kumanda tuşunun kodunu seri monitörde görürler.
Zaten kolayca bunu yapabiliyorken bu yazının anlamı ne diyebilirsiniz.
Anlattığım yöntem ile kütüphaneye ihtiyacınız olmadığı gibi, kütüphanelerde bulunan hatalardan dolayı yanlış tuş kodu geldiğinde, bu kodu doğru zannedip, gelen kodu o kumandanın gerçekten kontrol ettiği cihazda denenmesi durumunda hata vereceğidir.  Ayrıca herkes kendi işlemcisinde veya programlama dilinde IR kütüphanesine sahip olamayacaktır. Fakat anlattığım yol ile kendi işlemcisine ya da kendi programlama diline kolaylıkla uyarlayabilecektir.

Kütüphanelerin tamamı böyle hatalı diyemem Fakat elimdeki kütüphane seri monitörde gösterirken veya yakalarken hata yapıyor. Bu hata sizin arduino projelerinizi etkilemiyor. Çünkü algoritma, devamlı aynı yerde aynı hatayı yaptığından bulduğu kod hep aynı oluyor. Bu şekilde ise siz gelen kodu kullanmak istediğinizde sorun yaratmadan tekrar, tekrar aynı kodu bulacağından sizin projenizi etkilemeyecek.
Bunun yanı sıra aldığınız kodu protokolüne uygun kumandadan gelmiş gibi simüle edip gerçek cihazı çalıştırmak isteseniz, Gelen kod yanlış olduğundan dolayı kontrol edemeyeceksiniz.

Kütüphanesiz çalışmada başlıca 2 yöntem izlenebilir.
Kolay olanı ki benim kullandığım bu. PULSIN komutu. Bu komut ile isterseniz HIGH seviyesinin ne kadar süre devam ettiğini, isterseniz LOW seviyesinin ne kadar süre devam ettiğini, mikro saniye olarak öğrenebilirsiniz.
Zor olanı ise timer kesmesini kullanarak protokole uygun zaman aralıklarında sinyalin durumuna bakmak.
Her iki yoldan farklı çözümler de bulunabilir. Fakat ben programlarımda PULSEIN komutunu tercih ettim.

Pulsein komutu arduinoda kullanım.  Bu sadece sinyal yakalama kısmıdır. 

while (pulseIn(RECV_PIN,LOW) < 8000); // wait until start bit is received.
{
}
while (basla==0)
{
sayy=(pulseIn(RECV_PIN,HIGH));
// Serial.println(sayy);
if (sayy>3000 && sayy<=5000){
//Serial.println(sayy);
basla=1;
}
}
for (int i = 0; i < 32; i++)
{
if (pulseIn(RECV_PIN, HIGH) > 1000)
bin[i] = 1;
else
bin[i] = 0;
}

Protokollere geçmeden önce sinyalin nasıl okunması gerektiğini anlatmak istiyorum. İnternette NEC protokol dediğinizde size herhangi bir tuşa ait sinyal resmi gelecektir. Fakat gelen sinyal resmi Arduinoya gelen sinyalin tersi olarak görünecektir. Sebep ise arduino alıcı gözün içindeki devre gelen sinyali terslemektedir. Kütüphaneler bu terslenmiş sinyale göre kodu çözer. Kendi programınızı bu terslenmiş sinyale göre yapabilirsiniz ( Ben terslenmiş sinyale göre yaptım ) Ya da sinyali tek bir transistör kullanarak tekrar tersleyerek orijinal sinyale dönüştürüp programınızı ona göre yapabilirsiniz.  İlk resimde taşıyıcı frekans geldiğinde alıcı göz çıkışında LOW sinyal çıkışı olduğunu görebilirsiniz. Olan işlem budur. Aynı zamanda taşıyıcı frekansından temizlenmiş kontrol sinyalinin çıktığını görebilirsiniz.

Yukarıdaki transistör çalışmasında ise giren ve çıkan sinyallerin doğru yönde ve ters yönde olduğunu görebilirsiniz. Orjinal sinyale dönmek isterseniz. Bu tip bir transistörlü devre yapıp girişine alıcı gözün çıkışını verirseniz ve çıkışı kollektöründen alırsanız ilk gelen orjinal sinyale dönmüş olduğunuzu görürsünüz.

Doğrusu hangisi derseniz orijinal sinyalin şekline uygun olandır. Kendi örnek programlarımda kolaylık olsun diye terslenmiş sinyali kullandım.

Ayrıca sinyal resimlerine bakarken LSB ve MSB göreceksiniz. Bu binary sayı sistemlerinde en yüksek bit ve en düşük biti tanımlamaktadır.
Mesela BINARY 10001001 sayısını ele alırsak en sağdaki bit LSB dir. En soldaki bit ise MSB dir.
Sinyal grafiği protokole göre verildiğinden bazı protokollerde en düşük bit önceden gönderilir bazılarında ise en düşük bit en son gönderilir.

Bu neden önemli derseniz, gelen 1 ve 0 lardan oluşmuş binary sayının 1 ler basamağı neredeyse ona göre sayıyı hesaplamanız için. Ayrıca matematikte soldaki sıfırın bir önemi yoktur. Bazı binary yazan programlar ( mesela kullandığım kütüphane gibi) soldaki 0 değerini atıp gösteriyor. Bu sıfır MSB deyse sorun olmayacaktır. Fakat LSB de ise binary sayı hatalı çıkacaktır çünkü 1 ler basamağı yoktur.

Bununla ilgili bir örnek kod aşağıdadır.
01000000101111111000000001111111  burada en soldaki sıfırı kütüphane göstermiyor. Fakat biz LSB kısmı en solda diye soldan itibaren kodları ayırmaya başlarsak, soldan ilk 8 bit diyoruz ve 0 orada görünmüyorsa ilk bit 1 den başlar dediğimizde ise hata yapmış olacağız. Benim yaptığım program da ise 32 bitin tamamı sıfır bile olsa oraya yazılır. Bu da size ayırmada kolaylık sağlar. Bununla ilgili örnekler aşağıda verilecektir.

Not: Arduino alıcı göz modülü (KY-022) 38khz taşıyıcı frekansına göre filtrelenmiş gibi görünse de 36Khz sinyalleri de alabiliyor.
Bununla birlikte Alıcı gözün sinyali terslediğini de unutmamamız kazım.

Taşıyıcı frekans ne demek: IR sinyallerin daha uzak mesafelere gidebilmesi ve ayrıca IR verici led akımının daha yüksek akımda anahtarlamalı çalışabilmesi için taşıyıcı frekans kullanılır. DC olarak 20-30 ma akıma dayanan bir LED 38Khz de anahtarlandığında 100ma civarında akım da kullanılabilmektedir. Bu da verici sinyalini kuvvetlendirecek ve mesafeyi arttıracaktır. Bazı alıcı gözler 36Khz frekansına maksimum geçirgenlik için ayarlanmıştır. Bazıları 38Khz bazıları 40 Khz sinyale göre dir. Belki daha farklı modeller de vardır. En çok kullanılan 36Khz ve 38Khz dir.
Buradaki alıcı göz yakın mesafe denendiği için tüm kumandalarda olumlu sonuç verdi. Fakat 36Khz bir kumanda ile bu 38Khz lik alıcı göze sinyal gönderdiğinizde yakın mesafede sorun olmasa bile mesafe uzadıkça sorun olmaya başlayacaktır. Halbuki 36Khz lik bir kumandayı 36Khz lik bir alıcı gözle kullansanız daha uzak mesafeden sinyal gönderebilirsiniz.
Taşıyıcı frekans sinyali nasıldır. Alıcı göze resimdeki üst tarafta bulunan sinyal gelir.


Taşıyıcı frekans arka arkaya geldiğinde HIGH seviyesi hiç gelmediğinde LOW seviyesi olur. Alıcı göz taşıyıcı frekansı yok ederek gerçek sinyali bizlere verir. Bu sinyali direkt olarak gönderici Led’e verip göndereyim deseniz mesafe çok küçük olacak. Fakat taşıyıcı frekansa bindirip gönderdiğinizde daha uzun olacaktır. Bundan dolayı Kumanda vericisi yapılırken kontrol sinyali ve taşıyıcı frekans birleştirilerek gönderilir. Alıcı gözlerde uygun taşıyıcı frekansı süzerek size kontrol sinyalini verir ve bu kontrol sinyalini alıcı devrede işlersiniz.
Bu resimdeki devre ise basit olarak taşıyıcı frekans ile kontrol sinyali nasıl birleştirildiği(modüle edildiği) görülmektedir.

Devre çalışmasına bakarsak  diyot geçirgenliği taşıyıcı frekansın LOW kısmında transistor ün beyz ucunu low durumuna getirir. HIGH seviyesinde ise diyot tıkama yönünde çalışacağından kontrol sinyalinin durumuna bağlı olarak transistorün çıkış vermesini sağlar. Mesela kontrol sinyali HIGH olduğunda çıkışta taşıyıcı frekansın da görülmesi gerekir. Bu durum diyota gelen taşıyıcı frekans sinyalinin HIGH ve LOW durumuna göre çıkışa yansıtılır. Bu durum tablodan daha kolay anlaşılmaktadır. Tabloda sarı ile gösterilen alan taşıyıcı frekansın karşıya iletildiği alandır. Diğer alanda ise çıkış LOW durumundadır. Çünkü Kontrol sinyali LOW durumundadır.

 

NEC PROTOKOLÜ :


NEC protokolü birçok kumandada kullanılıyor gibi. Hatta Samsung kumanda, NEC protokolü kullanmasına rağmen baştaki 9ms start palsını 4.5ms olarak kullanmış. Başka NEC benzeri kumandalar da mevcut. Üreticiler temelde NEC protokolü kullansalar da, belkide kumandalar karışmasın diye kendince küçük ayrıntılar koymuşlar. Bunlar NEC protokol temelli olduklarından programlama NEC protokolüne göre yapılacaktır. Sadece aradaki süreler değişecektir. NEC protokolü 32 bitliktir. Start palsı hariç. 32 bit soldan sağa doğru gidilirse ilk resimde görüldüğü üzere
Adress+adresin tersi+cmd+cmd tersi şeklinde 4 byte lık bir bilgidir. Ayrıca tuş basıldığı sürece tuşun tekrar ettiğini gösteren sadece start palsından oluşan sinyaller gelmektedir. 1. Sinyal katarı adres ve komuttan oluşan 32 bit bilgidir. Bu bilginin sonunda 1 adet stop bit vardır. Bu da 562.5µs dir. Arkasındakiler ise tuş bırakılasıya kadar gelen ve start palsından oluşan tekrar (repeat) sinyalleridir. 2. resim bunu gösterir.

NEC protokolünün sinyal şekilleri ve anlatımı.

NEC protokolünde HIGH ve LOW şekilleri birbirinden kolayca ayrılabilir. Şayet bir periyot içinde HIGH ve LOW süreleri eşitse 0 olarak değerlendirilir. Şayet HIGH ve LOW süreleri farklıysa 1 olarak değerlendirilir. Resimdeki sinyal şeklinde 1 ve 0 durumlarını hemen fark edebileceksiniz.
Bu süreler kontrol edilirken alıcı gözün terslediğini de dikkate alarak sinyalin hangi kısmına göre karar vermeniz gerektiğini bulabilirsiniz. Orijinal sinyale göre karar vereceksek, LOW seviyesi büyük olana 1 dememiz gerekir. Şayet Alıcı gözün terslemesine göre karar vereceksek, HIGH seviyesi büyük olana 1 dememiz gerekir.
Bu durum yukarıdaki sinyal şekillerinde görülmektedir. İlk sinyal resmi, Terslenmemiş (noninvert) durumu gösterir. 2. sinyal resmi ise tekrar kodunu gösterir. 3. Sinyal resmi ise gerçek devrede alıcı gözde terslenmiş (invert) sinyaldir. ( Bu tüm protokoller için aynıdır. Tüm protokollere ait programlar alıcı gözün terslediği şekle göre yapılmıştır) Osilaskoptan alınan bu görüntü arduino ya da diğer işlemcilerin alıcı gözden sonra alacağı sinyali gösterir.
İlk resimde göreceğiniz üzere NEC protokolü LSB den başlayarak gönderilir. Buna dikkat etmeniz gerekir. 38.222kHz. lik bir taşıyıcı frekans kullanır.
Sinyal gelirken bu sırayla gelir. start bit – Address – Address – Data – Inverse Data – stop bit
Sinyal start palsi ile başlar (9ms ve 4.5ms) sonrasında 4 byte 32 bit veri gelir ve sonrasında 562.5µs olan Stop bit gelir.
0 olarak tanımladığımız sinyalin LOW ve HIGH kısımları eşittir ve 562.5µs dir. toplamda 1.125ms dir
1 olarak tanımladığımız sinyalin LOW bölümü  562.5µs, HIGH bölümü ise 1.6875ms, toplamda 2.25ms dir.

SAMSUNG NEC PROTOKOLÜ :

SAMSUNG NEC formatı 1 ve 0 süreleri

start bit – Address – Address – Data – Inverse Data – stop bit
start bit- 11100000 11100000 00100000 11011111-stop bit

Alıcı gözden sonra terslenmiş sinyal.

Samsung ta NEC protokolünü kullanıyor. Fakat bazı farklılıklar oluşturmuş durumda
NEC protokolü        : 9ms + 4.5ms + adres + adres tersi + komut + komut tersi + stop bit
Samsung protokol : 4.5ms + 4.5ms + adres + adres + komut + komut tersi + stop bit
Şeklindedir. Fakat NEC protokolünde kullandığınız programın aynısını kullanabilirsiniz. Sadece ilk start palsındaki 9ms yerine 4.5ms ile başladığından start palsı yakalama komutunun süresini 4.5ms yapmanız yeterli. Kodlama kısmında analiz ederken zaten adresin tersi ve komutun tersini dikkate almayacağımız için yine aynı şekilde hesaplanabilir.

PHILIPS RC5 protokolü:
Bu protokolü yakalamak kolay fakat hesaplamak biraz daha zor görünüyor. Çünkü gelen sinyalde start palsı, HIGH seviyesi ve LOW seviyesi hep aynı sürededir. Burada kullanılan kodlama Manchester kodlama sistemidir. Bu kodlama sisteminde LOW pozisyondan HIGH pozisyona çıkıyorsa 1, HIGH seviyesinden LOW seviyesine düşüyorsa 0 seviyesi olarak değerlendirilir. (IEEE 802.3 standart yapısına göre) Aşağıdaki resimde Manchester kodlama standartları görülmektedir. RC5 protokolü IEEE 802.3 standardını kullanıyor.

Yukarıdaki ilk resimde Manchester kodlamanın 2 tip standardı olduğunu görüyorsunuz. Bizler RC5 orijinal sinyaline göre işlem yapıyorsak IEEE 802.3 standart yapısına göre kodlamayı yapacağız. Fakat sizin de farkına varacağınız gibi alıcı gözün terslediği sinyale göre bakarsak (3. resim)  LOW seviyesinden HIGH seviyesine çıkarken 0 diyoruz. Burada G. E. Thomas standardına göre kullandığımızı göreceksiniz. Yani alıcı göz terslediğinde standart değişmiş oluyor. Buna dikkat etmeniz gerekiyor. Ayrıca RC5 protokolünde start palsından sonra veriler, MSB yönünden gönderilmeye başlanır. Buna dikkat edin. NEC protokolünde ise start palsından sonra, LSB yönünde bilgiler gönderiliyordu.

Bunun yanı sıra diğer protokollerden farklı olarak bu protokol 36Khz taşıyıcı frekans kullanıyor. Yukarıda da anlattığım gibi Alıcıda 36Khz lik göz kullanıldığında maksimum mesafeye ulaşılabilir. Arduino IR alıcı modülü 38Khz e göre ayarlıdır. Fakat 36Khz de de sinyalleri alabilmektedir. Yakın mesafe olduğundan.

Ayrıca bu protokolde bir de TOGGLE biti vardır. Her tuşa bastığınızda HIGH ise LOW, LOW ise HIGH durumuna geçerek tuşa ilk defa bastığı belli olur. NEC protokolünde sadece start palsından oluşan tekrar sinyali vardı. Burada ise yine tuş basılı olduğu anda kendini tekrar eder. Fakat sadece start palsı değil aynı sinyali tekrar eder ve toggle bitini değiştirmez. Şayet butonu bırakıp aynı tuşa bile bassanız, toggle biti değişecektir.

Aşağıdaki resimlerde sadece TOGGLE biti yer değiştirmiştir. Sinyal aynı tuşa aittir.

TOGGLE = 1
TOGGLE= 0 

Programı yaparken yine aynı şekilde PULSIN komutu kullanılır. HIGH ve LOW seviyelerinin süreleri alınır. Bu süreler alındığında durum aşağıdaki gibidir.


Yukarıdaki tabloda gelen sinyalin HIGH ve LOW seviyelerinin süreleri en soldaki sütunlardır. En baştaki yeşil 1 rakamı start palsının yakalanması sırasında, süresi hesaplanmayan 1 dir ve kodlama da en başa yazılmıştır.
Daha sonra ise sinyal şekline bakarsak hangi sinyal geldiyse o sinyali 3. Ve 4. Sütunlara yazdık. Bundan sonra ise Manchester kodlamaya (G. E. Thomas standardına )  göre
1, önce yazılmış ise 1 dir.
0 önce yazılmış ise 0 dır
diyerek en sağdaki kodlamayı oluşturduk.
İlk 2 sütunda sürelerin yaklaşık 900mikro saniye  olduğu görülmektedir. RC5 sinyalinde LOW ve HIGH süreleri 889us dir. Fakat bunun yanı sıra 1700 ve 1802 gibi değerler göreceksiniz. Bunlar ise 2 sinyalin HIGH, HIGH veya LOW, LOW olması durumudur. Bu durumda olanları ise 3. Ve 4. Sütunda nasıl ayırdığıma dikkat edin. Çünkü HH sinyalinin ilk H seviyesi sol tarafındaki yarım periyot olan LOW seviyesine aittir yani sol taraftaki sinyalin bitişidir. 2. H sinyali ise sağ tarafındaki yarım periyot sinyalin başlangıç noktasıdır. Bu şekilde düşündüğümüzde 1802 gibi bir sinyal geldiğinde 1800-1 yazıldıktan sonra 1802-2 si ise hemen arkasından yazılarak sinyalin şekline uydurulmuş olacaktır.
Aşağıda gördüğünüz gibi bit6 ve bit7 birleşiktir. Bu şekildeki sinyali yukarıda anlattığım gibi tabloya 1802-1yani bit6 mavi çizgi olarak düşüneceğiz bu sinyal periyotunun 2. yarısını yani bitişini gösterir.  1802-2 ise bit7 kırmızı çizgi olarak düşünülecek. Bu şekilde ise periyotun 1. yarısı olacaktır ve başlangıcını temsil edecektir.  Tüm sinyali bu şekilde yazdıktan sonra kod içerisinden adres ve komut kısmını hesaplayabiliriz.


Bu şekilde RC5 sinyalini de çözmüş oluruz. Toplam start palsı+toggle  dahil 14 bitlik sinyaldir.
START1+START2+TOGGLE+5 bit adres+6 bit komut şeklindedir.

Arduino programında ise void tekrarla() kısmı 3. Ve 4. sütunları hazırlamaktadır. Bundan sonra ise void sonkod() kısmı ise en sağdaki sütunu oluşturur. Sonrasında ise kod içerisinden adres ve komut kısmını ayırarak yazar.

Programları birleştirme: Ben protokolleri anlatmak için programları ayrı ayrı yaptım. Bunları birleştirdiniz ve sinyal geldi hangisine göre kod çözeceksiniz. Bu da verdiğim programlar arasında protokol.ino programıyla anlaşılacaktır. Bu program ise gelen sinyali gördüğünde start palsına bakar. Start palsı 9ms ise NEC protokolü der. 4,5ms ise samsung NEC diyebiliriz şayet start palsı 889ms civarıysa RC5 kodu diyerek programınızı yönlendirebilirsiniz. Bu program sadece start palsının sürelerini pulsin komutuyla kontrol eder.

Bütün bunları anlatırken bir noktayı anlatmadım. En önemli olan kısmı ise budur. Başlangıç palsının yakalanması için gelecek olan büyük palsın beklenmesi.
İki kod bilgisi arasında oldukça uzun bir geçiş süresi var. NEC protokolünde, 108ms RC5 te ise 114ms de bir sinyal tekrarlanır. Diğer protokollerde de bunu göreceksiniz.
Burada şunu unutmamak lazım. RC5 kodunda her tekrarda sinyal kendini toggle biti değişmeksizin tekrar eder. Birinci pals katarını kaçırsanız bile 2.sini mutlaka yakalarsınız. Bu da pulsin komutunda 80ms boyunca HIGH ya da LOW beklemekle olur. Bu süre sonunda PULSIN timeout verir ve 0 döndürür. Bu şekilde HIGH ya da LOW uzun bir aralık tespit edilir. Biliyoruz ki bu aralıktan sonra start palsı gelecek. Biz de kodu yakalayabileceğiz.

Fakat NEC protokolünde tuşa bastığımızda sinyal 1 kez tuş kodu yollar ve arkasından sadece tekrar sinyali olarak start palsını yollar. Bu şekilde düşünürsek öncelikli olarak ilk gelen palsı NEC ile yakalamak inceleyip NEC yada benzeri değilse RC5 olduğunu düşünüp tuş daha bırakılmadan uzun palsı bekleyip kodu tekrar almak bir çözüm olabilir. Tabii ki bu arada ilk yakaladığımız sinyalin start palsını incelememiz ve karar vermemiz de gerekebilir. Bu şekilde hangi kumanda protokolü olduğunu anlayabiliriz. Tuş bırakılmadan o protokole göre sinyali bir kez daha uzun sinyali bekleyip kayıt ederek kullanıcıya bilgiyi gönderebiliriz. Bunun dışında kendi Algoritmanızı da oluşturabilirsiniz.

RC5 tekrar bölümü aşağıdaki resimde görülmektedir.

NEC tekrar bölümü aşağıdaki resimde görülmektedir.

PIC işlemcisiyle nasıl yaparız derseniz, programlar arasında aynı algoritmayı kullanan PBP ile gerçekleştirilmiş bir program var.
Benzer algoritmayı kullanıp programları kendi işlemcinize veya kendi programlama dilinize uyarlayabilirsiniz. Kütüphane kullanılmadığından kolaylıkla adapte edebilirsiniz.
Zor mu kolay mı derseniz, bence kolay. Aşağıdaki satırlar RC5 sinyalini yakalamak için yeterli olmaktadır. Sonrası ise gelen sinyalin analiz edilmesidir. Analiz yöntemi yukarıda protokol anlatımlarında anlatıldığı gibi, sinyalin 1 veya 0 olduğuna göre ve LSB mi MSB mi önce gönderiliyor bunu bilmekle yapılır. Aşağıdaki program parçası, PIC 16F1827 ile yapılmış bir programın sinyal yakalama kısmıdır. Önce start palsını sonra LOW seviyesi daha sonra ise HIGH seviyesi kontrol ederek süreleri diziye aktarır. ( config satırını, seri port ayarlarını ve osilatör frekansını değiştirerek ayarlayarak 16F628 entegrede kullanılabilir. 16F1827 iç osilatörü 32mhz de 16F628 ise iç osilatörü 4Mhz de çalışır. Buna göre seri port baud satırlarını değiştirebilirsiniz. )

basla:
hserout [“IR sinyali gonder “,13,10]
temp=0:temp1=0
while temp1<14000
PULSIN RECV_PIN,1,temp1
wend

for I=0 to 20
PULSIN RECV_PIN,0,sayL[I]
Next

while temp1<14000
PULSIN RECV_PIN,1,temp1
wend

 

Aşağıdaki resimlerde arduino seri monitörden alınan kodlar var.


Yukarıdaki resimde, NEC protokolünde ilk gelen sinyalde soldaki 2 bit 0 olduğundan kütüphaneli program yazarken sıfırları atmış. Buna göre NEC programında gelen kod yanlış olacaktır. Normalde 4 olması gerekirken 131 sayısı okunacak adres olarak. Bu sadece yazım hatası ama bu şekilde yazıldığında projelerinizde sorun yaratmayacaktır çünkü hep aynı kodu verecektir.


Samsung kodlamasında fark görülmüyor. kütüphaneli ya da kütüphanesiz doğru sonucu veriyor. Çünkü start palsı 1 ile başlıyor. 0 ile başlasaydı o da soldaki sıfırlar atılmış olarak görüntülenecekti.


Yukarıdaki RC5 protokol sonucunda ise farklı bir hata yok gibi görünse de, yine sıfırların atılması gibi görünse de. Sinyalin yakalanması sırasında baştaki start palslarının 1 olması gerekirken 0 olarak hesaplanması sonucu, toggle biti de sıfırsa kütüphaneli program soldaki sıfırları atarak gösteriyor. Tabii ki bu da sonuçta adres kısmını tamamen kaldırıyor ve sadece komut kodu olan 10001 kodu geliyor. Halbuki gerçek sinyal 11000000010001 olmalıydı. Dikkatli bakarsanız tuş 2. kez basıldığında toggle biti 1 olduğundan kütüphane start palslarını 0 gördüğünden yazmaya toggle bitinden başlamış soldakileri sıfırlamış.
Kütüphanesiz program doğru bir şekilde hesaplayıp soldaki start bitleri 1 olduğundan tüm sinyali gösteriyor.

Buraya kadar NEC + SAMSUNG + RC5 protokollerini anlatmaya çalıştım. Fakat diğer protokollere de baktığınızda, bu mantık ile onları da kolaylıkla çözebileceğinizi sanıyorum.

Program örneği veremesem de, örnek olarak SHARP ve SONY(SIRC ) protokollerinin sinyal şekillerini buraya koyuyorum.

SHARP Protokolü:
Programlar arasında da internetten bulduğum kaynakların internet adresleri de var. O adreslerden ayrıntılı bilgi edinebilirsiniz.
SHARP ile ilgili bilgiler :
Sharp IR protokolü hakkında internette çok az bilgi bulabildim. Bulduklarımda elimdeki sharp kumandayla uyuşmadı. Fakat elimdeki kumandanın osilaskop görüntülerini ve bulabildiğim bilgileri burada paylaşıyorum.
Öncelikle protokol hakkında bildiklerimi sıralıyayım.
Sinyal şekli bu şekilde olduğu belirtiliyor. Burada 5 bit adres ve 8 bit komut var ve LSB yönüne dikkat edin. Sinyalde HIGH seviyesinin büyüklüğüne göre 1 ve 0 olarak değerlendiriliyor. Bundan dolayı LOW seviyesi çok küçük fakat sabit bir LOW süresi oluşturulmuş. Sinyal resminden gördüğünüz üzere 320us LOW süresi belirtilmiş. Fakat elimdeki kumandada bu 400us civarında görülüyor. Ayrıca 0 seviyesine ait süre ise resimde 680us yazıyor fakat elimdeki kumandada 1640us görünüyor. Ayrıca 1 seviyesi ise 1680us görülüyor, elimdeki kumandada 3760us görülüyor. Belki de sadece küçük büyük diye düşünüldüğü için sürede tolerans mevcut olabilir. Resimde gördüğünüz gibi 5 bit adres ve 8 bit kod var.

Elimdeki kumandada Sinyal Bu şekilde 3 lü olarak gelir. 1. ve 3. bölüm birbiriyle aynıdır. 2. bölüm ise 1ve 3. sinyallerin tersidir. Daha kısa görünmesi bit sayısının azlığından değil, 1 yerine 0 gelmesi ve sıfır süresinin 1 süresinden küçük olmasıdır. 3 sinyal bloğu arasındaki 2 büyük boşluk ise 20ms civarındadır. 

 


Yukarıdaki resimde UP butonu ve DOWN butonunun karşılaştırılması mevcuttur. İnternetten alınan bilgi içerisindeki sinyal ve bilgilerde START palsından bahsedilmiyor. Elimdeki kumandada 3 adet 0 palsından sonra başladığı açıkça görülüyor. Bu sinyaller ALICI gözden sonra alındığı için terslenmiş sinyallerdir. Sayfa içerisinde 1. resim 2. resim ifadeleri, gelen 3 lü sinyalin,
1. sırası 2. sırasını 3. sırasını temsil eder.
Resmin sağ tarafında ki Binary kodlar aşağıdakilerdir. Bu renkli kısım START palsı+ADRES+KOMUT şeklinde belirlenmiştir. Bunun dışında ise 14 tane 1 ve 2 tane 0 verilmiştir. ( 2. resim ise bu 1. resmin terslenmiş (invert ) halidir. Sinyalin doğru şekilde iletilip iletilmediği bu 2. resim yazan yerdeki terslenmiş sinyal ile 1. resim sinyalinin karşılaştırılmasıyla yapılır. (Tersleme işlemi 1 yerine 0 konulmasıdır.)
……………..adres komut
DOWN1      30     125
00001111101111101111111111111100 1. resim
UP1
00001111010011101111111111111100 1. resim
……………….30     114

Yanlarında yazdığım kodlar sinyalden elle yazılan kodlardır. Kumanda SHARP klima kumandasıdır. 

Bununla birlikte Arduino kütüphanesini de kullanarak SHARP kumandayı okumaya çalıştığımda sanırım ona ayarlanmadığı için hatalı sonuçlar üretti. Fakat üretilen sayılar yanlış ve tutarlı olmadığından bu kütüphane ile projelerinizde kullanamazsınız.

Seri monitör de gösterilen hatalı sonuçlar. ( SHARP kumanda için)
SADECE  power ON OFF tuşu kullanıldı.
10001101111110010111111110001101
10010110101111001001010011011110
10100001110110101101001100111110
10010110101111001001010011011111

Not: Elimdeki SHARP klima kumandası bu sinyali üretiyor. Belki elinde SHARP başka cihazı olan vardır. Yapabilirseniz elinizdeki kumandanın sinyal şeklini bana iletir misiniz. SHARP IR protokolü hakkında az kaynak vardı ve tam sonuca ulaşabilecek sinyal şekli bulamadım. Kendi kumandama göre program yapabilirim. Fakat birden fazla kumandayı karşılaştırabilirsek iyi olur. Bu kaynak SHARP hakkında güzel bir kaynak olabilir.

SHARP için program örneği yok. Fakat 32 bitlik bir sayı olduğu belli ve NEC programına benziyor. Sadece START palsi yok gibi görünüyor. Birinci  gelen pals katarında 400us olan LOW seviyesini kontrol etsek bu kez de sinyalin ortasından başlayabilir. Yukarıda 3’ü bir arada olan sinyal şeklindeki aralara dikkatinizi verin. Oradaki sinyallerin arasında 20ms boşluk var. ilk 20ms geldiğinde bir kez daha 20ms aranır ve 3. sinyal katarında kod yakalanır. 1. sinyal katarı ve 3. sinyal katarı birbirinin aynıdır.
Ya da Low seviye görüldüğü andan itibaren 32 değil 96 HIGH seviyesi hafızaya alınır ve analiz edilirken 20ms lik sinyaller başlangıç veya bitiş noktası olacak şekilde istediğiniz sinyal katarından bilgileri alabilirsiniz.
Tabii ki daha farklı algoritmalar da düşünebilirsiniz.

SONY(SIRC ) protokolü:

Elimde kumanda olmadığı için link veriyorum. Buradan inceleyebilirsiniz.
SONY SIRC Protokolü

==========================================================================

 

Tüm programlar bu linktedir. ( Programları yazıya eklemedim çünkü her biri yazıyı uzatacak ve okuyanı rahatsız edecekti. )

Programların olduğu yerde osilaskoptan alınan sinyal şekilleri de mevcuttur. Oradan osilaskop görüntülerine bakıp programınızı yapabilirsiniz. 

NOT: Sizlere kumandanın şu tuşu şu koddadır diyemediğim için örnek kod veremiyorum. Çünkü bazı tv modelleri 1 nolu tuşa 1 kodunu verirken bazıları farklı kod verebiliyor. Bundan dolayı sizi yanıltırım. RC5 te veya diğer protokollerde Hangi butona hangi kod verileceği yazılmış olsa da üreticiler buna %100 uymuyor diye gördüm. Bundan dolayı kendi kodunuzu kendiniz bulmalısınız. Sadece referans olarak size sinyal görüntülerini veriyorum. Elimdeki her kumandanın sinyalini osilaskoptan alıp yazıya ekledim. Bu görüntüler Alıcı gözden sonra arduinoya gelen sinyal görüntüsüdür. Orijinal sinyalin tersidir. 

Şayet anlatımlarda eksiklik veya yanlışlık varsa, Lütfen yorum bırakın ki sayfayı okuyanlar yanlış bilgi edinmesin.
Hatta SHARP protokolü konusunda yardımcı olacak web adresi bulabilirseniz, yorumlara ekleyebilirseniz. Yazıya katkı sağlamış olursunuz.

NEC protokol video:

 

SAMSUNG protokol video

RC5 protokol video.

Protocol öğrenme video :

PIC devre+proteus RC5 protokol video :

 

 

 

 

 

 

 

1 Comment

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.