الأحد، 10 نوفمبر، 2013

الروبوت المتفادي للحواجز باستخدام الألتراسونيك 2

الروبوت المتفادي للحواجز 


Avoiding Ultrasonic Robot 

L293 Motor driver Module


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

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

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

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

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

2) هيكل الروبوت Magician Chassis من شركة 

Sparkfun , هيكل سهل التركيب .


او الهيكل رباعي العجلات 4Wheel  المميز ذو العزم العالي و 

الدقة الأكبر في الحركة .




3) Arduino L293 Motor Sheild و هو غطاء مصمم خصيصاً ليتناسب مع بطاقات الأردوينو المختلفة , يحتوي على دارة متكاملة هي L293 خاصة لقيادة المحركات الكهربائية بالأضافة لمسجل الازاحة 74595 لزيادة مجال التحكم بسرعة المحركات .


4) حساس الأمواج فوق الصوتية Ultrasonic HC-SR04






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

استخدم الليثيوم كخيار أول و أفضل من حيث الآداء

5)بطاريتان , واحدة لتغذية المحرك "يجب ان تكون أكبر من 5 فولت " و الثانية  بطارية 9 فولت مع الحاضنة  لتغذية الأردوينو .

غذي بها الأردوينو , حتى تكون تغذية الروبوت منفصلة عن تغذية المحركات 

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

توصيل القطع : 

1) قم بتجميع هيكل الروبوت .
2) قم بتوصيل الpin header male  مع غطاء الأردوينو الخاص بالمحرك .
3) قم بوضع غطاء الأردوينوالخاص بالمحرك فوق بطاقة الأردوينو كما في الصورة .
4) ثبت الألتراسونيك في الأمام و قم بتوصيله كالأتي 

tri >>>pin15 "A1 "
echo>>pin16 "A2"
vcc>> vcc 
Gnd>>Gnd

ستحتاج لعملية لحام بسيطة ل Pin header حتى يسهل عليك تثبيت اطراف الألتراسونيك بالغطاءShield و ستراها بوضوح اسفل يمين الغطاء .

5) ثبت البطاريات بهيكل الروبوت , قم بعملية لحام ل ل dc jack female  مع سلكين و توصيلهما لمداخل التغذية مع غطاء الأردوينوالخاص بالمحرك , ليسهل تشغيل و ايقاف الروبوت .


6)الشكل ادناه يوضح طريقة توصيل المحركين بالأردوينو



7) حمل الكود من مقالة غطاء قيادة المحرك  L293 لتتأكد نم ان توصيلك صحيح .

8) للتأكد حمل برنامج الألتراسونيك من هذا المقال لتتأكد من تثبيت الالتراسونيك صحيح " فقط غير السطر :


 Ultrasonic ultrasonic (12,13);

إلى :
 Ultrasonic ultrasonic (15,16);


حتى يناسب توصيلك , و افتح شاشة العرض Serial monitor يجب ان تتغير القراءة كلما اقتربت يدك من الاتراسونيك .

9) حمل الكود الرئيسي التالي :

// Avoiding robot Code
//Mohannad Rawashdeh - Amman-Jordan
//Genotronex@gmail.com

//................
 #include <AFMotor.h>
 #include  "Ultrasonic.h"
int distance = 0;
 AF_DCMotor right_motor(1, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
 AF_DCMotor left_motor (2, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
 Ultrasonic ultrasonic (15,16);
 void  setup () {
 left_motor.setSpeed(200);     // set the speed to 200/255
 right_motor.setSpeed(200);     // set the speed to 200/255
 delay(2000);
 }
 void Forward(int SpeedR,int SpeedL){
  left_motor.setSpeed(SpeedL);     // set the speed to 200/255
  right_motor.setSpeed(SpeedR);     // set the speed to 200/255
  left_motor.run(FORWARD);
  right_motor.run(FORWARD);      // turn it on going forward
 }
 void right(int SPEED,int timer){
  left_motor.setSpeed(SPEED);     // set the speed to 200/255
  right_motor.setSpeed(SPEED);     // set the speed to 200/255
  left_motor.run(BACKWARD);
  right_motor.run(FORWARD);      // turn it on going forward 
  delay(timer);
 }
 void left(){
  left_motor.run(FORWARD);
  right_motor.run(BACKWARD);      // turn it on going forward  
 }
 void backward(){
  left_motor.run(BACKWARD);
  right_motor.run(BACKWARD);      // turn it on going forward  
 }
 void Stop(){
  left_motor.run(RELEASE);
  right_motor.run(RELEASE);      // turn it on going forward  
 }
 void  loop ()
 {
  distance=ultrasonic.Ranging(CM);
  delay(80); 
  if(distance>30){
    Forward(110,130);
 }
 if(distance<=30 && distance>15){
     Forward(100,120);
 }
 if(distance<=20){
   Stop();
   delay(10);
   right(120,15);
 }
 }


و هذا فيديو بسيط يوضح طريقة عمل البرنامج .






8 التعليقات :

  1. بعد اذنك يا بشمهندس
    عماذا تعبر هذه الأرقام الواردة في الأمر البرمجي void loop
    " void loop ()
    {
    distance=ultrasonic.Ranging(CM);
    delay(80);
    if(distance>30){
    Forward(110,130);
    }
    if(distance<=30 && distance>15){
    Forward(100,120);
    }
    if(distance<=20){
    Stop();
    delay(10);
    right(120,15);
    } "

    و جزاكم الله خيرا

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

    ردحذف
    الردود
    1. أزال المؤلف هذا التعليق.

      حذف
    2. الامر خاضع لنوعية الحساس والفولتية التي يعمل عليها
      الاردوينو يعمل مع الحساس الذي فولتيته 5 فولت

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

    ردحذف
  4. يعطيك العافية .. تصميم رائع 
    طلب صغير :
    لو بدي اخلي الروبوت يمشي بخط مستقيم من نقطة الى نقطة اخرى معينة و يوجد عقبات امامه ويتفاداها ويكمل بخط مستقيم الى نقطة الهدف .. ما اللازم اضافته على الكود .. 
    مع جزيل الشكر 😊
    وما الفرق بين استخدام التراسونيك واحد او اكثر ..
    اريد استخدام 4 التراسونيك موزعين على زوايا الروبوت

    ردحذف
    الردود
    1. ممكن ذلك باستخدام encoder يربط مع المحرك لتحيد المسافة التي يسرها الروبوت مع تحدي الاحائيات التي يسير عليها الروبوت اما تعد الحساسات فلاتوجد مشكلة لكن العدد الفردي افضل فواحد في الامام واثنان كل منهما يميل عنه بزاوية 45 او 30 يمينا وشمالا وهذا يحدد تجاوز العائق يمينا او شمالا حسب مكان العائق والمسافة

      حذف
  5. بيجبلى ان فى مشكلة فى الجملة دى ;
    (distance=ultrasonic.Ranging(CM

    ردحذف

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