İlgili sayfa: Uzaktan Kumanda
Geçenlerde hocamız, bilgisayarda sıradaki slayta uzaktan kumanda ile geçiş yapılabilmesini sağlayan minik bir kumanda ile derse girmişti. Güzel düşünmüşler, kafamda yer etti... Bir önceki haftasonu, zamanında merakıma kurban olmuş ve bir köşeye atılmış eski bir vcd çaların kumanda algılayıcısına gözüm ilişti. O an hocanın kumandası da aklıma geldi, ordan esti kafama bu fikir. Önceki haftasonumu bunu yapabilip yapamayacağıma karar vermek için bilgi toplamakla geçirdim. Bu haftasonu da işe koyuldum. Sonunda bitti ve gayet güzel çalışıyor...
Kızılötesi iletişim değişik protokoller ile gerçekleştirilir. Ancak tüm protokoller aynı mantığa dayanır. Verici, bitler ile şekillendirdiği dalgayı (genelde kare dalga kullanılır) kızılötesi ışık yayan diyota gönderir. Yayılan ışığa duyarlı olan sensör, ışığı aldığı anda tipine göre 0 veya 1 lojik seviyesinde çıkış verir. Çıkış, bir mikroişlemci yardımıyla okunur ve tekrar 1 ve 0lara dönüştürülerek iletişim gerçekleştirilmiş olur. Kızılötesi iletişimde en çok kullanılan protokoller konusunda daha çok bilgi edinmek için şu sayfa ziyaret edilebilirsiniz.
Yandaki resimde bir kumandaya ait "1" tuşunun ürettiği sinyalin genlik-zaman grafiği var. Kumadaların çoğu genelde şekilde gibi dalgalar üretir. Ancak üretilen dalgalarda 1 ve 0 bitlerinin kodlanışı, dalgaların üretiliş periyodu, kodlanıp gönderilen verinin uzunluğu gibi özellikler değişiklik gösterir. Tuşa ait sinyalin örneklenmesi ile oluşturulan ses dosyasını indirmek için buraya tıklayabilirsiniz...
Önce işin elektronik kısmıyla başlayalım. Gördüğüm kadarıyla en yaygın kızılötesi sensörler, Telefunken'in TK19'u ve Siemens'in SFH506'sı. İnternette datasheetlerini bulabilirsiniz. Kullandığım sensörü yukarıda sözünü ettiğim vcd çalardan çektim. Bu yüzden modelini bilmiyorum. En sağ bacağa +5V, orta bacağa toprağı bağlayıp sol bacaktan çıkış aldım. Kullandığım sensör kızılötesi ışık yokken, 1 lojik seviyesinde çıkış veriyor ve sensöre sinyal ulaştığında çıkışı 0 lojik seviyesine çekiyor. TK19 ve SFH506'da resimdeki + ve - kutuplar yer değiştirilerek durum tersine çevirilebilir. Yani sinyal yokken 0, varken 1 çıkışı alınabilir. Ses kartına direkt 5v vermek zararlı olabileceğinden seviyeyi mümkün olduğu kadar aşağı çekmemiz gerekiyor. Elimdeki en yüksek direnç 1000K civarında olduğu için araya bu direnci bağlayarak voltajı düşürdüm...
Sensörün mikrofon girişine nasıl bağlanacağını yukarıdaki resimde görebilirsiniz. Güç ihtiyacını usb girişinden karşıladım. Usb girişi bize yaklaşık 5 volt kadar gerilim sağlar. Bunun için bir usb kablosunu gözden çıkarmanız gerekiyor. Dıştaki kabı soyduktan sonra karşınıza 4 kablo çıkacak. Kırmızı olanı +5V, siyah olanı toprak, beyaz olanı data+, yeşil olanı da data- kablosu. Sadece siyah ve kırmızı olanlara ihtiyacımız olacak.
İşin asıl önemli kısmına, yazılım kısmına gelelim. Daha önce ses kartı yardımıyla telefon hattından arayan numarayı çözümlemeye çalışmıştım. Ancak oluşan cızırtıları bir türlü engelleyemediğim için bu işten vazgeçmiştim. Bu sefer de cızırtı var ama genelde çözümleme işlemini pek etkilemiyor.
Ses kartı kendisine gelen analog sinyalleri dijital sinyallere, dijital sinyalleri analog sinyallere dönüştürebilir; yani bir çeşit çift yönlü analog<->dijital dönüştürücüsü olarak çalışır. Kartın bu özelliğinden yararlanarak analog sinyali örnekleyip bilgisayar ortamına aktarabilir ve böylece sinyali çözümleyip ne taşıdığına karar verebiliriz. Visual Basic ile hazırladığım programda kullandığım örnekleme yaklaşımı şöyle:
Böylece çerçeveleme mantığını da kullanmış oluyoruz. Burada bellek boyutu (aynı zamanda çerçeve boyutunu da belirliyor) için seçilen 4096 rastgele bir değer değil. Bu değere çeşitli parametreler değiştirilerek yapılan gözlemler sonucunda ulaşıldı. Tampon bellek boyutunun düşürülmesi, kumandanın ürettiği kare dalgalar yarım dalga periyodu boyunca (bazı kumandalarda daha kısa veya daha uzun süre) 0 seviyesinde tutulduğundan sinyal henüz bütünüyle alınamamışken programın sinyalin bittiğini zannetmesine yol açar. Boyutun arttırılması ise programın bellek bölgeleri arasında veri taşıma işlemlerini gerçekleştirirken daha çok zaman harcamasına ve arasıra çok kısa süreli de olsa kullanıcıya yanıt vermeyi kesmesine yol açar. Daha da önemlisi sinyalin başlangıcına ait örneklerin gözardı edilmesine yol açabilir. Bu durum "Gözlemler/Sonuçlar" kısmında daha ayrıntılı bir biçimde açıklanmıştır.
Yukarıda verdiğim linke tıkladıysanız ne kadar çok kızılötesi iletişim protokolü olduğunu görmüşsünüzdür. Bir kumandanın hangi protokolle iletişim kurduğunu yani aslında hangi dille konuştuğunu anlamak için tüm bu protokolleri ayrı ayrı inceleyip programı da o şekilde tasarlamak gerekir. Ama kumandanın ne söylediğini anlamamıza gerek yok. Yapmamız gereken şey her gelen sinyali, kendisini betimleyecek benzersiz niteleyiciler ile simgelemek. Kumandanın ne söylediğine daha sonra biz karar vereceğiz.
Yazdığım programda niteleyici değer bulunurken şu adımlar izlenir:
Yöntem uygulanırken dikkat edilmesi gereken 3 önemli nokta daha var:
Bu üç noktaya da dikkat edildikten sonra aynı tuşun farklı zamanlarda çıkardığı sinyalin bu yöntem izlenerek işlenmesi sürekli aynı sonucu doğuracaktır. Sonuçta tuşun gerçekte hangi bitleri kodlayıp gönderdiğini bilemesek bile, yani kumandanın kendi dilinde ne söylediğini bilemesek bile kendi geliştirdiğimiz dilde ne söylediğini anlayabiliyoruz. İstenirse, herbir protokol incelenerek, tutulan öznitelik değerlerinin kullanılan protokolde ne ifade ettiği çözümlenebilir.
Program daha önce kaydedilen bir tuşa basıldığında onu algılayıp, yine daha önce kaydedilen komutu çalıştırır. Komut "Sistem|||ÇalıştırılacakExe Parametreler" ve "Tuş|||KısayolTuşu+KısayolTuşu+..." olmak üzere iki biçimde girilebilir. İlk biçimde girilen komut programın belirtilen çalıştırılabilir dosyayı belirtilen parametreler ile çalıştırmasını sağlar. İkinci biçimde komut girilmesi halinde programa herhangi bir klavye tuşu girilebilir. Tuşlar + ile ayrılmalıdır. Program sinyali aldığında belirtilen tuşlara sırayla basar ve son bastığı tuşu başta olmak üzere tümünü sırayla bırakır. Programda tüm klavye tuşlarını tanımlamaya ve hata ayıklamaya üşendim, belki daha sonra zaman bulursam bunları da yaparım. Programın son derlenmiş halini ekran görüntüsünün altındaki linkten indirebilirsiniz...
Denemelerde kullanılan 5 farklı kumandanın ikisinde maksimum genlik değeri ile minimum genlik değeri arasındaki fark çok düşük ölçülmüştür. Geliştirilen yöntem en düşük genlik değeri ile en yüksek genlik değeri arasında bir noktayı eşik değer olarak belirlediğinden, program bu kumandalarda sinyalleri niteleyen benzersiz değerler bulmakta zorlanmıştır. Bu probleme, maksimum ve minimum genlik değerleri arasındaki farkın yüksek olduğu kumandalarda yöntemin işleyişine etki edemeyen cızırtı sebep olmaktadır.
Farklı örnekleme frekansları ile sinyaller örneklenmiş ve en uygun örnekleme frekansı tespit edilmeye çalışılmıştır. Örnekleme frekansının olabilecek en düşük değerde tutulması ve bu arada da gelen sinyallerde kare dalgaların örneklenememesine, başka bir değişle dalga kaybına sebep olunmamaması gerekir. Bu hususlar göz önünde tutularak örnekleme frekansı 11025 hertz olarak seçilmiştir. Bu frekasta denenen tüm kumandalar arasında dalga tepesi/çukuru başına düşen en düşük örnek sayısı 5 olarak ölçülmüştür. Amaca en uygun örnekleme frekansının bu olduğu söylenebilir...
Sinyal başlangıcının o an alınan örnek grubunda (sinyal tespit bölgesinde veya çerçevede) sonlara düşmesi, hesaplanan ortalama genlik değerinin düşük olmasına ve sinyalin başladığının anlaşılamamasına sebep olabilmektedir. Nadiren oluşan bu durumda program, tümü sinyale ait olan sonraki örnek grubunu sinyalin başlangıcı olarak seçmekte ve nitelik değerini yanlış hesaplamaktadır. Bu sorunun ortaya çıkmasında tampon bellek bölgesi ile sinyal tespit bölgesinin boyut seçimi ve ortalama genlik eşiğinin değeri etkili olmaktadır. Boyutlar programda 4K olarak seçilmiştir. Ortalama genlik değerinin maksimum ve minimum genlik değerleri arasındaki uzaklık ile orantılı olarak seçilmesinin sorunu tamamen ortadan kaldıracağını düşünüyorum. (aklıma sonradan geldi henüz denemedim)...
Neyse, kafamı bir süredir kurcalayan bu mesele de burada bitmiş oldu...
Bugün, daha önce kurduğum sensör devresinin bilgisayarın sağlığı açısından tehlikeli olduğunu fakettim. Sensör de ses kartı da aynı kaynağa bağlı ve eğer mikrofonun - kutbuna usbnin + kutbu değerse kısa devre olur... Hem daha önce denemelerde kullandığım 5 kumandadan 2sinin sinyallerinin program tarafından anlaşılamadığını söylemiştim. İçime sinmedi. Öyle 3 tane çalıştı 2 tane çalışmadı olmaz; "Yapacaksan tam yap Hüseyin"...
Programda tanımlamaya üşendiğim diğer tüm klavye tuşlarını tanımladım (eksik tuş kaldı mı bilmiyorum) ve TK19 alıcı modülü kullanarak bugün devreyi tekrar kurdum. Devreyi öyle kurunca cızırtı sıfırlandı. Ayrıca TK19'un kullanılmasıyla daha önce bahsettiğim max-min genlik değerleri arasındaki farkın düşük ölçülmesi sorunu da çözülmüş oldu. TK19'un giriş ve çıkışı daha önce kullandığım sesörün tam tersi. Şöyle de bir durum var; sonuçta ses kartının - kutbu ile usbnin - kutbu aynı. Bu yüzden sensör çıkışında + kutbun değil, - kutbun mikrofon girişine bağlanması gerekiyor. Aksi halde kısa devre olur ve bilgisayar bozulabilir. Ayrıca sensör çıkışının, sadece mikrofon girişinin + kutbuna bağlanması yeterli, - kutup boşta kalabilir. Çünkü - kutuplar içeriden zaten bağlı...
Programda kare dalganın tepesi ve çukurunu belirleyebilmek için kullanılacak eşik değerini bulurken, maksimum ve minimum genlik değerlerini hesaplamak için genliklerin mutlak değerini alıyordum. Bu sefer mutlak değer almadım ve oluşan eşik değer maksimum genlik ile 0 noktası arasında olmuş oldu. Ayrıca öznitelik verisinin uzunluğunun da kumanda dosyasında saklanmasını ve kullanıcı tarafından değiştirilebilmesini sağladım.
Sonuçta yöntem son değişikliklerden sonra, en başta hedeflediğim gibi tüm protokoller ile uyumlu hale geldi ve daha önce sinyallerinin anlaşılamadığını söylediğim 2 kumanda da artık problem yaratmıyor...
Sensörün çıkış aldığım bacağı ile mikrofonun + kutbu arasında yaklaşık 2.5 volt kadar bir potansiyel fark olduğunu farkettim. Bu yüzden çıkış hiç 0V olmuyordu. Araya diyot bağlayarak mikrofonun + kutbundaki voltajın TK19'un çıkışına gelmesini engelledim.
Algoritmamızda sinyal başlangıcı tespitinin nadiren yanlış yapılabildiğini söylemiştim. Bu istisnai durumu ortadan kaldırmak için sinyalin başlangıcını içerdiği tespit edilen her örnek grubunun, kendisinden önceki grup ile birlikte dinamik bellek bölgesine aktarılmasını sağladım. Böylece sinyal başlangıcı çerçevenin/grubun sonlarına düşüp tespit edilemese bile, sonraki örnek grubunda tespit yapılacağından, farkedilemedikleri için dışlanan örnekler de çözümleme işlemine dahil edilmiş olur.
Bellek üzerinde verilerin sinyal tespit bölgesine taşınmasının uzun sürmesi halinde mikrofondan tampon belleğe örnek aktarımının kesintiye uğraması sebebiyle gerçek zamanlı örnekleme işleminde aksamalar meydana gelebiliyordu. Dönüşümlü iki tampon bellek kullanımı ile problem tümüyle giderildi. Bu sayede bir tampon bellek alanı dolduktan sonra örnekleme diğer tampon bellek alanı kullanılarak yapılırken, dolan bellek alanından veri kopyalama işlemi de örnekleme işlemini etkilemeden yapılabilmektedir.
Program sinyal uzunluğunu tespit edemiyordu. Tuşa basılı kalınması durumunda sinyal sürekli tekrarlandığı için program da sinyali tekrarlı biçimde değerlendiriyordu. Zaman kaybına sebep olan bu sorun programın sinyal uzunluğunu tespit etmesi sağlanarak çözüldü. Buna göre program, kumanda dosyası içinde saklanan bir ortalama aralık değerine rastlandığında sinyalin yeterli bölümünün alındığına karar verir ve sinyalin geri kalan kısmını değerlendirmeye almaz.
Sinyali niteleyecek değerler elde edilirken tüm tepe<->çukur geçişlerinin önemsenmesi yerine sadece dalga tepelerinin dikkate alınması sağlandı. Böylece nitelik değeri yarı yarıya kısalmış olur ve karşılaştırma işlemi önceki yönteme göre iki kat daha hızlı tamamlanır...
Bellek içerisinde çok sık veri transferi gerçekleştirildiği için hız da büyük önem kazanıyor. Transfer işlemleri için kullanılan klasik döngüler yerine oldukça hızlı çalışan kernel32 kütüphanesine ait RtlMoveMemory fonksiyonu kullanılarak hızda farkedilir bir artış sağlandı.
Son olarak daha önce programın elde ettiği nitelik değerlerinin, kumandanın kullandığı protokolde ne anlama geldiğinin bulunabileceğini söylemiştim. Artık sadece dalga tepelerini hesaba kattığımızdan, karşılık gelen değerin bulunması daha da kolaylaştı. Bundan emin olmak için televizyon kumandasının hangi protokole uyduğunu araştırıp, algoritmamızla elde ettiğim nitelik değeri ile gönderilen gerçek değeri karşılaştırdım. Kumanda NEC protokolünü kullanıyormuş. İşte sonuç:
Konka KK-Y267 Menü Tuşu: 00000010 00010101 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 (kodlanıp gönderilen gerçek değer) |2420|67|22|22|22|21|22|22|33|22|22|22|22|33|22|33|22|33|48 (programın elde ettiği değer)
Baştaki ilk değerin önemli olmadığını ve sinyalin başlangıcının çerçeve başlangıcına uzaklığını temsil ettiğini daha önce yazmıştım. 67 başlangıç işareti ve 48 de sonlanma işareti olarak düşünülebilir. 22 0 değerini, 33 1 değerini temsil etmektedir. Yine daha önce çözümleme işleminde +-1 örneklik kayma töleransı tanımamız gerektiğini yazmıştım. Bu yüzden 21 de 23 te 0 değerini temsil eder. Farklı protokoller için 0 ve 1 değerlerini temsil edecek sayılar da farklı olur. Daha önce "... ne söylediğini anlayamasak bile ..." demiştim, ama görüldüğü gibi artık kumandanın ne söylediğini de anlayabiliyoruz :)...
Programı süsleyip yayına koydum, sayfaya gitmek için buraya tıklayabilirsiniz...
teşekkür ederim bilgilendirdiğiniz için ben fişi soydum zaten artık en uçtaki 4 kutubu onu öyle zannediyorum.. bi de o kısa devre koruması sanırım bende de var daha önce başıma gelmişti. hala kullanıyorum bilgisayarı :D tekrar teşekkür ederim. İyi çalışmalar...
Merhaba Hüseyin bey... Yaptığınız çalışma çok güzel.. Bir şey sormak istiyordum ben size. Mikrofonun kutbunu direncin ucuna bağladım o tamam da diğer ucu nereye bağlayacağım onu tam anlayamadım. Kızıl ötesinin hangi bacağına lehimlemem gerekiyor. Bilgilendirirseniz sevinirim şimdiden teşekkürler... İyi çalışmalar dilerim...
Mikrofon çıkışının 2. ucu boşta kalabilir. Çünkü devre bilgisayarın içinde zaten tamamlanıyor. Yukarıda kızılötesi sensörün bağlantıları ile ilgili bir diyagram var. Ona bakarak uçları lehimleyebilirsiniz...
merhaba hüseyin bey gene ben :D. yukarıda verdiğiniz devreyi yaptım ve sanırım çalışıyor. Ama proğramı ayarlayamıyorum. turuncu proğram sinyali algılamıyor. bu sayfada verdiğiniz proğram sinyali algılıyor fakat; ona da bir tuş kaydedemiyorum. mantığı anladım bi tuşa basacağım, o sinyal görüntülendikten sonra tuşu kaydet diyip komutu gireceğim. ama olmadı mesela winamp için duraklatma tuşu "c" tuşlllc yazıyorum olmuyor sanırım başka bir yolu olmalı... Beni bilgilendirirseniz sevinirim... iyi çalışmalar kolay gelsin... teşekkürler şimdiden...
Turuncu programı yükledikten sonra sağ tıkladığınızda, yeni menüsünde 'Atasoy Kumanda Dosyası' na tıklayın. Böylece yeni bir kumanda dosyası oluşturmuş olacaksınız. Bu dosyaya çift tıklayın. Dosya program ile açılacak. Artık hazırsınız demektir. Başla butonuna tıklayarak sinyal dinlemeye başlayabilirsiniz. Bir sinyal algılandığında Tuşu Kaydet demeniz yeterli.
Bunlar dışında kumandanıza göre Ayarlar penceresindeki ayarları değiştirmeniz gerekebilir. Programın sayfasında bu ayarla bilgiler bulabilirsiniz...
İyi çalışmalar...
Teşekkür ederim Hüseyin bey. dediklerinizi uyguladım; ve kumandayı ayarladım çok rahat kullanıyorum şimdi. ufak tefek sorunlar var ama kendim halledebilirim sanırım. Gerçekten harika bir düşünce Bilgisayarı kumanda ile kullanmak büyük zevk. Tebrik ederim bu fikrinizden dolayı. iyi çalışmalar...
Hüseyin Atasoy bilgi birikiminizi, bu çok değerli eğitici paylaşımla birlikte bizlere sunduğunuz için teşekkürler. Benzer proje veya projeleriniz varsa lütfen benimle chip online sitesinden özel mesaj yoluyla irtibata geçiniz.
merhaba..konuyu hortlatmak istiyorum:)
çok güzel bir çalışma yapmışsınız aklınıza elinize sağlık..laptobum da ır gözü olduğu için gösterdiğiniz bağlantıyı yapmadım umarım oradan çalışır..
benim sorum kumandanın gönderdiği sinyalleri mp3 olarak kaydetmek ve ır alıcıya mp3 çalar veya bir telefon ile göndermek istiyorum..bu ses dosyalarını nasıl kaydedebilirim yardımcı olurmusunuz?
Laptopınızdaki IR alıcınızı kullanarak bunu yapabilir misiniz bilmiyorum ama yukarıdaki devreyi kurduktan sonra herhangi bir ses kaydedici program ile sinyalleri ses dosyası formatında kaydedip oynatabilirsiniz. Zaten yukarıdaki devreyi mikrofon girişine bağladığımız için sinyalleri kendi sesinizi kaydeder gibi kaydetmeniz mümkün...
Üstadım tekrar ben (:
Sorum şu TK19 tamam da IR alıcıyıda mı aynı kablolara bağlıyoruz detaylı bir foto eklersen sevinirim (: Sıfırdan başlayıp aşama aşama foto eklersen biz acemiler ve bu işi yapmak isteyenler için büyük bi kolaylık olur.Çünkü adım atmayı öğrenmeden yürüyemeyiz, bilenler belki yazdığımla dalga geçecekler ama ahh bilmeyenler emin olun bana hak vereceklerdir (:
Yok, niye dalga geçsinler.
TK19 zaten IR alıcısının ta kendisi oluyor. Bağlantıları son fotoğrafta, beyaz zemin üstünde göstermeye çalıştım. TK19'u alıp orada gösterildiği gibi bağlamanız gerekiyor.
İyi günler
Şu alıcı gözü 5 tl'ye aldım, şimdi bana lazım olan usb kablo ve kulaklık kablosu değil mi ? (: Ha birde 1 tane direnç alacam.
Unutmadan alıcı göz 3 ile 7 volt arasıymış sorun olmaz değil mi ?
elinize sağlık ama birşey sormak istiyorum. bununla sadece bilgisayara gelen sinyaller mi algılanıyor yoksa aynı şekilde kızılötesi sinyalde yollayabiliyor mu?
Sadece gelen sinyaller algılanıyor. Yine ses kartını kullanarak bilgisayarın da sinyal göndermesini sağlamak mümkün ama bilgisayarı kumanda olarak kullanmak işe yarar birşey gibi görünmüyor.
tebrikederim güzel birşey ama pc film izlerken ya da müzik dinlereken hopörler girişini nereyed etakılacak ben tonmastercıyım ve pc ses kartı girişini mıcsere bağlamam lazım bu nasıl olacak.ama paylaşımın gerçekten güzel.ucuz bir malıyete yapılabilir.
Kumanda için hoparlör çıkışını değil, mikrofon girişini kullanıyoruz. O yüzden müzik dinlerken, film izlerken kumandanın bir tuşuna bastığınızda çıkaracağı ses dışında bir problem yok. O da çok rahatsız edici sayılmaz.
Gerçekten çok faydalı bir makale olmuş. Emeğinize sağlık. Saygılarımla
Merhaba öncelikle emeğinize sağlık gerçekten çok güzel bir çalışma
televizyona bağlı pc de win10 üzerinde kodi ile kullanıyorum çok işime yarıyor
size sorum şu programınıza PageUp , PageDown ve back tuşlarınıda ekleyebilirmiyiz,
program açılışında başla tuşuna basmaya gerek kalmadan başlaması mümkünmü?
ikinci olarak Pc ye android x86 da yükledim bununla da çalışan bir versiyonunu yapmayı düşünürmüsünüz?
İşinize yaramasına sevindim.
Ama programı çok uzun zaman önce yazmıştım, şu an kodlarına baksam birşey hatırlamam muhtemelen.