الخميس، 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 , مثلاً اذا كانت قراءة الحساسين اللذين في المنتصف عالية فهذا دليل انهما على الخط و عليه يتحرك الروبوت نحو اليمين , و لو كانت قراءة الحساس اللذي للجهة اليمنى عالية فهذا دليل ان الروبوت انحرف باتجاه اليمين , و لكي يعود للمسار الصحيح عليه ان ينعطف يساراً , و بالعكس .

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


البرنامج :







ملاحظات :

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

1) توصيل المحركات صحيح مع غطاء قيادة المحرك و ليس معكوس , جرب في البداية هذا البرنامج , يجب ان يدور الروبوت بشكل صحيح كما هو وارد في البرنامج  .






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






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

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








الاثنين، 27 يناير، 2014

المرسل-المستقبل اللاسلكي NRF24L01

المرسل-المستقبل  اللاسلكي  NRF24L01








في المشاريع الألكترونية المتنوعة , نحتاج احياناً لربط القطع لاسلكياً معاَ سواءاً لارسال البيانات او استقبالها او ارسال اشارات للتحكم في تشغيل او اغلاق القطع  اللتي بالمشروع ! 



تتعد هذه الوسائل ما بين السرعة و المدى و معدل صرف الطاقة .
من هذه الطرق :

1) Wifi .



2) Xbee .




3) RF Radio Frequency .



4)bluetooth .





الطريقة التي سنتحدث عنها هي القطعة nrf24L01 و هي قطعة ارسال لاسلكي تعمل كمرسل و كمستقبل معاً ! لها العديد من المزايا مثل 




1)العمل على التردد  2.4GHz 
2)سرعات متعددة لارسال البيانات "250kHz,1MB,2MB "
3)استهلاك قليل للطاقة 13.5mA-3.3V
4)وجود وضعية توفير الطاقة  900nA 

5)استخدام البروتوكول SPI في البرمجة 
6)امكانية الأستقبال لأكثر من اشارة من أكثر من مرسل في نفس الوقت Multiceiver  .

في النشرة الفنية لهذه القطعة كل المعلومات اللازمة للبرمجة بالأضافة لتصميم أمثل لهذه القطعة على لوحات الطباعة PCB

بشكل عام ربط هذه القطعة مع الأردوينو سهل و لكي تبدأ في برمجتها عليك أن تتعرف في البداية على البروتوكول SPI و هو بروتوكول اتصال سريع بين المتحكمات الأصغرية MCU و القطع الألكترونية الأخرى و يسمح بالأتصال و نقل البيانات بسرعة عالية جداً .

للتعرف أكثر على هذا البروتوكول يمكنك قراءة الرابط هنا .

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


1) بطاقة أردوينو اونو عدد 2 .
2)القطعة NRF24L01 عدد 2 .
3) اسلاك توصيل Female-male عدد 20 .

4) breadBoard عدد 1 .
5)مقاومة متغيرة  Potentiometer  50Kohm .
6) اسلاك توصيل Male-Male .

ما سنقوم بعمله هو قراءة قيمة المقاومة المتغيرة و ارسال هذه القيمة للطرف الأخر و عرض القيمة على شاشة السيريال .

التوصيل :
يفضل  استخدامك لاردوينو من الأصدار R3  لان القطعة nrf24L01 تعمل على فولتية تبلغ 3.3V و الأردوينو في مختلف اصداراتها تعمل على 5 فولت ! فالحل يكون بتوصيل مدخل IOREF ب 3.3V و هكذا يصبح مستوى الدخل-الخرج المنطقي للاردوينو 3.3V بدلاً عن 5V .


التوصيل سيعتمد على الأصدار الأحدث Arduino UNO R3.

دارة الأرسال :




دارة الأستقبال :


البرنامج  :

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



كتبت مكتبة خاصة لهذه القطعة تصلح لكل بطاقات الأردوينو UNO, MEGA,Leonardo ,DUE و سأقوم بنشرها بعد أن اتحقق من عمل كل الأوامر بشكل صحيح .

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

لمعرفة كيفية تثبيت المكتبات الجديدة في الأردوينو 

كود الأرسال:







كود الأستقبال:



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

الاثنين، 20 يناير، 2014

كيفيه وضع مكتبه جديده للأردوينو


كيفية تثبيت مكتبة جديدة للأردوينو 






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



لنأخذ كمثال تفعيل  مكتبه المترو"من مقاله المؤقتات الزمنيه والتحكم اللحظي بالمنافذ" .





بعد ان يتم تحميل المكتبه قم بفك ضغط الملف باختيار الامر الموضح بالصوره بعد الضغط على الزر الايمن للفأره على ايقونه الملف.



نفتح الملف الناتج ونختار الملف الذي يفتح مباشره لملفات الcpp وh 


اذا سننقل ملف Metro في هذا المثال 




نضعه في مسار مكتبات اردوينو 


ونغلق  واجهه الاردوينو , ثم نعيد فتح البرنامج وبذلك نكون قد فعّلنا المكتبه الجديده ويمكننا  التأكد من اختيار example من قائمه ملف كما في الصوره


وهكذا يمكننا استخدام هذه المكتبه الجديده ضمن الكود :)



هذه هي طريقة وضع المكتبات الجديدة في مسار المكتبات للأردوينو و تفعيلها للاستخدام .
ننوه لأمر آخر مهم وهو أنه قد تكون المشكله أن نسخه ال arduino IDE قديمه ولذلك يجب تحديث النسخه كل فتره  و يفضل استخدام نسخة 1.0 أو أعلى لكي تعمل المكتبات بشكل صحيح .


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

المؤقتات الزمنية و التحكم اللحظي بالمنافذ

المؤقتات الزمنية و التحكم اللحظي بالمنافذ 





كيف تجعل الأردوينو استجابة منافذ الأردوينو أسرع ؟هذا السؤال الذي طالما يطرح علي من قبل المتابعين للمدونة , هل يمكنني ذلك ؟ هل يمكنني ربط حساسات كثيرة مثل الالتراسونيك و الاشعة تحت الحمراء و المحركات مع  الأردوينو و جعلها تعمل بشكل واحد و بدون تأخير زمني ملحوظ ؟


في البداية يجب أن أشير إلى أن المتحكمات الأصغرية MCU برمجتها تعتمد على الأوامر السلمية Ladder أي تنفيذ البرامج يكون بالترتيب حسب موضع التعليمة بالكود , من الأعلى للأسفل , هناك استثناءات الأ وهي المقاطعات Interrupts و المؤقتات Timers و لأهميتهما أفردت لهما مواضيع منفصلة في المدونة .


لكن نرجع للسؤال الأهم , هل يمكنهم كلهم العمل مع الأردوينو دون تأخير زمني ملحوظ ؟




 الجواب نعم

كيف ؟ هذا ما سنتعرف عليه سوية في  هذه التدوينة .

أبسط أوامر التأخير الزمني في الأردوينو هو delay هذا الأمر يسهل على المبتدئين معرفة معنى التأخير الزمني و كيفية تطبيقه على المداخل و المخارج .

كأبسط مثال , برنامج Blink الذي يطبق على الباعث الضوئي LED المربوط على المدخل D13 يضيء لثانية واحده و يطفى لثانية واحدة .

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}



هذا الأمر فيه عدة عيوب , منها أنه لا نستطيع عمل أي شيء خلال زمن التأخير , لا نستطيع مثلاً قراءة حالة مدخل معين خلال هذا الوقت او التحكم في حالة مدخل آخر , إلا بعد انتهاء زمن التأخير كما أن زمن التأخير لا يكون بالضبط بنفس القيمة المحددة , في المثل السابق التأخير الزمني هو 1000 ملي ثانية لكن فعلياً التأخير يزيد بقليل عن هذه القيمة , و اذا تم تشغيل هذا البرنامج لفترة طويلة سيكون واضحاً جداً ان التأخير الزمني بين عمليه الأنارة و الأطفاء تزيد عن 1000 ملي ثانية بوضوح تام !

الحل يكون باستخدام الأمر millis ففي الأردوينو يمكن تشغيل المؤقتات باستخدام هذا الأمر و ان يكون زمن الأضاءة و الأغلاق للباعث الضوئي LED بالضبط هو 1000ملي ثانية حتى و لو استمر البرنامج بالعمل لفترة طويلة , هذا رائع :)

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


/* Blink without Delay
 
 Turns on and off a light emitting diode(LED) connected to a digital  
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.
 
 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.
 
 
 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 
 This example code is in the public domain.

 
 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */

// constants won't change. Used here to 
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

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

لحسن الحظ فالمهتمين بالأردوينو قاموا بكتابة عشرات المكتبات لتسهل على المستخدمين التعامل مع المداخل و المخارج بصورة سريعة و بدقة عالية , منها مكتبة  Metro .

هذه المكتبة تعتمد بشكل أساسي على الأمر millis و تسهل على المبرمج الحصول على برنامج يحتوي العديد من البرامج ذات تأخير زمني ثابت بين كل وظيفة و الأخرى .

اولاً يمكن تحميل المكتبة من هنا . 

أوامرها جداً سهلة و يمكن أن ترى عدة أمثلة مرفقه مع المكتبة .


مثلاً لو أردنا تشغيل 3 مداخل في الأردوينو بحيث يكون :

1)واحد منهم يعمل لأضاءة - اطفاء ضوء لمدة2000ملي ثانية 

2)يعمل كتعديل نبضي PWM بحيث يقوم بزيادة طول النبضة الفعالة  "زيادة توهج ال LED " مرة كل 10 ملي ثانية.

3) يعمل كمدخل قراءة لحساس تماثلي "مقاومة متغيرة" يقوم بالتحقق منها كل 200ملي ثانية و يزيد توهج LED مربوط على مدخل رقمي بتناسب طردي مع قيمة المقاومة المقروءة .

القطع المستخدمة في التجربة :

1) بطاقة أردوينو
2) مقاومة متغيرة Potentiometer

3) LED باعث ضوئي عدد 3
4)مقاومات عدد 3 "ان تكون قيمتها أقل من 1كيلو اوم"
5) اسلاك توصيل

6) Bread Board .

المخطط :




البرنامج :






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

أختم هنا بالقول أنه اذا اردت عمل برنامجك بصورة سريعة و في نفس الوقت و دون تأخير فخيارك الأمثل هو استخدام Arduino DUE و هو ما سأفرد له بنداً خاصاً في المدونة للحديث عن أمكانياتها . 





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