در این آموزش میخواهیم چگونگی استفاده از سنسور اولتراسونیک HC-SR04 را در بورد رزبریپای یاد بگیریم.
آنچه که خواهیم آموخت ابتدا طریقهی اتصال این سنسور به بورد رزبریپای، و سپس نحوهی استفاده از آنها برای تشخیص مسافت است. در اتصال سنسور به رزبریپای، نکتهای که وجود دارد این است که باید حتما از یک مقسم ولتاژ به عنوان واسطه استفاده کنیم تا ولتاژ ۵ ولت خروجی سنسور را به ۳.۳ ولت برسانیم و بعد به بورد رزبری متصل کنیم. و البته این تنها سنسوری نیست که قابلیت اتصال به بورد رزبریپای را دارد. این بوردها را میتوان به سنسورهای مختلف و متنوعی متصل کرد که اگر علاقهمند باشید آموزشهای مربوط به سنسورهای مختلف را برایتان آماده خواهیم کرد.
علاوه بر آموزش چگونگی اتصال بین سنسور و بورد، در این آموزش یاد میگیریم که چگونه یک اسکریپت پایتون بنویسیم که سنسور HC-SR04 را برای سنجش فاصله راهاندازی کند.
ما با محاسبهی تقسیم زمان ارسال پالس فراصوت به بیرون و زمان بازگشت آن به سنسور به این نتیجه یا هدف رسیدیم.
لیست تجهیزات مورد نیاز برای انجام پروژه
- بورد Raspberry Pi 2 یا ۳ یا جدیدتر
- کارت میکرو SD
- منبع تغذیه
- سنسور HC-SR04
- مقاومتهای 1K Ω و 2K Ω
- برد بورد
- سیم برد بوردی
دو مورد زیر را نیز میتوانید تهیه کنید اما ضروری هم نیست.
- Raspberry Pi Case
- دانگل وایفای یا اتصال اترنت
راهاندازی سختافزار مدار اتصال سنسور سنجش فاصله و رزبریپای
در این بخش به سراغ اتصالات مداری میرویم. خبر خوبی که برای شما داریم این است که اتصال این دو ماژول به یکدیگر بسیار ساده است چرا که اکثر پینهای سنسور به طور مستقیم به یکی از پینهای رزبریپای متصل میشوند. تنها بخشی که شاید کمی پیچیدهتر به نظر برسد بخش مدار مقسم ولتاژی است که باید برای echo pin بسازیم. علت استفاده از این مقسم همان طور که در قسمت ابتدایی آموزش هم توضیح دادیم، این است که ولتاژ خروجی سنسور ۵ ولت است و ولتاژ مورد استفاده در پینهای GPIO رزبری ۳.۳ ولت؛ لذا باید با استفاده از مدار تقسیم ولتاژ، سطح ولتاژ ورودی به این پینها را کاهش دهیم. برای این کار از یک مقاومت 1K و یک مقاومت 2K استفاده میکنیم. اگر علاقهمند بودید که محاسبات اندازهی مقاومتها و ولتاژها در مدار تقسیم ولتاژ چگونه هستند، به فرمولهای این مدار در منابع مراجعه کنید.
دستورالعمل اتصال پینهای سنسور به رزبری از این قرار است:
- اتصال VCC به پین شماره ۲ (5 V)
- اتصال Trig به پین شماره ۷ (GPIO 4)
- اتصال Echo به مقاومت (R1 (1K Ω
- اتصال مقاومت (R2 (2K Ω بین R1 و زمین
- اتصال نقطهی میانی R1 و R2 به پین شماره ۱۱
- اتصال GND به پین شماره ۶ (Ground)
پس برای بستن مدار کافی است این دستورالعملها را به ترتیب انجام دهید (و البته میتوانید بدون خواندن اینها و از روی عکسهای بالا هم آن را انجام دهید)
- از پین ground (پین شماره ۶)، یک سیم به قسمت زمین برد بورد متصل کنید.
- از پین ۵ ولت (پین شماره ۲) ، یک سیم به پین VCC سنسور متصل کنید.
- پین شماره ۷ رزبری را هم به پین TRIG سنسور وصل کنید.
- یک سر مقاومت 1K را به پین Echo سنسور وصل کنید و سر دیگر آن را در نقطهای آزاد از برد بورد قرار دهید.
- یک سر مقاومت 2K را به سر آزاد مقاومت 1K وصل کنید و سر دیگر آن را به قسمت زمین مدار.
- از نقطهی اتصال دو مقاومت به یکدیگر، یک سیم به پین شماره ۱۱ بورد رزبریپای وصل کنید.
استفاده از مدار برای سنجش فاصله
- برای اینکه بتوانیم با کمک بورد رزبریپای و سنسور متصل شده به آن، فاصلهسنجی کنیم، کافی است که از یک اسکریپت پایتون استفاده کنیم. علت استفاده نکردن از raspi-config tool این است که ما برای ارتباط با سنسور تنها از پینهای GPIO استفاده میکنیم و لازم نیست خودمان را درگیر پیچیدگیهای استفاده از raspi-config tool کنیم.
قبل از آنکه شروع به نوشتن اسکریپت کنیم، یک فولدر برای ذخیرهسازی آن ایجاد میکنیم. دو دستور زیر را روی بورد رزبری اجرا کنید تا یک فولدر ساخته شود. مسیر ذخیره شدن آن را نیز انتخاب کنید.
mkdir ~/distance_sensor/ cd ~/distance_sensor
- حالا که در دایرکتوری مورد نظر قرار داریم؛ میتوانیم نوشتن اسکریپت پایتون برای استفاده از سنسور فاصلهسنج را شروع کنیم. برای این کار دستور زیر را اجرا کنید.
nano distance_sensor.py
- در این فایل کدی که در ادامه میآید را بنویسید. ما همین طور که بخشهای مخلتف کد را مینویسیم، روی هر کدام از آنها توضیحاتی را نیز میدهیم تا دقیقتر متوجه شوید. فقط یک نکتهی بسیار مهم که باید مد نظر داشته باشید این است که ما اسکریپت پایتون را مینویسیم که میدانیم به فاصلهها نیز حساس است. بنابراین به tabهایی که در کد وجود دارند دقت کنید و شما هم دقیقا به همین صورت کدها را وارد کنید.
#!/usr/bin/python import RPi.GPIO as GPIO import time try:
در خط اول اعلام میکنیم که قرار است از زبان پایتون استفاده کنیم. در صورتی که این را قید نکنیم، هیچ تضمینی وجود ندارد که کد ما به زبان پایتون تفسیر شود.
در ادامه دو کتابخانهای را که در طول نوشتن اسکریپت نیاز داریم را import میکنیم. این دو کتابخانه یکی Rpi.GPIO و دیگری time است.
Rpi.GPIO: با استفاده از این پکیج میتوانیم با پینهای GPIO ارتباط برقرار کرده و آنها را کنترل کنیم. بنابراین اگر این پکیج نباشد، نمیتوانیم با سنسور هم ارتباط برقرار کنیم چون سنسور را به پینهای GPIO رزبریپای متصل کردهایم.
time: وجود این پکیج عملکرد صحیح توابعی که در اسکریپت استفاده میشوند و وابسته به زمان هستند را میسر میکند. در عمل ما از این پکیج در دو قسمت از اسکریپت استفاده میکنیم. یکی برای تابعی که به کمک آن میخواهیم در مواقع استراحت مدار، آن را در حالت sleep قرار دهیم و یکی هم برای تابعی که قرار است زمان رفت و برگشت پالس اولتراسونیک ارسالی سنسور را اندازهگیری کند.
و در نهایت به try میرسیم؛ عبارتی که بخش اعظم کدمان را در درون آن جای میدهیم تا مطمئن باشیم پس از اجرا و خارج شدن از برنامه، پینهای GPIO را clear کردهایم.
GPIO.setmode(GPIO.BOARD) PIN_TRIGGER = 7 PIN_ECHO = 11 GPIO.setup(PIN_TRIGGER, GPIO.OUT) GPIO.setup(PIN_ECHO, GPIO.IN)
در خط اول، GPIO mode را روی GPIO.BOARD قرار میدهیم. معنای این جمله این است که شمارهی پینهای ما physical هستند نه BCM. اگر این را مشخص نکنیم و شمارهها به صورت BCM تعبیر شوند، کد ما به درستی کار نخواهد کرد.
در دو خط بعدی دو متغیر ایجاد میکنیم که فیزیکال پینهای trigger و echo را در آنها نگهداری کنیم. این کار را میکنیم تا در صورت نیاز به تغییر این متغیرها لازم نباشد تمام کد را زیر و رو کنیم و در جاهای مختلف بخواهیم مقادیر پینها را تغییر دهیم.
پس از آن تنظیمات ورودی یا خروجی بودن پینها را انجام میدهیم. پین trigger که مسلما خروجی است چون میخواهیم با استفاده از آن سنسور را راهاندازی کنیم. و پین echo هم که قرار است دادههای سنسور را به ما بدهد طبیعتا باید ورودی باشد.
GPIO.output(PIN_TRIGGER, GPIO.LOW) print "Waiting for sensor to settle" time.sleep(2)
در خط اول Trigger pin را روی LOW تنظیم میکنیم. یعنی تا زمانی که تعیین میکنیم، هیچ دادهای به سنسور ارسال نشود. با این کار به سنسور اجازه میدهیم تا پس از روشن شدن کارکرد آن تثبیت شود و سپس شروع به اندازهگیری کند. به این ترتیب نتایج دقیقتر و معتبرتری تولید خواهد کرد.
همین مدت زمان ۲ ثانیهای که تعیین کردهایم، فرصت اولیهای است که به سنسور میدهیم تا بتواند به دقت شروع به کار کند.
print "Calculating distance" GPIO.output(PIN_TRIGGER, GPIO.HIGH) time.sleep(0.00001) GPIO.output(PIN_TRIGGER, GPIO.LOW)
در اینجا به بخشی از کد میرسیم که در آن سنسور برای شروع به کار trigg میشود. برای این کار ابتدا باید Trigger pin را روی High تنظیم کنیم.
یک نانوثانیه صبر میکنیم و سپس مجددا آن را LOW میکنیم. علت این کار این است که برای رسیدن سیگنال trigger به سنسور یک نانوثانیه زمان لازم است. پس از آن سنسور شروع به کار میکند و نباید مجددا سیگنال Trigg دیگری به آن ارسال شود تا بتواند اندازهگیری شروع شده را به پایان برساند.
while GPIO.input(PIN_ECHO)==0: pulse_start_time = time.time() while GPIO.input(PIN_ECHO)==1: pulse_end_time = time.time() pulse_duration = pulse_end_time - pulse_start_time distance = round(pulse_duration * 17150, 2) print "Distance:",distance,"cm"
در قدم بعدی یک while loop تعریف میکنیم و در آن مدام PIN_ECHO را چک میکنیم تا زمانی که یک شود. تا قبل از آن، یعنی تا هر لحظهای که چک کنیم و هنوز یک نشده باشد (صفر باشد)، pulse_start_time را روی زمان آن لحظه تنظیم میکنیم.
هر زمان که یک شد، در pulse_end_time زمان آن لحظه را ذخیره میکنیم و این کار را تا زمانی که PIN_ECHO مجددا صفر شود تکرار میکنیم. یعنی هر بار زمان را بروزرسانی میکنیم.
کاری که در این دو حلقه انجام میدهیم در حقیقت اندازهگیری زمان رفت و برگشت پالس اولتراسونیک ارسالی توسط سنسور به نقطهای است که مسافت آن را میخواهیم بدانیم. وقتی که هر دو زمانهایی که در بالا توضیح دادیم را داشته باشیم، فقط کافیست آنها را از هم کم کنیم تا مدت زمان رفت و برگشت سیگنال مشخص شود.
با علم به اینکه سرعت سیگنال فراصوت (اولتراسونیک) ۳۴۳۰۰ سانتیمتر بر ثانیه است، از روی مدت زمان پالس میتوانیم مسافت مورد نظر را محاسبه کنیم.
اما نکتهای که باید به آن دقت کنیم این است که چون این مدت زمان، مدت زمان یک رفت و برگشت سیگنال از محل سنسور تا محل مورد نظر است، برای محاسبهی فاصله ما کافیست نصف این زمان را در نظر بگیریم. (و یا مقدار سرعت را نصف در نظر بگیریم) انجام دادن این محاسبهی کوچک (تقسیم بر دو کردن سرعت یا زمان) به مراتب سادهتر از این است که ابتدا فاصله را محاسبه کنیم و بعد آن را نصف کنیم.
با این توضیحات، برای محاسبهی فاصله، کافی است طول پالس به دست آمده را در ۱۷۱۵۰ (سانتیمتر بر ثانیه) ضرب کنیم.
finally: GPIO.cleanup()
و اما این خطوط پایانی بسیار حائز اهمیت هستند چرا که پایان کار ما را تضمین میکند. تحت هر گونه شرایط و عملکردی که حاصل شده است، ما باید در انتهای اسکریپت تابع ()GPIO.cleanup را اجرا میکنیم. اگر این اتفاق نیفتد، دفعهی بعدی که این اسکریپت را دوباره اجرا کنیم و یا حتی هر اسکریپت دیگری که آن هم از پینهای GPIO استفاده میکند، با خطا مواجه خواهیم شد.
- پس از اینکه تمام کدهایی که گفتیم را نوشتید، باید چیزی شبیه کد زیر داشته باشید.
#!/usr/bin/python import RPi.GPIO as GPIO import time try: GPIO.setmode(GPIO.BOARD) PIN_TRIGGER = 7 PIN_ECHO = 11 GPIO.setup(PIN_TRIGGER, GPIO.OUT) GPIO.setup(PIN_ECHO, GPIO.IN) GPIO.output(PIN_TRIGGER, GPIO.LOW) print "Waiting for sensor to settle" time.sleep(2) print "Calculating distance" GPIO.output(PIN_TRIGGER, GPIO.HIGH) time.sleep(0.00001) GPIO.output(PIN_TRIGGER, GPIO.LOW) while GPIO.input(PIN_ECHO)==0: pulse_start_time = time.time() while GPIO.input(PIN_ECHO)==1: pulse_end_time = time.time() pulse_duration = pulse_end_time - pulse_start_time distance = round(pulse_duration * 17150, 2) print "Distance:",distance,"cm" finally: GPIO.cleanup()
اگر کد را به درستی وارد کردهاید، میتوانید با فشردن Ctrl + X و بعد Y و سپس Enter فایل را ذخیره کنید.
- پس از اینکه اسکریپت را با موفقیت نوشتید و ذخیره کردید، میتوانید با وارد کردن کد زیر در رزبریپای، آن را اجرا کنید.
python ~/distance_sensor/distance_sensor.py
- اگر همهچیز به درستی پیش برود، نتیجه را به صورت زیر دریافت خواهید کرد و البته مسلما مقدار فاصلهی به دست آمده برای شما متفاوت خواهد بود.
Waiting for sensor to settle Calculating distance Distance: 29.69 cm
در اینجا به پایان آموزش این جلسه میرسیم. شما در این آموزش یاد گرفتید که اولا چگونه سنسور HC-SR04 را به بورد رزبریپای متصل کنید و ثانیا اینکه چطور یک پایتون اسکریپت برای راهاندازی آن بنویسید.
اگر دوست داشتید این پروژه را پیشرفتهتر هم بکنید، میتوانید در مرحلهی بعد یک نمایشگر LCD هم به مدار اضافه کنید تا بدون نیاز به استفاده از یک مانیتور جانبی، مسافت محاسبه شده بر روی آن LCD نمایش داده شود.
اگر این آموزش برایتان جالب یا مفید بود و یا اگر سوالی درمورد آن داشتید، حتما در قسمت نظرات برای ما ارسال کنید.
- منبع: ترجمه از سایت pimylifeup.com
امیدوارم آموزش «اتصال سنسور فاصلهسنج HC-SR04 به رزبریپای» براتون مفید واقع شده باشه. کامنت یادتون نره 🙂
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.