ساخت یک ربات ساده برای تازه کارها

در این قسمت می خواهیم یک آموزش گام به گام برای ساخت رباتی ساده برای تازه کارها ارایه دهیم. با انجام این مراحل می توانید اولین ربات خود را به سادگی با آردوینو بسازید. با ما همراه شوید.

 

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

برد آردوینو Uno × 1
سروو موتور × 1
برد بورد × 1
درایور موتور L293D × 1
موتور گیربکس دار به همراه چرخ × 2
سنسور فاصله آنالوگ GP2D12 و یا GP2Y0A02YK × 1
سیم جامپر × 1
جاباتری قلمی چهارتایی × 1
کابل USB × 1
چرخ کاستور castor × 1
باتری 1.5 ولتی × 4
باتری 9 ولتی × 1
کانکتور باتری × 1
صفحه آکریلیک × 1
نوار چسب دو طرفه × 1
هویه × 1
سیم لحیم × 1

طرز ساخت:


در ابتدا سیم های برد بورد را به موتور های دنده ای لحیم کنید. این کار اتصال موتور ها را به برد بورد آسان تر می کند.

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

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

 

حال دو موتور را بر روی صفحه در قسمت عقب ربات قرار داده و توسط چسب دو طرفه بچسبانید.

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

سپس برد آردوینو و برد بورد را طبق عکس فوق بر روی صفحه ی آکریلیک ثابت کنید.

حال باتری 9 ولت متصل به کانکتور(دارای DC plug ) و باتری های قلمی متصل به کانکتور (بدون DCPlug) را مطابق شکل بر روی بدنه ی ربات قرار دهید. از Dc plug برای اتصال باتری 9 ولتی به آردوینو استفاده می شود.

سنسور فاصله بر روی سروو قرار خواهد گرفت اما قبل از آن لازم است تا سروو در ناحیه ی مرکزی خود قرار گیرد(90 درجه).

اتصالات و سیم بندی سیستم:

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

اتصالات منبع تغذیه:

آردوینو از یک منبع تغذیه 9 ولتی استفاده کرده و توسط رگولاتور داخلی آن را به 5 ولت رگوله می کند. بنابراین باتری 9 ولتی را توسط dc plug به آردوینو متصل می کنیم. از باتری های قلمی که 6 ولت را تامین می کنند برای سروو و موتورها استفاده می شود. منفی باتری های قلمی یا در واقع Ground باتری 6 ولتی باید به Ground آردوینو متصل شود.

اتصالات سنسور فاصله:

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

همانطور که گفته شد می توان از هر دو مدل سنسور GP2D12 و یا GP2Y0A02YKاستفاده نمود. تنها تفاوت این دو سنسور در محدوده ی مسافت قابل اندازه گیری آن هاست.

GP2D12 مسافت های بین10 سانتی متر تا 80 سانتی متر و GP2Y0A02YK مسافت های بین 20 سانتی متر تا 150 سانتی متر را اندازه گیری می کند.

از این سنسورها سه سیم خارج می شود.

سیم قرمز به پین +5V آردوینو

سیم قهوه ای یا سیاه به پین GND آردوینو

سیم سفید یا زرد یا نارنجی به پین ورودی آردوینو. در اینجا به پین آنالوگ (Analog pin 0)

اتصالات سروو:

پایه سیگنال سروو(سیم سفید یا قرمز) به پین دیجیتال شماره 8 آردوینو (digital pin 8)

پایه vcc سروو به سر مثبت باتری های قلمی (+6V)

پایه GND سروو (سیم سیاه یا قهوه ای) به پین GND آردوینو

اتصالات موتورها و درایور موتور L293D:

موتورها توسط پین های دیجیتال شماره ی 4، 5، 6 و 7 درایور موتور L293D درایو شده و از منبع 6 ولتی تغذیه می شوند. اتصالات درایور موتور را می توانید از عکس مربوط به سیم بندی سیستم به طور کامل دریافت کنید.

برنامه نویسی:

اولین چیزی که برای برنامه ریزی آردوینو نیاز است دانلود نرم افزار آردوینو (IDE) و نصب آن است. نرم افزار آردوینو را می توانید از لینک زیر دانلود نموده و همچنین با استفاده از آموزش گام به گام نصب آن، این نرم افزار را نصب کنید.

 دانلود نرم افزار آردوینو

آموزش گام به گام نصب نرم افزار آردوینو

یادآور می شویم که هنوز سنسور فاصله را بر روی سروو نصب نکرده ایم. در ابتدا باید برنامه ی انتقال سروو به مکان مبدا را بنویسیم و یا اصطلاحا سروو را کالیبره کنیم. پس از اینکه از اتصال هر دو منبع تغذیه در مدار اطمینان حاصل کردید نرم افزار آردوینو را باز نموده و در صفحه ی جدیدی که اسکچ (Sketch) نام دارد کد زیر را کپی کنید. این کد برای کالیبره کردن سروو به کار می رود.


#include     // includes the servo library
Servo myservo;                                 // creates a servo object
voidsetup()
{
  myservo.attach(8);                       // attaches the servo to digital pin 8
}
voidloop()
{
  myservo.write(90);                     // moves the servo to 90 degree.
  delay(700);                               // wait for the servo to finish its rotation
}
 

 این کد را از قسمت *Sketch → Verify/Compile* کامپایل کنید. بعد از کامپایل کردن برنامه جمله ی DoneCompiling دیده می شود.

با استفاده از کابل USB آردوینو خود را به لپ تاپ متصل کنید. پس از اتصال می توانید دستگاه های متصل به لپ تاپ را از قسمت *Tools → Serial Port* مشاهده کنید. دستگاه خود را انتخاب کنید. اکنون قادر خواهید بود برنامه ی (اسکچ) خود را روی آردوینو آپلود کنید.

برای آپلود کردن برنامه به سادگی می توان دکمه upload را از قسمت toolbar فشار دهید و یا از قسمت *File → Upload* فایل خود را بر آردوینو آپلود کنید. در این هنگام چراغ های مربوط به فرستادن و گرفتن داده بر روی آردوینو شروع به چشمک زدن کرده و سپس جمله ی Done Uploading بر روی اسکچ نمایان می شود.

پس از کالیبره کردن سروو می توانیم سنسور فاصله را بر روی آن قرار داده به طوریکه سنسور ناحیه ی مقابل ربات را ببیند و آن را با چسب دو طرفه بر روی سروو ثابت کنیم.

حال نوبت به خواندن مقادیر از روی سنسور فاصله می رسد. برای این منظور کد زیر را در همان صفحه کپی کرده و دوباره برنامه را کامپایل و آپلود نمایید. پس از آپلود کردن برنامه از گزینه ی *Tools → SerialMonitor*می توانید مقادیر فاصله ی اندازه گیری شده توسط سنسور و همچنین عدد برگردانده شده توسط آن را مشاهده کنید. این عدد بین 0 تا 1023 قرار داشته و هرچه این عدد کمتر باشد فاصله ی اندازه گیری شده توسط سنسور بیشتر است.


int sensorpin = 0;                 // analog pin used to connect the sharp sensor
int val = 0;                 // variable to store the values from sensor(initially zero)
voidsetup()
{
  Serial.begin(9600);               // starts the serial monitor
}
voidloop()
{
  val = analogRead(sensorpin);       // reads the value of the sharp sensor
  Serial.println(val);               // prints the value of the sensor to the serial monitor
}
اکنون برنامه ی مربوط به چرخش موتورها را می توانید از زیر کپی کنید.
int motor_pin1 = 4;                 //define the pins to which motor wires are connected
int motor_pin2 = 5;
voidsetup ()
{
  pinMode(motor_pin1,OUTPUT);            // set the motor pins as output
  pinMode(motor_pin2,OUTPUT);
}
voidloop()
{
  digitalWrite(motor_pin1,HIGH);
  digitalWrite(motor_pin2,LOW);
}
 

 

این کد موتور را در راستای جلو و عقب می چرخاند. اگر موتور عقب گرد می چرخد می توانید کد زیر را کپی نمایید. یعنی جای پین 1 و 2 را از لحاظ LOW و HIGH بودن عوض کنید.


int motor_pin1 = 4;                 //define the pins to which motor wires are connected
int motor_pin2 = 5;
voidsetup ()
{
  pinMode(motor_pin1,OUTPUT);            // set the motor pins as output
  pinMode(motor_pin2,OUTPUT);
}
voidloop()
{
  digitalWrite(motor_pin1,HIGH);
  digitalWrite(motor_pin2,LOW);
}
 

 

همچنین برای راه اندازی موتور دوم می توانید کد زیر را کپی کنید.


int motor_pin3 = 6;                  //define the pins to which motor wires are connected
int motor_pin4 = 7;
voidsetup ()
{
  pinMode(motor_pin3,OUTPUT);                   // set the motor pins as output
  pinMode(motor_pin4,OUTPUT);
}
voidloop()
{
  digitalWrite(motor_pin3,HIGH);
  digitalWrite(motor_pin4,LOW);
}
 

 

برای موتور دوم هم در صورت عقب گرد بودن همانند موتور اول باید کد را تغییر دهید.

ممکن است این سوال برای شما پیش آید که ربات چگونه می تواند به راست یا چپ بچرخد؟ پاسخ این پرسش به شرح زیر است:

برای حرکت مستقیم باید هر دو چرخ با سرعت یکسان به جلو حرکت کنند.

برای حرکت به عقب باید هر دو چرخ با سرعت یکسان به عقب حرکت کنند.

برای حرکت به سمت چپ باید چرخ سمت چپ به عقب و چرخ سمت راست به جلو حرکت کند.

برای حرکت به سمت راست باید چرخ سمت راست به عقب و چرخ سمت چپ به جلو حرکت کند.

مرحله ی آخر در برنامه ریزی ربات مربوط به جلوگیری از برخورد ربات به موانع است. کد زیر را در اسکچ کپی کرده و آن را کامپایل و آپلود کنید.


#include                                   //includes the servo library
int motor_pin1 = 4;
int motor_pin2 = 5;
int motor_pin3 = 6;
int motor_pin4 = 7;
int servopin = 8;
int sensorpin = 0;
int dist = 0;
int leftdist = 0;
int rightdist = 0;
int object = 500;             //distance at which the robot should look for another route                          
Servo myservo;
voidsetup ()
{
  pinMode(motor_pin1,OUTPUT);
  pinMode(motor_pin2,OUTPUT);
  pinMode(motor_pin3,OUTPUT);
  pinMode(motor_pin4,OUTPUT);
  myservo.attach(servopin);
  myservo.write(90);
  delay(700);
}
voidloop()
{
  dist = analogRead(sensorpin);               //reads the sensor
  if(dist < object) {                         //if distance is less than 550
   forward();                                  //then move forward
  }
  if(dist >= object) {               //if distance is greater than or equal to 550
    findroute();
  }
}
void forward() {                            // use combination which works for you
   digitalWrite(motor_pin1,HIGH);
   digitalWrite(motor_pin2,LOW);
   digitalWrite(motor_pin3,HIGH);
   digitalWrite(motor_pin4,LOW);
   return;
 }
void findroute() {
  halt();                                             // stop
  backward();                                       //go backwards
  lookleft();                                      //go to subroutine lookleft
  lookright();                                   //go to subroutine lookright
                                      
  if ( leftdist < rightdist )
  {
    turnleft();
  }
else
 {
   turnright ();
 }
}
void backward() {
  digitalWrite(motor_pin1,LOW);
  digitalWrite(motor_pin2,HIGH);
  digitalWrite(motor_pin3,LOW);
  digitalWrite(motor_pin4,HIGH);
  delay(500);
  halt();
  return;
}
void halt () {
  digitalWrite(motor_pin1,LOW);
  digitalWrite(motor_pin2,LOW);
  digitalWrite(motor_pin3,LOW);
  digitalWrite(motor_pin4,LOW);
  delay(500);                          //wait after stopping
  return;
}
void lookleft() {
  myservo.write(150);
  delay(700);                                //wait for the servo to get there
  leftdist = analogRead(sensorpin);
  myservo.write(90);
  delay(700);                                 //wait for the servo to get there
  return;
}
void lookright () {
  myservo.write(30);
  delay(700);                           //wait for the servo to get there
  rightdist = analogRead(sensorpin);
  myservo.write(90);                                 
  delay(700);                        //wait for the servo to get there
  return;
}
void turnleft () {
  digitalWrite(motor_pin1,HIGH);       //use the combination which works for you
  digitalWrite(motor_pin2,LOW);      //right motor rotates forward and left motor backward
  digitalWrite(motor_pin3,LOW);
  digitalWrite(motor_pin4,HIGH);
  delay(1000);                     // wait for the robot to make the turn
  halt();
  return;
}
void turnright () {
  digitalWrite(motor_pin1,LOW);       //use the combination which works for you
  digitalWrite(motor_pin2,HIGH);    //left motor rotates forward and right motor backward
  digitalWrite(motor_pin3,HIGH);
  digitalWrite(motor_pin4,LOW);
  delay(1000);                              // wait for the robot to make the turn
  halt();
  return;
}
 

 

با توجه به این کد حرکت ربات به مسافت اندازه گیری شده توسط سنسور بستگی دارد. همانطور که قبلا گفته شد، عدد برگردانده شده توسط سنسور یک عدد بین 0 تا 1023 است. اگر این عدد کمتر از 500 باشد به این مفهوم است که مانعی در سر راه ربات وجود ندارد و ربات به حرکت مستقیم خود ادامه می دهد اما اگر این عدد بزرگتر یا مساوی با 500 باشد ربات باید به دنبال راستای جدیدی برای حرکت خود باشد زیرا به مانع نزدیک شده است. در ابتدا ربات متوقف شده و کمی به عقب بر می گردد، سروو کمی به سمت چپ می چرخد و سنسور فاصله ی جدید تا مانع رویروی خود را ثبت می کند، سپس سروو به سمت راست چرخیده و دوباره سنسور فاصله را از مانع مقابل خود ثبت می کند، این دو مقدار ثبت شده توسط سنسور با هم مقایسه می شوند و در آخر ربات به سمتی حرکت می کند که از مانع فاصله ی بیشتری دارد.

و دوباره این مراحل از ابتدا اجرا می گردد.

 

 

افزودن نظر

دسته بندی ها

Icon Arduino
آردوینو
Icon Raspberry Pi
رسپبری پای
Icon Launchpad
لانچ پد
Icon St
برد های دیسکاوری
Icon Sensors
سنسورها
Icon Other
سایر پروژه ها

جدیدترین آموزش ها


محبوبترین آموزش ها


شماره تماس: ۵۹ ۸۳ ۰۲ ۸۸ ۰۲۱

info@caferobot.ir

ایران | تهران

ما را در شبکه های اجتماعی دنبال کنید

ورود

ثبت


x

مطلب مفیدی بود؟

برای دریافت جدیدترین آموزش ها و خبرها در ایمیل خود، در خبرنامه کافه ربات عضو شوید