HC-SR04 Ultrasonik Sensörünün Raspberry Pi İle İletişimi

Ultrasonik mesafe sensörleri, ultrasonik dalgalar kullanarak kaynak ve hedef arasındaki mesafeyi ölçmek için tasarlanmıştır. Ultrasonik dalgalar

HC-SR04 Ultrasonik Sensör

kullanmamızın sebebi kısa mesafelerde nispeten doğru sonuçlar verir ve insan kulağı tarafından duyulmadığı için rahatsızlıklara neden olmazlar.

 

HC-SR04 sensörü bir adet ultrasonik verici ve bir adet ultrasonik alıcıya sahiptir. VCC, GND, TRIG ve ECHO olmak üzere 4 dört adet bacağı bulunmaktadır. VCC bacağı 5V verilerek sensörün çalışması için gerekli gücün verildiği bacak, GND topraklama, TRIG tetikleme yapılan ve ECHO değerlerin okunduğu bacaktır. ECHO bacağından dijital değerler alınmaktadır. Matematiksel işlemler ile analog sonuçlar alınabilmektedir.HC-SR04 ultrasonik mesafe sensörü 5V ile çalışmaktadır. ECHO bacağı çıkış 5V vermektedir. Raspberry Pi 2’nin GPIO pinleri 3.3V ile çalıştığı için direk okuyamayacaktır. ECHO bacağı doğrudan bir GPIO pinine bağlanırsa bağlandığı pin yanar ve kullanılmaz hale gelir. Bu sebep bu voltajın düşürülerek verilmesi gerekir.
HC-SR04 ultrasonik mesafe sensörü 2cm ve 400cm aralığında en sağlıklı sonuçları vermektedir. Yunus ve yarasaların iletişim ve hareket etmelerinden esinlenilerek oluşturulan bu sensör aracın önüne koyularak aracın önüne çıkan engellerin tespitinde kullanılacaktır.

HC-SR04’ün çalışmasını inceleyeceğiz.

  1. TRIG girişine tetik sinyali sağlanır, en az 10 mikrosaniye de bir HIGH sinyali gönderilir.
  2. Bu, modülün sekiz adet 40KHz ultrasonik atış iletmesini sağlar.
  3. Modülün önünde bir engel varsa, o ultrasonik dalgaları yansıtacaktır.
  4. Sinyal geri gelirse, modülün ECHO çıkışı, ultrasonik sinyal gönderimi ve alımı için geçen süre boyunca HIGH olacaktır. Darbe genişliği, engelden sensöre olan mesafeye bağlı olarak 150μS – 25mS arasında değişir ve engel yoksa yaklaşık 38ms olacaktır.

Şimdi voltaj düşürücü devreye geliyoruz.

HC-SR04 ultrasonik mesafe sensörünün çıkış olarak verdiği 5V’u 3.3V seviyesine düşürerek Raspberry Pi 2’nin okuması sağlanacaktır. Kurulacak devre “Vout = Vin x R2/(R1+R2)”  formülüne göre kurulacaktır. Bu formüle uygun olan devre şekilde görülmektedir.

5V – 3.3V Voltaj Düşürme Devresi

 

Devredeki direnç değerleri Şekil 3.8’de görüldüğü gibi R1 = 4.7k ve R2 = 10k olarak alınacaktır. Bu durum Vout = 5V x 10k/(4.7k+10k) işlemi yapıldığında Vout = 3.4V çıkacaktır. Bu değer Raspberry Pi 2 için güvenli bir giriş değeridir.

 

Mesafenin hesaplanmasına gelince ilk sinyal gönderildiğindeki zamanla döndüğü zaman arasındaki süreyi tutuyoruz. Gidiş ve dönüş olarak hesapladığımızda zamanı ikiye bölmemiz gerekiyor. Mesafe = Hız * Zaman / 2”  formülü baz alındığında ve deniz seviyesindeki ses hızı = 343 m/s veya 34300 cm/s olmasından kaynaklı olarak son formülümüz Mesafe = 17150 * Zaman (birim cm)” oluyor. Doğru mesafe okumaları için çıktı bir cetvel kullanılarak kalibre edilebilir. Örnek olması amacıyla aşağıdaki programda 0.5 cm’lik bir kalibrasyon eklenmiştir.

PYTHON PROGRAMI

import RPi.GPIO as GPIO                    #GPIO Kütüphanesi ekleniyor
import time                                #time Kütüphanesi ekleniyor
GPIO.setmode(GPIO.BCM)                     #GPIO pinleri için kullanılacak mod seçiliyor 

TRIG = 23                                  #23 numaralı pine TRIG bacağı bağlanıyor.
ECHO = 24                                  #24 numaralı pine ECHO bacağı bağlanıyor.

print "Distance measurement in progress"

GPIO.setup(TRIG,GPIO.OUT)                  #TRIG pini çıkış bacağı olarak atanıyor.
GPIO.setup(ECHO,GPIO.IN)                   #ECHO pini giriş bacağı olarak atanıyor.

while True:

  GPIO.output(TRIG, False)                 #TRIG bacağına LOW değeri atanır.
  print "Waiting For Sensor To Settle"
  time.sleep(2)                            #2 saniye bekleme süresi atanıyor.

  GPIO.output(TRIG, True)                  #TRIG bacağına HIGH değeri atanır.
  time.sleep(0.00001)                      #0.00001 saniye bekleme süresi atanıyor.
  GPIO.output(TRIG, False)                 #TRIG bacağına LOW değeri atanır.

  while GPIO.input(ECHO)==0:               #ECHO bacağı LOW değerinde mi kontrolü yapılıyor.
    pulse_start = time.time()              #LOW pulse'nin geldiği zaman kaydedilir.

  while GPIO.input(ECHO)==1:               #ECHO bacağı HIGH değerinde mi kontrolü yapılıyor.
    pulse_end = time.time()                #HIGH pulse'nin geldiği zaman kaydedilir.

  pulse_duration = pulse_end - pulse_start #Pulse'lerin arasındaki fark bir değişkene atanır.

  distance = pulse_duration * 17150        #Pulse'lerin arasındaki mesafe 17150 ile çarpılır.
  distance = round(distance, 2)            #Virgülden sonraki iki basamağa yuvarlanır.

  if distance > 2 and distance < 400:      #Mesafenin sensörün okuyabildiği değerler arasında olup olmadığı kontrol edilir.
    print "Distance:",distance - 0.5,"cm"  #Kalibrasyon farkı ile beraber ekrana mesafe yazılır.
  else:
    print "Out Of Range"                   #Mesafe dışı uyarısı verilir.

İlk yorum yapan olun

Bir yanıt bırakın

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


*