فاصله را با استفاده از سنسور اولتراسونیک Raspberry Pi و HCSR04 اندازه گیری کنید
در این پروژه ما می خواهیم از ماژول سنسور اولتراسونیک HC-SR04 برای اندازه گیری فاصله با Raspberry Pi استفاده کنیم.
سنسور التراسونیک HC-SR04:
حسگر اولتراسونیک برای اندازه گیری فاصله با دقت بالا و قرائت پایدار استفاده می شود. می تواند فاصله از ۲ سانتی متر تا ۴۰۰ سانتی متر یا از ۱ اینچ تا ۱۳ فوت را اندازه گیری کند. این سنسور یک موج اولتراسوند با فرکانس 40KHz در هوا منتشر می کند و اگر جسم سر راهش قرار بگیرد، دوباره به سنسور باز می گردد. با استفاده از زمانی که برای ضربه زدن به جسم لازم است و دوباره برمی گردد، می توانید فاصله را محاسبه کنید.
سنسور اولتراسونیک از روشی به نام “ECHO” استفاده می کند. “ECHO” به سادگی یک موج صوتی منعکس شده است. هنگامی که صدا پس از رسیدن به بن بست منعکس می شود، یک ECHO خواهید داشت.
ماژول HCSR04 هنگامی که پایه “Trigger” را برای حدود 10us در وضعیت high قرار دهیم، باعث ایجاد یک لرزش صدا در محدوده اولتراسونیک می شود که با سرعت صدا یک انفجار صوتی ۸ سیکل ایجاد می کند و پس از برخورد به جسم، توسط پایه Echo دریافت می شود. بسته به زمانی که ارتعاش صدا برای بازگشت نیاز دارد، خروجی پالس مناسبی را فراهم می کند. اگر جسم دور باشد، زمان بیشتری لازم است تا ECHO شنیده شود و عرض پالس خروجی بزرگ خواهد بود. و اگر مانع نزدیک باشد، ECHO سریعتر شنیده می شود و عرض پالس خروجی کوچکتر خواهد بود.
ما می توانیم فاصله جسم را بر اساس زمانی که موج اولتراسونیک برای بازگشت به سنسور طی می کند محاسبه کنیم. از آنجا که زمان و سرعت صدا مشخص است ، می توانیم فاصله را با فرمول های زیر محاسبه کنیم.
Distance= (Time x Speed of Sound in Air (343 m/s))/2.
از زمان حرکت موج به جلو و عقب در مسافت یکسان، مقدار به دو تقسیم می شود. بنابراین زمان رسیدن به مانع فقط نیمی از کل زمان گرفته شده است
Distance in centimeter = 17150*T
قطعات و لوازم مورد نیاز برای این آموزش
در اینجا ما از Raspberry Pi 2 Model B با Raspbian Jessie OS استفاده می کنیم. تمام نیازهای اساسی سخت افزار و نرم افزار قبلاً مورد بحث قرار گرفتند
Raspberry Pi با سیستم عامل از پیش نصب شده
سنسور التراسونیک HC-SR04
منبع تغذیه (۵ ولت)
مقاومت 1KΩ (۳ قطعه)
خازن 1000uF
LCD 16 * 2 کاراکتری
توضیح مدار:
اتصالات Raspberry Pi و LCD در جدول زیر آورده شده است:
LCD connection | Raspberry Pi connection |
GND | GND |
VCC | +5V |
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 یا + 5V
PIN2- TRIGGER (پالس 10us بالا برای دادن حس فاصله به سنسور داده می شود)
PIN3- ECHO (خروجی پالس را فراهم می کند که عرض آن فاصله بعد از ماشه را نشان می دهد)
PIN4- زمین
اکو پالس خروجی + ۵ ولت را فراهم می کند که نمی توان مستقیماً به Raspberry Pi متصل شد. بنابراین ما از مدار تقسیم ولتاژ (ساخته شده با استفاده از R1 و R2) برای دریافت منطق + ۳.۳ ولت به جای منطق + ۵ ولت استفاده خواهیم کرد.
عملکرد مدار:
۲. موج صدا توسط سنسور ارسال می شود. پس از دریافت 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)
مطالب پیشنهادی برای شما
- آموزش راه اندازی برد رزبری پای و ماژول GPS
- ارتباط سریال RS-485 بین Raspberry Pi و Arduino Uno
- معرفی Webmin برای کار با Raspberry Pi
- پیدا کردن MAC Address در Raspberry Pi
- ۸ عامل برای انتخاب یک IoT وب سرور
۱۲۱
- مقدمه ای بر Embedded Linux (بخش اول) - آذر ۲۰, ۱۴۰۳
- تفاوت بین روتر و فایروال - مهر ۱۰, ۱۴۰۳
- مسیریابی استاتیک در ویندوز - مهر ۸, ۱۴۰۳