اذهب إلى المحتوى

بناء إشارة مرور باستخدام الأردوينو Arduino


Mohammad Baher Karazeh

بعد أن أنشأنا أول مشروع بسيط لنا باستخدام لوحة أردوينو في المقال السابق، سنوظف ما تعلمناه حول التعامل مع الأقطاب الرقمية Digital Pins وكتابة التعليمات البرمجية لضبط نوع القطب وإعطاء أوامر التشغيل والإيقاف إليه وتوصيل العناصر على لوحة التجارب BreadBoard وربطها مع أقطاب لوحة أردوينو ونطور مشروعنا الثاني وهو مشروع يحاكي إشارة المرور.

فكرة المشروع

توضيح آلية عمل المشروع.gif

الهدف من هذا المشروع هو التحكم بإشارة مرور بسيطة مثل التي نراها في الطرقات والتي تحتوي على ثلاثة ليدات، أحمر وبرتقالي وأخضر، إذ تكون خطوات التشغيل بالشكل الآتي:

  1. يضيء الليد الأخضر في البداية وتنطفئ باقي الليدات لمدة زمنية محددة (5 ثوان).
  2. ينطفئ الليد الأخضر ويضيء الليد البرتقالي بشكل ومضات مرات عدة بفترات قصيرة (0.5 ثانية).
  3. يضيء الليد الأحمر وتنطفئ باقي الليدات لمدة زمنية محددة (5 ثوان).
  4. تتكرر عملية تشغيل وإطفاء الليد البرتقالي مرات عدة ( الخطوة نفسها رقم 2).
  5. إعادة تكرار الخطوات باستمرار بدءًا من الخطوة رقم 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 لأنها تشترك جميعًا بالنقطة ذاتها وفي النهاية النتيجة واحدة.
    توضح الصورة الآتية مخطط التوصيل:

001 مخطط توصيل المشروع الثاني

الكود البرمجي لمشروع إشارة المرور

في البداية نحتاج لتعريف ثلاثة متغيرات من نوع عدد صحيح 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 باتباع الخطوات التي شرحناها في المقال السابق للوصول الى الصفحة الخاصة بمحاكاة المشروع كما توضح الصورة التالية:

002 الصفحة الخاصة بمحاكاة المشروع

  • بعدها أضف العناصر الإلكترونية اللازمة للمشروع مثل لوحة التجارب BreadBoard، والليدات LEDs، والمقاومات Resistors.

003 إضافة العناصر في موقع وكوي

  • غيّر قيمة المقاومات إلى 220 أوم من خلال الضغط عليها فتظهر لك نافذة تمكنك من تغير القيمة والواحدة.

004 تغيير قيمة المقاومة

  • يمكنك الطريقة نفسها تغير ألوان الليدات من خلال الضغط عليها فتظهر لك نافذة تستطيع من خلالها اختيار لون الليد.

005 تغير لون الليد

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

006 النتيجة النهائية لمحاكاة المشروع الثاني

الخلاصة

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...