اندازه گیری فاصله با سنسور اولتراسونیک و Raspberry Pi

فاصله را با استفاده از سنسور اولتراسونیک Raspberry Pi و HCSR04 اندازه گیری کنید

در این پروژه ما می خواهیم از ماژول سنسور اولتراسونیک HC-SR04 برای اندازه گیری فاصله با Raspberry Pi استفاده کنیم.

سنسور التراسونیک HC-SR04:

حسگر اولتراسونیک برای اندازه گیری فاصله با دقت بالا و قرائت پایدار استفاده می شود. می تواند فاصله از ۲ سانتی متر تا ۴۰۰ سانتی متر یا از ۱ اینچ تا ۱۳ فوت را اندازه گیری کند. این سنسور یک موج اولتراسوند با فرکانس ۴۰KHz در هوا منتشر می کند و اگر جسم سر راهش قرار بگیرد، دوباره به سنسور باز می گردد. با استفاده از زمانی که برای ضربه زدن به جسم لازم است و دوباره برمی گردد، می توانید فاصله را محاسبه کنید.

سنسور اولتراسونیک از روشی به نام “ECHO” استفاده می کند. “ECHO” به سادگی یک موج صوتی منعکس شده است. هنگامی که صدا پس از رسیدن به بن بست منعکس می شود، یک ECHO خواهید داشت.

ماژول HCSR04 هنگامی که پایه “Trigger” را برای حدود ۱۰us در وضعیت high قرار دهیم، باعث ایجاد یک لرزش صدا در محدوده اولتراسونیک می شود که با سرعت صدا یک انفجار صوتی ۸ سیکل ایجاد می کند و پس از برخورد به جسم، توسط پایه Echo دریافت می شود. بسته به زمانی که ارتعاش صدا برای بازگشت نیاز دارد، خروجی پالس مناسبی را فراهم می کند. اگر جسم دور باشد، زمان بیشتری لازم است تا ECHO شنیده شود و عرض پالس خروجی بزرگ خواهد بود. و اگر مانع نزدیک باشد، ECHO سریعتر شنیده می شود و عرض پالس خروجی کوچکتر خواهد بود.

موج

ما می توانیم فاصله جسم را بر اساس زمانی که موج اولتراسونیک برای بازگشت به سنسور طی می کند محاسبه کنیم. از آنجا که زمان و سرعت صدا مشخص است ، می توانیم فاصله را با فرمول های زیر محاسبه کنیم.

Distance= (Time x Speed of Sound in Air (343 m/s))/2.

 

از زمان حرکت موج به جلو و عقب در مسافت یکسان، مقدار به دو تقسیم می شود. بنابراین زمان رسیدن به مانع فقط نیمی از کل زمان گرفته شده است

Distance in centimeter = 17150*T


قطعات و لوازم مورد نیاز برای این آموزش

در اینجا ما از Raspberry Pi ۲ Model B با Raspbian Jessie OS استفاده می کنیم. تمام نیازهای اساسی سخت افزار و نرم افزار قبلاً مورد بحث قرار گرفتند

Raspberry Pi با سیستم عامل از پیش نصب شده
سنسور التراسونیک HC-SR04
منبع تغذیه (۵ ولت)
مقاومت ۱KΩ (۳ قطعه)
خازن ۱۰۰۰uF
LCD 16 * 2 کاراکتری


توضیح مدار:

اتصالات Raspberry Pi و LCD در جدول زیر آورده شده است:

LCD connection

Raspberry Pi connection
GND GND
VCC +۵V
VEE GND
RS GPIO17
R/W GND
EN GPIO27
D0 GPIO24
D1 GPIO23
D2 GPIO18
D3 GPIO26
D4 GPIO5
D5 GPIO6
D6 GPIO13
D7 GPIO19

در این مدار، ما از ارتباط ۸ بیتی (D0-D7) برای اتصال LCD به Raspberry Pi استفاده کردیم، اما این اجباری نیست، می توانیم از ارتباط ۴ بیتی (D4-D7) استفاده کنیم. در اینجا ما ۱۰ پایه LCD به Raspberry Pi متصل کرده ایم که در آن ۸ پایه پین داده و ۲ پایه پین کنترل است.

در شکل زیر مدار اتصال سنسور HC-SR04 و LCD با Raspberry Pi برای اندازه گیری فاصله نشان داده شده است.

مدار

 

همانطور که در شکل نشان داده شده است، سنسور اولتراسونیک HC-SR04 دارای چهار پایه است

PIN1- VCC یا + ۵V
PIN2- TRIGGER (پالس ۱۰us بالا برای دادن حس فاصله به سنسور داده می شود)
PIN3- ECHO (خروجی پالس را فراهم می کند که عرض آن فاصله بعد از ماشه را نشان می دهد)
PIN4- زمین

اکو پالس خروجی + ۵ ولت را فراهم می کند که نمی توان مستقیماً به Raspberry Pi متصل شد. بنابراین ما از مدار تقسیم ولتاژ (ساخته شده با استفاده از R1 و R2) برای دریافت منطق + ۳.۳ ولت به جای منطق + ۵ ولت استفاده خواهیم کرد.

 

عملکرد مدار:

۱. با up کردن پایه تریگر برای ۱۰uS ، سنسور را روشن کنید.

۲. موج صدا توسط سنسور ارسال می شود. پس از دریافت ECHO، ماژول سنسور خروجی متناسب با فاصله را فراهم می کند.

۳. ما زمانی را ضبط خواهیم کرد که پالس خروجی از LOW به HIGH می رود و هنگامی که دوباره به حالت HIGH به LOW تبدیل می شود.

۴. ما زمان شروع و توقف خواهیم داشت. برای محاسبه فاصله از معادله فاصله استفاده خواهیم کرد.

۵. فاصله در صفحه نمایش LCD 16×2 نمایش داده می شود.

بر این اساس ما برنامه پایتون را برای Raspberry Pi نوشته ایم تا توابع زیر را انجام دهد:

۱. برای ارسال تریگر به سنسور

۲. زمان شروع و توقف خروجی پالس از سنسور را ثبت کنید.

۳. برای محاسبه فاصله با استفاده از زمان شروع و توقف.

۴- برای نمایش نتیجه بدست آمده در LCD 16 * 2.


کد کامل برنامه

 

import time
import RPi.GPIO as IO    #calling for header file which helps in using GPIOs of PI

string_of_characters = 0 

IO.setwarnings(False)    #do not show any warnings
IO.setmode (IO.BCM)      #programming the GPIO by BCM pin numbers. (like PIN29 as GPIO5)
IO.setup(17,IO.OUT)      #initialize GPIO17,27,24,23,18,26,5,6,13,19,21 as an output
IO.setup(27,IO.OUT)
IO.setup(24,IO.OUT)
IO.setup(23,IO.OUT)
IO.setup(18,IO.OUT)
IO.setup(26,IO.OUT)
IO.setup(5,IO.OUT)
IO.setup(6,IO.OUT)
IO.setup(13,IO.OUT)
IO.setup(19,IO.OUT)
IO.setup(21,IO.OUT)
IO.setup(16,IO.IN)      #initialize GPIO16 as an input

def send_a_command (command):  #steps for sending a command to 16x2 LCD
    pin=command
    PORT(pin);
    IO.output(17,0)
    #PORTD&= ~(1<<RS);
    IO.output(27,1)
    #PORTD|= (1<<E);
    time.sleep(0.001)
    #_delay_ms(50);
    IO.output(27,0)
    #PORTD&= ~(1<<E);
    pin=0
    PORT(pin); 

def send_a_character (character):  #steps for sending a character to 16x2 LCD
    pin=character
    PORT(pin);
    IO.output(17,1)
    #PORTD|= (1<<RS);
    IO.output(27,1)
    #PORTD|= (1<<E);
    time.sleep(0.001)
    #_delay_ms(50);
    IO.output(27,0)
    #PORTD&= ~(1<<E);
    pin=0
    PORT(pin);

def PORT(pin):                    #assigning level for PI GPIO for sending data to LCD through D0-D7
    if(pin&0x01 == 0x01):
        IO.output(24,1)
    else:
        IO.output(24,0)
    if(pin&0x02 == 0x02):
        IO.output(23,1)
    else:
        IO.output(23,0)
    if(pin&0x04 == 0x04):
        IO.output(18,1)
    else:
        IO.output(18,0)
    if(pin&0x08 == 0x08):
        IO.output(26,1)
    else:
        IO.output(26,0)    
    if(pin&0x10 == 0x10):
        IO.output(5,1)
    else:
        IO.output(5,0)
    if(pin&0x20 == 0x20):
        IO.output(6,1)
    else:
        IO.output(6,0)
    if(pin&0x40 == 0x40):
        IO.output(13,1)
    else:
        IO.output(13,0)
    if(pin&0x80 == 0x80):
        IO.output(19,1)
    else:
        IO.output(19,0)

def send_a_string(string_of_characters):
  string_of_characters = string_of_characters.ljust(16," ")
  for i in range(16):
    send_a_character(ord(string_of_characters[i]))  #send characters one by one through data port
    
while 1:
    send_a_command(0x38);  #16x2 line LCD
    send_a_command(0x0E);  #screen and cursor ON
    send_a_command(0x01);  #clear screen
    time.sleep(0.1)                #sleep for 100msec
    
    IO.setup(21,1)
    time.sleep(0.00001)
    IO.setup(21,0)           #sending trigger pulse for sensor to measure the distance
        
    while (IO.input(16)==0):
        start = time.time()  #store the start time of pulse output         
            
    while (IO.input(16)==1):
        stop = time.time()   #store the stop time 
      
            
    distance = ((stop - start)*17150)  #calculate distance from time
    distance = round(distance,2)       #round up the decimal values
    if(distance<400): #if distance is less than 400 cm, display the result on LCD send_a_command(0x80 + 0); send_a_string ("Dist=%s cm"% (distance)); time.sleep(0.15) if(distance>400):                  #If distance is more than 400cm, just print 400+ on LCD
        send_a_command(0x80 + 0);
        send_a_string ("Dist= 400+ cm");
        time.sleep(0.15)

 


مطالب پیشنهادی برای شما

 


۱۲۱

محمد صداقتی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *