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

فهرست مطالب

مقدمه

در این آموزش با ماژول آلتراسونیک، کاربرد‌ها و نحوه عملکرد آن آشنا می‌شویم. نحوه راه اندازی و اتصال آن به برد آردوینو را خواهیم دید و از آن برای تشخیص حرکت و کنترل صفحه نمایشگر خود با حرکات دست استفاده میکنیم.

آنچه در این آموزش یاد می‌گیرید

آشنایی با ماژول فاصله سنج فرا‌‌صوت التراسونیک

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

اکثر ماژول هاي التراسونيک از دو قسمت فرستنده و گيرنده تشکيل شده‌اند. گيرنده و فرستنده ماژول‌هاي SRF04 و  SRF05 در کنار يکديگر  قرار دارند و مي توانند جسم هاي در فاصله 2 تا 300 سانتي متر را با دقت قابل قبولي تشخيص دهند. ماژول SRF05 نسخه تکامل يافته SRF04 مي باشد. اين نسخه دو مد کاري را پشتيباني مي کند و 5 پايه جهت کار با ماژول را در اختيار قرار مي دهد. اما ماژول SRF04 داراي 4 پايه مي باشد و تنها يک مد کاري را پشتيباني مي کند. هردوي اين ماژول ها داراي يک مد کاري مشترک هستند که اين مد کاري با نام مد 1 شناخته ميشود.

در مد 1 ابتدا باید یک پالس به طول حداقل ۱۰ میکرو ثانیه به پایه TRIG اعمال کنیم. ماژول به صورت اتوماتیک 8 عدد پالس با فرکانس ۴۰ کیلو هرتز ارسال میکند. وقتی که پالس ها ارسال شد پایه ECHO یک می‌شود و تا زمانی که پالس های برگشتی از جسم را دریافت نکند این پایه یک باقی می‌ماند. در این مد پایه Out SRF05 را بدون اتصال رها می‌کنیم. با اندازه گیری مدت زمانی که پایه Echo در سطح منطقی ۱ بوده است می‌توانم زمان رفت و برگشت صوت را بدست آوریم و فاصله را محاسبه کنیم.

در مد 2 که فقط در SRF05  فعال است، از یک پایه برای تریگر و اکو استفاده می شود. برای استفاده از این مد پایه‌ی OUT را  به زمین وصل می‌کنیم و از پایه‌ی Echo  برای ارسال و دریافت پالس اکو استفاده می‌کنیم. مانند حالت قبل فاصله از اولین جسم را، با محاسبه‌ی زمان رفت و برگشت صوت خواهیم داشت.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو لئوناردو × 1
ماژول فاصله سنج التراسونیک SRF05 × 2
سیم جامپر × 1

نرم افزار های مورد نیاز

Arduino IDE

ارتباط ماژول التراسونیک و آردوینو

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

نکته
اتصال تغذیه و زمین ماژول را هم فراموش نکنید.

سیم بندی

کد

/*    
   * Ultrasonic Sensor HC-SR05/4 and Arduino
    * by Hanie Kiani
*  https://electropeak.com/learn
    */
long duration;
    int distance;
    
    const int trig = 9;
    const int echo = 10;
   
    
    void setup() {
    pinMode(trig, OUTPUT); // Sets the trigPin as an Output
    pinMode(echo, INPUT); // Sets the echoPin as an Input
    Serial.begin(9600); // Starts the serial communication
    }
    void loop() {
       distance = calculateDistance();
Serial.println(distance); 

    }
    int calculateDistance(){ 
  
  digitalWrite(trig, LOW); 
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trig, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  duration = pulseIn(echo, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
  distance= duration*0.034/2;
  return distance;
}

  بیایید نگاه دقیق تری به کد بیاندازیم:

digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);	
  digitalWrite(trigPin, LOW);

ارسال پالس 10 میکرو‌ ثانیه‌ای روی پین Trigger.

duration = pulseIn(echoPin, HIGH);

تابع pulsln() مدت زمانی که پایه Echo در سطح منطقی 1 می‌ماند را اندازه می‌گیرد. که در واقع برابر با مدت زمان رفت و برگشت صوت از ماژول به مانع روبرو میباشد.

distance= duration*0.034/2;
با ضرب مدت زمان رفت و برگشت صوت در سرعت صوت در محیط، فاصله‌ای که صوت طی کرده است را محاسبه می‌کنیم.

کنترل صفحه نمایشگر کامپیوتر به کمک آردوینو و ماژول آلتروسونیک

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

برای اینکار کافیست دو ماژول SRF04 یا SRF05 را به یک برد آردوینو لئوناردو متصل کرده و در سمت چپ و راست بالای مانیتور خود قرار دهید.

کد زیر را روی برد خود آپلود کنید. حالا شما میتوانید با گرفتن هر دو دست خود در فاصله 20 تا 30 سانتی متری مقابل ماژول‌های چپ و راست، ویدیو را پخش یا متوقف کنید!

اگر دست راست خود را در فاصله 9 تا 15 سانتی متری مقابل ماژول سمت راست بگیرید و کمی از آن دور کنید، ویدیو 5ثانیه به عقب برمیگردد و اگر دست خود را کمی به ماژول نزدیک کنید، ویدیو 5ثانیه به جلو میرود.

نگران صدا هم نباشید! با قرار دادن دست چپ خود در فاصله 9 تا 15 سانتی متری ماژول و نزدیک کردن به آن صدای ویدیو افزایش و با دور کردن آن از ماژول صدا کاهش میابد.

سیم بندی

کد

در این قسمت شما نیاز به کتابخانه Keyboard.h آردوینو دارید. می‌توانید این کتابخانه را از لینک زیر دریافت کنید:

https://www.arduinolibraries.info/libraries/keyboard

/*
    * Control Your PC with Ultrasonic Sensor HC-SR04 and Arduino
    * by Hanie Kiani
    *  https://electropeak.com/learn
 */
#include <Keyboard.h>
long duration;
int distance,distLeft,distRight;

const int trigger1 = 2; //Trigger pin of 1st Sesnor
const int echo1 = 3; //Echo pin of 1st Sesnor
const int trigger2 = 4; //Trigger pin of 2nd Sesnor
const int echo2 = 5;//Echo pin of 2nd Sesnor


void setup() {
Serial.begin(9600); 
  
pinMode(trigger1, OUTPUT); 
pinMode(echo1, INPUT); 
pinMode(trigger2, OUTPUT); 
pinMode(echo2, INPUT); 
}



void loop() { 
distance=calculateDistance(trigger1,echo1);
distLeft =distance; 

distance=calculateDistance(trigger2,echo2);
distRight =distance;
 
//Pause Modes -Hold
if ((distLeft >20 && distRight>20) && (distLeft <30 && distRight<30)) //Detect both hands
{Serial.println("Play/Pause"); 
                        Keyboard.press(KEY_TAB);
                        delay(100);
                        Keyboard.releaseAll();
  delay (500);}

distance=calculateDistance(trigger1,echo1);
distLeft =distance;

distance=calculateDistance(trigger2,echo2);
distRight =distance;

 

//Control Modes
//Lock Left - Control Mode
if (distLeft>=9 && distLeft<=14)
{
  delay(100); //Hand Hold Time
 distance=calculateDistance(trigger1,echo1);
  distLeft =distance;
  if (distLeft>=0 && distLeft<=15)
  {
    Serial.println("Left Hand detected");
    while(distLeft<=20)
    {
     distance=calculateDistance(trigger1,echo1);
      distLeft =distance;
      if (distLeft<5) //Hand pushed in 
      {Serial.println ("Volume Up");
                         Keyboard.press(KEY_UP_ARROW); //up  key
                         delay(100);
                         Keyboard.releaseAll();
        delay (300);}
      if (distLeft>17) //Hand pulled out
      {Serial.println ("Volume Down");
       Keyboard.press(KEY_DOWN_ARROW); //down  key
                         delay(100);
                         Keyboard.releaseAll();
       delay (300);}
    }
  }
}

//Lock Right - Control Mode
if (distRight>=9 && distRight<=14)
{
  delay(100); //Hand Hold Time
 distance=calculateDistance(trigger2,echo2);
  distRight =distance;
  if (distRight>=0 && distRight<=20)
  {
    Serial.println("Right Hnaad Detected");
    while(distRight<=20)
    {
      distance=calculateDistance(trigger2,echo2);
      distRight =distance;
      if (distRight<5) //Right hand pushed in
      {Serial.println ("Rewind"); 
       Keyboard.press(KEY_LEFT_ARROW); //left key
                         delay(100);
                         Keyboard.releaseAll();
       delay (300);
      }
      if (distRight>17) //Right hand pulled out
      {Serial.println ("Forward"); 
       Keyboard.press(KEY_RIGHT_ARROW); //right  key
                         delay(100);
                         Keyboard.releaseAll();
       delay (300);}
  }
}
}

delay(200);
}
 int calculateDistance(int trig, int echo){ 
  
  digitalWrite(trig, LOW); 
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trig, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  duration = pulseIn(echo, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
  distance= duration*0.034/2;
distance = 50;
 return distance;
}

یک گام جلوتر

  • با اضافه کردن یک سروو موتور به ماژول سعی کنید فاصله از همه اجسام اطراف ماژول التراسونیک را محاسبه کنید.
  • سعی کنید موارد دیگری مثل زیاد و کم کردن سرعت پخش ویدئو به پروژه بالا اضافه کنید.

از این مطلب خوشتان آمد؟

آخرین مطالت و آموزش ها را در ایمیلتان دریافت کنید:

مطالب بیشتر

Comments (25)

  • aradbayat81 Reply

    با سلام خسته نباشید . ببخشید کدوم کتابخانرو بگیرم چون ورژن های مختلفه وبعد باید با برنامه بالا یکی بکنمش؟

    اکتبر 11, 2019 at 1:15 ب.ظ
    • سعید حسینی Reply

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

      اکتبر 12, 2019 at 10:28 ق.ظ
      • aradbayat Reply

        سلام یعنی نمی تونم برنامرو از اینجا کپی کنم باید کتابخانرو بریزم و این برنامه هم کپی کنم ؟ یا این برنامه کتابخانه رو هم داره اخه هم الان من این برنامرو زدم روی اردواینو و بقیه کار هارو نیز انجام دادم نمیدونم چرا برنامه کار نمی کنه ممنون میشم راهنمایی کنید

        اکتبر 15, 2019 at 1:55 ب.ظ
        • سعید حسینی Reply

          بردتون سالمه؟

          دسامبر 18, 2019 at 4:58 ب.ظ
      • اسکندری Reply

        سلام . با این سیستم میتونم سرعت یک موتور رو برحسب فاصله جسم تنظیم کنم ؟

        ژانویه 9, 2023 at 8:04 ب.ظ
        • علی عبدالملکی Reply

          سلام
          بله میتونید ، با پیاده سازی الگوریتم مناسب و دقیق امکان پذیره

          فوریه 27, 2023 at 6:43 ب.ظ
  • ابوالفضل Reply

    سلام
    تابع distance=calculateDistance(trigger1,echo1); برای من خطا میده
    میگه was declared in this scope

    فوریه 3, 2020 at 8:08 ب.ظ
    • سعید حسینی Reply

      distance رو تعریف کردید؟

      فوریه 29, 2020 at 9:16 ق.ظ
  • ابوالفضل Reply

    was not declared in this scope

    فوریه 3, 2020 at 8:08 ب.ظ
    • فرناز صادقی Reply

      سلام وقت بخیر چراcalculatedistanceرو برا منerror میزنه و قبولش نمیکنه

      آگوست 31, 2021 at 8:00 ب.ظ
    • فرناز صادقی Reply

      شما مشکلتون حل شد؟برا منم همینerrorرو میده

      آگوست 31, 2021 at 9:05 ب.ظ
      • مهران ملکی Reply

        سلام.
        من دوباره کدهارو بررسی و کامپایل کردم و مشکلی نداشتن. شما تو کدوم کد این ارور رو میگیرید؟
        یک مساله دیگه هم که باید در نظر بگیرید انتخاب بردتون هست. این کد همونطور که توی آموزش میبینید، برای برد Leonardo نوشته شده و امکانش هست که خطایی که بهش برخورد کردید به خاطر این باشه که برد درست رو موقع کامپایل انتخاب نکردید.
        یک کار دیگه هم که میتونید انجام بدید این هست. موقعی که کد رو از توی وبسایت کپی میکنید و تو آردوینو پیست میکنید، از کلیدهای ترکیبی crtl+A+T هم استفاده کنید تا شکل کد هم مرتب بشه، چون ممکنه ارور از نامرتب بودن کد هم باشه.

        سپتامبر 1, 2021 at 12:05 ب.ظ
  • مهدی Reply

    سلام
    ببخشید میخواستم بدونم با برد arduino uno هم میشه این پروژه رو اجرا کرد؟

    مارس 8, 2020 at 1:05 ب.ظ
    • سعید حسینی Reply

      سلام
      نه، آردوینو لئوناردو از کتابخونه کیبوردپشتیبانی میکنه

      مارس 10, 2020 at 12:44 ب.ظ
      • فاطمه Reply

        سلام بنده در بخش کد اردوینو قسمت کتابخانه ارور دارم میشه راهنمایی کنید لطفا

        دسامبر 10, 2022 at 11:51 ق.ظ
        • علی عبدالملکی Reply

          سلام
          لطفا دقیقا بفرمایید چه error باهاش برخورد کردید؟

          دسامبر 11, 2022 at 9:08 ق.ظ
  • امیر Reply

    سلام.میشه برنامه رو از اینجا کپی کنیم توی نرم افزار آردوینو بعد کامپایل کنیم روی برد آردوینوآنو؟؟؟؟

    آوریل 8, 2020 at 12:02 ب.ظ
    • سعید حسینی Reply

      سلام بله

      آوریل 12, 2020 at 7:45 ب.ظ
    • Amir Mogoei Reply

      باسلام
      خیر روی آردوینو uno اجرا نمیشه، میتونید از برد لئوناردو استفاده کنید

      می 12, 2020 at 9:34 ق.ظ
  • سارا Reply

    سلام خسته نباشید
    اگر بخوایم اجسامی که از جلوی این سنسور حرکت میکنن رو بشماریم، چطوری اجسام ثابت رو تشخیص بدیم؟؟

    جولای 19, 2020 at 3:20 ب.ظ
    • مهران ملکی Reply

      سلام
      برای این کار یک حد فاصله معین رو در نظر بگیرید مثلا 10 سانتی‌متر. تو حالت عادی که جسمی از جلوی سنسور حرکت نکنه فاصله اندازه‌گیری شده توسط سنسور در حالت بیشینه است و موقعی که جسمی رد بشه فاصله اندازه‌گیری شده از حد فاصله تعیین شده شما مثلا 10 سانتی‌متر کمتر میشه. با این روش شما میتونید یک کانتر داشته باشید و با بررسی فاصله اندازه‌گیری شده توسط سنسور، هر بار که فاصله اندازه ‌گیری شده کمتر از حد فاصله تعیین شده بود به معنای رد شدن جسم از جلوی سنسور تلقی میشه و کانتر یک واحد اضافه میشه.

      سپتامبر 1, 2021 at 11:29 ق.ظ
  • محمد Reply

    سلام ببخشید بعد از اینکه این کارهارو انجام دادم چطور به کامپیوتر وصلش کنم ؟

    ژانویه 22, 2022 at 8:13 ب.ظ
    • مهران ملکی Reply

      سلام.
      بعد از قرار دادن دو ماژول التراسونیکتون روی مانیتور کامپیوتر و آپلود کد روی برد آردوینوتون، مدار کار میکنه. اتصال آردوینو به کامپیوتر هم از طریق همون رابطی هست که باهاش برد رو برنامه‌ریزی میکنید. همون به کامپیوتر متصل باشه کافی هست.

      ژانویه 29, 2022 at 10:51 ق.ظ
  • حامد Reply

    سلام ببخشید با برد آردیو اونو میتونم این کار رو بکنم

    آوریل 13, 2022 at 1:23 ب.ظ
    • مهران ملکی Reply

      سلام.
      بخش “ارتباط ماژول التراسونیک و آردوینو” رو میتونید با آردوینو Uno هم انجام بدید، اما بخش “کنترل صفحه نمایشگر کامپیوتر به کمک آردوینو و ماژول آلتروسونیک” فقط با برد آردوینو لئوناردو امکان‌پذیر هست.

      آوریل 13, 2022 at 9:48 ب.ظ

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

نشانی ایمیل شما منتشر نخواهد شد.