
به نام خدا
اندازه گیری فاصله با رزبری پای و سنسور آلتراسونیک 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)