AVR- Kızılötesi Haberleşme (IR LED-1838)

Bir önceki yazımda boşta bekleyen ve birçok amatörün elinde olan malzemelerle bir şeyler yapmaya çalışacağımı söyledim. Eski telefonlarda veri aktarımı için kullanılan telefonlar için eskimiş bir teknolojiyi kullanmak ve yine öğrenmek amacıyla basit bir çalışma yaptım. Tek yönlü bir iletişim için kullanacağım bu çalışmada verici olarak kızılötesi (IR) Ledi kullanacağım teknolojisine kaplamasına girmeyeceğim. Alıcı tarafta ise elimde olan KY-022 kullanacağım. Benim kullandığım modül bu üstünde 1838 yazan sensörün tam olarak VS1838,  TL1838  veya OS1838 olması çok  önemli değil . Sanırım bütün üreticiler aynı özelliklerde üretim yapıyor. Bu kızılötesi alıcı sensörler 940nm dalga boyundaki ışığı algılayacak şekilde yapılmış.

1838

Hiç datasheet okumadan hemen bağladım. Yazılımı yükledim ama çalışmadı. Verici olarak kullandığım ledi kontrol ettim gayet güzel yanıp sönüyor.  Mecburen en başta yapmam gerekeni yaptım okumaya başladım. Bu sensörler kızıl ötesi ışığı algılıyor ama bunun için 38-40 kHz arası kare dalga ile göndermek gerekiyor. Burada verici IR ledi sürekli yanık tutsak da bu alıcı sensör için bir anlam ifade etmiyor ve çıkış vermiyor. Klasik olarak kablo ile UART veri gönderirken TX normalde “1, high” durumdadır. İletişim başlarken “0, low” olur ve veriye göre “1” veya “0” olarak devam eder. “1” durumda IR led sürekli yanarken nasıl yapacağım derken bu şema sorumu cevapladı.

Şemaya göre verici taraf yanıyorken daha doğrusu 38kHz ile yanıp sönüyorken, sensör çıkışı “0” durumuna geçiyor. Benim ilk olarak düşündüğüm verici led yandığında alıcı “0” olur. Bunun için verici ledi bir  transistör ile anahtarlarım ve TX “0” olunca ledi yakarım şeklindeydi. Bu 38kHz ve şemayı öğrenmem işimi kolaylaştırdı. Bu arada sensörün öneri bağlantı şemasını uygulamadım. Ben çıkış ucunu direk RX e bağladım. Belki daha kötü bir iletişim olacaktır ama sonuçta bu amaçsız bir proje olduğundan bu detaylara girmedim. Önemli bir detayı atlamamak gerek. Datasheette belirtilen “1” ve “0” olma zamanları için sınırlama mevcut.

Low “0” 450-500µs den daha az olamıyor. High “1” için 700-750µs süresi verilmiş ama bu sınırın üstüne çıktığım halde sorun olmadı. Low “0” TL veya Tpwl olarak belirtilen süre önemli. Bu kısıtlama bizim en büyük yani en hızlı iletişim sınırımızı belirliyor. Burada verinin gönderimindeki Baud değeri bir bit için geçen süre 450µs den az olamıyor. 4800 Baud değerinde bir bit için 208µs gerekiyor ve bu hızda çalışmıyor. 2400 için 416µs gerekiyor ve bu sürede 450 den küçük olmasına rağmen çalışıyor.

Düşük hızlarda neredeyse hatasız şekilde iletişim kuruluyor. Önüne bir engel gelmez veya başka bir kaynaktan gelen ışığın etkisi olmazsa hatasız. Sensörün çalışması için gereken sınırlar ve çalışma mantığı bu şekilde. Verici led yanarken “0” olduğundan ve çıkış voltajı 0,5-4,5V arası olduğundan çıkış pinini Rx pinine bağlayıp bu sensörle işimizi bitiyoruz.

IR led

Verici tarafta KY-005 isimli bir modül kullandım. Üstünde 940nm dalga boyunda ışık yayan bir led bulunmakta. UART Tx ucuna bağlı çalışacak olan bu ledin bağlantısı basit. Ledin negatif pini Tx’e, pozitif pini PWM çıkış veren PORTD5’e bağlı olacak. Artı-eksi ayrımı olmayan bir ampül bağlı olsaydı. Tx iletişim yokken “1” durumda olduğundan  PWM sayesinde bu ampül %50 oranında sürekli yanacaktı. IR ledin sadece iletişim sırasında yanması gerekiyor.  Tx iletişim başladığında ve verinin durumuna göre “0” olduğundan ledin eksi ucuna bağlıyoruz.

PWM Ayarla

IR ledi alıcı tarafın algılaması için 38kHz frekansında yakıp söndürmem gerekiyor. Bunun için PWM kullanacağım. Önceki yazılarda bir örneğini yapmış ve detaylı anlatmıştım. Burada hızlıca değineceğim. PWM için timer0 birimine bağlı PORTD5 pinini kullandım. Gerekli ayarlara geçmeden 38kHz frekansının periyodunu bulalım. T=1/F, T=1/38000 ve çıkan sonucu µs cinsinde yazmak için 1.000.000 ile çarparsak  T=26,3157µs buluruz. Bu çıkışın “1” ve “0” olma süresidir.

Şemada görüldüğü gibi Faz doğrulamalı PWM modunda TCNT0 üst (TOP,0xFF) değere çıkıyor ve iniyor. Bu sırada OCR0A-OCR0B ile eşleşince bizim ayarlarımıza bağlı olarak COM0A-COM0B  “1” veya “0” oluyor. Bu şekilde yaptığımızda frekans- periyot ayarlama şansımız yok. Prescaler değerine göre frekans belirleniyor. Bu nedenle aşağıda gördüğünüz “Mode 5” seçeneğini kullanacağız.

Bu seçenekte diğerinden farklı olarak TOP değerini 0xFF yerine OCR0A ya eşitleyebiliriz. Böylece bizim istediğimiz üst değer çıkar ve yine azalarak sıfırlanır.  TCNT0 değeri kristalden alınan saat darbelerine göre artıyordu. Bir prescaler değeri belirlemezsek 26,3157µs sürede ulaşılan değer 8 bit üstüne çıkar. (timer0 8 bit) Bu nedenle prescaler değerini 8 olarak seçeceğiz. 16.000.000/8=2.000.000 saniyedeki darbe değeridir. 1µs de ise 2 saat darbesi ile TCNT0 artar. Periyot 26µs olduğundan TCNT0 değerinin TOP değere ulaşıp tekrar sıfır olması gerekir (26 darbe TOP-26 darbe BOTTOM) Bunun için OCR0A değerini 25 seçeriz. (0 dan 25’e 26 darbe) Bu değerin yarısını OCR0B(12 “0” dahil) ye eşitlersek kare dalga elde ederiz. NOT: OCR0A PORTD6 ya bağlı olan register olduğundan bu pini kullanamayız.

İki tarafta gerekli bağlantıları yaptıktan sonra daha önce kullandığım kodlarda ufak değişiklikler yaptım. Bu kodlar ile iletişime gerçekleşiyor.

Bu yazı Haluk ŞİMŞEK tarafından yazılmıştır.

Gönderici taraf:

Alıcı taraf:

 

You may also like...

Bir cevap yazın

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