آموزش ساخت یک ربات ساده با آردوینو - قسمت سوم
با عرض سلام خدمت دوستان عزیز
قسمت سوم آموزش ساخت ربات ساده برای تازه کارها رو امروز براتون میذاریم. امیدواریم در جهت یادگیری رباتیک بتونیم نقش موثری داشته باشیم. آموزش کامل ساخت این ربات به همراه سایر آموزش های کاربردی برای ساخت ربات های مختلف رو در سایت کافه ربات می تونید ببینید.
تخصصی ترین مرجع آموزش رباتیک | پروژه رباتیک| آموزش آردوینو
آموزش رباتیک | آموزش ساخت ربات ساده با استفاده از آردوینو
برنامه نویسی ربات:
اولین چیزی که برای برنامه ریزی آردوینو نیاز است دانلود نرم افزار آردوینو (IDE) و نصب آن است. نرم افزار آردوینو را می توانید از لینک زیر دانلود نموده و همچنین با استفاده از آموزش گام به گام نصب آن، این نرم افزار را نصب کنید.
http://arduino.cc/en/Main/Software
http://arduino.cc/en/Guide/HomePage
یادآور می شویم که هنوز سنسور فاصله را بر روی سروو نصب نکرده ایم. در ابتدا باید برنامه ی انتقال سروو به مکان مبدا را بنویسیم و یا اصطلاحا سروو را کالیبره کنیم. پس از اینکه از اتصال هر دو منبع تغذیه در مدار اطمینان حاصل کردید نرم افزار آردوینو را باز نموده و در صفحه ی جدیدی که اسکچ (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 باشد ربات باید به دنبال راستای جدیدی برای حرکت خود باشد زیرا به مانع نزدیک شده است. در ابتدا ربات متوقف شده و کمی به عقب بر می گردد، سروو کمی به سمت چپ می چرخد و سنسور فاصله ی جدید تا مانع رویروی خود را ثبت می کند، سپس سروو به سمت راست چرخیده و دوباره سنسور فاصله را از مانع مقابل خود ثبت می کند، این دو مقدار ثبت شده توسط سنسور با هم مقایسه می شوند و در آخر ربات به سمتی حرکت می کند که از مانع فاصله ی بیشتری دارد.
و دوباره این مراحل از ابتدا اجرا می گردد.