PIC Assembly - PIC C PIC16F877A Mikrodenetleyicisi ve HC-SR04 Ultrasonik Sensörle Seviye Ölçer Projesi By Burak Ablay Posted on 4 Şubat 2015 17 min read 8 0 20,970 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr HC-SR04 Ses dalgaları sınıflandırılmasında 20Khz-1Ghz aralıgındaki ses sinyalleri ultrasonic ses olarak tanımlanmıştır.Bizim sensörümüz ve bir çok ultrasonic sensör 40Khz frekansında ultrasonic ses üretmektedir.Burada önemli olan sesin yüksekliğinde belirleyici olan etken frekanstır.Ses yüksekse frekansta yüksektir.Ultrasonic ses sinyallerini insan kulağı algılayamaz. Transdüser ultrasonik darbeyi iletir.Darbe sehimden yansır ve transdüser tarafından alınır.Darbenin gidiş geliş zamanı sensörle sehimin mesafesine göre orantılıdır. Ultrasonik darbe t=0 zamanında transdüser tarafından iletiliyor. X pozisyonundaki hedef tarafından yansıtıldıktan sonra t= tx. zamanında darbe alınıyor. tx ; X mesafesi ile orantılıdır. T=0 zamanında darbe iletilir(ultrasonic ses sinyali), cisimden yansır, transdüser tarafından algılanır ve tekrar gönderilir.Sonraki darbe ilk darbenin ultrasonik enerjisinin hepsi absorbe edildiğinde iletilmelidir.Bu yüzden sensöre bir pals gönderilir sensör okunur ve sensörün datasheetinde yazan süre kadar sensöre tekrar pals gönderilmez.Eğer bekleme yapmaksak sensör saçma değerler döndürür.Çünkü ilk yolladıgımız sinyal bir yerden yansıyarak sensöre geri dönmeye devam eder. Tüm katı ve sıvı cisimler ultrasonik dalgayı cok iyi oranda yansıtırlar.Hem katı hemde sıvı cisimlerden ultrasonik enerjinin %99u yansıtılır.Çok ufak oranlardaki enerji miktarı cisim tarafından emilir. Bundan dolayı sensörü çok çeşitli uygulamarlda sorunsuz kullanabilmemiz mümkündür.Ayrıca robotlarda da sıkça kullanımlaktadır.Aşağıdaki resim bu tarz uygulamara güzel bir örnek. Sensör üzerinde 4 adet pin mevcut.Bunlar;vcc,gnd,trig,echo pinleri.Sensörü kullanmak için trig pininden yaklaşık 15us’lik bir pals gönderiyoruz.Sensör kendi içerisinde 40khz frekansında bir sinyal üretip 8 pals verici transdüsere gönderiyor.Bu ses dalgası havada, deniz seviyesinde ve 15 °C sıcaklıkta 340 m/s bir hızla yol alır.Bir cisme çarpar ve geri sensöre yansır.Cismin sensörden uzaklıgı ile doğru orantılı olarak echo pini bir süre lojik 1 seviyesinde kalır ve tekrar lojik 0 olur.Bizim bu mesafeyi ölçmekiçin tek yapmamız gereken echo pininin ne kadar lojik1 oldugunun süresini bulmaktır.Bu yapı aşağıdaki resimden daha iyi görülebilir. Şimdi echo pindeki sinyal ile nasıl mesafeyi bulacagımıza gelelim.Echo pinin lojik1 de kalma süresini mikrodenetleyici timerı ile ölçelim. Mikrodenetleyiciyi 4mhz kristal ile kullanırsak, timer 1us çözünürlügünde pinin durumunu tutmuş olur.Klasik yol=hız*zaman dan ve sesim 340m/sn lk hızınıda 34000cm/1000000us (340000/1000000=1/29) olarak düzenlersek formül x=t/29 olarak bulunur.Fakat burada önemli bir nokta sensörün bize döndürdügü süre ses sinyalinin gönderilmesi ile alınması ile oluşan süre.Yani yol=zaman/29 ile aradaki mesafeyi iki ile çarpmış oluyoruz.Çünkü ses hem gitti hem geldi.Bu yüzden x=t/58 formulüyle aradaki mesafeyi ölçmüş olacagız.(29*2=58). DEVRE ŞEMASI KODLAR [php] #include<htc.h> #include"delay.h" #include"lcd.h" __CONFIG(0x3B31);//konfigirayon ayarla yapılıyor. //4mhz kristal #define trig RC0 //pin tanımları #define ECHO RC1 void main(){ int sure,uzaklik,uzaklikson; TRISB=0x00; //port giriş çıkış işlemleri TRISC=0b0000010; PORTB=0x00; PORTC=0x00; T1CON=0b00000101; //TIMER1 ayarları yapılıp çalıştırılıyor lcd_init(); DelayMs(100); lcd_clear(); for(;;){ //trig pinine 15us lojik 1 yapılıyor trig=1; DelayUs(15); trig=0; while(!(ECHO)); //echo pini bekle TMR1=0; //echo pini 1 se timeri 0 la ve saymaya başla while((ECHO)); sure=TMR1; //echo pini 0 olunca timer değerini süreye eşitle uzaklik=(sure/58);//mesafeyi hesapla uzaklikson=30-uzaklik;//derinlik 30cm olarak ayarlandı lcd_goto(0x00); lcd_puts("SEVIYE OLCER"); lcd_goto(0x40); lcd_puts("seviye:"); lcd_write_int(uzaklikson); lcd_goto(S2_13); lcd_puts("cm"); DelayMs(100);//yeni ölçüm için bekle. } } [/php] TIMER1 Timer1 16 Bitlik bir sayıcı / zamanlayıcıdır Değeri kod içerisinden atanabilir ve okunabilir Yazılım ile devre dışı bırakılabilir veya devreye alınabilir. 0-65535arası (0x0000-0xFFFF) sayar ve 0xffff den 0’a geçerken interrupt (Kesme) oluşturabilir. Timer1 clock kaynağı olarak kristal seçilebilir. Kristal PIC’in T1OSO ve T1OSI pinleri arasına bağlanır. Örneğin gerçek zaman saati olan bir uygulama yapmak için 32.768 Khz lik kristal bu pinlere bağlanabilir. 2 bitlik prescaler değeri ile fosc/4 sinyali 1,2,4,8 degerlerinden istenilene bölünebilir. Böylece farklı süreler oluşturulur. T1CKPS1, T1CKPS0 : Prescalar değeridir, (1:1, 1:2, 1:4, 1:8) T1OSCEN : Timer1 osilatör kontrol biti (0: Kapalı, 1: Açık) TMR1CS : Saat kaynağı seçme biti (0: Dahili, 1: Harici) T1SYNC : Senkronizasyon biti (1: Senk. Yok, 0: Senk. Var) TMR1ON : Timer1 açma kapama biti (0: Kapalı, 1: Açık) TMR1H : Timer1 sayıcısının yüksek değerlikli bitini tutan kaydedici TMR1L : Timer1 sayıcısının düşük değerlikli bitini tutan kaydedici TMR1IE : Timer1 kesme izin biti TMR1IF : Timer1 kesme bayrak biti LCD LCD, Liquid Crystal Display yani Sıvı Kristal Ekran elektrikle kutuplanan sıvının ışığı tek fazlı geçirmesi ve önüne eklenen bir kutuplanma filtresi ile gözle görülebilmesi ilkesine dayanan bir görüntü teknolojisidir. LCD lerde bulunan sıvı kristaller sıcaklığa ve madde yapısına göre termotropik ve liyotropik fazlarda bulunabilirler. Termotropik fazlı sıvı kristallerin bir alt grubu olan nematik likit kristallerin, kıvrık nematikler (twisted nematics – TN) adı verilen çeşidi uygulanan akımın gerilimine bağlı olarak düz konuma yani kıvrık olmayan nematikler haline gelir. Nematik sıvı kristaller, LCD lerin yapılmasını mümkün kılan sıvı kristal fazıdır. LCD lerin yapılabilmesi için ışık polarize edilebilmeli, sıvı kristaller polarize edilmiş ışığı geçirebilmeli, sıvı kristallerin molekül dizilimi elektrik akımı ile değiştirilebilmeli ve elektriği ileten bir yapıya sahip olunmalıdır. LCD Yapısı ve Çalışma Prensibi LCD ‘lerin yapısı yandaki resimde görüldüğü gibi farklı katmanlardan oluşmaktadır. LCD katmanları bir araya geldiklerinde paneller meydana gelir. Panellerin çalışma mantığı en basit haliyle, üzerindeki özelleşmiş hücrelerin iyon katmanı tarafından şekillendirilmesi ve elektrik akımıyla görüntü oluşturulması şeklindedir. Herhangi bir elektrik alan uygulanmadan önce sıvı kristaller kıvrık nematikler (TN) denilen 90 derece kıvrık olacak şekilde sıralanmışlardır. Böylece kristaller arasından geçen ışığın kutuplanmasının yön değiştirmesi sağlanır ve ekran gri görünür. Yeterince yüksek bir voltaj uygulandığında sıvı kristaller kıvrık olmayacak şekilde (untwisted) sıralanırlar ve sıvı kristal katmanından geçişi sırasında ışığın kutuplanma yönü değişmez. Bu durumda ışık ikinci filtreye dik biçimde polarlanır ve katmanı geçemediği için o piksel siyah görünür. LCD Kullanımı LCD panelleri robot projelerinde ya da otomasyon projelerinde kullanmak için bilgisayarınızın seri ya da parelel portundan veya bir PIC mikrodenetleyici kullanarak kontrol edebilirsiniz. LCD paneller piyasada satır ve sütun sayılarına göre 1×8, 2×8, 1×16, 2×16, 1×20, 2×20, 1×40 ve 2×40 gibi farklı boyutlarda bulunmaktadır. Bunlar arasında robot projelerinde yaygınlıkla 2×16 boyutlarındaki LCD paneller kullanılmaktadır. Günümüzde üretilen LCD panellerin çoğunda tek sıra halinde 16 pin bulunur. Bu pinlerden ilk 14 tanesi kontrol için son iki tanesi ise eğer varsa arka ışık için kullanılır. Bazı LCD ‘lerde kontrol için kullanılan 14 pin 2 adet 7 li sıra halinde de bulunabilir. VEE : Kontrast girişine bağlanan direnç ile LCD panelin kontrastı ayarlanabilir. Direnç değeri yükseldikçe kontrast düşer, azaldıkça ise kontrast yükselir. RS : Lcd ye komut mu yoksa data mı gönderileceğini belirler. RS girişi “0” (ground) durumundayken komut saklayıcısı, +5V oldugundaysa veri saklayıcısı seçilmiş olur. RW : Lcd den okuma mı yoksa lcd ye yazma yapılacağını belirler. RW girişi toprağa bağlandığında yani “0” durumundayken LCD yazma modundadır. E : Enable ucu LCD ve pinler arasındaki gerçek veri alışverişini sağlayan bacaktır. Bu girişi mikrodenetleyiciye program aracılığıyla tanıttıktan sonra PIC kendisi veri gönderileceği zaman bu bacaga enable pulsu gönderir. D0 – D7 : Data hattı olan bu pinler doğrudan mikrodenetleyicinin bir portuna bağlanır. Veri 4 ya da 8 bitlik veri yolu ile gönderilebilir. LCD lerin kontrolü için farklı programlama dillerini kullanabilirsiniz. Aşağıdaki tabloda örnek olarak Pic Basic dilinde LCD kontrolü için kullanılan bazı komutların listesi verilmiştir. LCD ‘nin verileri göstermeye başlaması kısa bir zaman aldığı için bir LCD ‘ ye ilk komutu göndermeden önce programda en az 0,5 saniye bekleme yapılmalıdır.