الخميس، 30 يناير، 2014

الروبوت متتبع الخط Line Follower 2

الروبوت متتبع الخط  2


Line Follower Robot 2



ضمن سلسلة الروبوت على مدونتنا , سنستعرض اليوم واحد من الروبوتات المسلية ألا و هو روبوت متتبع الخط Line Follower هذا الروبوت ذو فكرة مميزة جداً , و نستطيع تعريفه باختصار بأنه روبوت يستطيع السير على خط او مسار مرسوم له دون أن يخرج عنه ! هذا ليس سحراً بل حقيقة , سنتعرف أكثر على كيفية صناعة هذ الروبوت و مبدأ عمله و القطع المستخدمة لذلك و ايضاً برمجته بواسطة الأردوينو .




الفكرة العامة :

يرتكز هذا الروبوت على مبدأ أرتداد الأشعة تحت الحمراء Infrared حيث أن الأشعة ترتد عند ملامستها اجسام ذات لون معين , و في أحيان أخرى لا ترتد , هذه الأشعة ترتد عن اللون الأبيض و تُمتص بواسطة اللون الأسود .


سيكون اعتمادنا على هذه الخاصية في التحكم في مسار الروبوت .



القطع التي سنحتاجها لهذا الروبوت :


1) بطاقة أردوينو Uno 















6) بطارية ليثيوم 7.4 فولت

يمكن استخدام اي بطارية شرط ان لا تقل فولتيتها عن 7 فولت و تيار أكبر من 1000 ملي امبير .



7)اسلاك توصيل Jumper

قد تتسائل لماذا نستعمل دارتي قيادة l298 بدلاً من واحده كالمعتاد ؟! 

الجواب هو أن الروبوت Rover 5 يحتوي على 4 محركات كل محرك يستهلك بحدود 2 أمبير ! اذا تم ربط ال 4 محركات مع دارة قيادة واحدة فأنها سوف تنحرق لأنها تستطيع اعطاء 2أمبير لكل مخرج منها كحد أقصى , بأختصار قمنا بهذه الخطوة حتى نستطيع تامين تيار كافي للمحركات و لكي لا تنحرق دارة القيادة L298

غطاء الحساسات Sensor Shield الهدف منه توصيل كل الأسلاك عليه بسهولة بدلاً من استعمال ال bread board .


تغذية الأردوينو يمكن الحصول عليها من دارة القيادة L298 Module حيث انها مزودة بمنظم فولتية يعطي 5 فولت يمكن توصيلها بالأردوينو و تغذيتها به .
توصيل القطع :


ستحتاج لتحميل بعض المكتبات , رابط التنزيل من هنا , و يمكن وضعها ضمن مسار المكتبات في الأردوينو عبر قراءة هذه التدوينة .

البرمجة :


مبدأ عمل البرنامج هو تتم قراءة حساس تتبع الخط QTR8A كل مرة و مقارنة القيم المأخوذة في جملة شرط .

عندنا 4 قراءات لهذا الحساس ,  4 حساسات الأشعة تحت الحمراء IR , مثلاً اذا كانت قراءة الحساسين اللذين في المنتصف عالية فهذا دليل انهما على الخط و عليه يتحرك الروبوت نحو اليمين , و لو كانت قراءة الحساس اللذي للجهة اليمنى عالية فهذا دليل ان الروبوت انحرف باتجاه اليمين , و لكي يعود للمسار الصحيح عليه ان ينعطف يساراً , و بالعكس .

ستفهم الفكرة و تستوعبها عندما تبني الروبوت بنفسك و تكتشف المتعة في الموضوع .


البرنامج :

//Line Follower Robot 
//This code for Line Follower Robot
//using arduino And Rover 5 and QTR8 
//Written by :Mohannad Rawashdeh
//http://www.genotronex.com
//23/1/2014 6:00 pm
//....................................
#include <QTRSensors.h>
#include "L298_MOTOR.h"

#define NUM_SENSORS             4  // number of sensors used
#define NUM_SAMPLES_PER_SENSOR  4  // average 4 analog samples per sensor reading
#define EMITTER_PIN             2  // emitter is controlled by digital pin 2
#define Threshold 800              // threshold for line follower  
#define minValue 30
// sensors 0 through 5 are connected to analog inputs 0 through 5, respectively
QTRSensorsAnalog qtra((unsigned char[]) {0, 1, 2, 3}, 
NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
#define RightSensor 'R'
L298_MOTOR L298(5,4,6,7);
const int d = 7;
int SPEED=200; // 200/255 speed 
// void for Read QTR Sensor 
void QTR_Sensor_test(){
  qtra.read(sensorValues); 
  delay(5);//delay 5ms
  for(int i=0;i<4;i++){
  Serial.print("sensorValues[ ");
  Serial.print(i);
  Serial.print(" ] = ");
  Serial.println(sensorValues[i]);
  }
}
void Get_QTR_Order(){
   // 4 sensor 
   //sensorValues[0] ,sensorValues[1] ,sensorValues[2],sensorValues[3]
    qtra.read(sensorValues); 
   //.....................
   //forward movment state :
   if(sensorValues[3]<Threshold && sensorValues[2]>Threshold &&sensorValues[1]>Threshold &&sensorValues[0]<Threshold ){//0110
     L298.FORWARD(SPEED); 
   // Serial.println("forward ");
   }
   if(sensorValues[3]<Threshold && sensorValues[2]>Threshold &&sensorValues[1]<Threshold &&sensorValues[0]<Threshold ){//0100
    L298.FORWARD(SPEED); 
   // Serial.println("forward ");
   }
    if(sensorValues[3]<Threshold && sensorValues[2]>Threshold &&sensorValues[1]<Threshold &&sensorValues[0]<Threshold ){//0010
     L298.FORWARD(SPEED); 
   // Serial.println("forward ");
   }
   //......................
   //Right movment state 
   if(sensorValues[3]<Threshold && sensorValues[2]>Threshold &&sensorValues[1]>Threshold &&sensorValues[0]>Threshold ){//0111
   L298.TurnLEFT(SPEED); 
   delay(d);
   
    //Serial.println("Right ");
   }  
  if(sensorValues[3]<Threshold && sensorValues[2]<Threshold &&sensorValues[1]>Threshold &&sensorValues[0]>Threshold ){//0011
      L298.TurnLEFT(SPEED); 
      //Serial.println("Right ");
      delay(d);
  } 
 if(sensorValues[3]<Threshold && sensorValues[2]<Threshold &&sensorValues[1]<Threshold &&sensorValues[0]>Threshold ){//0001
      L298.TurnLEFT(SPEED); 
      //Serial.println("Right ");
      delay(d);
   }
   //......................
   //left movment state 
   if(sensorValues[3]>Threshold && sensorValues[2]>Threshold &&sensorValues[1]>Threshold &&sensorValues[0]<Threshold ){//1110
     L298.TurnRIGHT(SPEED); 
    //Serial.println("Left ");
    delay(d);
   }  
  if(sensorValues[3]>Threshold && sensorValues[2]>Threshold &&sensorValues[1]<Threshold &&sensorValues[0]<Threshold ){//1100
     L298.TurnRIGHT(SPEED);    
     //Serial.println("Left ");
     delay(d);
   }
   if(sensorValues[3]>Threshold && sensorValues[2]<Threshold &&sensorValues[1]<Threshold &&sensorValues[0]<Threshold ){//1000
     L298.TurnRIGHT(SPEED);    
     //Serial.println("Left ");
     delay(d);
   }
   //.....................
   // stop State condtion ! 
 //   if(sensorValues[3]>Threshold && sensorValues[2]<Threshold &&sensorValues[1]<Threshold &&sensorValues[0]>Threshold ){//1001
    if(sensorValues[3]>Threshold && sensorValues[2]>Threshold &&sensorValues[1]>Threshold &&sensorValues[0]>Threshold ){//1111
     L298.STOP(); 
   }
 }

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(13,OUTPUT);
for(int x=0;x<10;x++){
QTR_Sensor_test();
digitalWrite(13,1);
delay(250);
digitalWrite(13,0);
}
Serial.println("test Complete ");
}


void loop() {
  // put your main code here, to run repeatedly: 
 Get_QTR_Order(); 
}


ملاحظات :

اذا تحرك الروبوت بشكل خاطئ , تأكد من أمرين :

1) توصيل المحركات صحيح مع غطاء قيادة المحرك و ليس معكوس , جرب في البداية هذا البرنامج , يجب ان يدور الروبوت بشكل صحيح كما هو وارد في البرنامج  .
// check code for L298 Motor driver
//Written by : Mohannad Rawashdeh
//http://www.genotronex.com
//....................................
#include "L298_MOTOR.h"
L298_MOTOR L298(5,4,6,7);

void setup() {
  // put your setup code here, to run once:
L298.ENABLE_ACTIVE(12,13);
 // put your main code here, to run repeatedly: 
 L298.ENABLE_A('ON'); 
 L298.FORWARD(200);
delay(2000);
L298.BACKWARD(240);
delay(2000);
L298.LEFT(200);
delay(2000); 
L298.RIGHT(200);
delay(2000); 
L298.TurnRIGHT(200);
delay(2000); 
L298.TurnLEFT(200);
delay(2000); 
L298.STOP();
delay(2000); 


}

void loop() {
 
}


2) توصيل ال IR بشكل صحيح من A0-A3 و ان لم يعمل حتى بعد التأكد من التوصيل , قم بتوصيل LEDON من الحساس إلى المدخل D2 في الأردوينو , جرب هذا البرنامج يجب أن يعطي قراءة عالية جداً "أكثر من 900 " في حال اقتراب الحساس من اللون الأسود "و قراءة منخفضة جداً "تصل ل 50 " في حال اقترابه من اللون الأبيض .


//Line Follower Robot 
//This code for Line Follower Robot
//using arduino And Rover 5 and QTR8 
//Written by :Mohannad Rawashdeh
//http://www.genotronex.com
//23/1/2014 6:00 pm
//....................................
#include <QTRSensors.h>
#define NUM_SENSORS             4  // number of sensors used
#define NUM_SAMPLES_PER_SENSOR  4  // average 4 analog samples per sensor reading
#define EMITTER_PIN             2  // emitter is controlled by digital pin 2
#define Threshold 800              // threshold for line follower  
#define minValue 30
// sensors 0 through 5 are connected to analog inputs 0 through 5, respectively
QTRSensorsAnalog qtra((unsigned char[]) {0, 1, 2, 3}, 
NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
#define RightSensor 'R'
L298_MOTOR L298(5,4,6,7);
const int d = 7;
int SPEED=200; // 200/255 speed 
// void for Read QTR Sensor 
void QTR_Sensor_test(){
  qtra.read(sensorValues); 
  delay(5);//delay 5ms
  for(int i=0;i<4;i++){
  Serial.print("sensorValues[ ");
  Serial.print(i);
  Serial.print(" ] = ");
  Serial.println(sensorValues[i]);
  }
}
void setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);
}


void loop() {
 Serial.println(" -----------");
 digitalWrite(13,1);
 QTR_Sensor_test();
 delay(250);
digitalWrite(13,0);
Serial.println("test Complete ");
Serial.println(" -----------");
 delay(1000);
}

3) تأكد من أنك لا تغذي المحرك بفولتية أكبر من من 7.2 فولت لانه سيتسبب في تدمير المحرك و احتراقه "استخدمت تقنية PWM للتحكم بفولتية المحرك " .

و هذه مجموعة فيديوهات لعمل الروبوت , مشاهدة ممتعة .








7 التعليقات :

  1. أزال المؤلف هذا التعليق.

    ردحذف
  2. رااااااااااائع
    بس دلوقتي هل ينفع اعمل روبوت بيتخطى الحواجز بالالتراسونيك واستخدم التحكم عن بعد علشان اوصلة لأول نقطة في تراك هو يتتبعه
    يعني من
    Avoiding Ultrasonic Robot
    الى
    Line Follower
    باستخدام
    bluetooth_module وريموت كنترول
    وده هيتعمل على اردوينو واحدة بس والكود هيبقى عامل ازاي!؟

    ردحذف
    الردود
    1. هذا كود مركب و يعتمد على نوع القطع المستخدمة و براعتك في البرمجة .

      كم اردوينو سيستخدم؟ تعود لنوع القطع المستعملة و عدد المادخل التي تحتاجها من الأردوينو .

      جرب بنفسك , و شاركنا ما ستقوم به , ابدأ ببناء كل روبوت على حدا ثم ادمجهم معاً "لن يكون صعباً "

      حذف
  3. ما هى تقنية pwm معرفش ارجو الافاد وشكراا

    ردحذف
    الردود
    1. http://www.genotronex.com/2012/11/pwm.html

      حذف
    2. هناك موضوعان في المدونة بهذا العنوان " التعديل النبضي PWM " يمكنك البحث عنه بواسطة خيار البحث في المدونة

      حذف

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.