آموزش راه اندازی آلتراسونیک با Raspberry Pi

مقدمه

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

البته ما در ابتدای جلسه توضیحی مختصری در مورد این سنسور خواهیم داد ولی اطلاعات دقیق در دو جلسه بالا موجود می باشد. 

معرفی سنسور SR-04

سنسوری که در این جلسه ما قصد راه اندازی اون رو داریم ، سنسور SR-04 هست که این سنسور دارای 4  پایه است. این 4 پایه را در زیر مشاهده می کنید: 

راه اندازی آلتراسونیک با Raspberry Pi - سنسور HC-SR-04

ما تغذیه این برد را از طریق برد رزبری پای انجام خواهیم داد. بنابراین پایه های VCC و GND سنسور به رزبری پای متصل می شوند. بدیهی است که برای Trigger کردن سنسور نیز از خود رزبری پای استفاده میکنیم. با این کار سنسور یک موج فراصوت را ارسال میکند که این موج به یک جسم برخورد میکند و به خود سنسور باز میگردد. سنسور موج برگشتی را شناسایی می کند و  زمان این رفت و برگشت موج را محاسبه میکند و متناسب با این زمان یک پالس 5 ولت را بر روی پایه ECHO خود قرار می دهد.[post_shop]

 

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

نکته مهم :
سیگنال خروجی سنسور ولتاژ 5 ولت را به برد تحویل می دهد در حالی که  پایه های ورودی و خروجی برد رزبری پای با  3.3 ولت کار میکنند. ارسال یک سیگنال 5 ولت به یک برد با ولتاژ کاری 3.3 ولت میتواند به برد آسیب برساند. برای حل این مشکل کافی است که از یک مقسم ولتاژ استفاده کنیم.

ما قبلا در جلسه کاربرد مقاومت ها  به صورت کامل در مورد تقسیم ولتاژ به کمک مقاومت ها صحبت کرده بودیم: 

مقسم ولتاژ مورد استفاده : 

ما از دو مقاومت استفاده میکنیم و قصد داریم با این دو مقاومت ولتاژ خروجی پایه ECHO رو از 5 ولت به 3.3 ولت کاهش دهیم. شکل زیر رو ببینید: 

راه اندازی آلتراسونیک با Raspberry Pi - مقسم ولتاژ مورد استفاده

فرض کنید که مقاومت R1 را یک کیلواهم در نظر گرفته ایم. حال میخواهیم مقاومت R2 را بیابیم. محاسبات مربوط به R2 در زیر آورده شده است : 

راه اندازی آلتراسونیک با Raspberry Pi - محاسبات مربوط به R2

که مقدار مقاومت R2 برابر 1941 بدست می آید. حال اگر به جای این مقاومت که یک مقدار استاندارد نیست میتوانیم مقاومت 2 کیلواهم را در نظر بگیریم. 

در جدول زیر پایه های سنسور که باید به پایه های رزبری متصل شود ، آورده شده است. 

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

بنابراین مدار مورد نظر ما به صورت زیر خواهد بود :

راه اندازی آلتراسونیک با Raspberry Pi

به سادگی میتوانیم از کانکتورهای نرگی و مادگی استفاده کنیم و این مدار را ببینیم. شکل نهایی مدار به صورت زیر می باشد: 

راه اندازی آلتراسونیک با Raspberry Pi

توضیح کد

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

ما به دو پایه GPIO نیاز داریم. یک پایه برای Trigger کردن ماژول و پایه ای دیگر برای اتصال به پایه ECHO که به کمک آن هنگامی که سطح ولتاژ پایه ECHO از صفر به 5 ولت (که با مقسم ولتاژ به 3.3 ولت کاهش می یابد) رسید ، تشخیص داده شود. در ادامه کد مربوط به راه اندازی را خط به خط توضیح میدهیم. 

در ابتدا باید ماژول های time و RPI.GPIO را اضافه کنیم تا بتوانیم از GPIO استفاده کنیم و طول پالس را اندازه گیری کنیم. علاوه بر آن نوع شماره بندی پایه ها را نیز در خط سوم مشخص کرده ایم. 

import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BCM)

در گام بعد برای پایه های مربوط به Trig و ECHO یک اسم خاص مشخص میکنیم تا در ادامه کد به راحتی بتوانیم شماره پایه ها را عوض کنیم. این نام ها TRIG و ECHO نام گرفته اند. 

TRIG = 23

ECHO = 24

سپس یک پیغام برای مشخص تر شدن کار در خروجی نمایش می دهیم : 

print ("Distance Measurement In Progress")

حال ورودی یا خروجی بودن پایه ها را مشخص میکنیم. میدانیم پایه مربوط به TRIG باید به عنوان خروجی تعریف شود و پایه مربوط به ECHO نیز باید به صورت ورودی تنظیم شود. این کار به کمک دو خط زیر انجام شده است. 

GPIO.setup(TRIG,GPIO.OUT)

GPIO.setup(ECHO,GPIO.IN)

در گام بعد برای اطمینان ، پایه مربوط به ECHO را در حالت LOW قرار می دهیم و برای دو ثانیه صبر میکنیم. 

GPIO.output(TRIG, False)

print ("Waiting For Sensor To Settle")

time.sleep(2)

سنسور SRF04 نیاز به یک پالس به طول 10uS دارد تا Trigger شود. پالس ارسالی از برد باعث می شود که سنسور 8 پالس پشت سر با فرکانس 40 کیلوهرتز ( برای دریافت پاسخ از ECHO ) ارسال کند. بنابراین ابتدا پایه TRIG را به مدت 10 میکروثانیه در حالت HIGH قرار میدهیم و سپس دوباره آن را به حالت LOW میبریم. کدهای زیر این کار را برای ما انجام می دهند: 

GPIO.output(TRIG, True)

time.sleep(0.00001)

GPIO.output(TRIG, False)

پس از ارسال سیگنال ما نیاز داریم تا به پایه ورودی خود که به پایه ECHO سنسور وصل شده است ،  گوش دهیم. سنسور پایه ECHO را برای مدتی در حالت HIGH قرار میدهد و دوباره آن را به حالت LOW می برد. بنابراین ما نیاز داریم تا مدت زمانی که پایه ECHO در حالت HIGH قرار دارد را اندازه گیری کنیم. برای این کار از حلقه while کمک میگیریم. 

تابع time.time() آخرین زمان برای وقتی که شرط مربوط به while برقرار شده است را اندازه گیری می کند. به عنوان مثال اگر پایه از حالت LOW به حالت HIGH برود ، ما آخرین لحظه ای که پایه در حالت LOW هست رو به کمک خطوط زیر اندازه گیری میکنیم : 

while GPIO.input(ECHO)==0:

  pulse_start = time.time()

توجه داشته باشید که هنوز پایه در حالت HIGH قرار نگرفته است و مقدار عبارت pulse_start به مرور زمان زیاد و زیادتر میشه و مقدار نهایی دقیقا قبل از لحظه ای است که پایه به حالت HIGH برود. 

حال وقتی که سیگنالی دریافت شد ، پایه به حالت HGIH میرود و ما نیاز داریم تا آخرین لحظه ای که این پایه در حالت HIGH است ، اندازه گیری شود. برای این حالت نیز مشابه حالت قبل عمل میکنیم ولی این بار شرط حلقه while را در حالتی میگذاریم که پایه HIGH است. بنابراین به کمک این شرط نیز ما آخرین لحظه ای که این پایه در حالت HIGH است نیز اندازه گیری می شود. 

while GPIO.input(ECHO)==1:

  pulse_end = time.time()     

حال میتوانیم مدت زمانی که پالس را در حالت HIGH بوده است را به کمک کد زیر محاسبه کنیم:

pulse_duration = pulse_end - pulse_start

با دانستن این مدت زمان و استفاده از فرمول زیر ، میتوان فاصله را بدست آورد :

راه اندازی آلتراسونیک با Raspberry Pi - فرمول محاسبه فاصله

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

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

فرمول نهایی برای محاسبه فاصله - راه اندازی آلتراسونیک با Raspberry Pi

حال اگر بخواهیم موارد گفته شده در بالا را به کد تبدیل کنیم خواهیم داشت : 

distance = pulse_duration x 17150

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

distance = round(distance, 2)

سپس فاصله بدست آمده را در خروجی چاپ میکنیم. 

print ("Distance:",distance,"cm")

در نهایت نیز نوع مدهای مربوط به پایه ها را پاک میکنیم. این کار به کمک دستور GPIO.Cleanup انجام می شود. 

GPIO.cleanup()

بنابراین کد نهایی به صورت زیر است : 

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)

TRIG = 23 
ECHO = 24

print ("Distance Measurement In Progress")

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)

GPIO.output(TRIG, False)
print ("Waiting For Sensor To Settle")
time.sleep(2)

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)

print ("Distance:",distance,"cm")

GPIO.cleanup()

[/post_shop]

که اگر آن را اجرا کنیم نتیجه به صورت زیر خواهد بود : 

در پایان یک تذکر و دو تمرین

تذکر:
سعی کنید حتما کد را خودتان بنویسید و به هیچ عنوان آن را کپی و پیست نکنید. به کد نگاه کنید و آن را بفهمید و سپس آن را در کامپیوتر خود بنویسید. تا هنگامی که این کار را انجام ندهید ، برنامه نویس خوبی نخواهید شد و نمیتوانید با سخت افزارها خوب کار کنید.
تمارین:

 تمرین 1 : کد بالا را طوری تغییر دهید که فاصله به صورت مداوم نشان داده شود. (نه فقط یک بار) 

 تمرین 2 : تحقیق کنید که دستور GPIO.Cleanup دقیقا چه کاری را برای ما انجام میدهد و چرا باید از آن استفاده کنیم؟ (از این لینک میتوانید کمک بگیرید. )

نکته :  پس از حل سوالات ، لطفا  کد های خود را در قسمت کامنت ها قرار دهید تا در صورتی که دوستان دیگر دچار مشکل شدند ، از کدهای شما کمک بگیرند. 

در پایان مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید: 

اشتراک گذاری:
مطالب زیر را حتما بخوانید

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