به نام خدا
اندازه گیری فاصله با رزبری پای و سنسور آلتراسونیک HCSR04
سنسور آلتراسونیکHC-SR04 :
سنسور اآلتراسونیک برای اندازه گیری فاصله با دقت و ثبت بالا استفاده می شود . این سنسور می تواند فاصله ی از ۲ تا ۴۰۰ سانتی متر را اندازه گیری کند.
این سنسور یک موج فراصوت را در فرکانس ۴۰KHz در هوا منتشر می کند و اگر در مسیر این موج یک شی قرار بگیرد ، موج به سنسور منعکس می شود .
ماژول HCSR04 موجب ارتعاش صدا در محدوده فراصوت می شود، زمانی که پین ”Trigger” را برای ۱۰us یک کنیم باعث میشود که سنسور ۸ موج آلتراسونیک را با سرعت ارسال کند و پس از برخورد با شی، توسط پین Echo دریافت میشود .
بسته به زمانی که ارتعاش صدا برای بازگشت می گیرد ، در خروجی پالس مناسب فراهم می شود. اگر جسم دور باشد، زمان بیشتری برای ECHO محاسبه می شود و عرض پالس خروجی بزرگ خواهد بود. و اگر مانع نزدیک باشد، ECHO سریعتر شنیده خواهد شد و پهنای پالس خروجی کوچکتر خواهد بود.
قطعات مورد نیاز اندازه گیری فاصله با رزبری پای و سنسور آلتراسونیک HCSR04 :
رزبری پای با سیستم عامل از پیش نصب شده روی آن
سنسور آلتراسونیک HC-SR04
منبع تغذیه ۵ ولت
۳ قطعه مقاومت ۱KΩ
خازن ۱۰۰۰uf
ال سی دی کاراکتری ۱۶*۲
توضیحات مدار :
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 به رسپبری پای استفاده می کنیم . اگرچه این نوع ارتباط اجباری نیست و ما همچنان می توانیم از ارتباط ۴ بیتی استفاده کنیم (D4-D7) ، اما برنامه نویسی ارتباط ۴ بیتی برای تازه کاران کمی پیچیده خواهد شد بنابراین ما از ارتباط ۸ بیتی استفاده می کنیم. در این قسمت ما ۱۰ پین از LCD را به رزبری پای متصل کرده ایم که ۸ پین از آنها مربوط به انتقال دیتا و ۲ پین دیگر برای کنترل هستند .
در پایین دیاگرام مداری برای اندازه گیری فاصله با رزبری پای و سنسور آلتراسونیک HCSR04 آورده شده است:
همانطور که در تصویر مشخص است سنسور آلترا سونیک HCSR04 چهار پایه دارد :
۱ -VCC : تغذیه ۵ ولت
۲- TRIGGER : به این پایه باید یک پالس با سطح ۱ منطقی به مدت ۱۰us داده شود تا سنسور مسافت را بسنجد.
۳- ECHO : پالس خروجی را که مقدار فاصله را می توان از روی آن تشخیص داد، پس از عمل TRIGGER فراهم می کند.
۴- GROUND
خروجی پین ECHO مقدار ۵ ولت را دارد که نمی تواند مستقیما به رزبری پای متصل شود . بنابراین ما از یک مدار تقسیم ولتاژ (که از دو مقاومت R1 و R2 ساخته شده است) برای گرفتن ۳٫۳ ولت به جای ۵ ولت منطقی استفاده می کنیم.
توضیح عملکرد :
مراحل کار اندازه گیری فاصله با رزبری پای و سنسور آلتراسونیک HCSR04
۱-تحریک کردن سنسور با یک کردن پین متصل به trigger سنسور به مدت ۱۰us
۲-صوت توسط سنسور ارسال می شود. پس از دریافت ECHO، ماژول سنسور خروجی متناسب با فاصله را فراهم می کند.
۳-ما زمانی که پالس خروجی از حالت صفر به یک منطقی می رود و زمانی که دوباره از یک به صفر منطقی بر می گردد را ثبت می کنیم.
۴- فاصله در صفحه LCD 16×2 نمایش داده می شود
دانلود کد های برنامه اندازه گیری فاصله با رزبری پای و سنسور آلتراسونیک HCSR04 :
دانلود فایل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)
دیدگاهها (0)