Friday, September 19, 2014

HCSR04 სენსორის გამოყენება

HC-SR04-2.jpg
მოგესალმებით, ამ პოსტში მინდა მარტივად და ერთი სენსორის გამოყენებით გასწავლოთ, როგორ შეგვიძლია გავზომოთ მანძილი ობიექტამდე 3მმ-იანი სიზუსტით. ზემოთ მოცემულია სენსორის ვიზუალური მხარე

ეს არის წინ-ხედი, რომლის წინაც ხდება ობიექტის მოთავსება და მანძილის გაზომვა. თუ მონაცემთა ფურცელს ვნახავთ, მანძილის სიგრძე შეიძლება იცვლებოდეს 2-დან 400 სანტიმეტრამდე და ცდომილების მინიმალური მნივნელობა შეიძლება იყოს 3 მილიმეტრი. საკმაოდ კარგი პარამეტრებია, თუ ძალიან ზუსტი შედეგები არ არის საჭირო. ასევე ინტერნეტში ვნახე ხედვის არეალის სურათი, რომელიც კუთხეების მიხედვით გვიჩვენებს გაზომვის უნარიანობას.

HC-SR04-4.jpg

მოქმედების პრინციპი კი შემდეგში მდგომარეობს:
  1. Trig პინზე უნდა მოვდოთ მინიმუმ 10 მიკრო წამიანი სინგალი
  2. მოდული ავტომატურად აქტიურდება და აგზავნის 40 კილოჰერციან სიგნალს და აკვირდება არის თუ არა უკან არეკლილი სიგნალი
  3. თუ ეს სიგნალი უკან ბრუნდება, მაშინ ლოგიკური 1-იანის ყოფნის დრო პინზე უდრის დროს სიგნალის გაგზავნიდან მიღებამდე

ასევე გვაქვს ფორმულა, რომლითაც შეგვიძლია ვისარგებლოთ, რომ დრო გადავიყვანოთ სანტიმეტრებში.

მანძილი = (იმპულსის დრო * ბგერის სიჩქარეზე) / 2

რაც შეეხება ბგერის სიჩქარეს, მონაცემთა ფურცელში მითითებულია 340 მ/წმ.

ამის შემდეგ უკვე შეგვიძლია დავწეროთ ფუნქცია, რომელიც ამ სენსორის გამოყენებით წაიკითხავს მანძილს ობიექტამდე და გამოვიყენებთ, როგორც უკონტაქტო სახაზავს. შედეგების მიღების შემდეგ, ბგერის სიჩქარე შეგიძლიათ შეცვალოთ, თუ მიღებული შედეგი ცოტა მაინც სცდება რეალურ მნიშვნელობებს.

ახლა კი ვნახოთ კოდი (ეს არის კოდის ლინკი, რომელიც მოთავსებულია ჩემს დრაივზე), რომელიც საკმაოდ მარტივია და სულ სამი ფუნქციისგან შედგება

  1. int16_t GetDistance() - რომელიც აბრუნებს გაზომილ მანძილს სანტიმეტრებში. როგორც აღვნიშნე, გაზომილი მანძილის მაქსიმალური მნიშვნელობა რეკომენდირებულია, როგორც 4 მეტრი, მე პირადად მაქვს გამოცდილება ცოტა მეტიც გამეზომა
  2. int16_t GetDistance(int8_t trigPin, int8_t echoPin) - ეს ფუნქცია იმით განსხვავდება წინა ფუნქციებისგან, რომ აქ არგუმენტად შეგიძლიათ მიაწოდოთ ნებისმიერი ციფრული/ანალოგური პინი ხელოვნურად
  3. boolean IB(int16_t value, int16_t Floor, int16_t Ceiling) - ფუნქცია ამოწმებს არის თუ არა მოცემული ცვლადი (value) მეტი ქვედა საზღვარზე (Floor) და ნაკლები ზედა საზღვარზე (Ceiling). თუ ეს ორი პირობა ერთდროულად დაკმაყოფილდა, მაშინ აბრუნებს 1-ს (true), თუ არა და აბრუნებს 0-ს (false).

ახლა ვნახოთ მარტივი მაგალითი, რომელშიც ორი LED-ია გამოყენებული და ცისფერიდან ირთვება წითელზე თუ სენსორის წინ მდებარე ობიექტი “უსაფრთხო ზონიდან” “სახიფათო ზონაში” გადადის, სადაც ზონა “სახიფათოდ” ითვლება თუ ობიექტი 20 სანტიმეტრზე ახლოს მივა სენსორთან. სწორედ ქვემოთ ვიდეოში შეგიძლიათ იხილოთ პროგრამის მუშაობა


No comments:

Post a Comment