Raspberry Pi Mesafe Sensörü Kullanımı HC-SR04

Merhabalar, bugün sizlere Raspberry Pi kullanarak HC-SR04 mesafe sensörü nasıl kullanılır LCD ekran da mesafe değerleri nasıl yazdırılır bunlara değineceğiz.

Çok basit bir güvenlik sistemi yapacağız eğer belirttiğimiz mesafe değerini aşarsak yeşil led yakacağız oluşturduğumuz if sorgusu ile istediğimiz şeyi yapabiliriz ben led yaktım.

HC-SR04 Ultrasonik Mesafe Sensörü

HC-SR04 Ultrasonik Mesafe Sensörü

Ultrasonik mesafe sensörü nedir nasıl çalışır kısaca bundan bahsedeyim.

Bu sensör belirli bir frekansta ses dalgasını alıp nesne ile uzaklığını ölçer buna sonar (Sound Navigation and Ranging) sistemi denir.

Bizim kullanacağımız sensör 2cm – 400cm arası mesafe ölçer daha geniş aralıklar ile ölçüm yapabilen sensör bulmanız mümkün.

HC-SR04 Pin Bilgileri

  1. VCC – +5V | (Pi 2)
  2. TRIG – Sensörü tetikleme pini | (GPIO27)
  3. ECHO – Sensörün alıcı pini | (GPIO22)
  4. GND –  Toprak Hattı | (Pi 6)

Araç / Gereç

  • Raspberry Pi
  • 16×2 LCD Ekran
  • HC-SR04
  • Breadboard
  • Herhangi bir renk LED
  • Jumper Kablo

İlk öncelikle LCD ekranımızı bağlayarak işe başlayalım bunu daha önceki bir makalemde anlatmıştım buraya tıklayarak yapabilirsiniz.

LCD ekranımızı bağladıktan sonra hc-sr04 mesafe sensörü devresine geçebiliriz

Raspberry Pi Mesafe Sensörü Devresi
HC-SR04 Raspberry Pi GPIO
Pin 1 – 5V GPIO 5V (Pin 2)
Pin 2 – TRIG GPIO 27 (Pin 13)
Pin 3 – ECHO GPIO 22 (Pin 15)
Pin 4 – GND GPIO GND (Pin 6)

Yukarıdaki devre şemasını takip ederek devreyi kurabilirsiniz her şeyi açık bir şekilde göstermeye çalıştım.

Devreyi kurduktan sonra terminal ekranında aşağıdaki adımları takip edelim.

cd Desktop

mkdir mesafe-olcer.py

# The wiring for the LCD is as follows:
# 1 : GND
# 2 : 5V
# 3 : Contrast (0-5V)*
# 4 : RS (Register Select)
# 5 : R/W (Read Write)       - GROUND THIS PIN
# 6 : Enable or Strobe
# 7 : Data Bit 0             - NOT USED
# 8 : Data Bit 1             - NOT USED
# 9 : Data Bit 2             - NOT USED
# 10: Data Bit 3             - NOT USED
# 11: Data Bit 4
# 12: Data Bit 5
# 13: Data Bit 6
# 14: Data Bit 7
# 15: LCD Backlight +5V**
# 16: LCD Backlight GND

#import
import RPi.GPIO as GPIO
import os
import socket
import fcntl
import struct
import time
from time import gmtime, strftime
GPIO.setmode(GPIO.BCM)

GPIO.setwarnings(False)
GPIO.setup(4,GPIO.OUT)#pinlerin durmunu cikis yaptik
TRIG = 27 #13 gpio number pin
ECHO = 22 #15 gpio number pin

def getCPUtemperature():
  res = os.popen("vcgencmd measure_temp").readline()
  return(res.replace("temp=","").replace("'C\n",""))

def printDateTime():
  textDate = strftime("%d %A %Y", gmtime())
  textTime = strftime("    %H:%M:%S", gmtime())
  lcd_string(textDate,LCD_LINE_1)
  lcd_string(textTime,LCD_LINE_2)
  return

def getInterfaceAddress(ifname):
  try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
      s.fileno(),
      0x8915,  # SIOCGIFADDR
      struct.pack('256s', ifname[:15])
    )[20:24])
  except:
    return ''

def getIP():
  ipWlan = getInterfaceAddress('wlan0')
  if ipWlan:
    return ipWlan
  ipEth = getInterfaceAddress('eth0')
  if ipEth:
    return ipEth

# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 27
LCD_D6 = 22
LCD_D7 = 18


# Define some device constants
LCD_WIDTH = 16    # Maximum characters per line
LCD_CHR = True
LCD_CMD = False

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
def main():
  # Main program block
  
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  GPIO.setup(LCD_E, GPIO.OUT)  # E
  GPIO.setup(LCD_RS, GPIO.OUT) # RS
  GPIO.setup(LCD_D4, GPIO.OUT) # DB4
  GPIO.setup(LCD_D5, GPIO.OUT) # DB5
  GPIO.setup(LCD_D6, GPIO.OUT) # DB6
  GPIO.setup(LCD_D7, GPIO.OUT) # DB7


  # Initialise display
  lcd_init()
  while True:
      lcd_string("  Mesafe Olcer",LCD_LINE_1)
      GPIO.output(TRIG, False)
      print "Olculuyor..."
      time.sleep(0.4)

      GPIO.output(TRIG, True)
      time.sleep(0.00001)
      GPIO.output(TRIG, False)

      while GPIO.input(ECHO)==0:
          pulse_start = time.time()

      while GPIO.input(ECHO)==1:
          pulse_end = time.time()

      pulse_duration = pulse_end - pulse_start

      distance = pulse_duration * 17150
      distance = round(distance, 2)

      if distance > 20 and distance < 400:
        h1 = distance - 0.5
        lcd_string(h1,LCD_LINE_2)
        GPIO.output(4,False)
      else:
        h2 = "Menzil asildi"
        lcd_string(h2,LCD_LINE_2)
        GPIO.output(4,True)# 12 nolu pini +5v cikis verdik



def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = data
  # mode = True  for character
  #        False for command

  GPIO.output(LCD_RS, mode) # RS

  # High bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
  if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

  # Low bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
  if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
  if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
  if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

def lcd_toggle_enable():
  # Toggle enable
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Cast to string
  message = str(message)
  # Send string to display
  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)
    lcd_string("Gule Gule!",LCD_LINE_1)
    GPIO.cleanup()

Oluşturduğumuz mesafe-olcer.py dosyasına kodumuzu yapıştırıyoruz ve python script çalıştırıyoruz

python mesafe-olcer.py

Bir cevap yazın

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

%d blogcu bunu beğendi: