بعد أن أنشأنا أول مشروع بسيط لنا باستخدام لوحة أردوينو في المقال السابق، سنوظف ما تعلمناه حول التعامل مع الأقطاب الرقمية Digital Pins وكتابة التعليمات البرمجية لضبط نوع القطب وإعطاء أوامر التشغيل والإيقاف إليه وتوصيل العناصر على لوحة التجارب BreadBoard وربطها مع أقطاب لوحة أردوينو ونطور مشروعنا الثاني وهو مشروع يحاكي إشارة المرور.
فكرة المشروع
الهدف من هذا المشروع هو التحكم بإشارة مرور بسيطة مثل التي نراها في الطرقات والتي تحتوي على ثلاثة ليدات، أحمر وبرتقالي وأخضر، إذ تكون خطوات التشغيل بالشكل الآتي:
- يضيء الليد الأخضر في البداية وتنطفئ باقي الليدات لمدة زمنية محددة (5 ثوان).
- ينطفئ الليد الأخضر ويضيء الليد البرتقالي بشكل ومضات مرات عدة بفترات قصيرة (0.5 ثانية).
- يضيء الليد الأحمر وتنطفئ باقي الليدات لمدة زمنية محددة (5 ثوان).
- تتكرر عملية تشغيل وإطفاء الليد البرتقالي مرات عدة ( الخطوة نفسها رقم 2).
- إعادة تكرار الخطوات باستمرار بدءًا من الخطوة رقم 1.
العناصر المستخدمة
العناصر التي سنستخدمها لعمل هذا المشروع هي كالتالي:
- لوحة أردوينو أونو Arduino Uno.
- كابل البرمجة USB Cable.
- لوحة توصيل التجارب Breadboard.
- ليد أحمر RED LED.
- ليد أخضر GREEN LED.
- ليد برتقالي ORANGE LED.
- ثلاث مقاومات بقيمة 220 أوم.
- مجموعة أسلاك توصيل من نوع Male to Male.
مخطط توصيل مشروع إشارة مرور باستخدام أردوينو
لتنفيذ فكرة المشروع، اتبع الخطوات الآتية لتوصيل العناصر والأسلاك مع لوحة الأردوينو Arduino :
- صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل.
- صل الرِّجل الأطول (التي تمثل الطرف الموجب) لليد الأخضر مع الرجل الأولى للمقاومة، ثم الرجل الأخرى للمقاومة مع القطب رقم 9 في لوحة الأردوينو أونو Arduino Uno.
- صل الرِّجل الأقصر (التي تمثل الطرف السالب) لليد الأخضر مع المسرى السالب في لوحة توصيل التجارب BreadBoard.
- كرر الخطوتين السابقتين بالطريقة ذاتها لليد البرتقالي والليد الأحمر ولكن مع تغيير أرقام الأقطاب في لوحة الأردوينو أونو Arduino Uno إلى القطب رقم 10 لمقاومة الليد البرتقالي والقطب رقم 11 لمقاومة الليد الأحمر.
-
لترتيب التوصيل بصورة أفضل يمكنك توصيل الرِّجل الأقصر (التي تمثل الطرف السالب) لليد الأول مع الرِّجل الأقصر من الليدات الأخرى، ثم توصيل إحداها بالمسرى السالب في لوحة توصيل التجارب BreadBoard لأنها تشترك جميعًا بالنقطة ذاتها وفي النهاية النتيجة واحدة.
توضح الصورة الآتية مخطط التوصيل:
الكود البرمجي لمشروع إشارة المرور
في البداية نحتاج لتعريف ثلاثة متغيرات من نوع عدد صحيح int
تحتوي على رقم القطب الموصول مع كل ليد في لوحة Arduino Uno حيث سنوصلها مع الأقطاب 9 لليد الأخضر و 10 لليد البرتقالي و 11 لليد الأحمر كما وضحنا ذلك في جزء مخطط التوصيل، وبما أننا نريد استخدام هذه المتغيرات في أي جزء من الكود سنعرفها في البداية كمتغيرات عامة خارج الدالتين الرئيسية والتكرارية كما يلي.
int Green_Led = 9; int Orange_Led = 10; int Red_Led = 11;
الآن، سنضبط داخل الدالة الرئيسية الأقطاب الخاصة بالليدات التي خُزّنت أرقامها ضمن متغيرات كأقطاب خرج من خلال الدالة المدمجة ()pinMode
التي تأخذ معاملين الأول رقم القطب (الذي خُزن في المتغير) والثاني نوع القطب (إما خرج وإما دخل) وفي حالتنا هذه الأقطاب جميعها خرج OUTPUT
.
void setup() { pinMode(Red_Led, OUTPUT); pinMode(Orange_Led, OUTPUT); pinMode(Green_Led, OUTPUT); }
وبما أننا نحتاج لتشغيل المشروع باستمرار لذلك سنكتب التعليمات البرمجية الخاصة بأوامر التحكم بالتشغيل والإطفاء الخاصة بالليدات في الدالة التكرارية ()void loop
التي تنفذ الكود البرمجي الموجود داخلها بشكل متكرر.
void loop() { }
ذكرنا سابقًا أننا سنشغل القطب الخاص بالليد الأخضر في البداية ونطفئ الأقطاب الخاصة بالليدات الأخرى (الأحمر والبرتقالي) بتأخير زمني 5000 مللي ثانية أي بمقدار 5 ثوان، وللتحكم بإشارة خرج أقطاب الليدات برمجيًا سنستخدم الدالة المدمجة ()digitalWrite
التي تأخذ معاملين أيضًا: الأول رقم القطب (الذي خُزن في المتغير) والثاني حالة أو قيمة القطب (إما 1 منطقي HIGH
وإما 0 منطقي LOW
) وفي حالتنا هذه سيأخذ القطب الخاص بالليد الأخضر القيمة HIGH
لأننا نريد تشغيله وستأخذ الأقطاب الخاصة بالليدات الأخرى (الأحمر والبرتقالي) القيمة LOW
، ولتحقيق التأخير الزمني نستخدم الدالة المدمجة ()delay
كما يلي:
digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, LOW); digitalWrite(Green_Led, HIGH); delay(5000);
سنشغل الليد البرتقالي ثم نطفئه بشكل متكرر مرات عدة وبتأخير زمني قصير (0.5 ثانية بعد كل عملية تشغيل أو إطفاء) ليحاكي النموذج الحقيقي لإشارة المرور، ولتنفيذ ذلك برمجيًا نستدعي الدالة ()digitalWrite
حيث سيأخذ القطب الخاص بالليد البرتقالي القيمة HIGH
وستأخذ الأقطاب الخاصة بالليدات الأخرى (الأحمر والأخضر) القيمة LOW
لأننا نريد تشغيل الليد البرتقالي بالبداية، وبالطريقة نفسها نستخدم الدالة ()digitalWrite
مع تغيير قيمة القطب الخاص بالليد البرتقالي إلى القيمة LOW
لأننا نريد إطفاءه. ونستدعي دالة التأخير الزمني()delay
بين كل عملية تشغيل وإطفاء أو العكس بمقدار نصف ثانية أو 500 مللي ثانية، بهذه الطريقة نحقق وميض الليد البرتقالي مرة واحدة، وبتكرار الكود مرات عدة نحصل على الوظيفة المطلوبة.
digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, HIGH); digitalWrite(Green_Led, LOW); delay(500); digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, LOW); digitalWrite(Green_Led, LOW); delay(500); digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, HIGH); digitalWrite(Green_Led, LOW); delay(500); digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, LOW); digitalWrite(Green_Led, LOW); delay(500); digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, HIGH); digitalWrite(Green_Led, LOW); delay(500); digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, LOW); digitalWrite(Green_Led, LOW); delay(500);
سيضيءالقطب الخاص بالليد الأحمر في النهاية وتنطفئ الأقطاب الخاصة بالليدات الأخرى (الأخضر والبرتقالي) بتأخير زمني 5000 مللي ثانية أي بمقدار 5 ثوان، لذا نستدعي الدالة()digitalWrite
حيث سيأخذ القطب الخاص بالليد الأحمر القيمة HIGH
لأننا نريد تشغيله وستأخذ الأقطاب الخاصة بالليدات الأخرى (الأخضر والبرتقالي) القيمة LOW
، ونستدعي الدالة المدمجة ()delay
بقيمة 5000 لتحقيق تأخير الزمني بمقدار 5 ثوان.
digitalWrite(Red_Led, HIGH); digitalWrite(Orange_Led, LOW); digitalWrite(Green_Led, LOW); delay(5000);
تحسين الكود البرمجي لمشروع إشارة مرور
كما تلاحظ فإننا نكرر التعليمات البرمجية الخاصة بالتحكم بتشغيل وإطفاء الليد البرتقالي ثلاث مرات في الكود السابق، وفي كل مرة نعيد كتابة التعليمات البرمجية الخاصة بذلك، ويمكن اختصار الكود خلال كتابة التعليمات مرة واحدة فقط داخل حلقة تكرارية for بمتغير i تبدأ قيمته من 1 وتزداد بمقدار 1 في كل مرة حتى تصبح مساوية لـ 3 (تكرار تنفيذ ما بداخل الحلقة ثلاث مرات) ويصبح الكود الخاص بهذا الجزء:
for (int i = 1; i <= 3; i++) { digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, HIGH); digitalWrite(Green_Led, LOW); delay(500); digitalWrite(Red_Led, LOW); digitalWrite(Orange_Led, LOW); digitalWrite(Green_Led, LOW); delay(500); }
لاحظ أننا في كل مرة نتحكم بالأقطاب الثلاثة بالترتيب نفسه Red_Led
ثم Orange_Led
ثم Green_Led
، يمكننا القيام بذلك بتعليمة برمجية واحد فقط بدلًا من أن نكتب ثلاث تعليمات برمجية خاصة بالتحكم بتشغيل وإطفاء هذه الليدات في كل مرة من خلال كتابة دالة باسم ()ROG_LED
(أو أي اسم مناسب تريده) تأخذ ثلاثة معاملات، يمثل كل معامل حالة قطب من أقطاب الليدات الثلاثة وتكون بالترتيب الآتي: معامل حالة قطب الليد الأحمر Red_Stat
، ومعامل حالة قطب الليد البرتقالي Orange_Stat
، ومعامل حالة قطب الليد الأخضر Green_stat
وبداخل هذه الدالة سنكتب التعليمات البرمجية التي تتحكم بتشغيل وإطفاء هذه الليدات مرة واحدة فقط وبقيمة الوسيط الخاص بكل ليد ذاتها.
void ROG_LED(int Red_Stat, int Orange_Stat, int Green_stat) { digitalWrite(Red_Led, Red_Stat); digitalWrite(Orange_Led, Orange_Stat); digitalWrite(Green_Led, Green_stat); }
يصبح الكود النهائي للمشروع كما يلي:
int Red_Led = 11; int Orange_Led = 10; int Green_Led = 9; void ROG_LED(int Red_Stat, int Orange_Stat, int Green_stat) { digitalWrite(Red_Led, Red_Stat); digitalWrite(Orange_Led, Orange_Stat); digitalWrite(Green_Led, Green_stat); } void setup() { pinMode(Red_Led, OUTPUT); pinMode(Orange_Led, OUTPUT); pinMode(Green_Led, OUTPUT); } void loop() { // Green Light ROG_LED(LOW, LOW, HIGH); delay(5000); // Orange Light for (int i = 1; i <= 3; i++) { ROG_LED(LOW, HIGH, LOW); delay(500); ROG_LED(LOW, LOW, LOW); delay(500); } // Red Light ROG_LED(HIGH, LOW, LOW); delay(5000); }
محاكاة المشروع:
سننفذ المحاكاة باستخدام منصة ووكوي Wokwi باتباع الخطوات التي شرحناها في المقال السابق للوصول الى الصفحة الخاصة بمحاكاة المشروع كما توضح الصورة التالية:
- بعدها أضف العناصر الإلكترونية اللازمة للمشروع مثل لوحة التجارب BreadBoard، والليدات LEDs، والمقاومات Resistors.
- غيّر قيمة المقاومات إلى 220 أوم من خلال الضغط عليها فتظهر لك نافذة تمكنك من تغير القيمة والواحدة.
- يمكنك الطريقة نفسها تغير ألوان الليدات من خلال الضغط عليها فتظهر لك نافذة تستطيع من خلالها اختيار لون الليد.
- رتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
- اكتب الكود البرمجي في الجزء الخاص به، ثم شغل المحاكاة، ستجد أن الليدات تعمل بالترتيب الذي ذكرناه في وصف المشروع.
الخلاصة
تعلمنا في هذا المقال بناء المشروع الثاني في سلسلة دليل أدوينو وهو إشارة مرور بسيطة بعدة خطوات سهلة بدءًا من فهم فكرة المشروع ووصولًا إلى كتابة الكود البرمجي الخاص به، مع تعلم كيفية التفكير في تحسين وتطوير الكود، وسنستكمل في المقالات القادمة بناء المزيد من المشاريع الإلكترونية المفيدة ونتعلم من خلالها أفكارًا جديدة.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.