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

ربط راسبيري باي بعناصر إلكترونية وبرمجتها باستخدام سكراتش وبايثون


ابراهيم الخضور

يمكن برمجة عمل مكوّنات فيزيائية إضافةً إلى تطوير البرمجيات التي تُنفّذ على الشاشة، مثل المكوّنات الإلكترونية التي تتصل مع باي عبر أرجل المنصة GPIO، أو ما يُعرف باسم الحوسبة الفيزيائية physical computing.

يتبادر إلى الأذهان أثناء التفكير بمصطلحي برمجة programming أو كتابة شيفرة Coding، بأنها برمجيات الحاسوب software مباشرةً، لكن الأمر ليس كذلك دومًا؛ فقد نكتب برمجياتٍ تتعامل مباشرةً مع العتاد الصلب hardware، ويُعرف هذا النوع من البرمجة باسم الحوسبة الفيزيائية أو برمجة المكونات الفيزيائية، حيث ترتبط الحوسبة الفيزيائية كما يوحي اسمها بالتحكم بتجهيزات فيزيائية حقيقية؛ فعندما تغيّر برنامجًا في الغسالة الآلية لضبط درجة حرارة حساس الحرارة القابل للبرمجة، أو عندما تضغط زرًا عند إشارة المرور لتعبر الطريق بأمان، فأنت تُنفِّذ حوسبةً فيزيائيةً.

يُعد حاسوب راسبيري باي أداة رائعة لتعلم الحوسبة الفيزيائية بفضل منصة أرجل الدخل والخرج ذات الأغراض العامة general-purpose input/output -أو اختصارًا GPIO-.

اقتباس

هذا المقال جزء من سلسلة "مدخل إلى راسبيري باي".

التعرف على منصة الأرجل GPIO

ستجد منصة أرجل الدخل والخرج العامة GPIO، المكونة من صفين من الأرجل أو الدبابيس المعدنية عند الحافة العلوية لراسبيري باي، وستمنحك هذه المنصة القدرة على توصيل تجهيزات فيزيائية مثل المؤشرات الضوئية LEDs، أو القواطع switches إلى باي للتحكم بها من خلال برامجٍ تصممها بنفسك.

قد يكون اسم المنصة مربكًا، لكنه يصف بالفعل ما تتكون منه، حيث يمكنك استخدام أي رجلٍ لاستقبال إشارةٍ كهربائية وعندها تُدعى رجل دخل input pin أو لإرسال إشارة كهربائية وتدعى عندها رجل خرج output pin. كما تُعرف باسم منصة Header، لأن الأرجل مجمعةٌ ومرتبةٌ وظاهرةٌ على اللوحة الإلكترونية للجهاز، ومن هنا يأتي اسم "منصة الدخل والخرج ذات الأغراض العامة general-purpose input/output header".

GPIO_distribution_00.png

تتكون المنصة من 40 رجلًا معدنيًا، حيث يمكنك استخدام بعضها في الاتصال مع تجهيزاتٍ خارجية، بينما يزوّدك بعضها بالتغذية الكهربائية، ويُحجز بعضها لأغراض التواصل مع تجهيزات مخصصة لتوسيع راسبيري باي، مثل Sense HAT التي سنشرحها مفصلًا في مقال لاحق. إذًا، هناك فئاتٌ مختلفةٌ للأرجل ولكلٍّ منها وظيفته الخاصة والتي سنلخصها في الجدول التالي:

نوع الرجل التيار الكهربائي مصدر التغذية والوظيفة
أرجل 3V3 تعطي تغذية كهربائية جهدها 3.3 فولت مصدر تغذية كهربائية جهده 3.3 فولت وهو نفسه الجهد الذي يعمل عليه راسبيري باي داخليًا
أرجل 5v تعطي تغذية كهربائية جهدها 5 فولت مصدر تغذية كهربائية جهده 5 فولت وهو نفسه الجهد الذي يدخل إلى راسبيري باي عبر منفذ USB-C
أرجل الأرضية (Ground (Gnd وتمثل أرجل الأرضية التي يُقاس الجهد بالنسبة إليها وتُعد 0 فولت تُستخدم وصلة الأرضية لإكمال الدارة الكهربائية المرتبطة بمصدر التغذية.
أرجل دخل وخرج GPIO XX أرجل الدخل والخرج للأغراض العامة وأرقامها من خانتين XX وهي الأرجل التي تتحكم بسلوكها من خلال برامجك وتُعرّف بأرقام من 2 وحتى 27
أرجل توصيل تجهيزات موسِّعة ID EEPROM أرجل محجوزة لاستخدامات خاصة محجوزة للاتصال بالتجهيزات المرتبطة بالأعلى Hardware Attached on Top -أو اختصارًا HAT- وغيرها من التجهيزات الملحقة.

تمنحك المنصة GPIO طريقةً ممتعةً وآمنةً في نفس الوقت لتتمرن على الحوسبة الفيزيائية، لكن ينبغي الحذر في التعامل معها؛ لذلك لا تحاول ثني الأرجل عند فصل أو وصل التجهيزات؛ ولا تصل أبدًا رجلين ببعضهما مباشرةً عن طريق الخطأ أو متعمدًا إذا لم يُطلب منك ذلك بوضوحٍ في توجيهات المشروع الذي تبنيه، حيث تُعرف هذه الحالة بالدارة المقصورة، وقد تؤدي إلى ضررٍ غير قابلٍ للإصلاح في راسبيري تبعًا للأرجل التي قُصرت.

العمل مع العناصر الإلكترونية

تمثل المنصة GPIO جزءًا فقط مما ستحتاجه لتبدأ مسيرتك في الحوسبة الفيزيائية، بينما تمثل العناصر الإلكترونية، وهي الأجهزة التي ستتحكم بها عبر GPIO، الجزء الآخر. ستجد آلاف العناصر الإلكترونية المتاحة، لكن معظم مشاريع GPIO مكوّنةٌ من العناصر التالية:

لوحة اختبار مثقبة breadboard

وتعرف أيضًا باللوحة التي لا تحتاج إلى لحام solderless، حيث تسهل هذه الأداة تأمين الاتصال بين العناصر الإلكترونية لمشروعك بسهولة؛ فبدلًا من وصل العناصر عن طريق الأسلاك، تؤمن لك لوحة الاختبار ثقوبًا تدفع فيها أرجل العناصر لتتصل ببعضها عبر مساراتٍ معدنيةٍ مخفيةٍ تحت السطح البلاستيكي للّوحة. ستجد في كثيرٍ من لوحات الاختبار أقسامًا منفصلةً لتوزيع التغذية الكهربائية، وهذا سينعكس على سهولة بناء الدارات. لن تحتاج إلى لوحة الاختبار للبدء بالحوسبة الفيزيائية طبعًا، لكنها أداةٌ مفيدةٌ جدًا.

breadboard_01.png

وصلات طرفية jumpers

تُستخدم لوصل العناصر الإلكترونية إلى باي أو مع بعضها بعضًا إذا لم تستخدم لوحة الاختبار. يتوفر ثلاثة أنواع من الوصلات الطرفية، هي:

  • وصلة مذكرة- مؤنثة "M2F"، والتي ستحتاجها لوصل لوحة الاختبار مع أرجل المنصة GPIO.
  • وصلة مؤنثة- مؤنثة "F2F"، والتي تُساعد في ربط العناصر ببعضها إذا لم تستخدم لوحة اختبار.
  • وصلة مذكرة- مذكرة "M2M"، وهي تُستخدم لربط نقطةٍ (مجموعة ثقوب متصلة ببعضها) من لوحة اختبار بنقطةٍ أخرى.

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

jumpers_02.png

قاطع آني أو زر كبس push button

وهو نوعٌ القواطع أو الأزرار مشابهة للتي نستخدمها في مقبض الألعاب، وتأتي عادةً برجلين أو أربعة ويعمل كلاهما مع باي. يُعد زر الكبس عنصر دخل، حيث يمكن لبرنامجك مراقبة هذا الزر عندما يُكبس ليُنفِّذ مهمةً ما.

يتواجد أيضًا نوعٌ آخر من القواطع المعروفة باسم القواطع الدائمة latching، وهي تُبقِي التيار الكهربائي موصولًا عند تحويلها إلى وضع التوصيل على خلاف أزرار الكبس، التي يجب عليك الاستمرار في ضغط أزرار الكبس حتى يستمر التيار الكهربائي بالمرور.

button_03.png

المؤشرات الضوئية LEDs أو ثنائي المساري الضوئي Light Emitting Diode

وهي أجهزة خرج يمكن التحكم بها من خلال البرامج مباشرةً، حيث يُضيء المؤشر عندما يمر فيه التيار الكهربائي، ومن المؤكد أنك تستخدمها في منزلك سواءً الصغيرة منها، مثل التي تنبهك أن غسالتك في وضع التشغيل، أو الكبيرة التي تُنير بها الغرفة. تأتي هذه الأضواء بأشكالٍ وألوانٍ وأحجامٍ كثيرة، لكنها لا تتناسب جميعها مع راسبيري باي، فلا تستخدم تلك التي صُممت للعمل على جهدٍ 5 أو 12 فولت.

led_04.png

المقاومات Resistors

وهي عناصر إلكترونية تتحكم بتدفق التيار الكهربائي، وتتوفر بقيمٍ متنوعة تُقاس بواحدة الأوم Ohms ويرمز لهذه الواحدة بالرمز Ω. وكلما زادت قيمة المقاومة مقدرةً بالأوم قلَّ تدفق التيار الكهربائي عبرها. تُعد حماية المؤشرات الضوئية من استجرار تيار كهربائي مرتفع قد يؤدي إلى تضررها أو إحداث ضررٍ بباي من أكثر استخدامات المقاومات شيوعًا في مشاريع الحوسبة الفيزيائية الخاصة براسبيري باي، ولهذا السبب ستحتاج إلى مقاوماتٍ قيمتها بحدود Ω 330. يُقدّم الكثير من مزوّدي العناصر الإلكترونية مجموعاتٍ كاملةً من المقاومات تتضمن عددًا من القيم المختلفة للاستخدامات الشائعة مما يمنحك مرونةً أكثر في اختيار المقاومات المناسبة.

resistor_05.png

جرس تنبيه كهروانضغاطي Piezoelectric buzzer

ويدعى عادةً منبه buzzer، أو مصوت sounder؛ وهو جهاز خرج يصدر ضجيجًا صوتيًا كما تُصدر المؤشرات الضوئية أضواءً، ويتألف المنبه من غلافٍ بلاستيكي يضم صفيحتين معدنيتين تهتزان باتجاهين متعاكسين عند مرور التيار في الجهاز، فيصدر الصوت المميز له. للمنبه نوعان، فعال Active أو غير فعّال passive، فاحرص على استخدام المنبه الفعّال لأنه أبسط استخدامًا.

buzzer_06.png

مكونات وعناصر إلكترونية شائعة

مثل المحركات التي تحتاج إلى لوحة تحكمٍ خاصةٍ لتوصيلها إلى باي، وحسّاسات الأشعة تحت الحمراء IR sensors التي تستشعر الحركة، وحسّاسات الرطوبة والحرارة التي يمكن استخدامها لتوقع حالة الطقس، والمقاومات الضوئية LDRs وهي أجهزة دخلٍ تلتقط الضوء على عكس المؤشرات الضوئية.

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

لإكمال المشاريع في هذا الفصل ينبغي تأمين العناصر والمكوّنات التالية:

  • ثلاث مؤشرات ضوئية LEDs، أحمر وأخضر وأصفر أو كهرماني.
  • قاطعين آنيين أو زري كبس.
  • منبّه فعّال Active
  • وصلات طرفية من النوعين مذّكرة- مؤنثة "M2F" ومؤنثة-مؤنثة "F2F".
  • لوحة اختبار ووصلات طرفية من نوع مذّكرة- مذّكرة "M2M" ولك الحرية في استخدام هذين المكونين أو عدمه.

قراءة الرموز اللونية للمقاومات وتقدير قيمتها

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

resistor_color_bands_07.png

لقراءة قيمة المقاومة: احمل المقاومة بحيث تكون مجموعة الخطوط المتقاربة إلى اليسار والخط المفرد إلى اليمين. انظر إلى لون الخط الأول وخذ القراءة من العمود الأول المُسمى خط أول/ ثانيفي الجدول، ثم انظر إلى الخط الثاني وخذ قيمته من نفس العمود فستحصل على الرقمين الأول والثاني من قيمة المقاومة؛ فلو كان الخطان برتقاليان، فسيكون الرقمان الأول 3 والثاني 3 ويشكلان العدد 33؛ وإذا احتوت المجموعة اليسارية ثلاث خطوط، كرّر الأمر بالنسبة للخط الثالث وستحصل على الرقم الثالث من قيمة المقاومة؛ وفي حال احتوت أربعة خطوط، فعليك الرجوع إلى الإنترنت لقراءة الترميز.

اللون خط أول/ثاني مضاعفات (خط ثالث) السماحية (الخط المفرد)
أسود 0 ‎×100 -
بني 1 ‎×101 ±1%
أحمر 2 ‎×102 ±2%
برتقالي 3 ‎×103 -
أصفر 4 ‎×104 -
أخضر 5 ‎×105 ±0.5%
أزرق 6 ‎×106 ±0.25%
بنفسجي 7 ‎×107 ±0.1%
رمادي 8 ‎×108 ±0.05%
أبيض 9 ‎×109 -
ذهبي - ‎×10-1 ±5%
فضي - ‎×10-2 ±10%
بلا لون - - ±20%

يمثّل الخط الثالث أو الرابع في المجموعة اليسارية القيمة الواجب جدائها بالعدد الذي شكلته الخطوط السابقة للحصول على القيمة الاسمية للمقاومة. انتبه إلى أن ‎100=1 و 101=10 و 102=100 و 103=1000 وهكذا؛ فلو كان الخطان الأول والثاني برتقاليان والثالث برتقالي، فهذا يعني أن قيمة المقاومة هي العدد 33 مضروبًا بالعدد 1000 وستكون النتيجة 3000 أوم.

يمثّل الخط المفرد السماحية tolerance؛ وهي مقياسٌ لاقتراب القيمة الاسمية للمقاومة من القيمة الفعلية التي تعطيها، حيث تعني المقاومات الرخيصة التي تأتي بخط سماحيةٍ فضي مثلًا أن القيمة الفعلية للمقاومة ستزيد أو تقل عن القيمة الإسمية بمقدار 10%، أي أن مقاومةً قيمتها الاسمية 1000 أوم قد تكون فعليًا في المجال 900- 1100 أوم؛ بينما تأتي المقاومات المرتفعة السعر مثلًا بخط سماحية رمادي، أي باختلافٍ لا يتعدى 0.05 % أعلى أو أدنى من القيمة الاسمية. لن تؤثر السماحيات كثيرًا في مشاريع الهواة، حيث ستعمل أية مقاومة كما هو مطلوب بغض النظر عن سماحيتها.

يبقى علينا الإشارة إلى موضوع المضاعفات، فعندما تتجاوز قيمة المقاومة 1000 أوم ستُقدّر بواحدة الكيلو أوم "kΩ"؛ أي إذا كانت قيمة المقاومة 2200 أوم، فستكتب على الشكل 2.2 كيلو أوم؛ أما عندما تتجاوز قيمته 1000 كيلو أوم أو 1000000 أوم، فستُقدَّر عندها بالميغا أوم  "MΩ"، أي إذا كانت قيمة المقاومة 22000000، فستكتب 2.2 ميغا أوم.

اقتباس

هل يمكنك الإجابة؟ ما هي الخطوط اللونية التي ستحملها مقاومة قيمتها 100 أوم؟ وما هي الخطوط اللونية التي ستحملها مقاومة قيمتها 2.2 ميغا أوم؟ إذا أردت مقاومةً رخيصة الثمن، ما هو لون خط السماحية الذي ستختاره؟

مشروعك الأول: مرحبا أيها الضوء

يمثّل تشغيل مؤشرٍ ضوئي الخطوة التقليدية الأولى في الحوسبة الفيزيائية، تمامًا كما تمثّل طباعة عبارة "!Hello world" على الشاشة الخطوة الأولى لتعلم البرمجة.

سنحتاج في مشروعنا هذا إلى:

  • مؤشر ضوئي LED.
  • مقاومة قيمتها 330 أوم أو أية مقاومة قريبةٍ منها
  • وصلات طرفية مؤنثة-مؤنثة.
اقتباس

المقاومات عناصر حيوية: المقاومات عناصرٌ مهمةٌ جدًا في هذه الدارة؛ فهي تحمي راسبيري باي والمؤشر الضوئي من خلال تحديد شدة التيار الكهربائي الذي سيستجره المؤشر، حيث يستجر المؤشر الضوئي كميةً كبيرةً من الطاقة إذا لم نستخدم مقاومةً مناسبة ويحترق وقد تتضرر باي أيضًا. تُدعى المقاومات في هذه الحالة مقاومات تحديد التيار current limiting resistors، حيث يُحدد المؤشر الضوئي المستخدم القيمة الدقيقة للمقاومة المطلوبة، لكن ستعمل المقاومة 330 أوم مع معظم المؤشرات المنتشرة. يخفت ضوء المؤشر بازدياد قيمة المقاومة نتيجةً لانخفاض شدة التيار الذي تمرره. لا توصل مؤشرًا ضوئيًا مباشرةً إلى باي إذا لم تكن متأكدًا من وجود مقاومةٍ داخليةٍ مناسبة مدمجةٍ معه.

ابدأ بالتحقق من صلاحية المؤشر الضوئي الذي ستستخدمه من خلال قلب لوحة باي حتى تصبح المنصة GPIO عموديةً وفي الجهة اليمنى من اللوحة. صِل أحد طرفي المقاومة 330 أوم إلى أي رجل 3.3 فولت (يُشار إليها في لوحة باي بالرمز 3V3) مستخدمًا سلكًا مزودًا بوصلةٍ طرفية مؤنثة-مؤنثة، ثم صل الطرف الآخر للمقاومة بالرجل الأطول (الرجل الموجبة) للمؤشر الضوئي والتي تُعرف بالمصعد أو الأنود Anode. صِل بعد ذلك الرجل الأقصر (الرجل السالبة) للمؤشر الضوئي والتي تُعرف بالمهبط أو الكاثود cathode إلى أي رجٍل أرضيةٍ GND في المنصة GPIO، كما هو موضحٌ في الشكل التالي.

led_connected_to_pi_08.png

شكل 1-6 صل المؤشر الضوئي إلى أرجل باي ولاتنس المقاومة!

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

بمجرد أن يضيء المؤشر فهو جاهزٌ للبرمجة، لذلك افصل الوصلة الطرفية من الرجل "3V3" وصلها بالرجل رقم 25 للمنصة GPIO، والتي يُشار إليها على لوح باي بالرمز GP25، وسينطفئ عندها المؤشر الضوئي.

connect_led_to_gp25_09.png

شكل 2-6 افصل السلك عن الرجل 3V3 وصله بالرجل GP25

أصبحت الدارة جاهزةً، وتستطيع الآن كتابة برنامج بلغة سكراتش أو بايثون لتشغيل وإطفاء المؤشر الضوئي.

اقتباس

تنويه لكتابة الشيفرة: لا بدّ أن تكون قادرًا على استخدام بيئتي عمل سكراتش 2 وثوني IDE للعمل على مشاريع هذا الفصل؛ فإذا لم تكن كذلك، عُد إلى الفصلين الرابع "البرمجة باستخدام سكراتش" والخامس "البرمجة باستخدام لغة بايثون" واطلِّع على المشاريع المُنفّذة فيهما أولًا.

التحكم بالمؤشر الضوئي باستخدام برنامج سكراتش 2

افتح برنامج سكراتش 2 من قائمة راسبيري باي، ثم انقر على زر "كتل أخرى More Blocks" ضمن لوح الكتل البرمجية، واختر بعدها "إضافة موسِّع Add an Extension"، واختر الموسِّع "Pi GPIO" ثم انقر الزر OK. سيُحمّل الأمر الكتل البرمجية اللازمة للتحكم بأرجل المنصة GPIO باستخدام سكراتش، حيث سترى هذه الكتل البرمجية في لوحة الكتل البرمجية ضمن الفئة "كتل أخرى More Blocks".

GPIO_extension_10.png

شكل3-6 إضافة الموسِّع Pi GPIO إلى سكراتش 2

ابدأ بسحب الكتلة when_GF_clicked.pngإلى منطقة بناء البرنامج، ثم ضع تحتها الكتلة set_gpio_to_output_high.png. عليك الآن اختيار رقم رجل المنصة الذي تستخدمه، لذلك انقر على السهم الصغير المتجه للأسفل في الكتلة السابقة واختر الرقم 25 من القائمة المنسدلة لتخبر سكراتش أنك ستتحكم بالرجل رقم 25 من المنصة.

code_led_11.png

انقر على الراية الخضراء وسترى أنّ المؤشر يضيء، وهكذا ستكون برمجت بنفسك أول مشروع حوسبةٍ فيزيائية. عند النقر على المثمن الأحمر لإيقاف البرنامج لن ينطفئ المؤشر الضوئي، لأنك أنهيت البرنامج دون أن تخبر باي بأن تطفئه؛ فكل ما طلبته منه في برنامجك هو تشغيله من خلال output high أو خرج مرتفع، وهذا يعني أن تقدّم للرجل جهدًا موجبًا يعادل 3.3 فولت في راسبيري. لإطفائه مجددًا انقر على السهم الصغير المتجه للأسفل والمجاور لعبارة "output high" واختر "output low".

code_led_12.png

انقر على الراية الخضراء مجددًا، فسينطفئ المؤشر. لجعل الأمر أكثر متعةً، أضف كتلة حلقةٍ لا متناهية forever.png مع كتلتيwait_1_secs.png لبناء برنامجٍ يومض المؤشر باستمرار أي ينطفئ ثانيةً ويضيء ثانية.

code_led_13.png

انقر على الراية الخضراء وراقب كيف سيضيء المؤشر لمدة ثانية ثم ينطفئ لمدة ثانية ويستمر بالوميض باستمرار دون توقف. انقر على المثمن الأحمر لإيقاف البرنامج وتحقق من حالة المؤشر لحظة إيقاف البرنامج فيما إذا كان يضيء أم لا.

اقتباس

تحدٍ: هل يمكنك تغيير البرنامج ليبقى المؤشر مضاءً لفترةٍ أطول؟ أو إطفائه لفترةٍ أطول؟ ما هو أصغر تأخيرٍ زمني تستطيع خلاله تمييز تشغيل وإطفاء المؤشر؟

التحكم بالمؤشر الضوئي باستخدام بايثون

افتح برنامج ثوني Thonny انطلاقًا من قائمة راسبيري باي، ثم انقر أيقونة جديد New في شريط أدوات ثوني لإنشاء برنامجٍ جديد، ثم انقر أيقونة Save لحفظ البرنامج باسم "Hello LED". لا بُدّ من استخدام مكتبة GPIO Zero للتعامل مع أرجل المنصة GPIO، لكننا لن نحتاج إلى المكتبة بأكملها في هذا المشروع. أدرج هذا الجزء من المكتبة بكتابة الأمر التالي:

from gpiozero import LED

انظر المقال السابق البرمجة باستخدام لغة بايثون للتعرف على بيئة ثوني.

ستخبر مكتبة GPIO Zero الآن عن الرجل التي يتصل بها المؤشر الضوئي من خلال الشيفرة التالية:

led = LED(25)

يعطي السطران السابقان بايثون القدرة على التحكم بالمؤشر الضوئي المتصل براسبيري باي، ويخبرانه بالرجل أو الأرجل في حال كنت تتحكم بأكثر من مؤشرٍ في دارتك. اكتب السطر التالي لإضاءة المؤشر:

led.on()

والسطر التالي لإطفائه:

led.off()

تهانينا، فأنت تتحكم بأرجل المنصة GPIO باستخدام بايثون. حاول تكرار تعليمتي التشغيل والإطفاء. في حال كان كان المؤشر مطفأً أصلًا، فلن تُنفَّذ التعليمة:

led.off()

ويحصل الأمر نفسه إذا استخدمت تعليمة تشغيل المؤشر وهو مضاءٌ أصلًا.

لجعل برنامجك أكثر واقعية، اكتب الشيفرة التالية:

from gpiozero import LED
from time import sleep

led = LED(25)

while True:
    led.on()    
    sleep(1)    
    led.off()    
    sleep(1)

يُدرج هذا البرنامج الدالة LEDمن المكتبة GPIO Zero والدالة sleep من المكتبة time، ثم يبني حلقةً لا متناهية لتكرار إضاءة المؤشر لمدة ثانية ثم إطفائه لمدة ثانية. انقر على أيقونة التشغيل Run لترى المؤشر يومض. راقب حالة المؤشر عند النقر على أيقونة الإيقاف Stop عندما يكون المؤشر مضاءً أو مُطفأً.

اقتباس

تحدٍ-فترة إضاءةٍ أطول: كيف ستتمكن من تغيير البرنامج ليبقى المؤشر مضاءً لفترةٍ أطول؟ أو إطفائه لفترةٍ أطول؟ ما هو أصغر تأخيرٍ زمني تستطيع خلاله تمييز تشغيل وإطفاء المؤشر؟

استخدام لوحة الاختبار المثقبة

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

الشكل: لوحة الاختبار المثقبة تصطف الثقوب في صفوفٍ وأعمدة، وتُقسم اللوحة إلى قسمين، أو ثلاثة أقسامٍ منفصلةٍ من الثقوب، وقد تجد على بعض اللوحات أرقامًا من الأعلى للصفوف وأحرفًا على الجانب للأعمدة لتحديد مكان ثقبٍ معيّن؛ حيث ستجد مثلًا الثقب A1 في الصف 1 والعمود الأول A أقصى وأعلى اليسار، والثقب B3 في الصف الثالث والعمود الثاني B، وهكذا.

ترتبط الثقوب في كل صفٍ ببعضها عبر شريطٍ معدني مخفي؛ حيث تمثّل بمجموعها نقطة توصيلٍ واحدة، أي أن كل الثقوب التي تحمل الرقم 1 مرتبطةٌ معًا والتي تحمل رقم 2 كذلك؛ بينما لا ترتبط ثقوب الصف 1 مع ثقوب الصف 2 إطلاقًا ما لم يصل بينهما سلكٌ فيتحول الصفّان إلى نقطةٍ واحدة.

اقتباس

ملاحظة: اِحمل اللوحة طوليًا حتى تتضح الصورة، وستجد أن الأعمدة هي الطولانية والصفوف عرضية، ويضم كلًا منها خمسة ثقوب ولا يوجد اتصالٌ بين أي قسمٍ من أقسام اللوحة.

يمكن أن تضم لوحات الاختبار الكبيرة شريطين جانبيين من كل جهة، معلّمين بخطين أحمر وأسود، أو أحمر وأزرق، وقد صُممت هذه الأعمدة من الثقوب لتسهيل توصيل التغذية الكهربائية إلى بقية الثقوب، حيث يمكن وصل سلكٍ من رجل راسبيري باي "3V3" أو "5V" إلى خط التغذية ذو اللون الأحمر، والإشارة الموجبة وسلك من الرجل GND إلى الخط الأسود أو الأزرق ذي الإشارة السالبة. تجدر الإشارة إلى أن ثقوب الخط الأحمر متصلةٌ معًا وكذلك ثقوب الخط الآخر، ولا يوجد اتصالٌ أبدًا بين الخطين.

من السهل إضافة العناصر الإلكترونية إلى لوحة الاختبار، فما عليك فعله هو ثني أرجل العنصر الإلكتروني الطرية ودفعها بلطفٍ في الثقوب المناسبة حتى تأخذ مكانها. استخدم وصلاتٍ طرفية M2M للوصل بين نقطة (صف ثقوب) وأخرى، ومن النوع M2F لوصل نقاطٍ من اللوحة مع أرجل باي. لا تحاول حشر أرجل عدّة عناصرٍ في ثقبٍ واحد؛ وإذا أردت وصلها معًا، فتذكر أن وضعها في صفٍ واحدٍ يجعلها متصلةً معًا بالشريط المعدني المخفي.

مراقبة إشارة صادرة عن ضغطة زر

إنّ عملية تمرير التيار الكهربائي من باي إلى المؤشر الضوئي والمعروفة بعملية خرج إشارة، هي أحد شقي الوظيفة المختلطة "دخل/ خرج input/output" لبعض أرجل منصة GPIO، حيث يمكن استخدام الرجل نفسها لاستقبال تيار كهربائي، وتُعرف بعملية دخل إشارة إلى باي أيضًا.

سنحتاج في هذا المشروع إلى:

  • لوحة اختبار.
  • أسلاك بوصلات طرفية M2M وأخرى M2F.
  • قاطع آني أو زر كبس.

يمكن استخدام أسلاك بوصلة طرفية F2F بدلًا من لوحة الاختبار، لكنك ستواجه صعوبة في الضغط على الزر دون أن تتسبب في تفلّت بعض الأسلاك.

ابدأ بإضافة الزر إلى اللوحة؛ فإذا كان للزر رجلين فقط، فعليك حشر كل رجلٍ في صفٍ مختل؛ أما إذا كان للزر أربعة أرجل، فاحشر رجلي الطرف الأول في عمودٍ واحد وسيدخُل رجلي الطرف الثاني تلقائيًا في عمودٍ آخر. صل بين رجل الأرضية GND في باي وخط التغذية السالب على لوحة الاختبار باستخدام سلكٍ ذو وصلاتٍ طرفية M2F، ثم صل أحد أرجل الزر بخط التغذية السالبة مستخدمًا سلك M2M، كما هو موضح في الشكل التالي. أخيرًا، صِل الرجل الآخرى للزر إذا كان ذا رجلين، أو الرجل التي تقع على نفس الجانب إذا كان الزر بأربعة أرجل إلى الرجل GP2 في المنصة GPIO.

wiring_push_button_13.png

شكل 4-6 توصيل الزر إلى المنصة GPIO

مراقبة إشارة صادرة عن ضغطة زر باستخدام سكراتش

ابدأ مشروع سكراتش جديد واسحب الكتلة when_GF_clicked.png إلى منطقة بناء البرنامج، ثم أضف تحتها الكتلة set_gpio_to_output_high.png وغيّر gpio إلى 2 gpio بالنقر على السهم المجاور واختيار هذه القيمة من القائمة المنسدلة ليتطابق مع الرجل التي وصلتها بالزر. انقر كذلك على السهم الصغير بجوار "output high" وحوِّلها إلى "input" لتهيئة الرجل على أنها رجل دخل لاستقبال الإشارات الكهربائية.

code_button_14.png

لن يحدث الآن شيء عند النقر على الراية الخضراء لأنك أخبرت سكراتش باستخدام الرجل GP2 على أنها رجل دخل، لكنك لم تخبرها ما الذي ستفعله عند تلّقي إشارة الدخل؛ لذلك اسحب الكتلةforever.png وضعها في نهاية السلسلة، ثم ضع ضمنها الكتلة if_then_else.png ابحث عن الكتلةgpio_is_high.pngوضعها في الفراغ الذي يأخذ شكل مسدس داخل الجزء if_then.png، ثم انقر على السهم الصغير بجوار "gpio" واختر 2 لتخبر الكتلة الشرطية أن تتحقق من دخل الزر رقم 2 في منصة GPIO. اسحب أخيرًا الكتلة say_hello_for_2_secs.png وضعها في فراغ الجزء else.png من الكتلة الشرطية، ثم غيِّر الكلمة "!Hello" إلى "!Button pushed"، ودع الجزء if_then.png فارغ حاليًا.

code_button_15.png

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

ربما لاحظت أن ما داخل الجزء if_gpio_2_is_high_then.png من العبارة الشرطية هو المكان الذي يجب أن توضع فيه الشيفرة الفعلية للتعامل مع الضغط على زر الكبس في لوحة الاختبار، إلا أن هذه الشيفرة في الجزء الآخر else.png. سيسبب هذا الأمر ارتباكًا، لأنك تتوقع أن ضغط الزر سينقل رجل المنصة إلى حالة الجهد المرتفع "high"، لكن الحالة المعاكسة هي الصحيحة في راسبيري باي؛ فعندما تخصص رجلًا من أرجل المنصة على أنها رجلٌ لاستقبال إشارة الدخل، فسيصبح جهدها مرتفعًا "high"؛ وعندما نضغط الزر، فإننا في الواقع سنصل رجل الدخل إلى جهد الأرضية GND، أي سنسحب جهده إلى الحالة المنخفضة "low".

اقتباس

الجهد المرتفع والمنخفض high/low state لرجل: عندما يكون جهد الرجل مماثلًا لجهد العمل في مكوّن رقمي يُعد في حالته المرتفعة، وعندما يماثل جهده جهد الأرضية GND فيُعد في حالته المنخفضة. في راسبيري باي: تُعد أي رجلٍ لها جهدٌ بين 3.3 و 5 فولت بحالتها المرتفعة، وتُعد في الحالة المنخفضة إذا كان أقل من 3 فولت. تمثل الحالة المرتفعة رقميًا القيمة 1 أو محقق True، والحالة المنخفضة 0 أو خاطئ False.

أمعن النظر في دارتك، ستجد اتصال الرجل GP2 التي تمثّل الجهد الموجب في الدارة مع رجل الأرضية عن طريق زر الكبس، وبالتالي ستصبح صفرًا (حالة منخفضة) عند ضغط الزر ولن يُنفَّذ الجزء if_gpio_2_is_high_then.png من العبارة الشرطية بل الجزء else.png. تذكر دائمًا أن راسبيري باي تستشعر ضغطة الزر عندما تنتقل حالة رجل الدخل من الحالة المرتفعة إلى المنخفضة.

سنضيف الآن مؤشرًا ضوئيًا إلى الدارة؛ لذلك صل الرجل GP25 بمقاومة، وصِل طرفها الآخر برجل المؤشر الضوئي الطويلة، ثم صِل أخيرًا رجل المؤشر الأقصر بخط التغذية السالب في لوحة الاختبار. اِسحب الكتلة say_hello_for_2_secs.png خارج الكتلة الشرطية واحذفها، ثم أضِف الكتلة set_gpio_25_to_output_low.png إلى الجزء if_gpio_2_is_high_then.png من العبارة الشرطية، وتذكر اختيار العدد 25 بالنقر على سهم القائمة المنسدلة، ثم أضف الكتلة set_gpio_25_to_output_high.png إلى الجزء الآخر else.png.

انقر على الراية الخضراء ثم اضغط الزر. لاحظ أنّ المؤشر سيضيء طالما أنك تستمر بالضغط على الزر، وسينطفئ إذا حررته. تهانينا، تستطيع الآن التحكم برجلٍ من أرجل المنصة GPIO بناءً على إشارة دخلٍ تتلقاها رجلٌ أخرى.

code_button_16.png

اقتباس

تحدٍ- أبقِ المؤشر مضاءً: كيف ستغير البرنامج لتُبق المؤشر مضاءً عدة ثوانٍ بعد تحرير الزر؟ ما الذي ستغيره لتجعل الزر مضاءً دائمًا ثم تطفئه عند الضغط على الزر؟

مراقبة إشارة صادرة عن ضغطة زر باستخدام بايثون

انقر على أيقونة جديد New في شريط أدوات ثوني لتُنشئ مشروعًا جديدًا، ثم احفظه باسم "Button Input". سنستخدم رجلًا من GPIO على أنها رجل دخل بنفس طريقة استخدامها مثل رجل خرج، لكننا سنحتاج إلى جزءٍ آخر من المكتبة GPIO Zero، لذلك اكتب الشيفرة التالية:

from gpiozero import Button
button = Button(2)

لجعل شيفرةٍ ما تعمل عند ضغط الزر، سنستخدم الدالة wait_for_press المدمجة مع المكتبة GPIO Zero، لذلك اكتب الشيفرة التالية:

button.wait_for_press() 
print("You pushed me!")

انقر على أيقونة التشغيل Run ثم اضغط الزر، فتظهر العبارة "!You pushed me" في نافذة المفسِّر أسفل نافذة ثوني. تهانينا، لقد قرأت بنجاحٍ إشارة الدخل القادمة إلى المنصة GPIO. انقر من جديد على الأيقونة Run إذا أردت اختبار البرنامج مجددًا، لأن شيفرته لا تحتوي حلقاتٍ لمراقبة الزر على الدوام، وسيتوقف كل شيءٍ بمجرد طباعة العبارة الموجودة في نهاية الشيفرة.

أعِد توصيل المؤشر الضوئي والمقاومة إذا لم تكن قد فعلت ذلك وفقًا للطريقة المُعتمدة في الفقرة السابقة. ولقراءة دخل الزر وإضاءة المؤشر، لا بدّ من إدراج جزئي المكتبة GPIO Zero المخصصين لذلك. أضِف سطري الشيفرة التاليين إلى بداية البرنامج:

from gpiozero import LED
from time import sleep

ثم أضِف السطر:

led = LED(25)

بعد السطر:

button = Button(2)

ثم احذف سطر التعليمة print وضع مكانها الأسطر التالية:

led.on()
sleep(3)
led.off() 

سيبدو برنامجك الآن على النحو التالي:

from gpiozero import LED
from time import sleep
from gpiozero import Button

button = Button(2)
led = LED(25)
button.wait_for_press()
led.on()
sleep(3)
led.off

انقر على أيقونة Run ثم اضغط على الزر، سيضيء المؤشر لثلاث ثوانٍ ثم ينطفئ وينتهي البرنامج. تهانينا، تستطيع الآن التحكم برجلٍ من أرجل المنصة GPIO بناءً على إشارة دخل تتلقاها رجلٌ أخرى باستخدام بايثون.

اقتباس

تحدٍ- أضف حلقة: كيف ستضيف حلقةً إلى برنامج ليستمر بمراقبة ضغطة الزر دائمًا وليس لمرةٍ واحدة فقط؟ ما الذي ستغيره ليبقى المؤشر مضاءً طالما أنك لم تضغط الزر، ثم ينطفئ بمجرد ضغط الزر؟

تشغيل منبه صوتي

إن التحكم بجهاز للإنذار والتنبيه باستخدام المؤشرات الضوئية أمرٌ عظيم، لكنه لن يخدمك كثيرًا إذا كنت تنظر بالاتجاه الآخر، وسيكون الحل باستخدام منبهٍ صوتي buzzer مسموعٍ في كل أرجاء الغرفة. سنحتاج في هذه الفقرة إلى:

  • لوحة اختبار.
  • أسلاك بوصلات طرفية منوعة M2F وF2F، إذا لم تشأ استخدام لوحة اختبار.
  • منبه صوتي فعّال Active.

يُعامل المنبه الصوتي الفعّال مثل المؤشر الصوتي من ناحية التوصيل والبرمجة. استخدم دارة توصيل المؤشر الضوئي نفسها لكن استبدل المؤشر الضوئي بالمنبه ولا تستخدم مقاومة لأن المنبه يحتاج إلى تيارٍ أعلى ليعمل. إذًا، صِل الرجل "GP15" بأحد رجلي المنبه مباشرةً، وصِل الرجل الأخرى له بأحد أرجل الأرضية "GND" للمنصة GPIO؛ أما في الحالة التي يمتلك فيها المنبه ثلاثة أرجل، صِل الرجل المعلّمة بإشارة "+" إلى رجل "3V3" والمعلمة بإشارة "-" إلى رجل أرضية "GND" والثالثة المُعلّمة بالحرف "s" (إشارة signal) إلى الرجل GP15.

connecting_buzzer_17.png

شكل 5-6 توصيل المنبه الصوتي إلى المنصة GPIO

التحكم بالمنبه الصوتي باستخدام سكراتش

أنشئ مشروعًا جديدًا مطابقًا لمشروع تشغيل المؤشر الضوئي، أو حمّله إذا كنت قد خزنته، وغيّر رقم الرجل في الكتل set_gpio_to_output_high.png ليصبح 15، وبالتالي سيتحكم سكراتش بالرجل GP15.

code_buzzer_18.png

انقر على الراية الخضراء وسيبدأ المنبه بإصدار صوتٍ لمدة ثانية ثم يتوقف لمدة ثانية. إذا لم يصدر سوى صوت نقرةٍ فقط وليس صوتًا متواصلًا خلال فترة تشغيل المنبه، فما تستخدمه هو منبهٌ غير فعّال passive؛ والذي يحتاج إلى إشارةٍ مهتزةٍ مستمرة حتى تتحرّض الصفيحتان المعدنيتان وتهتزان لإنتاج الصوت؛ بينما يولد المنبه الفعّال active إشارةً مهتزةً سريعة بنفسه.

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

اقتباس

تحدٍ- غيّر صوت المنبه: كيف ستعدّل البرنامج حتى يصدر المنبه صوتًا لمدةٍ أقصر؟ هل يمكن بناء الدارة بحيث تتحكم بالمنبه عبر زر؟

التحكم بالمنبه الصوتي باستخدام بايثون

يُعد التحكم بمنبهٍ صوتي مشابهًا تمامًا للتحكم بمؤشر ضوئي عند استخدام المكتبة GPIO Zero، فللمنبه أيضًا حالتان: تشغيل أو إطفاء. سنحتاج بالطبع إلى دالةٍ مختلفة، وهي buzzer.

ابدأ مشروعًا جديدًا في ثوني واحفظه باسم Buzzer، ثم اكتب الشيفرة التالية:

from gpiozero import Buzzer
from time import sleep

عليك أيضًا تحديد رجل GPIO التي تتصل بالمنبه الصوتي، حتى تتمكن من التحكم به، لذا اكتب الشيفرة التالية:

buzzer = Buzzer(15)

تتطابق بقية الشيفرة مع مثيلاتها التي تتحكم بالمؤشر الضوئي ما عدا أنك ستستخدم كلمة "buzzer" بدلًا من "led"، وأنّ رقم رجل GPIO مختلف. اكتب إذًا الشيفرة التالية:

while True:
    buzzer.on()    
    sleep(1)    
    buzzer.off()    
    sleep(1)

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

اقتباس

تحدٍ- منبه صوتي أفضل: كيف ستعدّل البرنامج حتى يصدر المنبه صوتًا لمدة أقصر؟ هل يمكن بناء الدارة بحيث تتحكم بالمنبه عن طريق زر؟

المشروع الثاني: إشارات المرور الضوئية

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

ستحتاج في هذا المشروع إلى:

  • لوحة اختبار.
  • ثلاث مؤشرات ضوئية أحمر وأصفر وأخضر.
  • ثلاث مقاومات قيمة كل منها 330 أوم.
  • منبه صوتي.
  • زر.
  • مجموعة من الأسلاك بوصلات طرفية M2M وM2F.

لبناء الدارة: صِل المنبه بالرجل "GP15"، والمؤشر الضوئي الأحمر بالرجل "GP25"، والأصفر بالرجل "GP8"، والأخضر بالرجل "GP7"، والزر بالرجل "GP2"، ولا تنس وصل مقاومة 330 أوم بين الرجل الطويلة لكل مؤشرٍ ضوئي ورجل GPIO المتصل بها، ثم صِل الأرجل القصيرة للمؤشرات بخط التغذية السالب على لوحة الاختبار. صِل أخيرًا خط التغذية السالبة بأي رجلٍ أرضية GND من أرجل GPIO باستخدام سلكٍ ذي نهاياتٍ طرفية M2F.

wiring_traffic_lights_19.png

شكل 6-6 مخطط التوصيل لمشروع الإشارات الضوئية

ابدأ مشروعًا جديدًا في سكراتش 2 ثم اسحب الكتلة when_GF_clicked.png إلى منطقة تنفيذ البرنامج. سنخبر سكراتش بعد ذلك بأن الرجل "GP2" المتصلة بالزر هي رجل دخل وليس خرج؛ لذلك اسحب الكتلة set_gpio_to_output_high.png من فئة "كتل أخرى More Blocks" إلى أسفل الكتلة when_GF_clicked.png. انقر السهم بجوار الرقم 0 واختر الرقم 2، ثم انقر على السهم الصغير الآخر بجوار "output high" واختر "input".

code_traffic_20.png

سننشئ تاليًا سلسلة الكتل المتحكمة بإشارات المرور، لذلك اسحب الكتلة forever.png إلى منطقة بناء البرنامج، ثم ضع داخلها الكتل التي تسمح بتشغيل وإطفاء المؤشرات الضوئية الثلاث وفق نمطٍ محدد، أي كم ثانية سيعمل الأحمر ثم ينطفئ ثم الأصفر ثم الأخضر. لا تنس أنّ المؤشر الأحمر مرتبطٌ بالرجل "GP25" والأصفر بالرجل "GP8" والأخضر بالرجل "GP7".

code_traffic_21.png

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

لمحاكاة مرور المشاة، لا بدّ لبرنامجك من مراقبة الزر إذا ضُغط أم لا. أوقف البرنامج بالنقر على المثمن الأحمر في حال كان يعمل. اسحب الكتلة if_then_else.png إلى برنامجك لتكون داخل الكتلة forever.png مباشرةً، ثم انقل الكتل التي تتحكم بإشارات المرور إلى الجزء if_then.png ولا تضع شيئًا في الوقت الحالي ضمن الفراغ الذي سيحمل شرط تنفيذ هذا الجزء.

code_traffic_22.png

لا يغير المشاة الضوء إلى الأحمر بالضغط على الزر ساعة يشاؤون كي يعبروا الشارع، بل سينتظرون تحوُّل الإشارة إلى الأحمر. لبناء ذلك، اسحب كتلة when_GF_clicked.png أخرى تليها كتلة forever.png، ثم اسحب كتلة if_then_else.png إلى داخلها، وضع المعامل not.png في فراغ الشرط للجزء if_then.png، ثم ضع الكتلة gpio_2_is_high.png ضمن فراغ المعامل. أنشئ أخيرًا متغيرًا جديدًا باسم "pushed"، ثم ضع الكتلة set_pushed_to_1.png داخل الجزء if_then.png من الكتلة الشرطية.

code_traffic_23.png

ستراقب هذه السلسلة من الكتل الحالة التي يُضغط فيها الزر ومن ثم تسند القيمة 1 إلى المتحول pushed، أي ستتذكر أنك ضغطت على الزر دون أن تنفذ شيئًا في الوقت الحالي.

عُد إلى السلسلة السابقة من الكتل واسحب العامل equal.png إلى داخل فراغ الشرط في الجزء if_then.png، ثم اسحب الكتلة pushed.png إلى فراغ المعامل الأول واكتب 0 في فراغه الآخر.

code_traffic_24.png

انقر على الراية الخضراء وراقب الإشارات الضوئية. اضغط الزر على لوحة الاختبار، فلن تلاحظ شيئًا للوهلة الأولى؛ لكن عندما ينتهي نمط عمل الإشارات وذلك بإضاءة المؤشر الأصفر، ستنطفئ المؤشرات الضوئية وتبقى على هذا الحال، وذلك بفضل المتغير pushed. يبقى علينا الآن إسناد مهمةٍ أخرى لزر عبور المشاة غير إطفاء الإشارات.

اسحب الكتلة set_gpio_25_to_output_high.png إلى داخل الجزء else.png للكتلة الشرطية في تسلسل الكتل الرئيسي، وتذّكر تغيير رقم الرجل ليطابق الرجل الموصولة مع المؤشر الأحمر.

ابقى داخل الجزء else.png وانشئ نمطًا لتشغيل المنبه الصوتي وذلك بسحب الكتلة repeat_10.png ووضع تسلسل الكتل التالي: set_gpio_15_to_output_high.png، ثم wait_0.2_secs.png، ثم الكتلة set_gpio_15_to_output_low.png، ثم wait_0.2_secs.png ضمنها، ولا تنس تغيير رقم الرجل لتلائم تلك المتصلة مع المنبه.

أخيرًا، ضع الكتلة set_gpio_25_to_output_low.png مباشرةً تحت الكتلة repeat_10.png وبعدها الكتلة set_pushed_to_0.png التي تغير قيمة المتغير pushed إلى 0 لتنهي حالة ضغط الزر فلا يتكرر تسلسل تشغيل المنبه إلى ما لانهاية.

انقر الآن على الراية الخضراء، ثم اضغط الزر على لوحة التحكم، وبعد انتهاء نمط تشغيل الإشارات الضوئية، سيضيء المؤشر الأحمر ويبدأ المنبه بإصدار صوتٍ ينبه المشاة بأن الوضع آمنٌ لعبور الشارع. سيتوقف الصوت بعد ثانيتين وتعود إشارات المرور إلى العمل وفق النمط المحدد.

code_traffic_25.png

تهانينا، لقد أنجزت برنامجًا يتحكم بمجموعة إشارات مرورية مزودةٍ بآلية لمساعدة المشاة في العبور الآمن.

اقتباس

تحدٍ- هل تستطيع تطوير البرنامج؟ هل يمكنك إعطاء المشاة وقتًا أطول للمرور؟ هل تستطيع إيجاد معلوماتٍ عن أنماط الإشارات المرورية في بلدانٍ أخرى ومن ثم تعيد برمجة مشروعك ليلائم تلك الأنماط؟ ما هي الطريقة التي تجعل المؤشرات الضوئية أقل إضاءةً؟

مشروع بلغة بايثون: لعبة سرعة رد الفعل

لقد اطلعت حتى الآن على طريقة استخدام المؤشرات الضوئية والأزرار مثل أجهزة دخل وخرج، لذلك حان الوقت لبناء مشروع حوسبةٍ فيزيائيةٍ واقعي، وهو لعبةٌ مؤلفةٌ من لاعبين لقياس سرعة رد فعل كلٍ منهما وتحديد زمن الاستجابة الأسرع. ستحتاج في هذا المشروع إلى:

  • لوحة اختبار.
  • مؤشر ضوئي.
  • مقاومة 330 أوم.
  • زري كبس.
  • بعض الأسلاك ذات الوصلات الطرفية M2F وM2M.

سنبدأ بناء الدارة بوصل الزر الأول الذي نضعه على الجانب اليساري للوحة الاختبار مع الرجل "GP14" للمنصة GPIO، والزر الآخر في الجانب اليميني مع الرجل "GP15". نصل بعد ذلك طرف المقاومة بالرجل "GP4" وطرفها الآخر بالرجل الطولية للمؤشر الضوئي. نصل الأرجل الباقية للزرين والمؤشر مع خط التغذية السالب في لوحة الاختبار، ثم نصل الخط مع أي رجلٍ أرضية GND للمنصة GPIO، كما هو موضح في الشكل التالي.

wiring_quik_raection_game_26.png

شكل 7-6 توصيل عناصر لعبة رد الفعل الأسرع

أنشئ مشروعًا جديدًا في ثوني واحفظه باسم"Reaction Game". سنستخدم لكتابة الشيفرة الدالتين LED و button من المكتبة GPIO Zero، والدالة sleep من المكتبة time. سندرج دالتي المكتبة GPIO Zero على سطرٍ واحد باستخدام الفاصلة ",". اكتب الشيفرة التالية:

from gpiozero import LED, Button
from time import sleep

حدد الآن أرجل GPIO المتصلة مع المؤشر الضوئي والزرين، لذلك اكتب الشيفرة التالية:

led = LED(4)
right_button = Button(15)
left_button = Button(14)

أضِف بعد ذلك تعليمات تشغيل وإطفاء المؤشر الضوئي للتحقق من عمله:

led.on()
sleep(5)
led.off()

انقر على أيقونة التشغيل Run وسترى أن المؤشر سيضيء مدة خمس ثوانٍ ثم ينطفئ وينتهي البرنامج. لكن سيكون إطفاء المؤشر الضوئي بعد 5 ثوانٍ أمرًا متوقعًا في لعبةٍ مثل التي نبنيها، لذلك أضف السطر التالي:

from random import uniform

بعد السطر:

from time import sleep

تتيح لك المكتبة random إمكانية توليد أعدادٍ عشوائية وفق قاعدة التوزيع المنتظم uniform distribution)، لذلك استبدل تعليمة (5)sleep بالسطر التالي:

sleep(uniform(5, 10))

إذا شغّلت البرنامج مجددًا، سترى أن المؤشر يضيء مدةً عشوائيةً بين خمس وعشر ثوان. جرّب ذلك بتشغيل البرنامج مراتٍ عديدة وقياس مدة الإضاءة في كلِّ مرة. لاحظ كيف ستختلف أزمنة الإضاءة، مما يجعل توقع لحظة توقف المؤشر عن الإضاءة غير متوقعة.

سنضيف الآن الدالة المُسماة pressed لتفعيل عمل زري اللاعبين، لذلك اكتب الشيفرة التالية في آخر برنامجك:

def pressed(button):
    print(str(button.pin.number) + " won the game")

تميّز بايثون التعليمات الواقعة داخل دالةٍ من خلال إزاحتها إلى اليمين، وهذا ما يفعله ثوني تلقائيًا. أضِف أخيرًا السطرين التاليين لاستشعار ضغط اللاعب على زره:

right_button.when_pressed = pressed 
left_button.when_pressed = pressed

لا تزح السطرين السابقين كي لا يعدّهما بايثون جزءًا من الدالة.

شغّل البرنامج وحاول هذه المرة الضغط على أحد الزرين في اللحظة التي ينطفئ فيها المؤشر الضوئي، ستظهر عندها رسالةً في نافذة المفسِّر أسفل نافذة ثوني مفادها أن الزر قد ضُغط، لكن ستظهر الرسالة في كل مرةٍ يُضغط فيها أيٌّ من الزرين دون تمييز، وستعرض رقم الرجل التي تلقت إشارة الزر بدلًا من إظهار اسمٍ ملائمٍ للاعب. لتحسين الوضع، سنبدأ بسؤال اللاعبين عن اسميهما، لذلك اكتب الشيفرة التالية:

left_name = input("Left player name is ") 
right_name = input("Right player name is ")

تحت السطر:

from random import uniform

عُد إلى الدالة واستبدل محتواها بالشيفرة التالية:

    if button.pin.number == 14:
        print (left_name + " won the game")    
    else:        
        print(right_name + " won the game")

شغِّل البرنامج من جديد، ثم اختر اسمين للاعبين وحاول الضغط على الزر بأقصى سرعة عند توقف إضاءة المؤشر. سترى هذه المرة ظهور اسم اللاعب بدلًا من رقم الرجل، لكن ستظهر الرسالة بمجرد ضغطت الزر دون أن تعرف من هو الأسرع. لإصلاح الأمر سندرج الدالة exit من المكتبة "sys" اختصارًا للكلمة System، تحت آخر سطرٍ لإدراج الدوال في برنامجك:

from os import _exit

اكتب التعليمة التالية في آخر سطرٍ من أسطر الدالة pressed:

    _exit(0)

وانتبه إلى إزاحة التعليمة بمقدار أربع مسافاتٍ فارغة عن بداية تعريف الدالة لأنها جزءٌ منها. ستنهي هذه التعليمة البرنامج بمجرد أن يُضغط أحد الزرين، وبالتالي يفوز اللاعب الذي يضغط أولًا.

سيبدو برنامجك بشكله النهائي على النحو التالي:

from gpiozero import LED, Button
from time import sleep
from random import uniform
from os import _exit

left_name = input("Left player name is ")
right_name = input ("Right player name is ") 
led = LED(4) 
right_button = Button(15)
left_button = Button(14)

led.on()
sleep(uniform(5, 10))
led.off()

def pressed(button):
    if button.pin.number == 14:        
        print(left_name + " won the game")    
    else:        
        print(right_name + " won the game")    
    _exit(0)

right_button.when_pressed = pressed
left_button.when_pressed = pressed

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

ستشاهد أيضًا في نافذة المفسِّر سطرين تظهرهما بايثون، أولهما (Backend terminated (returncode: 0؛ والذي يعني أن بايثون تلّقى الأمر (exit(0_ وأوقف البرنامج، والثاني . . . Use 'Stop/Restart' to restart the backend؛ والذي يخبرك أن البرنامج قد أُوقِف وعليك النقر على أيقونة الإيقاف Stop لإنهائه.

stop_the_program_27.png

شكل 8-6 حالما يتحدد الفائز عليك إيقاف برنامجك

تهانينا، لقد أنجزت لعبةً إلكترونيةً حقيقية.

اقتباس

تحدٍ- طوّر اللعبة: هل تستطيع إضافة حلقةٍ لتستمر في اللعب بصورةٍ متواصلة؟ تذكر أن تزيل الأمر (exit(0_ أولًا، هل تستطيع إضافة عدادٍ لحساب النتيجة بعد عدّة جولات؟ هل يمكنك استخدام مؤقتٍ لتحديد زمن ردّة فعل اللاعب عند توقف الإضاءة؟

ترجمة -وبتصرف- للفصل السادس "Physical computing with scratch and python" من كتاب The official Raspberry Pi beginner's guide.

اقرأ أيضًا


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

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

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



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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...