آردوینوپروژه آردوینو

به کمک آردوینو ربات مسیریاب (تعقیب خط) بسازید!

مقدمه

سلام دوستان! توی این پروژه میخواهیم به شما ساخت یک ربات مسیریاب ساده با آردوینو، در عین حال کاربردی رو آموزش بدیم. با ما همراه باشید.

ربات مسیریاب:ربات مسیریاب در کل به ربات هایی می گویند که بدون کنترل انسان بتوانند راه خود را با توجه به شرایط آماده شده از قبل پیدا کنند که به طور کلی به دو دسته تقسیم می شوند؛ دسته اول آن هایی که از سنسور تشخیص نور مرئی برای شناسایی خط و مسیر استفاده می کنند و دسته دوم آن هایی که از مادون قرمز برای برای شناسایی مسیر استفاده می­کنند. برای مثال در کارخانه هایی که تماماً اتوماتیک هستند ربات ها راه خود را از روی دنبال کردن خطوط خاص به وسیله مادون قرمز پیدا می کنند. در این پروژه هم ما میخواهیم رباتی همانند این ربات بسازیم.

توی این پروژه ما از از برد آردوینو UNO به عنوان پردازشگر و یا همان مغز اصلی ربات استفاده می کنیم؛ همچنین از ماژول درایور L298N برای کنترل سرعت و جهت حرکت موتور ها استفاده می کنیم. برای تشخیص خطوط مشکی هم از سنسور فرستنده و گیرنده مادون قرمز TCRT5000 بهره خواهیم برد.

ربات تعقیب خط

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

برد آردوینو UNO۱ عدد ربات تعقیب خط
درایور L298N۱ عدد
ماژول سنسور TCRT5000 فرستنده و گیرنده مادون قرمز۲ عدد
موتور گیربکس زرد پلاستیکی یکطرفه ۶ولت ۲ عددموتور گیربکس زرد تک محوره
چرخ پلاستیکی۲ عدد
چرخ هرزگرد۱ عدد
شاسی رباتیک عدد
سازه ربات(اختیاری) مسیریاب
باتری لیتیوم یون ۱۸۶۵۰۳ عددباتری لیتیوم 18650
جاباتری سه تایی باتری لیتیوم ۱۸۶۵۰۱ عددجا باتری 3تایی
سیم برد بورد۱ بستهربات تعقیب خط
بردبورد۱ عددربات تعقیب خط

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

آردوینو


Arduino UNO مغز اصلی و کنترل کننده تمامی عناصر این ربات که خود بر پایه سری میکروکنترلر های محبوب AVR می باشد.

ماژول درایور موتور L298N

این ماژول درایور که برپایه آی سی درایوری با همین نام است که قابلیت راه اندازی موتورهای  DC و Stepper را دارد.  با استفاده از میکروکنترلر و این درایور قادر خواهید بود سرعت و جهت حرکت موتور ها را کنترل کنید ؛ همچنین این درایور  توانایی کنترل همزمان ۲ موتور DC را دارد.

سنسور فرستنده و گیرنده مادون قرمز TCRT5000

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

توضیح عملکرد

سنسورهای مادون قرمز که جلوی ربات نصب شده اند دارای دو پین دیجیتال و آنالوگ هستند که در اینجا از پین دیجیتال آنها استفاده می کنیم. عملکرد این سنسور ها این گونه است که LED فرستنده به طور مداوم نور مادون قرمز تولید می کند. اگر این نور به سطح روشن برخورد کند، بازتاب یافته و توسط LED گیرنده دریافت شده که بیانگر سطح سفید است اما اگر این نور به سطح سیاه بتابد بازتابی نخواهیم داشت.این طرزکار حالت دیجیتال می باشد که فقط حالت ۰ یا ۱ دارد ولی درصورتی که از پین آنالوگ استفاده کنیم خروجی بسته به سطح (که روشن تر باشد یا تیره تر) بین ۰ تا ۱۰۲۳ متغییر خواهد بود،به این صورت که اگر ماژول در نزدیکی سطح کاملا سفید قرار گیرد عدد ۰ و اگر در نزدیکی سطح کاملا مشکی قرار گیرد عدد ۱۰۲۳ توسط پین آنالوگ خوانده می شود. حالا می خواهیم از همین ساز و کار برای تشخیص خطوط مشکی روی صفحه ای سفید استفاده کنیم. با تشخیص مرز بین سفید و سیاه می توانیم چرخ های ربات را در مسیر راست و چپ با سرعت متغیر(به کمک PWM و یا مدولاسیون پهنای پالس) حرکت دهیم تا ربات کاملا در مسیر خطوط سیاه باقی بماند.


موج pwm چیست؟ و چه کاربردی دارد؟


گام دوم: مدار را ببندید

این ربات تعقیب خط یا همان مسیریاب یکی از ساده ترین انواع ربات برای ورود به دنیای رباتیک و الکترونیک است و قطعا لازم نیست که یادآوری کنیم که بسیار هم سرگرم کننده است! مدار خود را به کمک سیم های رابط طبق تصویر زیر ببندید، برای اطمینان از عملکرد مدار سعی کنید در اتصالات دقت بیشتری به خرج دهید!

شماتیک مدار باید به صورت زیر باشد.

L298N:(ابتدا جامپرهایی که کنار پین های IN1 و IN4 هستند را بردارید.)

  • ENA —————–> پین ۵ آردوینو
  • IN1 ——————> پین ۸ آردوینو
  • IN2 ——————> پین ۹ آردوینو
  • IN3 ——————> پین ۱۰ آردوینو
  • IN4 ——————> پین ۱۱ آردوینو
  • ENB —————–> پین ۶ آردوینو
  • OUT1 و OUT2 ————— به دوسر موتور چپ
  • OUT3 و OUT4 ————— به دوسر موتور راست

TCRT5000(ماژول سمت راست):

  • GND به قطب منفی باتری
  • VCC به قطب مثبت باتری
  • D0  ———-> پین ۳ آردوینو

TCRT5000(ماژول سمت چپ):

  • GND به قطب منفی باتری
  • VCC به قطب مثبت باتری
  • D0  ———-> پین ۲ آردوینو

باتری ها:

  • قطب مثبت باتری اول به قطب منفی باتری دوم
  •  قطب مثبت باتری دوم به قطب منفی باتری سوم
  • قطب منفی باتری اول به GND آردوینو
  • قطب مثبت باتری سوم به ۵V آردوینو

شماتیک کلی مدار

شماتیک کلی مدار

توجه داشته باشید ۳ عدد باتری استفاده شده به صورت سری به یکدیگر متصل شده اند.

گام سوم: برنامه زیر را روی برد خود آپلود کنید

//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_www.datosrobo.com

/*----IR Sensors Conection----*/
int LS = 2;    // left sensor
int RS = 3;    // right sensor


/*-------definning Outputs------*/
int LM1 = 8;        // left motor
int LM2 = 9;       // left motor
int RM1 = 10;     // right motor
int RM2 = 11;    // right motor
int ENBL = 5;   //left motor PWM(ENA)
int ENBR = 6;  //right motor PWM(ENB)
//speed setting
int motorspeed = 150; //MAX speed is 255
void setup()
{
  pinMode(LS,  INPUT);
  pinMode(RS,  INPUT);
  pinMode(LM1, OUTPUT);
  pinMode(LM2, OUTPUT);
  pinMode(RM1, OUTPUT);
  pinMode(RM2, OUTPUT);
  pinMode(ENBL,OUTPUT);
  pinMode(ENBR,OUTPUT);
}

void loop(){
  int vall = digitalRead(LS);
  int valr = digitalRead(RS);
if (( LS == 0 ) && ( RS == 0 )) //CONDITION-1 FORWARD
{    
    MoveForward();
  }
  
  if (( LS == 1 ) && (RS == 1)) //CONDITION-2 STOP
  {
      Stop();
    }
  if(( LS == 0 ) && ( RS == 1 ))  // RIGHT
  {
      TurnRight();
  }
  if(( LS == 1 ) && ( RS == 0 ))
  {
      TurnLeft();
  }
}

	


void MoveForward()
{
    digitalWrite(LM1,LOW);
    digitalWrite(LM2,HIGH);
    digitalWrite(RM1,LOW);
    digitalWrite(RM2,HIGH);
    analogWrite(ENBL,motorspeed);
    analogWrite(ENBR,motorspeed);
    delay(20);
}

void TurnRight()
{
    digitalWrite(LM1,LOW);
    digitalWrite(LM2,HIGH);
    digitalWrite(RM1,HIGH);
    digitalWrite(RM2,LOW);
    analogWrite(ENBL,motorspeed);
    analogWrite(ENBR,motorspeed);
    delay(20); 
}

void TurnLeft()
{
    digitalWrite(LM1,HIGH);
    digitalWrite(LM2,LOW);
    digitalWrite(RM1,LOW);
    digitalWrite(RM2,HIGH);
    analogWrite(ENBL,motorspeed);
    analogWrite(ENBR,motorspeed);
    delay(20);
}

void Stop()
{
    digitalWrite(LM1,LOW);
    digitalWrite(LM2,LOW);
    digitalWrite(RM1,LOW);
    digitalWrite(RM2,LOW);
    delay(20);
}

آپلود کد

برای آپلود کد بر روی برد خود،ابتدا نرم افزار Arduino IDE را بازکرده و تمام نوشته های داخل آن را پاک کرده و کد بالا را کپی کنید؛سپس در محیط نرم افزار PASTE کنید.حال بر روی کلید کامپایل کلیک کنید و منتظر بمانید تا کد کامپایل شود سپس در نوار TOOLS  برد و پورت مورد نظر را انتخاب کنید حال بر روی کلید آپلود کلیک کنید و منتظر بمانید تا آپلود شود.

توضیحات کد

int LS = 2;    // left sensor
int RS = 3;    // right sensor

در این دو خط ما پین های مربوط به سنسور های مادون قرمز را مشخص کرده ایم که سنسور راست به پین ۳ و سنسور چپ به پین ۲ متصل می باشد.

int LM1 = 8;        // left motor
int LM2 = 9;       // left motor
int RM1 = 10;     // right motor
int RM2 = 11;    // right motor
int ENBL = 5;   //left motor PWM
int ENBR = 6;  //right motor PWM

در این ۶ خط پین های مربوط به ماژول درایور L298N مشخص شده اند .

pinMode(LS,  INPUT);
  pinMode(RS,  INPUT);

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

pinMode(LM1, OUTPUT);
  pinMode(LM2, OUTPUT);
  pinMode(RM1, OUTPUT);
  pinMode(RM2, OUTPUT);
  pinMode(ENBL,OUTPUT);
  pinMode(ENBR,OUTPUT);

در این شش خط پین هایIN1,IN2,IN3,IN4,ENA,ENB ماژول درایور L298N به صورت خروجی تعریف شده اند.

  int vall = digitalRead(LS);
  int valr = digitalRead(RS);

خواندن مقدار پین دیجیتال سنسور ها و ذخیره کردن مقدار پین دیجیتال سنسور سمت چپ در متغییر vall و سنسور سمت راست در متغییر  valr.

MoveForward();
Stop();
TurnRight();
TurnLeft();

فانکشن هایی که در ادامه در مورد آن ها توضیح خواهیم داد.

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

void MoveForward()
    {        
    digitalWrite(LM1,LOW);
    digitalWrite(LM2,HIGH);
    digitalWrite(RM1,LOW);
    digitalWrite(RM2,HIGH);
    analogWrite(ENBL,motorspeed);
    analogWrite(ENBR,motorspeed);
    delay(20);
    }
void TurnRight()
{
    digitalWrite(LM1,LOW);
    digitalWrite(LM2,HIGH);
    digitalWrite(RM1,HIGH);
    digitalWrite(RM2,LOW);
    analogWrite(ENBL,motorspeed);
    analogWrite(ENBR,motorspeed);
    delay(20); 
}

void TurnLeft()
{
    digitalWrite(LM1,HIGH);
    digitalWrite(LM2,LOW);
    digitalWrite(RM1,LOW);
    digitalWrite(RM2,HIGH);
    analogWrite(ENBL,motorspeed);
    analogWrite(ENBR,motorspeed);
    delay(20);
}

void Stop()
{
    digitalWrite(LM1,LOW);
    digitalWrite(LM2,LOW);
    digitalWrite(RM1,LOW);
    digitalWrite(RM2,LOW);
    delay(20);
}

فانکشن های استفاده شده در این کد برابر با حرکت به جلو،چرخش به راست،چرخش به چپ و ایست می باشد که به ترتیب با نام های MoveForward,TurnRight,TurnLeft,Stop نام گذاری شده اند.

ایراد های رایج و چگونگی رفع آن:

پلاریته موتور ها: اگر مشاهده کردید که موتور ها برعکس عمل می کنند یعنی به جای جلو،عقب می روند یا به جای عقب،جلو می روند،به سادگی دو سر آن را به صورت معکوس به ماژول درایور متصل کنید.توجه داشته باشید که شاید یکی از موتور ها درست باشد و دیگری ایراد داشته باشد؛پس حتما مراقب این نکته باشید.

پتانسیومتر ماژول TCRT5000: پتانسیومتر ماژول TCRT5000 تعیین می کند چه تا چه مقدار تیرگی برابر با ۱ و چه مقدار روشنایی برابر با ۰ باشد.اگر ربات درست کار نکرد این مورد را هم بررسی کنید و مطمئن شوید که پتانسیومتر آن بر نیمه های خود باشد نه بر ابتدا یا انتها خود.

سخن پایانی

در این پروژه آموختیم چگونه یک ربات مسیریاب ساده و کاربردی را با کمترین هزینه و زمان درست کنیم.

اگرسوال یا ایرادی در مورد این پروژه داشتید حتما با ما در میان بگذارید تا ما در کمترین زمان ممکن به آن رسیدگی کنیم.امیدواریم از این پروژه لذت برده باشید.

نمایش بیشتر

‫۲۰ نظرها

    1. با سلام
      سه پایه استفاده میشه چون پایه چهارن نربوط به خروجی آنالوگ این ماژول هست که در این پروژه کارایی ندارد.

  1. با سلام و درود خدمت شما؛
    آقا من کوی رو که گذاشته بودید تو سایت رو زدم در نرم افزار، اما خطا میده میگه که “سنسور ها نوع خاصی را نشان نمیدهند” همون اولین خط رو ترور میده که نوشته بودید ;into Los =2،
    چکار باید کنم ،
    ممنون میشم راهنمایی کنید..🙏

  2. سلام.من تمام قسمت هارو درست انجام دادم.وقتی تک تک با این مدار برنامه میدم قشنگ کار مکنه ولی برنامه اصلی ک ربات باید حرکت کنه نمیشه

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

    1. سلام و عرض خسته نباشید.
      برای مشکل شما احتمالات زیر وجود دارد لطفا آن ها را بررسی کنید:
      ۱.احتمال دارد پتانسیومترهای روی پتانسیومتر تنظیم نباشند و چیزی را تشخیص نمی دهند. لطفا آن ها را تنظیم کنید
      ۲.احتمال دارد پایه های ENBL و ENBL درست به درایور متصل نشده باشد.
      ۳.از صحت عملکرد درایو مطمئن شوید.
      برای تست کد اگر به پایه های ENBL و ENBL یک ال ای دی با مقاومت ۲۲۰ اهم متصل کنید. اگر جلو را بزنید با نور کمتر ازمعمول روشن و اگر عقب را بزنید باید خاموش شود.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا