Alınan ir datalarını değiştirip tekrar ir olarak gönderme

Başlatan blueboard, 30 Kasım 2024, 11:12:35

blueboard

Ete Hocam, yardımınızı talep ediyorum. Elimden geldiğince en sade şekilde yapmak istediğimi yazıyorum. Aracımda 1 adet Pioneer teyp var . Eski seri kaliteli bir model. Fakat bu teypte kablolu kumanda girişi yok. Bundan dolayı teybi sadece uzaktan kumanda ile kontrol edebiliyorum. Bu teypte USB girişi de olmadığından piyasada satılan Usb, SD kart girişi olan bir USB player aldım. Bu Usb player Pioneer teybe Aux girişinden bağlanıyor. USB player'den şarkı değiştirebilmek için araçta ikinci bir uzaktan kumanda olan USB Player'in de uzaktan kumandasını kullanmak zorunda kalıyorum.

Aynı anda hem Pioneer'in kumandasını, hem de USB player'in kumandasını kullanmak zor olduğundan  şunu yapmak istiyorum: 16F1827 ile daha önce yardımcı olduğunuz bir ir alıcı devresi var. Bu devrede Pioneer uzaktan kumandasının ir datalarını almak için TK19 var. Yine aynı devreden ir verici led çıkıyor.Bu devre Pioneer kumandasından infrared olarak gönderilen parçayı bir sonrakine atlatma, parçayı bir öncekine atlatma ve Play/pause datalarını alacak. Ardından 16f1827 bu dataları aldığında  PBP dosyasında yazdığım şekilde USB player'in orijinal kumandasının gönderdiği sonraki parça, önceki parça ve play/pause ir dataları olarak verici ir ledden gönderecek.

Bunu kendi mantığıma göre yazdım ancak verici ir ledden datalar çıkmıyor. Hatanın nerede olduğunu anlayabilmek için ayrıca 16f1827'nin b.2 ve b.3 pinlerine birer normal led bağladım. Pioneer kumandadan çıkan sonraki ve önceki parçanın alınması durumunda bu ledleri yakacak şekilde komut ilavesi yaptım. Devre Pioneer kumandasından gelen dataları alıyor ve ilgili ledleri yakıyor. Kısacası devre için yazılan kodların alıcı kısmında sorun yok. Verici kısım için yazılan kodlarda sorun var.  Yardımcı olabilir misiniz?


blueboard

Kodların olduğu dosya yüklenmemiş. Tekrar deniyorum.

ete

Bu işle ilgili bir çok sorun var gibi gözüküyor.
Her şeyden önce Alıcı (NEC protokolüne göre IR kumandadan gelen verilerin alındığı program) ve Verici şu anda çalıştırmak istediğin program ayrı ayrı kendi başlarına çalışıyorlarmı?
Alıcı çalışıyordur ancak vericinin çalışmadığından eminim.
Bunun  gördüğüm bazı sebepleri var.
- Öncelikle Çıkış pini 1827 de LAT registeri ile tanımlanır. PORT değil. Yani o ledin bağlı olduğu pin LATB.4 şeklinde verilmeli. İşin ASM kısmında pin tanımlamasına bence gerek yok idi.
ASM içindeki ;
bsf    IRTX,PIN  komutu yerine  bsf    LATB,4  yazmanız yeterli olacaktır.

Diğer bir konu ise verici kısmında gönderilen data bir taşıyıcı sinyale bindirilmesi gerekir. Bu genellikle 38Khz lik kare dalga olur. Sen ise direk data bilgisini led den çıkarmaya çalışıyorsun. Bu durumda bu verilen sinyalin kimin tarafından algılanacağına bakmak gerekir. Şayet oda bir foto transistör veya ışık alıcı bir sensör ise sorun olmayabilir. Ama TK19 benzeri bir IR_Göz ise sorun olabilir. Demek istediğim IR_Göz taşıyıcı sinyali data dan ayıran bir sensördür. Sen taşıyıcı sinyal olmadan bir bilgi yollarsan ve IR_Göz de bunu alırsaa ne yapar hiç denemediğim için bilemiyorum. Göz ün görevi bu sinyalleri alıp taşıyıcı kısmını ayırıp çıkışından net data sinyalini vermek dir. Hal böyle olunca nasıl davranacak bilemiyorum Deneyerek görmek lazım.
Başka bir sorun da, Alıcı kısmın KESME ile çalışması nedeni ile kendisinin yolladığı sinyalleri biryerden yansıyarak almaya kalkışırsa sorun çıkar. Demek istediğim bir alet hem alıcı hem verici olamaz olursa da farklı bir algoritma düşünmek lazım.

Bir diğer kusur diyeyim j değişkeninin formatı WORD olarak düzenlenmiş ve program içinde byte değişkenine J değeri veriliyor. Bu nedenle J nin formatı BYTE yapılmalı.

Bu dediklerimi değiştirip programın Başla etiketine GOSUB SEEK_UP yazıp simulasyonda çalıştırıyorum ve IR_Led çıkışına bir skop bağlıyorum çıkan sinyali görebiliyorum. Sanki taşıyıcı sinyale bindirilmiş data bitleri gibi gözüküyorlar. Bu durumda Taşıyıcı sinyal konusundaki kusuru göz ardı edebiliriz. Her ne kadar bit süreleri ve bit aralarındaki boşluklar bana fazla gibi gözüksede denemeden bir şey söylememek gerekir.

Bu durumda ilişikte verdiğim programı öncelikle bir denemeni isterim.
Ancak bunu denerken alıcı için kullandığın TK19 ile verici led aynı ortamda bulunmaması gerekir. Yada birbirlerini görmelerine engel olman gerekiyor.
Yada programa müdahale edip verici çalışırkan alıcı kısmı çalıştıran KESME yi iptal etmek en doğrusu olacaktır.Verici çalışırken kesmeyi kapattım Bu şekilde çalışması gerekir.
Sonucu yazarsın.
Ete

blueboard


blueboard

Ete Hocam, günaydın. Gönderdiğiniz kodları yükledim. Yaptığım devre bu kodlara göre doğru bir şekilde çıkış veriyor. Ancak alıcı USB player sebebini bilemediğim bir şekilde tepki vermiyor. Belirttiğiniz gibi verici infrared led ile usb player Pioneer uzaktan kumandasından  farklı bir ortamdalar.Lojik analizör ile hem yaptığım devre çıkışına hem de orijinal uzaktan kumandasının çıkışlarına bakıyorum; aynı dataları çıkarıyorlar. Çıkışların resimlerini ekliyorum. Resimleri yakınlaştırınca datalar belrgin bir şekilde görülüyor.Yanlız orijinal kumandasının çıkışında şunu görüyorum:gönderilen  33 bitlik data bittikten sonra 39.2 ms lik bir bekleme süresinden sonra repeat kod gönderiyor. Bu repeat kodun gönderilme sebebi tuşa basıyor olmamdan kaynaklanıyor olabilir mi? Yoksa orijinal kumanda alıcının tepki vermesi için önce 33 bit data , ardından bekleme süresi ve repeat kod gönderiyor olabilir mi? Düşünceme göre bu durum NEC protokolüne göre aykırı bir durum. 33 bit gönderim sonucu alıcının tepki vermesi gerekmez mi?




ete

Yaptığın devrenin kısa pulsları biraz daha kısa olmalı. Aralarındaki tek fark bu gibi gözüküyor.
Bit süreleri çok önemli ona göre karar veriliyor yollanan bitin bir mi sıfırmı olduğuna.
NEC sisteminde bit uzunlukları şöyledir.
560us (HIGH) + 560us (LOW) bu Lojik "0" bitidir.
889us (HIGH) + 1690us (LOW) buda Lojik "1" bitidir.
Header kısmı iyi gözüküyor. 9000us HIGH ve 4500us LOW bitinden oluşuyor.

Gördüğün gibi bir birinden farklı kullanılan bit uzunlukları 9000us - 4500us - 560u - 1690us
Senin yaptığın devrede "1" bitini oluşturan LOW biti süresi bana kısa geliyor. Diğerleri ile aynı gibi orada bir kusur var gibi geliyor bana. Oraya odaklan bence.

Diğer taraftan aldığın bu bit resimleri sanırım bir transistörle ters çevriliyor. Zira bunları normal göz çıkışındna aldığın zaman bir defa ters çevrilmiş alman gerekir idi.
Kısaca IR_Göz çıkışı yukarıda verdiğim bit sürelerinin tersini sana verir. Mesela Lojik "0" biti bu durumda 560us LOW + 560us HIGH olarak görünür.
Bu konuya dikkat ediyorsundur umarım.

Aşağıdaki linkte yer alan pdf dosyasıbıda yükle ve NEC protokolü hakkındaki bilgini genişlet.

https://www.ad-notam.com/download/RS232/ad_notam_IR_protocol_DFU.pdf

Ete

blueboard

Ete hocam, doğrudur. Pickit2'nin girişinde transistör var. Bit sürelerini tekrar kontrol edeceğim.

onurinci

konu ile pek alakalı değil ama , bir anı geldi aklıma , bir devreyi ne yaptımsa çalıştıramadım, IR bağlantı konuşmuyordu birbiri ile, scop'ta her şey normaldi, scop'bun triggeri nedense Fall Time 'de daha iyi kilitleniyordu. bir anda aklıma IR ekipmanları çıkarıp düz bağlama fikri geldi ve harika çalışıyordu , hata yazılımda değil bende imiş. alıcı evde bulduğum eski uydu alıcısından çıkardığım bir göz idi meğerse nadir üretilmiş , gelen datayı Invert eden bir türmüş, orijinal devre TFM5380 kullanıyordu bunu takınca sorun ortadan kalkmıştı..

blueboard

Dün akşam buton kontrollü bir uzaktan kumanda devresi yaparak aynı ir datalarını kullandım. İlginçtir buton kontrollü uzaktan kumanda ile aynı süreler ile sorunsuzca çalıştı. Ancak sebebini bulamadığım bir şekilde yapmaya çalıştığım asıl devrede çalışmıyor. Pickit2'nin lojik analizöründe her şey normal görünüyor ama gerçek alıcıda çalışmıyor.

ete

Benzer yazılımı kullanıyor isen sorunun fiziksel olmalı. Ya yeterince IR led sinyali çıkmıyor yada IR_göz ile IR_Led bir birini görmüyordur. Olaya uzaktan bakınca başkada bir sebep göremiyor insan.

Türlü türlü algoritmalar var gelen IR led sinyalini çözmek için. Ama asıl mesele bit sürelerini bir birlerinden ayırt etmek. Burada direk süreleri kullanırsan ölçümlerde işin ondalık kısmında farklılıklar çıkıyor. Ama daima en yüksek değerlikli bit karşılığı ondalık rakamı kullanırsan hiç sorunsuz okuma yapabilirsin.
Örnek vereyim.
Bize bit süreleri lazım. Birinci süremiz 560us. Bunu bir şekilde ölçerken basen 558 bazen 555 bazen 560 bulursan ve IF satırında IF SURE=560 dersen bir sürü yaklaşık süreyi göz ardı etmiş olursun.
560 rakamının Binary karşılığına bakacak olursak %001000110000 olduğunu görürüz. Burada en yüksek değerlikli bit karşılığının 9.cu bit olduğunu görürüz. Bu durumda karşılaştırma rakamımız 9 olacaktır. Şimdi 558 rakamına binary olarak bakalım %0010 0010 1110 bu rakamında en yüksek değerlikli biti 9 dur. O halde önce sürenin en yüksek değerlikli bitini bulup sonra onu 9 rakamı ile karşılaştırırsak ufak tefek farklılıklara rağmen kod çözücümüz mükemmel çalışır.

Basic de en yüksek değerlikli bit'i bulmak için NCD komutunu kullanıyoruz. TEMP=NCD(SÜRE) dediğiniz zaman Temp değişkenine 9 rakamı (süreye bağlı olarak) yerleşecektir.

Ete

blueboard

Ete Hocam, sorun muhtemelen belirttiğiniz gibi sinyalin yeterli çıkmamasıdır. Çünkü cep telefonu kamerası ile yaptığım devredeki ir lede bakınca zayıf bir ışık var. Buton kontrollü ve çalışan devrede ise led parlak bir şekilde yanıyor. Bunun çözümü için ne önerirsiniz?

ete

Öncelikle farklı IR ledler kullanmanı öneririm. Bu ledler Infrared ışığı belirli bir açı ile veriyor ve piyasada dar açılıdan geniş açılı olanlara dek geniş bir ürün bulunuyor. Hem mw olarak güçlü hemde açısı geniş olanlardan birini tercih etmende yarar ver.

Gücü artırmak için şayet verdiğin şema aynen uygulanmış ise led'e seri olarak bağlı 47 ohm direnci 10 Ohm ile değiştir. BC547 transistörü de BC337 ile değiştir. Bunlarda yeterli gelmez ise  bir yerine 2 ledi seri bağla ve 10 ohm direnci kaldır. Şu anda yapılabilecekler bunlar.

Ete

Powered by EzPortal