الثلاثاء، 12 نوفمبر، 2013

الروبوت المتفادي للحواجز باستخدام حساس الأشعة تحت الحمراء 1

الروبوت المتفادي للحواجز Avoiding IR Robot 1


L298 Motor driver



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




ما سنقوم ببناءه هو روبوت متفادي للحواجز " Avoiding Robot " هذا الروبوت يمكنه تحسس الأجسام التي أمامه و تفاديها , مستخدماً حساس الأشعة تحت الحمراء SHARP 2Y0A21




في ما يلي في هذا المقال سستعرف على كل المفاهيم المرتبطة بهذا الروبوت .

في البداية , ماذا سنحتاج لتنفيذ هذه التجربة ؟ 

القطع المطلوبة لتنفيذ هذا الروبوت قليلة و سهلة التوافر , و طريقة ربطها بعضها سهلة ايضاً , القطع هي 

1) أردوينو Uno او Dumilanova  .



2) هيكل الروبوت Magician Chassis من شركة Sparkfun , هيكل سهل التركيب ,و يمكن استخدام هيكل ذو 4 محركات ذو عزم و تحكم أفضل من ذو العجلين , لكنه يستهلك طاقة مضاعفة  





3)  L298 Motor Sheild و هو غطاء مصمم خصيصاً ليتناسب مع بطاقات الأردوينو المختلفة , يحتوي على دارة متكاملة هي L298


4) حساس الأشعة تحت الحمراء IR 
SHARP 2Y0A21





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


5)بطاريتان , واحدة لتغذية المحرك "يجب ان تكون أكبر من 5 فولت " و الثانية  بطارية 9 فولت مع الحاضنة  لتغذية الأردوينو .
6) قطع اخرى , مثل  اسلاك توصيل , ستحتاج لأسلاك توصيل female-female عدد 4 , و ايضاً ستحتاج ل dc jack male+female لتسهيل توصيل البطارية مع غطاء الأردوينو الخاص بالمحرك  , و اخيراً pin header male عدد 1 .

توصيل القطع : قد تحتاج فقط لعكس التوصيلات بحيث تقلب السلك الأحمر مع السلك الأزرق لكلا المحركين , و لا ضرورة لتوصيل 5فولت بين غطاء قيادة المحرك L298 Module و بين الأردوينو .



التوصيلة لروبوت بمحركين 
التوصيل لروبوت بأربع محركات 

توصيلة الحساس مع الأردوينو

هذا الحساس يعطي خرجاً متناسباً تناسباً عكسياً مع المسافة .

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



/*
// This code to drive 2 DC Motor using L298 Module
// Connect :

IN1 >>>> D3
IN2 >>>> D5
IN3 >>>> D6
IN4 >>>> D9

code written For 
http://www.genotronex.com

Mohannad Rawashdeh

*/
const int IN1=3;
const int IN2=5;
const int IN3=6;
const int IN4=9;
void setup() {
  // fIRST , define the Motor's pin as an OUTPUT
pinMode( IN1 ,OUTPUT);// Right Motor 1st wire
pinMode( IN2 ,OUTPUT);// Right Motor 2nd wire
pinMode( IN3 ,OUTPUT);// left Motor 1st wire
pinMode( IN4 ,OUTPUT);// left Motor 2nd wire

}
void forward(int Speed){
  //When we want to let Motor To Rotate clock wise
  // just void this part on the loop section .
 
  analogWrite(IN1,0);
  analogWrite(IN2,Speed);
  analogWrite(IN3,Speed);
  analogWrite(IN4,0);
}
void backward(int Speed){
  //When we want to let Motor To Rotate Counter clock wise
  // just void this part on the loop section .
  analogWrite(IN1,Speed);
  analogWrite(IN2,0);
  analogWrite(IN3,0);
  analogWrite(IN4,Speed);
}
void left(int Speed){
  //When we want to let Motor To Rotate Counter clock wise
  // just void this part on the loop section .
  analogWrite(IN1,0);
  analogWrite(IN2,Speed);
  analogWrite(IN3,0);
  analogWrite(IN4,Speed);
}
void right(int Speed){
  //When we want to let Motor To Rotate Counter clock wise
  // just void this part on the loop section .
  analogWrite(IN1,Speed);
  analogWrite(IN2,0);
  analogWrite(IN3,Speed);
  analogWrite(IN4,0);
}

void Stop(){
  //When we want to let Motor To Rotate clock wise
  // just void this part on the loop section .
  analogWrite(IN1,0);
  analogWrite(IN2,0);
  analogWrite(IN3,0);
  analogWrite(IN4,0);
}

void loop() {
 //Rise Up
 forward(2000);delay(2000);backward(200);delay(2000); right(200);delay(2000); left(200);delay(2000);Stop();delay(500);
}

و هذا البرنامج الكامل للمشروع .
 

//Name :Mohannad Rawashdeh .
//Date "1/7 /2013 3:00pm
// Description: This  Code for SHARP IR 2Y0A21 
// Connect V0 To analog pin A0
// Programmed for http://www.genotronex.com/
//****************************************************************
float Distance1;
const int IN1=3;
const int IN2=5;
const int IN3=6;
const int IN4=9;
unsigned int speed_value=150; // 250 of 255
boolean state=true;
void setup() {
  // initialize serial communication at 9600 bits per second:
    // fIRST , define the Motor's pin as an OUTPUT
pinMode( IN1 ,OUTPUT);// Right Motor 1st wire
pinMode( IN2 ,OUTPUT);// Right Motor 2nd wire
pinMode( IN3 ,OUTPUT);// left Motor 1st wire
pinMode( IN4 ,OUTPUT);// left Motor 2nd wire
  Serial.begin(9600);
}

void sesnorRead(){
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  float voltageValue=sensorValue*4.88E-3;
  float inverseDistance1=(0.05*voltageValue)-0.013;
  Distance1=1/inverseDistance1;  
  Serial.print("Distance 1= ");
  Serial.print(Distance1);
  Serial.println(" cm ");
  delay(100);        // delay in between reads for stability 
}
void forward(int Speed){
  //When we want to let Motor To Rotate clock wise
  // just void this part on the loop section .
 
  analogWrite(IN1,0);
  analogWrite(IN2,Speed);
  analogWrite(IN3,Speed);
  analogWrite(IN4,0);
}
void backward(int Speed){
  //When we want to let Motor To Rotate Counter clock wise
  // just void this part on the loop section .
  analogWrite(IN1,Speed);
  analogWrite(IN2,0);
  analogWrite(IN3,0);
  analogWrite(IN4,Speed);
}
void left(int Speed){
  //When we want to let Motor To Rotate Counter clock wise
  // just void this part on the loop section .
  analogWrite(IN1,0);
  analogWrite(IN2,Speed);
  analogWrite(IN3,0);
  analogWrite(IN4,Speed);
}
void right(int Speed){
  //When we want to let Motor To Rotate Counter clock wise
  // just void this part on the loop section .
  analogWrite(IN1,Speed);
  analogWrite(IN2,0);
  analogWrite(IN3,Speed);
  analogWrite(IN4,0);
}

void Stop(){
  //When we want to let Motor To Rotate clock wise
  // just void this part on the loop section .
  analogWrite(IN1,0);
  analogWrite(IN2,0);
  analogWrite(IN3,0);
  analogWrite(IN4,0);
}

// the loop routine runs over and over again forever:
void loop() {
 sesnorRead();
 if(Distance1>=25){ //No need to return
  //Go forward
  forward(speed_value); 
  state=!state;
 }
 if(Distance1<25){
   Serial.println("Warning ! ");
   if(state==true){
     right(speed_value);
     delay(20);
   }
   if(state==false){
    left(speed_value);
    delay(20);
   }
 }
 
}


و هذا الفيديو يوضح كيف يعمل هذا الروبوت , رائع أليس كذلك ؟




9 التعليقات :

  1. اريد معرفه اسم الshield التجارى حتى اتمكن من شرائه؟؟؟؟؟؟؟

    ردحذف
    الردود
    1. اسمه التجاري L298 Motor driver Module

      حذف
  2. ايه اسم البرنامج بتاع برمجة الروبوت

    ردحذف
  3. لو سمحت انا عندي الدارة l293 وعايز برمجة ليها عشان البرمجة دي مش شغالة عندي

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

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

    ردحذف
  6. هل من الممكن استخدام حساس من نوع اخر ؟لنفس الدائرة

    ردحذف

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