الدرس 4 - التجربة الأولى LED BLINKING

محمد صلاح الدينمنذ 4 سنوات

في هذا الدرس سنقوم بتنفيذ التجربة الأولى وهي عبارة عن اضاءة واطفاء LED بصورة تكرارية. ولضمان ترابط كل المفاهيم والخطوات مع بعضها البعض سنقوم بشرح جميع الخطوات إبتداءً من كيفية انشاء مشروع على البروتيوس وحتى استخراج ملف Hex الذي سيستخدم لبرمجة الأردوينو بالاضافة الى تشغيل التجربة وملاحظة النتائج. كذلك سيتم التطرق الى شرح الكود خطوة بخطوة.

 

 

تصميم الدائرة على البروتيوس

1. افتح برنامج بروتيوس 8 واختر new project.

 

2.  اكتب اسم المشروع و مكان الحفظ ثم اضغط على Next.

 

3.  اختر انشاء schematic من النماذج ، ثم اختر النموذج (default).

 

4.  اختر do not create pcb  كما هو موضح ثم اختر Next.

 

5.  بالرغم من وجود منصة على البروتيوس لكتابة وتنفيذ أكواد الأردوينو الا أنني أفضل استخدام برنامج الأردوينو الرئيسي لذلك اختر الخيار المحدد بالشكل التالي.

 

6.  هذا هو ملخص المشروع ، سنقوم بانشاء schematic  فقط. بعد الضغط على finish سنكون جاهزين لوضع الأجهزة وربطها معاً.

 

7. سنقوم باختيار ثلاث أجهزة وهي

  • Arduino UNO
  • مقاومة 220 أوم
  •  RED LED

الخطوات التالية توضح كيفية اختيار الـ UNO ووضعه على قائمة الأجهزة التي سوف تستخدم في التصميم. بنفس الطريقة قم باختيار RED LED و المقاومة ذات الـ 220 ohm.

 

8.  بعد اختيار الأجهزة يجب أن تتواجد كما هي بالصورة التالية.

 

9.  المثال التالي يوضح كيفية وضع الأردوينو على المساحة المخصصة للـ schematic. بنفس الكيفية اتبع الخطوات التالية وقم بوضع المقاومة والـ LED.

 

10.  بعد وضع جميع الأجهزة على الاسكيماتيك وربط أطرافها سيكون لدينا الشكل التالي.

 

11. ما الذي ينقصنا الآن حتى تكتمل الدائرة؟ لاشك إنه الـ Ground. لاختيار الـ Ground اتبع الخطوات الموضحة بالشكل أدناه. وبذلك نكون قد انتهينا من اعدادات توصيل الدائرة على برنامج البروتيوس.

محلوظة:

بورد الأردوينو لايحتاج الى أن يتم توصيله بالباور أو حتى الجراوند وذلك لأن البروتيوس يقوم بهذه العملية ضمنيا ً بدلا ً عنك.

 

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

1.  افتح برنامج الأردوينو وقم بفتح مشروع جديد ثم اكتب الكود التالي ثم احفظ المشروع بالاسم E1_LED_Blinking

 

const int LED_Pin = 13;

void setup() {
  // put your setup code here, to run once:
  pinMode(LED_Pin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_Pin,HIGH);
  delay(1000);
  digitalWrite(LED_Pin,LOW);
  delay(1000);
}

 

شرح الكود:

يبدأ الكود بالإعلان عن المتغييرات التي تستخدم داخل أكثر من scope بالبرنامج. والمقصود بالـ Scope هي المنطلقة المحاطة بالأقواس من النوع { }. لذلك بدأنا بالإعلان عن المتغير LED_Pin والذي تم استخدامه داخل الـ setup والـ loop.  الأمر const يستخدم لضمان عدم تغيير قيمة المتغير مرة أخرى ، وبما أن المتغير LED_Pin يحتفظ بقيمة رقم المنفذ فيجب أن لايتم تغييره مرة أخرى. نلاحظ أنه تم اسناد القيمة 13 الى المتغير LED_Pin وذلك لأننا قمنا بتوصيل الـ LED  الى المنفذ رقم 13. بداخل الـ setup سيتم تعريف نوع البورت (المنفذ) اذا كان للخرج أو الدخل من خلال الدالة PinMode. بداخل الدالة loop سيتم كتابة الكود الذي يتكرر بصورة مستمرة دون توقف. يبدأ الكود داخل الـ loop بالسطر (digitalWrite(LED_Pin, HIGH والذي يعني اخراج 5 فولت الى المنفذ المسمي LED_Pin ، بعد ذلك نلاحظ وجود السطر (delay(1000 والذي يعني أن الكود سيبقى على حاله لفترة 1 ثانية ، بعد ذلك نلاحظ وجود السطر (digitalWrite(LED_Pin, LOW والذي من خلاله سيتم منع مرور الـ 5 فولت الى المنفذ 13 ولضمان استمرارية توقف الـ LED  عن الإضاءة لفترة 1 ثانية كان لابد من وضع (delay(1000 في نهاية الـ loop أيضا ً. اذا من خلال الكود الموجود داخل الـ loop سيضيء الـ LED لفترة ثانية واحدة وكذلك سينطفىء لفترة ثانية واحدة وهكذا سيستمر دون توقف.

 

2.  قم بعمل verify  للكود من خلال الضغط على الزر الموضح بالشكل وذلك للتأكد من أن الكود لاتوجد به أي أخطاء.

 

3. اذا كان الكود صحيحا ً ستظهر لك رسالة مشابهة للرسالة التالية أسفل برنامج الأردوينو.

 

4. بعد التأكد من خلو الكود من أي أخطاء ، اذهب الى القائمة sketch واختر Export compiled Binary. وذلك لاستخراج ملف الـ hex. والذي يستخدم لبرمجة المايكروكونترولر. 

 

5. بالذهاب الى المجلد الذي تم فيه حفظ المشروع ستجد ملف امتداده hex. يحمل نفس اسم المشروع.

6. نعود للدائرة الموجودة بالبروتيس ، قم بالضغط على الأردوينو لاضافة ملف البرمجة كما هو موضح بالخطوات التالية.

 

7. قم بتشغيل الدائرة ولاحظ كيف تضيْ الـ LED ثم تنطفئ بصورة تكرارية.

 

8. حاول تغيير زمن الـ delay الى 500 بدلا عن 1000 ونفذ الخطوات من 2 الى 7 ثم لاحظ الفرق.

 

مناقشة

لنفترض أنك قمت بكتابة الكود بالصورة التالية وتجاهلت كتابة الـ delay الموجودة بعد (digitalWrite(LED_Pin,LOW. ما الذي تتوقع حدوثه في هذه الحالة؟ 

const int LED_Pin = 13;

void setup() {
  // put your setup code here, to run once:
  pinMode(LED_Pin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_Pin,HIGH);
  delay(1000);
  digitalWrite(LED_Pin,LOW);
}

اذا دعونا نحن نقوم بعملية التنفيذ ، سنبدأ من الـ loop ثم سنقوم بوضع 5 فولت على المنفذ المسمى LED_Pin والذي هو في الأصل المنفذ رقم 13. بعد ذلك سنذهب للسطر الثاني لنقوم بتنفيذه ووجدنا فيه delay بمقدار 1000 وبما أن الدالة delay تتعامل مع القيم بالميلي ثانية فهذا يعني أن التأخير سيستمر لفترة 1 ثانية وهذا التأخير سيبقي على آخر حالة كان المايكرو عليها وعليه سيكون الـ LED مضاءً لفترة 1 ثانية أي حتى ينتهي تنفيذ أمر الـ delay. الآن سنذهب لتنفيذ السطر الثالث والذي فيه الأمر (digitalWrite(LED_Pin, LOW والذي سيتم فيه اطفاء الـ LED. حسنا ُ لقد انطفأ الـ LED الآن ولكن ماذا بعد ذلك؟ ركز معي جيدا هنا نحن متواجدون داخل الدالة loop وعليه سيبدأ تنفيذ الكود مرة أخرى من أول سطر داخل الـ loop والذي فيه الأمر الذي سيخرج 5 فولت الى LED وعليه سيضيء مرة أخرى! وهنا تكمن المشكلة حيث سيتم تنفيذ السطر الأخير وبعده مباشرةً سيتم تنفيذ السطر الأول وعليه لن تستطيع العين أن تلاحظ أن الـ LED قد انطفأ لأن تنفيذ الكود يحسب بالمايكرو ثانية لذلك كان لابد من وضع delay بعد الأمر الذي كان ينص على اطفاء الـ LED.

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !