Ana Sayfa PIC Assembly - PIC C PIC16F877A Mikrodenetleyicisi ve HC-SR04 Ultrasonik Sensörle Seviye Ölçer Projesi

PIC16F877A Mikrodenetleyicisi ve HC-SR04 Ultrasonik Sensörle Seviye Ölçer Projesi

17 min read
8
0
20,789

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.

 

 ul

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.

ul1

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.

ul2

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.

ul3

Ş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

ul4

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.

UL5

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

ul6

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.

 

ul7

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.

Buna Benzer Yazılar Göster !
Daha Fazlasını Yükle - Burak Ablay
Daha Fazla Göster -  PIC Assembly - PIC C

8 Yorumlar

  1. Ufuk

    11 Şubat 2015 at 17:01

    Gerçekten çok iyi bi paylaşım olmuş işimizi oldukça iyi görüyor bu yazıların devamını bekliyoruz……..

    Reply

    • Burak Ablay

      Burak Ablay

      11 Şubat 2015 at 19:06

      iyi dilekleriniz için teşekkürler..

      Reply

  2. Harun Özcan

    5 Mart 2016 at 07:09

    Teşekkür ederim

    Reply

    • Burak Ablay

      Burak Ablay

      13 Mart 2016 at 15:12

      Biz teşekkür ederiz.. Takipte kalın..

      Reply

  3. Baran.34

    7 Mayıs 2016 at 14:24

    hocam htc.h kütüphane hatası veriyor nasıl düzeltirim . MicroC kullanıyorum

    Reply

  4. Burak Ablay

    Burak Ablay

    21 Şubat 2017 at 23:47

    Merhabalar , Bu yazıdaki kod MicroC için uyumlu olmayabilir çünkü HITECH – C de yazılmış bir koddur. Ancak yinede htc.h ı işaretleri yerine “” işaretlerini kullanarak tanımlamayı deneyiniz. Yani “htc.h” gibi buda sonuç vermiyorsa https://forum.mikroe.com/ MicroC forumundan daha fazla bilgiye sahip olabilirsiniz.

    Reply

  5. dedektör

    2 Şubat 2018 at 00:49

    Güzel çalışmalarınızdan olayı sizi tebrik ederim. Yazdığınız program bir konuda ufkumu açtı. İki pulse sinyal arasındaki faz farkını ölçmek için çabalıyordum. Pulselerden birisini referans olarak alıp bir timer kurup ikincisi gelince timer içeriğini okumak bu durumu çözer. Teşekkürler.

    Reply

  6. samed

    25 Aralık 2018 at 02:12

    kodun hex dosyasını gönderebilirmisiniz ?

    Reply

Burak Ablay için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bak Bakalım ?

Modbus POLL ile Allen Bradley Motor Sürücüsünün Haberleşmesi

Merhabalar arkadaşlar , Bu yazımızda RS485 yada Modbus haberleşmesi ile ilgilenen arkadaşl…