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

أروى عفان

الأعضاء
  • المساهمات

    46
  • تاريخ الانضمام

  • تاريخ آخر زيارة

2 متابعين

آخر الزوار

1475 زيارة للملف الشخصي

إنجازات أروى عفان

عضو نشيط

عضو نشيط (3/3)

5

السمعة بالموقع

  1. تتطلع الشركات في وقتنا الحالي إلى العمل بأسلوب ذي وتيرة إنجاز سريع والتركيز على جعل التحديثات "مملة"، لأنها أصبحت بسيطةً ومتوقعة، وهذه هي الخصائص الأساسية لنشر البرامج بصورة مستمرة وبثقة والتعامل مع التحديثات على أنها نشاط اعتيادي. تحدث كل من (دايفيد فارلي) و(جيز هامبل) في عام 2010 في كتابهما التسليم المستمر (Continuous Delivery) عن التصدير المستمر للبرمجيات، إذ ستجد في كتابهما عدة ممارسات لا تزال صالحة في يومنا هذا. إذًا، فالتسليم المستمر Continuous Delivery ليس مفهومًا جديدًا، لكن العديد من المؤسسات لا تزال لا تجيد تطبيقه. ستجد في هذا المقال مفاهيمًا تساعدك على فهم مبدأ النشر المستمر ونصائح لكيفية تطبيق ممارسات عملية لتحسين تقييمات العملاء التي تحصل عليها بعد كل إصدار. ما هو النشر المستمر CD الغرض من النشر هو استخدامه كطريقة للحصول على آراء العملاء، إذ ستحصد أكبر قدر ممكن من تعليقات العملاء عند كل نشر. لكن، للحصول على تعليقات قيّمة، يجب أن تأخذها من مستخدمي برامجك. ولذلك، تحتاج إلى إصدار التحديثات في بيئة الإنتاج production environment. وهذا هو جوهرالنشر المستمر Continuous Deployment أي نشر التعليمات البرمجية في بيئة الإنتاج بصورة آمنة ومستمرة وآلية ومؤتمتة دون الحاجة لإجراء أي تحقق يدوي. ملاحظة: بيئة الانتاج هي مكان نشر التطبيق وجعله متاحًا للمستخدمين، كمثال عليها Play Store أو الموقع الخاص بشركة ما بحيث ترفع تطبيقها عليه على سبيل المثال. قد يخطر في ذهنك أن هذا المفهوم غير مُستَخدَم على أرض الواقع وأنه مفهوم نظري وحسب، لكن تطبق الشركات الكبرى كشركة نتفليكس Netflix وايتسي Etsy وتسلا Tesla مفهوم النشر المستمر لنشر التحديثات البرمجية لتطبيقاتها المختلفة، فعند نشر التحديثات البرمجية تحصل الشركات على آراء المستخدمين بعد الاستخدام الفعلي، وتترجمها إلى خدمات أو تستخدمها لتطوير منتجاتها. وهذا هو الفرق الأساسي بين التسليم المستمر Continuous Delivery والنشر المستمر Continuous Deployment. ما الفرق بين النشر المستمر والتسليم المستمر إن النشر المستمر والتسليم المستمر هما أساس DevOps لكن الاعتقاد أن النشر المستمر هو نفس التسليم المستمر هو خطأ شائع، إذ إنه ثمة فرق بينهما يتعلق بوقت نشر التحديث. فالتسليم المستمر هو القدرة على تجهيز التحديثات البرمجية بحيث تكون جاهزة للإصدار. أي أن التحديثات مرت في أنابيب تجزئة تنفيذ التعليمات ونجحت في جميع الاختبارات، وليس هناك حاجة للعمل عليها. إذًا، أصبحت التحديثات البرمجية مؤهلة للإصدار. أما النشر المستمر فهو استراتيجية إصدار أو نشر تُستخدم في النشر المستمر Continuous Delivery، إن كان التحديث جاهزًا للنشر فيُدفع إلى بيئة الإنتاج تلقائيًا، أي يُصدر. فلا يمكن تطبيق النشر المستمر دون تطبيق التسليم المستمر، وبالتالي فإن التسليم المستمر هو الخطوة الأولى لإصدار التحديثات آليًّا وبسرعة وأمان وبطريقة "مملة" تحتاج إلى تنفيذ بعض الآليات المهمة بدءًا من التكامل المستمر. وللتعرف على المزيد من المعلومات حول أبرز الفروقات بين النشر المستمر والتسليم المستمر ننصحك بمشاهدة الفيديو التالي: ما سبب أهمية التكامل المستمر يُعد التكامل المستمر إحدى الممارسات المهمة لبناء خط تجزئة يصَدّر البرمجيات آليًّا مع التركيز على الجودة. توجد ثلاث قواعد أساسية للتكامل المستمر: يبنى البرنامج من فرع واحد من مجلد الشيفرة البرمجية code repository. يستخدم خط التجزئة مجموعة اختبارات مؤتمتة وموثوقة. إذا فشل بناء البرنامج، تتوقف عملية التكامل وتُلغى التعديلات. وبهذه الطريقة، تحرص على أن جميع التعديلات مؤهلة للإصدار، حتى لو أجلت الإصدار إلى وقت آخر أو منصة آخرى. لكن القاعدة الأهم هي إجراء اختبارات مؤتمتة موثوق بها. كما ستحتاج إلى إجراء اختبارات سريعة وتعمل بالتوازي، واختبارات لجميع السيناريوهات المهمة في تطبيقك، مثل اختبار المسار السعيد happy path test، واختبار للبيانات التي عطلت الإنتاج سابقًا، واختبار إدخال بيانات غير صحيحة. لا تحتاج إلى الحصول على درجة تغطية الشيفرة code coverage بنسبة 100%، ولكن يجب عليك زيادة عدد الاختبارات التي تجريها تدريجيًا قبل الإعلان عن جاهزية التعديلات البرمجية. لن تجري الأمور بسلاسة دائمًا كما خططت، وهذا أمر متوقع. ولهذا يجب أن تكون لديك القدرة على حل المشكلات فورًا. لا تترك خط التجزئة معطوبًا أبدًا. فالهدف هو ترك مسار متوفر في حال احتجت إلى إجراء تغيير طارئ، والاستمرار في استخدام خط التجزئة المؤتمت الذي أنشأته. وبطبيعة الحال، لن تصل إلى هذه النقطة بين عشية وضحاها، لذلك يجب أن تتبنى عقلية التحسين المستمر كي تنجح. والآن سنتعمق أكثر في كيفية تطبيق النشر المستمر. كيفية تطبيق النشر المستمر الخطوة الأولى، هي التدرب على أجزاء صغيرة من العمل، لا تنتظر حتى تجمّع تعديلات كافيةً أو مهمةً كي تنشر تحديثًا في بيئة الإنتاج. فكلما كانت التعديلات صغيرة، كان اختبارها ونشرها أسهل وأسرع. وتستطيع بهذه الطريقة التدرب مرارًا حتى تصل إلى نقطة يكون فيها وضع التعديلات مستقرًا. كما أن استخدام الأدوات هو أمر مهم، لذلك يجب أن تستخدم أدوات تساعدك في بناء، واختبار، وتحزيم، ونشر، وإصدار البرامج بصورة آليّة. إن إدارة الميزات Feature Management تُعد مفيدة للغاية، إذ يمكنك أن تفعّل التحديثات البرمجية للعملاء بنقرة واحدة. وبهذه الطريقة، تجعل الشيفرة البرمجية جاهزة للإصدار حتى لو لم تكن مكتملة. إذ يمكنك تفعيل ميزة ما لكي تختبرها، أو تفعيلها في جزء معين من الشيفرة لإجراء اختبارات ألف/باء أو A/B tests وأي اختبار آخر. فكل ذلك متاح بالإضافة إلى الحصول على آراء العملاء القيمة فورًا، وإنتاج برامج أفضل مع كل إصدار. لكن يجب أن تطبق النشر المستمر لغرض واضح مثل الابتكار، أو تحسين جودة البرامج، أو إصدار الميزات في الوقت المناسب. حتى إن وُجِدت قيود لا تسمح لك بتطبيق النشر المستمر، فإن الاستعداد لذلك سيساعدك على تقليل الوقت والجهد اللازمين لكل إصدار. الخاتمة لنلخص ما ورد في مقالنا، النشر المستمر هو القدرة على إصدار التحديثات البرمجية آليًّا دون أي تدخل بشري. تحتاج لتطبيق ذلك إلى الاعتماد على مجموعة اختبارات مُحكمَة الإعداد لتلافي حدوث الأخطاء، كما أن تقسيم التغييرات الكبيرة إلى تغييرات أصغر يسمح لك بالتدرب أكثر وتقليل احتمالات ظهور الأخطاء (كما يسهل التراجع عن عن هذه التغييرات الصغيرة). لا يمكنك تطبيق النشر المستمر بين عشية وضحاها، إذ إنه ثمة سلسلة من الخطوات التي عليك اتباعها أولاً. وترتيب هذه الخطوات هو كالتالي: التكامل المستمر، ثم التسليم المستمر، ثم النشر المستمر. كما يمكنك التدرب في بيئة التطوير أو الاختبار، وليس ضروريًا أن تبدأ في بيئة الإنتاج، ولكن عليك أن تحدد ما تريد إنجازه، مثلًا هل تريد تحقيق وقت تسويق قصير Time To Market، أم تريد تحقيق مدة توريد Lead Time قصيرة، أم تريد إجراء المزيد من التجارب. يمكنك اعتماد فحص يدوي أخير إذا كنت تحتاج إلى ذلك (على سبيل المثال، للتحقق من التوافق، أو التحقق من متاجر تطبيقات الأجهزة المحمولة، أو الأجهزة الطبية)، ولكن هذا يُعد تسليمًا مستمرًا، ولا بأس في ذلك. إذ يمكن تطبيق الممارسات والأدوات المذكورة في مقالنا، بغض النظر عن مجال عملك أو كميته. وإذا كان لديك من الاستفسارات حول ما ورد في مقالنا، أو أردت الحصول على الدعم والمساعدة أضف سؤالك في قسم التعليقات أسفل المقال، أو اكتبه في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال What Is Continuous Deployment? A Complete Explanation من موقع Cloudbees. اقرأ أيضًا مدخل إلى التكامل المستمر والنشر المستمر CI/CD أفضل ممارسات منهج التكامل المستمر والتسليم المستمر CI/CD إعداد التكامل المستمر والنشر المستمر باستخدام الخدمتين CircleCI وCoveralls التكامل المستمر: تثبيت Concourse CI على أوبنتو محاكاة عقلية DevOps
  2. تعد الصور ذات الصيغ التالية JPG و PNG و GIF إحدى أكثر صيغ الصور الشائعة منذ التسعينات. لكن، بخلاف صور JPG و PNG، فإن صور GIF تحتوى على إطارات متعددة من الرسوم المتحركة، وهي منتشرة انتشارًا واسعًا في شبكة الإنترنت. تعد صور GIF أو نسق الرسومات المتبادلة تقنيةً قديمةً وقد أصبحت أقل فاعلية من تضمين مقاطع الفيديو الويب، لأن معظم فيديوهات الويب تستخدم تقنيات ضغط حديثة وبرامج ترميز Codecs أحدث من المستخدمة في الصور المتحركة GIF. تُستخدم برامج الترميز Codecs (أو المرمازات) لترميز مقاطع الفيديو وفك ترميزها، وتحتوي معظم المنصات على عتاديات مخصصة لتشغيل برامج الترميز هذه. أما ملفات GIF، يُفَك ترميزها مباشرةً باستخدام وحدة المعالجة المركزية CPU، حيث إن حمل وحدة المعالجة المركزية اللازم لمعالجة ملف GIF منخفض الدقة ذو إطارات متحركة قليلة لا يكاد يذكر، ولكن يمكنك من الناحية الفنية إنشاء ملف GIF بدقة ومعدل إطارات مماثل لمقاطع فيديوهات YouTube، وسوف تتفاجأ بعدد موارد النظام التي يستهلكها ذلك. وعلى الرغم من ذلك، لا تزال ملفات GIF مفيدة لأنها تُعد صورًا وليست مقاطع فيديو، ونظرًا لطريقة عمل الويب والتطبيقات الأخرى، فهذا يعني أنها ستُعرض وتحرك تلقائيًا في عدة تطبيقات، ولن تحتاج إلى تضمينها أو ربطها على نحو منفصل. ويُعد استخدام صور GIF مفيدًا في صور التفاعل، أو لتطوير الخيال التفاعلي، أو في تنسيقات العروض الأخرى. سنتعرف في هذا المقال على عدة أدوات لإنشاء الصور المتحركة GIF من مقاطع الفيديو، وعلى كيفية تحسين حجمها ودقتها، وطريقة استخدامها في عدة مجالات. كما يمكنك دمج هذه الأدوات واستخدامها في حزمة تطبيقات أخرى. المتطلبات سنزودك في هذا المقال بإرشادات تثبيت خادم أوبنتو 22.4، يمكنك الاستعانة بالمقال التالي لتثبيته. كما ستحتاج إلى تثبيت مدير الحزم Homebrew لتثبيت إحدى الأدوات التي سنتحدث عنها في مقالنا. الخطوة الأولى: تثبيت الأدوات ffmpeg وGifski وGifsicle ستحتاج إلى ثلاثة أدوات كي تستطيع متابعة خطوات هذا المقال. أول أداة ستحتاجها هي ffmpeg التي سنستخدمها لقص الفيديو والتعديل عليه، ثم سنستخدم Gifski لإنشاء صور GIF، و Gifsicle لتحسين الصور والتعديل عليها. ستجد هذه الأدوات متاحة في أغلب المنصات. كلا الأداتان ffmpeg و gifsicle متاحتان في مستودعات أوبنتو، ويمكنك تنزيلها باستخدام مدير الحزم apt. أولًا، حَدّث الحزم باستخدام الأمر apt update: sudo apt update ثم ثبت حزمتي ffmpeg و gifsicle باستخدام الأمر apt install: sudo apt install ffmpeg gifsicle أما الأداة الثالثة gifski فهي متاحة بواسطة Homebrew ويمكنك تثبيتها بواسطة الأمر brew install: brew install gifski قد يستغرق ذلك بضع دقائق لأن Homebrew سيثبت بعض الاعتماديات dependencies. والآن، بعد أن ثبّت جميع الأدوات اللازمة على جهازك، عليك اختيار فيديو لإنشاء صورة GIF منه. الخطوة الثانية: تنزيل وفحص ملف الفيديو بإمكانك إنشاء صورة GIF من أي مقطع فيديو على جهازك، أو يمكنك استخدام الفيديو التعريفي بمنصة تطبيقات DigitalOcean. لتنزيل نسخة من الفيديو من باستخدم الأمر curl: curl -O https://deved-images.nyc3.digitaloceanspaces.com/gif-cli/app-platform.webm curl هي إحدى أدوات سطر الأوامر تخولك من إنشاء مختلف طلبات الويب web request، مثلًا عند استخدام الراية -o مع عنوان URL فهذا يوّجه curl إلى تنزيل ملف من الإنترنت وتخزينه على جهازك بنفس الاسم. والآن، بعد أن أصبح عندك نسخةً من الفيديو على جهازك، بإمكانك التحقق من بياناته الوصفية metadata لأن ذلك مفيد عند إنشاء صورة GIF ذات جودة عالية. بعد تثبيت الأداة ffmpeg يمكنك استخدام الأمر ffprobe الذي يسمح لك التحقق من الدقة resolution، ومعدل الإطارات framerate، والمعلومات الأخرى في ملفات الوسائط. استعرض هذه المعلومات باستخدام الأمر ffprobe على الفيديو app-platform.webm الذي نزلته: ffprobe app-platform.webm ستحصل على الخرج التالي: Output … Input #0, matroska,webm, from 'app-platform.webm': Metadata: ENCODER : Lavf59.27.100 Duration: 00:01:59.04, start: -0.007000, bitrate: 1362 kb/s Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 1920x1080, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn (default) Metadata: DURATION : 00:01:59.000000000 Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default) Metadata: DURATION : 00:01:59.041000000 يعرض الخرج التدفقات Streams الموجودة في الملف (عادةً فيديو واحد ودفق صوتي واحد على الأقل)، بالإضافة إلى معدل العينات sample rate، وبرامج الترميز Codecs، والخصائص الأخرى للتدفقات. لاحظ أن المعلومات المظللة في الخرج تدلنا أن الفيديو مرمز بدقة 1080 بكسل، ويُشَغل بمعدل 25 إطارًا في الثانية، كما أن طوله دقيقتين تقريبًا، وهو طويل جدًا بالنسبة لصورة GIF واحدة! أصبح عندنا المعلومات الكافية للانتقال إلى الخطوة التالية حيث سنقص مقطعًا من هذا الفيديو لإنشاء صورة GIF منه. الخطوة الثالثة، قص مقطع من الفيديو الآن أصبح لديك مقطع فيديو مدته دقيقتان وأصبحت تعرف خصائصه. قبل تحويله إلى صورة GIF عليك تقصير الفيديو،. ولا يُستحسن تشغيل مقطع الفيديو في الطرفية، لذا شاهد الفيديو على YouTube لتختار المقطع الذي تريده. اخترنا في مقالنا المقطع من الثانية 00:00:09 إلى الثانية 00:00:12، مما ينتج لدينا مقطعًا متحركًا سلسًا على النحو التالي: يمكنك قص الفيديو app-platform.webm باستخدام الأداة ffmpeg كالتالي: ffmpeg -ss 00:00:09 -to 00:00:12 -i app-platform.webm -c copy clip.webm إليك الشرح التفصيلي للأمر السابق: يعبر الجزء الأول -ss 00:00:09 -to 00:00:12 عن كيفية فهم ffmpeg للشيفرة الزمنية، من نقطة البدء إلى نقطة النهاية. كما يمكنك القص اعتمادًا على المدة أو أجزاء من الثانية. الجزء -i app-platform.webm هو مسار الفيديو مسبوقًا بـ -i. نحدد بعد الجزء -c copy مرماز فيديو الخرج أو الصوت للأداة ffmpeg، واستخدمنا للأمر copy بدلًا عن برنامج ترميز كي نحصل على الفيديو الجديد بسرعة، وبدون ترميز، ولنتفادى انخفاض دقة الفيديو. وبما أننا سننشأ صورة GIF فلا بأس إن حافظنا على نفس الصيغة في ملف الخرج لتوفير الوقت، لأننا سنحول الفيديو الناتج إلى صورة متحركة. الجزء clip.webm هو مسار الفيديو الناتج. ستحصل بعدها على فيديو مدته ثلاث ثواني باسم clip.webm، ويمكنك التأكد من حجمة باستخدام الأمر ls -lh: ls -lh clip.webm ستحصل على النتيجة التالية: Output -rw-r--r-- 1 sammy sammy 600K Nov 16 14:27 clip.webm لاحظ أن حجم ثلاث ثوانٍ من مقطع الفيديو هو 600K، بامكانك استخدام هذا الحجم كمرجع للمقارنة عندما تنشأ صورة GIF في الخطوة التالية. ملاحظة: إن كنت تستعمل جهازك المحلي، فيمكنك استخدام الأداة Lossless Cut وهي أداة واجهة رسوميات مفتوحة المصدر تستخدم لقص مقاطع الفيديو. تُعد هذه الأداة مفيدةً لأنها تنفذ نفس أوامر ffmpeg لاستخراج وقص مقاطع فيديو بسرعة استنادًا إلى الشيفرة الزمنية، دون إعادة ترميز الفيديو. بخلاف تشغيل ffmpeg في الطرفية، فإن Lossless Cut تحتوي على مشغل فيديو مدمج وواجهة تنقل. الخطوة الرابعة، تحويل الفيديو إلى صورة GIF بعد أن أصبح لديك مقطع فيديو مدته ثلاث ثوان وأصبحت تعرف معدل الإطارات والدقة اللازمة، بإمكانك الآن إنشاء صورة GIF منه. كما يمكنك تطوير خط آلي لتحويل مقاطع الفيديو إلى صور GIF، وحينها تستخدم الأداة ffprobe لاستخراج دقة الفيديو ومعدل الإطارات تلقائيًا من الفيديو وتمريرها مباشرةً إلى الأوامر اللاحقة. في مقالنا، سندخل يدويًا قيم الدقة ومعدل الإطارات للخرج المطلوب. لدينا عدة خيارات لإنشاء صور GIF في سطر الأوامر، يمكننا استخدام ffmpeg لوحدها لكن صيغة أوامرها صعبة الفهم والتغيير: ffmpeg -filter_complex "[0:v] fps=12,scale=w=540:h=-1,split [a][b];[a] palettegen [p];[b][p] paletteuse" -i clip.webm ffmpeg-sample.gif لاحظ أننا في مثالنا قلصنا الدقة ومعدل الإطارات إلى النصف، لنحصل على معدل إطارات 12fps ودقة بمقدار 540p بكسل، وتعد هذه بدايةً جيدة بالنسبة لصور GIF لأنها تعامل معاملة الصور العادية، إذ تُنَزل بالكامل عند تحميل صفحة ويب، بخلاف مقاطع الفيديو التي لا تُحَمّل تدريجيًا بدقة أقل. يمكنك استخدام شبكات توزيع المحتوى CDN لتحسين تسليم الأصول الثابتة للموقع مثل الصور، ولكن يجب أن تتفادى عرض الصور الضخمة دون هدف محدد. ولذا يجب ألا تنشأ صور GIF ذات حجم أعلى من 3 ميغا بايت، والآن، لنتحقق من حجم الصورة التي أنشأتها بواسطة الأمر ls -lh: ls -lh ffmpeg-sample.gif وستحصل على الخرج التالي: -rw-r--r-- 1 sammy sammy 2.0M Nov 16 14:28 ffmpeg-sample.gif أنشأنا بهذه الطريقة صورة GIF حجمها 2 ميغا بايت. لكن يمكننا الحصول على نتيجة أفضل باستخدام صياغة برمجية أقل تعقيدًا بواسطة gifski: gifski --fps 12 --width 540 -o gifski-sample.gif clip.webm لاحظ أننا ذكرنا التفاصيل المهمة كمعدل الإطارات والدقة، بالإضافة إلى اسمي ملفي الدخل والخرج. تحقق من الملف الناتج باستخدام الأمر التالي: ls -lh gifski-sample.gif لتحصل على الخرج التالي: -rw-r--r-- 1 sammy sammy 1.3M Nov 16 14:33 gifski-sample.gif حصلت على صورة GIF متحركة حجمها 1.3 ميغابايت وذلك يعد تحسنًا ملحوظًا عن النتيجة السابقة خاصةً أننا حافظنا على نفس الجودة. قد ترغب في إنشاء صورة ذات معدل إطارات كامل وبالدقة الكاملة كي تستطيع المقارنة وملاحظة الفرق: gifski --fps 25 --width 1080 -o gifski-high.gif clip.webm تحقق من حجم الملف الناتج: ls -lh gifski-high.gif الخرج -rw-r--r-- 1 sammy sammy 6.9M Nov 16 14:37 gifski-high.gif لاحظ أن حجم 6.9 ميغا بايت هو حجم كبير جدًا خصيصًا أن حجم الفيديو الأصلي هو 0.6 ميغا بايت وحسب! وتذكر أن صور GIF ليست ذات فاعلية مقارنةً ببرامج ترميز الفيديو الحديثة، فعليك التضحية قليلًا عندما تخفّض حجمها إلى حجم مقبول. سنتعلم في الخطوة التالية كيفية تحسين صور GIF. ملاحظة: إذا كنت تستخدم خادمًا بعيدًا لتنفيذ خطوات مقالنا، فيمكنك تنزيل الملفات وفحصها محليًا على جهازك، أو يمكنك نقلها إلى مجلد يمكن الوصول إليه من الويب كي تستعرضها في متصفح الويب. بهذه الطريقة سيصبح لديك مرجع مرئي لجودة الرسوميات. الخطوة الخامسة: تحسين صورة GIF والتحقق منها وعرضها سنستخدم الأداة gifsicle في الخطوة الأخيرة من مقالنا لتحسين جودة صورة GIF إذ إن ميزات استخدام gifsicle مع ملفات GIF تشابه ميزات استخدام ffmpegمع ملفات الصوت والفيديو وتمكننا من فعل أي شيء نرغبه، ولكن استخدامها قد يكون معقدًا جدًا. ولذلك، سنستخدم gifski لإنشاء صور GIF، وسنركز على بعض أوامر gifsicle لتحسين الصور أو معالجتها. أولًا، شَغّل أمر تحسين gifsicle القياسي: gifsicle -O3 --lossy=80 --colors 256 gifski-sample.gif -o optimized.gif لاحظ أننا في الأمر السابق طبقنا الخيار الثالث -O3 للحصول على أفضل تحسين، وطبقنا الخيار lossy 80-- لتحديد نسبة 20% كالحد الأقصى المسموح به لانخفاض الجودة عن الملف الأصلي، واخترنا --colors 256 لتطبيق 256 لون كحد أقصى في الصورة الناتجة. سيُنتِج ذلك صورةً ذات جودة أعلى من المتوقع بدون خسارة ملحوظة في الجودة لأن صور GIF لا تستخدم خوارزميات ضغط الإطارات الداخلية الحديثة، ولا تستخدم تقنيات ضغط صور JPEG. كما يشير 256 لونًا هنا إلى أي لوحة ألوان مكونة من 256 لونًا وفقًا للألوان الموجودة في ملف GIF، ولا يعبر عن لوحة ألوان محددة مكونة من أشيع 256 لون. وبصورة عامة، لا يكون ضغط GIF ملحوظًا. والآن، تحقق من حجم الصورة المحسنة optimized.gif: ls -lh optimized.gif وستحصل على الخرج التالي: -rw-r--r-- 1 sammy sammy 935K Nov 16 14:44 optimized.gif لاحظ أن الخطوة الأخيرة خفضت حجم الملف بنجاح إلى 935 كيلو بايت أي أكثر من حجم الفيديو الأصلي بقليل، وهو حجم مقبول لصورة متحركة. وهي نفس الصورة التي عرضناها سابقًا في مقالنا. يمكنك الاطلاع على دليل Gifsicle للتعرف على الطرق الأخرى لمعالجة صور GIF. على سبيل المثال، يمكنك "تقسيم" ملف GIF إلى ملفات صور متعددة، واحد لكل إطار رسوم متحرك باستخدام الأمر التالي: gifsicle --explode optimized.gif الذي ينشأ عدة ملفات اسمائها على نسق optimized.gif.000، optimized.gif.001 وهكذا، لكل صورة. استخدم الأمر ls -lh لعرض ملفات الصور: ls -lh optimized* لتحصل على الخرج التالي: -rw-r--r-- 1 sammy sammy 935K Nov 16 14:46 optimized.gif -rw-r--r-- 1 sammy sammy 20K Nov 16 14:54 optimized.gif.000 -rw-r--r-- 1 sammy sammy 17K Nov 16 14:54 optimized.gif.001 -rw-r--r-- 1 sammy sammy 22K Nov 16 14:54 optimized.gif.002 -rw-r--r-- 1 sammy sammy 22K Nov 16 14:54 optimized.gif.003 … كما يمكنك تدوير الصورة باستخدام خيار التدوير بمقدار 90 درجة --rotate-90 أو 180 درجة --rotate-180: gifsicle --rotate-90 optimized.gif -o rotated.gif على الرغم من عدم كفاءتها، لا تزال صور GIF مفيدةً لأنه يمكن استخدامها في عدة مواضع، عند الحاجة إلى مقطع متحرك قصير مثلًا، أو عند الحاجة إلى استخدام صيغة الصورة وليس الفيديو، أحيانًا لن تجد بديلًا عن صورة GIF. الخاتمة استخدمنا في مقالنا عدة أدوات لإنشاء صورة GIF من مقطع فيديو وتحسينها. كما تعرفنا على أدوات معالجة الفيديو مفتوحة المصدر وأدوات معالجة ملفات GIF، بالإضافة إلى بعض الخيارات لتعديل ملفات GIF. تعد صور GIF تقنيةً قديمةً ومثيرةً للاهتمام، لكن على الرغم من أنها ليست حديثة، إلا أنه لا يوجد لها بديل في بعض السياقات، كما أن أدوات التعامل مع صور GIF ذات أداء ودعم جيد.. والآن، أنشأ صور GIF وطبق ما تعلمناه في مقالنا هذا. وفي حال كان لديك مزيد من الاستفسارات حول ما ورد في المقال، أو أردت الحصول على الدعم والمساعدة أضف سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال How To Make and Optimize GIFs on the Command Line. اقرأ أيضًا نصائح لإنشاء صور GIF دائمة الحركة كيف تنشئ صورًا متحركة بصيغة GIF من مجموعة صور PNG باستخدام ImageMagick وسطر الأوامر 10 أدوات وتطبيقات مجانية تسهل عليك تحسين الصور البحث عن الملفات والمجلدات على لينكس باستخدام الأمر find
  3. تتطلب الأنظمة الحاسوبية الإدارة والمراقبة المناسبة، إذ تساعد مراقبة عمل النظام على اكتشاف المشكلات وحلها بسرعة. وثمة عدة أدوات أُنشئت لهذا الغرض، سنُعَرّفك في هذا المقال على أهم هذه الأدوات والتطبيقات. المتطلبات الأساسية لمتابعة خطوات هذا المقال، ستحتاج إلى ما يلي: حاسوب يعمل بنظام تشغيل لينكس Linux. يمكنك استخدام خادم خاص افتراضي VPS والاتصال به باستخدام بروتوكول SSH أو استخدام جهازك المحلي. استخدمنا في مقالنا خادم أوبنتو 20.04، لكن يمكنك اتباع أمثلتنا باستخدام أي من توزيعات لينكس. إن كنت تستخدم خادمًا بعيدًا فننصحك بالإطلاع على دليل إعداد الخادم الأولي لإعداد بيئة عمل آمنة على الخادم، ومستخدم غير جذري ذي صلاحيات sudo وجدار حماية، كما أن ذلك سيحسن مهاراتك في التعامل مع أنظمة لينكس. الخطوة الأولى: عرض العمليات الجارية Running Processes في لينكس يمكنك استعراض العمليات قيد التنفيذ في خادمك باستخدام الأمر top: top وستحصل على الخرج التالي: Output top - 15:14:40 up 46 min, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1019600k total, 316576k used, 703024k free, 7652k buffers Swap: 0k total, 0k used, 0k free, 258976k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0 8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset 9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs لاحظ أن الأسطر الأولى من الخرج تزودنا بمعلومات أو إحصائيات statistics عن النظام، مثل حمل استخدام وحدة المعالجة المركزية والذاكرة والعدد الإجمالي للمهام قيد التشغيل. لاحظ أن هناك عملية واحدة قيد التشغيل، و 55 عملية خاملة Sleeping لأنها لا تستخدم وحدة المعالجة المركزية ويُظهر باقي الخرج العمليات الجارية وإحصائيات استخدامها. يرتب الأمر top هذه العمليات تلقائيًا حسب استخدام وحدة المعالجة المركزية، كي ترى العمليات الأكثر استهلاكًا للموارد أولاً. يستمر top في العمل في سطر الأوامر shell إلى أن توقفه باستخدام المفتاحين Ctrl + C للخروج من العملية الجارية.إذ يُرسل هذا إشارة إيقاف kill، ويطلب من العملية التوقف بأمان إذا كان ذلك ممكنًا. كما تتوفر في معظم مستودعات الحزم نسخة محسنة من الأمر top، تدعى htop. يمكنك تثبيت هذا الأمر على خادم أوبنتو باستخدام الأمر apt: sudo apt install htop شغّل بعد ذلك الأمر htop إذ أصبح متاحًا على جهازك: htop وستحصل على الخرج التالي: Mem[||||||||||| 49/995MB] Load average: 0.00 0.03 0.05 CPU[ 0.0%] Tasks: 21, 3 thr; 1 running Swp[ 0/0MB] Uptime: 00:58:11 PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 1259 root 20 0 25660 1880 1368 R 0.0 0.2 0:00.06 htop 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 /sbin/init 311 root 20 0 17224 636 440 S 0.0 0.1 0:00.07 upstart-udev-brid 314 root 20 0 21592 1280 760 S 0.0 0.1 0:00.06 /sbin/udevd --dae 389 messagebu 20 0 23808 688 444 S 0.0 0.1 0:00.01 dbus-daemon --sys 407 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.02 rsyslogd -c5 408 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 409 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 406 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.04 rsyslogd -c5 553 root 20 0 15180 400 204 S 0.0 0.0 0:00.01 upstart-socket-br يزودنا htop بتصور أفضل لخيوط وحدة المعالجة المركزية CPU threads وبدعم أفضل للعمليات في الطرفيات الحديثة، وخيارات فرز أوسع، بالإضافة لعدة ميزات أخرى. وبخلاف الأمر top، لا تجد htop مُنَزَلًا تلقائيًا ولكن عليك تنزيله، ويمكن أن تَعُده بديلًا عن top. كما يمكنك الخروج من الأمر htop باستخدام المفتاحين Ctrl+C. إليك بعض الاختصارات التي ستساعدك في استخدام htop بفاعلية أكبر: M: فرز العمليات حسب استهلاك المساحة P: فرز العمليات حسب استهلاك المعالج ?: المساعدة K: إيقاف العملية الجارية F2: ضبط إعدادات htop وضبط خيارات العرض /:: البحث في العمليات كما توجد عدة خيارات أخرى يمكنك الوصول إليها من خلال خيار المساعدة أو الضبط، ارجع إليها لاستكشاف وظائف htop. أما عن خطوتنا التالية، فسنتعلم فيها كيفية مراقبة النطاق الترددي للشبكة. الخطوة الثانية: مراقبة النطاق الترددي للشبكة إذا شعرت بازدياد الحمل على اتصال الشبكة، ولم تدرِ ما هو التطبيق الذي يستهلك الاتصال فيمكنك الاستعانة ببرنامج nethogs لمعرفة ذلك. ثبّت nethogs على خادم أوبنتو باستخدام الأمر التالي: sudo apt install nethogs سيصبح بعدها الأمر nethogs متاحًا للاستخدام: nethogs وستحصل عند تشغيله على الخرج التالي: NetHogs version 0.8.0 PID USER PROGRAM DEV SENT RECEIVED 3379 root /usr/sbin/sshd eth0 0.485 0.182 KB/sec 820 root sshd: root@pts/0 eth0 0.427 0.052 KB/sec ? root unknown TCP 0.000 0.000 KB/sec TOTAL يعرض برنامج nethogs استخدام كل برنامج للشبكة. إليك بعض الاختصارات التي ستسهل عليك التعامل معه: M: تغيير واحدة عرض النطاق الترددي إلى “kb/s” أو “kb” أو “b” أو “mb” R: الفرز حسب حجم البيانات المستلمة S: الفرز حسب حجم البيانات المُرسَلة Q: خروج كما يمكنك استخدام iptraf-ng لمراقبة استهلاك الشبكة، إذ يوفر عدة واجهات مراقبة تفاعلية. ملاحظة: يتطلب IPTraf حجم شاشة لا يقل عن 80 عمودًا و 24 سطرًا. ثبّت iptraf-ng على خادم أوبنتو باستخدام الأمر التالي: sudo apt install iptraf-ng لتشغيل الأمر iptraf-ng يجب أن تعطيه صلاحيات المستخدم الجذري، لذا عليك أن تستخدمه مع sudo: sudo iptraf-ng ستظهر قائمة تستخدم إطار عمل واجهة الطرفية الشائع المسمى ncurses: يمكنك بواسطة هذه القائمة اختيار الواجهة التي تود الوصول إليها. مثلًا، لإلقاء نظرة عامة على حركة البيانات في الشبكة، يمكنك اختيار القائمة الأولى ثم النقر على خيار جميع الواجهات "All interfaces"، وبعدها ستظهر لك شاشة كالتالية: سترى في هذه الواجهة جميع عناوين IP المستخدمة في واجهات شبكتك. إذا أردت تحويل عناوين IP هذه إلى نطاقات، فيمكنك تفعيل البحث العكسي عن DNS عن طريق الخروج من شاشة حركة بيانات الشبكة، ثم النقر على خيار الضبط configure، ثم Reverse DNS lookups. كما يمكنك تفعيل TCP/UDP service names أي أسماء خدمات بروتوكولي TCP/UDP لعرض أسماء الخدمات الحالية بدلًا عن أرقام منافذها. ستبدو الشاشة كالتالي، عند تفعيل الخيارين السابقين: ولدينا أيضًا الأمر netstat الذي يُعد أداةً متعددة الاستخدامات للحصول على معلومات عن الشبكة. والذي يوجد عادةً تلقائيًا في الأنظمة الحديثة، كما يمكنك تثبيته يدويًا من مستودع حزم الخادم الافتراضي package repository. الحزمة التي تحتوي على الأمر netstat في معظم أنظمة لينكس ومن ضمنها أوبنتو، هي net-tools: sudo apt install net-tools يطبع الأمر netstat من تلقاء نفسه قائمة بالمآخذ sockets المفتوحة: netstat ويعرض لك الخرج التالي: Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.241.187.204:ssh ip223.hichina.com:50324 ESTABLISHED tcp 0 0 192.241.187.204:ssh rrcs-72-43-115-18:50615 ESTABLISHED Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 5 [ ] DGRAM 6559 /dev/log unix 3 [ ] STREAM CONNECTED 9386 unix 3 [ ] STREAM CONNECTED 9385 . . . إذا أضفت الخيار a-، فسوف يعرض جميع المنافذ المفتوحة listening والمغلقة not listening netstat -a وستحصل على النتيجة التالية: Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN tcp 0 0 192.241.187.204:ssh rrcs-72-43-115-18:50615 ESTABLISHED tcp6 0 0 [::]:ssh [::]:* LISTEN Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 6195 @/com/ubuntu/upstart unix 2 [ ACC ] STREAM LISTENING 7762 /var/run/acpid.socket unix 2 [ ACC ] STREAM LISTENING 6503 /var/run/dbus/system_bus_socket . . . إذا أردت تصفية النتائج لعرض اتصال TCP فقط أو UDP فقط، فعليك استخدام الراية t- أو u- : netstat -at الخرج Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN tcp 0 0 192.241.187.204:ssh rrcs-72-43-115-18:50615 ESTABLISHED tcp6 0 0 [::]:ssh [::]:* LISTEN ولاحظ النتائج عند استخدام الراية s- netstat -s الخرج Ip: 13500 total packets received 0 forwarded 0 incoming packets discarded 13500 incoming packets delivered 3078 requests sent out 16 dropped because of missing route Icmp: 41 ICMP messages received 0 input ICMP message failed. ICMP input histogram: echo requests: 1 echo replies: 40 . . . إذا أردت تحديث الخرج باستمرار، يمكنك استخدام الراية c-. ثمة عدة خيارات متاحة للأمر netstat يمكنك التعرف عليها من خلال مراجعة صفحة دليلها التعليمي. سنتعرف، في الخطوة التالية، على بعض الطرق المفيدة لمراقبة استخدام قرص التخزين الخطوة الثالثة: مراقبة استخدام القرص استخدم الأمر df لإلقاء نظرة سريعة على مساحة القرص المتبقية على محرك الأقراص المرفق: df وستحصل على الخرج التالي: Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda 31383196 1228936 28581396 5% / udev 505152 4 505148 1% /dev tmpfs 203920 204 203716 1% /run none 5120 0 5120 0% /run/lock none 509800 0 509800 0% /run/shm يعرض هذا الأمر المساحة المستخدمة بالبايتات، مما قد يجعلها صعبة القراءة، لحل هذه المشكلة اعرض الخرج بطريقة يَسهُل قراءتها على البشر human-readable، وذلك بإضافة الخيار h-: df -h وستحصل على الخرج التالي: Filesystem Size Used Avail Use% Mounted on /dev/vda 30G 1.2G 28G 5% / udev 494M 4.0K 494M 1% /dev tmpfs 200M 204K 199M 1% /run none 5.0M 0 5.0M 0% /run/lock none 498M 0 498M 0% /run/shm استخدم الخيار total-- لعرض إجمالي مساحة القرص المتاحة في جميع أنظمة الملفات، حينها ستُعرض المعلومات في سطر جديد في الأسفل، كما يلي: df -h --total الخرج Filesystem Size Used Avail Use% Mounted on /dev/vda 30G 1.2G 28G 5% / udev 494M 4.0K 494M 1% /dev tmpfs 200M 204K 199M 1% /run none 5.0M 0 5.0M 0% /run/lock none 498M 0 498M 0% /run/shm total 32G 1.2G 29G 4% لاحظ أن الأمر df يزوّدنا بمعلومات مفيدة، أما الأمر du فيستخدم التصنيف حسب المجلد، إذ يحلل الاستخدام للمجلد الحالي والمجلدات الفرعية. يبدو خرج du عند تشغيله في مجلد رئيسي فارغ كما يلي: du الخرج 4 ./.cache 8 ./.ssh 28 . كما يمكنك عرض الخرج بطريقة سهلة القراءة، وذلك بإضافة الخيار h-: du -h وستحصل على الخرج التالي: 4.0K ./.cache 8.0K ./.ssh 28K . ولعرض حجم الملفات والمجلدات، استخدم الخيار a- du -a الخرج 0 ./.cache/motd.legal-displayed 4 ./.cache 4 ./.ssh/authorized_keys 8 ./.ssh 4 ./.profile 4 ./.bashrc 4 ./.bash_history 28 . استخدم الخيار c- لإضافة سطر لعرض المحصلة: du -c وسيصبح الخرج كالتالي: 4 ./.cache 8 ./.ssh 28 . 28 total إذا أردت الحصول على المحصلة فقط دون التفاصيل استخدم الخيار s- du -s وسيكون الخرج كالتالي: 28 . كما توجد واجهة ncurses للأمر du تدعى ncdu ويمكنك تثبيتها باستخدام الأمر التالي: sudo apt install ncdu والذي سيمثل استخدام القرص بيانيًا كالتالي: ncdu الخرج --- /root ---------------------------------------------------------------------- 8.0KiB [##########] /.ssh 4.0KiB [##### ] /.cache 4.0KiB [##### ] .bashrc 4.0KiB [##### ] .profile 4.0KiB [##### ] .bash_history يمكنك التنقل في نظام الملفات باستخدام مفتاح السهم العلوي والسهم السفلي في لوحة المفاتيح والنقر على مفتاح enter لاستعراض المجلد. ستتعلم في الفقرة الأخيرة كيفية مراقبة استخدام الذاكرة. الخطوة الرابعة: مراقبة استخدام الذاكرة يمكنك عرض استخدام الذاكرة الحالي على نظام التشغيل باستخدام الأمر free: free وسيبدو الخرج كما يلي: total used free shared buff/cache available Mem: 1004896 390988 123484 3124 490424 313744 Swap: 0 0 0 لتسهيل قراءة الخرج، استخدم الخيار m- لعرض الحجم بواحدة الميغا بايت: free -m الخرج total used free shared buff/cache available Mem: 981 382 120 3 478 306 Swap: 0 0 0 يحتوي سطر mem على تفاصيل الذاكرة المستخدمة للتخزين المؤقت buffering and caching التي تفرغ محتوياتها عند الحاجة لاستخدامها في عملية أخرى. أما ذاكرة سواب swap فهي مكتوبة على ملف swapfile على القرص للمحافظة على الذاكرة النشطة Active memory. يعرض الأمر vmstat معلومات متعددة عن النظام بما في ذلك معلومات الذاكرة، ومعلومات الذاكرة swap، ومعلومات وحدة المعالجة المركزية، ومداخل ومخارج الأقراص. يمكنك استخدام vmstat لعرض معلومات استخدام الذاكرة: Vmstat الخرج procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 99340 123712 248296 0 0 0 1 9 3 0 0 100 0 اعرض الخرج بواحدة الميغا بايت عن طريق كتابة الواحدة M بعد الراية S- vmstat -S M Output 495 M total memory 398 M used memory 252 M active memory 119 M inactive memory 96 M free memory 120 M buffer memory 242 M swap cache 0 M total swap 0 M used swap 0 M free swap . . . استخدم الأمر التالي للحصول على معلومات عامة عن استخدام الذاكرة: vmstat -s -S M Output Cache Num Total Size Pages ext4_groupinfo_4k 195 195 104 39 UDPLITEv6 0 0 768 10 UDPv6 10 10 768 10 tw_sock_TCPv6 0 0 256 16 TCPv6 11 11 1408 11 kcopyd_job 0 0 2344 13 dm_uevent 0 0 2464 13 bsg_cmd 0 0 288 14 . . . أما للحصول على معلومات عن استخدام عمليات النظام الفردية لذاكرة التخزين المؤقت cache فاستخدم الأمر التالي: vmstat -m -S M وستحصل على الخرج التالي: Cache Num Total Size Pages ext4_groupinfo_4k 195 195 104 39 UDPLITEv6 0 0 768 10 UDPv6 10 10 768 10 tw_sock_TCPv6 0 0 256 16 TCPv6 11 11 1408 11 kcopyd_job 0 0 2344 13 dm_uevent 0 0 2464 13 bsg_cmd 0 0 288 14 . . . الذي سيزودك بتفاصيل حول المعلومات المخزنة في ذاكرة التخزين المؤقت. الخاتمة أصبحت الآن قادرًا على مراقبة خادمك من سطر الأوامر باستخدام الأدوات التي تعلمتها في مقالنا. وعلى الرغم أنه ثمة عدة أدوات مراقبة أخرى تُستخدم لأغراض مختلفة، إلا أن هذه تُعد انطلاقةًجيدة. ننصحك بعد قراءة هذا المقال بالتعرف على إدارة عمليات لينكس باستخدام ps وkill وnice. لمزيد من الاستفسارات حول ما ورد في مقالنا، أو للحصول على الدعم والمساعدة أضف سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال How To Use Top, Netstat, Du, & Other Tools to Monitor Server Resources لصاحبيه Justin Ellingwood و Alex Garnett. اقرأ أيضًا إعداد خادم اختبار محلي مراقبة شهادات SSL/TLS في الموقع باستخدام أداة Checkmk مدخل إلى خادم الويب عشرون أمرا في لينكس يفترض أن يعرفها كل مدير نظم تعرف على عناوين بروتوكول الإنترنت والشبكات الفرعية والتوجيه غير الصنفي بين النطاقات
  4. يُعد إطار Express أحد الإطارات الشائعة لبناء تطبيقات الويب السريعة وواجهات برمجة التطبيقات API باستخدام بيئة التشغيل Node.js. منصة تطبيقات DigitalOcean عبارة عن منتج منصة على أساس خدمة PaaS لضبط إعدادات التطبيقات ونشرها من مستودع شيفرات برمجية، فهي توفر طريقة سريعة وفعالة لنشر تطبيقات Express. سنتعلم في دليلنا هذا، كيفية نشر تطبيق Express على منصة تطبيقات DigitalOcean ثم توسيع نطاقه عن طريق إضافة التخزين المؤقت باستخدام إضافة متجر DigitalOcean Marketplace المخصصة لـ MemCachier. إذ يتوافق MemCachier مع نظام memcached للتخزين المؤقت للكائنات ولديه عدة مزايا، مثل تحسين سيناريوهات الفشل باستخدام مجموعة حواسيب عالية التوفر. سننشئ أولاً تطبيق Express يحسب عددًا أوليًا، ويحتوي على زر "أعجبني"، ويستخدم محرك قوالب Template engine. ستمكنك هذه الميزات من تنفيذ عدة استراتيجيات تخزين مؤقت لاحقًا. ثم ستدفع شيفرة التطبيق على Git Hub لتنشره بعدها على منصة التطبيقات App Platform. وأخيرًا، ستطبق ثلاث تقنيات تخزين مؤقت للكائنات لتسريع التطبيق وجعله سهل التطوير والتوسع. بنهاية هذا المقال، ستكون قادرًا على نشر تطبيق Express على منصة App Platform، وتطبيق تقنيات التخزين المؤقت لتخزرين العمليات ذات الاستخدام الكثيف للموارد، وتخزين طرق العرض المصيّر rendered views، والجلسات sessions. المتطلبات الأساسية لمتابعة خطوات هذا المقال التعليمي، ستحتاج إلى ما يلي: تثبيت بيئة تشغيل Node.js على جهازك العامل بنظام أوبنتو 22.04، ننصحك باتباع خطوات المقال التالي. أما إن كنت تستخدم نظام تشغيل آخر، فعليك اتباع المقال التالي. خادم Express مُثبّت عليه Node.js، ووللقيام بذلك ننصحك بالإطلاع على الخطوتين الأولى والثانية في هذا المقال. حساب غيت هب GitHub و تثبيت غيت Git على جهازك، إذ سننشر التطبيق في حسابك على غيت هب GitHub ثم سننشره على منصة تطبيقات DigitalOcean، اتبع الخطوات الواردة في المقال التالي لتثبيت غيت على جهازك. حساب على DigitalOcean لنشر التطبيق على منصة App Platform، وننبهك إلى أن نشر التطبيقات على هذه المنصة مأجور، لذا اطّلع على أجور منصة App Platform قبل البدء. متصفح إنترنت مثل متصفح كروم Chrome أو فايرفوكس Fire Fox. فهم أساسيات عمل موّلد قوالب Express. فهم آلية عمل البرمجيات الوسيطة middle-ware . الخطوة الأولى: ضبط قالب عرض مصيّر سنثبّت في هذه الخطوة موّلد قوالب Express، وننشئ قالبًا للمسار الرئيسي للتطبيق GET/، ثم سنحدّث المسار كي يستخدم هذا القالب. تمَكّننا القوالب من استخدام التخزين المؤقت للعرض المصيّر rendered view، مما يزيد سرعة معالجة الطلب ويقلل استخدام الموارد. لبدء العمل، انتقل إلى مجلد مشروع خادم Express باستخدام المحرر، سنثبّت محرك قوالب Express لاستخدام القوالب الثابتة في التطبيق، حيث يستبدل محرك القوالب المتغيرات الموجودة في ملف القالب بالقيم ثم يحول القالب إلى ملف HTML، ثم يُرسَل كرد أو استجابة response على طلب request. إذ يؤدي استخدام القوالب إلى تسهيل العمل باستخدام HTML. والآن، ثبّت مكتبة قوالب جافا سكربت المضمنة ejs، كما يمكنك استخدام أحد محركات القوالب التي يدعمها Express مثل Mustache أو Pug أو Nunjucks. npm install ejs بعد تثبيت مكتبة ejs، عليك ضبط إعدادات تطبيق Express كي يستخدمها، وذلك عن طريق فتح الملف server.js في محرر النصوص البرمجية، وإضافة السطر الثالث كما يلي: server.js const express = require('express'); const app = express(); app.set('view engine', 'ejs'); app.get('/', (req, res) => { res.send('Successful response.'); }); ... يعدّل هذا السطر إعدادات التطبيق ويعين خاصيّة view engine على ejs. ثم احفظ الملف بعد ذلك. ملاحظة: سنستخدم في هذا المقال الإعداد view engine، كما يمكنك استخدام الإعداد views الذي يدّل تطبيق Express على مكان وجود ملفات القوالب، وقيمته الافتراضية هي views/. والآن، أنشئ مجلد views ثم أنشئ فيه الملف views/index.ejs وافتحه في محرر النصوص البرمجية. وأضف توصيف القالب إلى الملف: views/index.ejs <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Find the largest prime number</title> </head> <body> <h1>Find the largest prime number</h1> <p> For any number N, find the largest prime number less than or equal to N. </p> </body> </html> ثم احفظ الملف. بعد أن أنشأت القالب، عليك تعديل المسار كي تتمكن من استخدامه. افتح الملف server.js وأضف ما يلي إليه: ... app.get('/', (req, res) => { res.render('index'); }); ... لاحظ أن دالة رد النداء render تأخذ اسم القالب كوسيط أول، وفي مثالنا يتوافق index مع اسم الملف views/index.ejs. والآن، أعد تشغيل التطبيق لكي تطبق التغيرات التي أجريتها. أوقف عمل الخادم في الطرفية باستخدام المفتاحين Ctrl+C ثم أعد تشغيل الخادم باستخدام الأمر التالي: node server.js الآن انتقل إلى localhost:3000 في المتصفح لمشاهدة محتوى القالب، ستحصل على نتيجة مماثلة لما يلي: والآن، أصبح تطبيقك يتمتع بعرض مُصَيّر للقوالب، لكنه لا ينفذ شيئًا الآن. سنضيف في الخطوة التالية وظيفة للعثور على عدد أولي. الخطوة الثانية، إضافة الوظائف إلى تطبيق Express سنضيف في هذه الخطوة ميّزة العثور على عدد أولي، وميّزة إبداء الإعجاب باستخدام زر "أعجبني Like". سنستخدم هذه الميزات للتفاعل مع التطبيق بعد نشره على منصة App Platform في الخطوة الرابعة من هذا المقال. العثور على العدد الأولي سنضيف الآن دالة إلى تطبيقنا وظيفتها العثور على أكبر عدد أولي أقل من أو يساوي N، حيث يشير N إلى عدد ما. سنرسل العدد N عبر استمارة باستخدام التابع GET إلى المسار الرئيسي (/) مع إضافة N كوسيط للاستعلام query، كما يلي: localhost:3000/?n=10 تمثل القيمة 10 هنا عينة الاستعلام، ويمكن أن يحتوي المسار الرئيسي على عناوين URL متعددة تنتج طرق عرض مصيّرة، كما يمكن تخزينها مؤقتًا بصورة فردية. أضف نموذجًا كالتالي يحتوي على عنصر إدخال لإدخال N في الملف views/index.ejs: ... <p> For any number N, find the largest prime number less than or equal to N. </p> <form action="/" method="get"> <label> N <input type="number" name="n" placeholder="e.g. 10" required> </label> <button>Find Prime</button> </form> ... لاحظ أن إجراء النموذج form يُرسَل إلى المسار الرئيسي /، الذي سيُعالَج بواسطة المسار الرئيسي (...'/')get.app في ملف server.js. وبما أن التابع هو get، فستضاف بيانات n إلى عنوان URL كوسيط للاستعلام. بعد ذلك، عند إجراء طلب باستخدام وسيط استعلام n، ستُمَرَر تلك البيانات إلى القالب. أضف الأسطر التالية بعد التابع get على الملف server.js، ثم احفظ الملف: ... app.get('/', (req, res) => { const n = req.query.n; if (!n) { res.render('index'); return; } const locals = { n }; res.render('index', locals); }); ... تتحقق الأسطر السابقة من وجود طلب له وسيط استعلام ذو القيمة n، فإذا تحقق ذلك يُصيَّر الملف index مع تمرير القيمة n إليه، وإلا فيُعرض الملف index بدون بيانات. ملاحظة: لا يمكن الوثوق دائمًا بالبيانات التي يدخلها المستخدم، لذا لإنشاء تطبيق جاهزًا للنشر يُنصح بالتحقق من المدخَلات باستخدام مكتبة joi. لاحظ أن للتابع render وسيط ثاني اختياري locals يُعَرّف المتغيرات المحلية التي تمرر إلى القالب لتصيير العرض. يحدد اسم الواصف المختصر الخاصية n للكائن المحلي locals، فعندما يكون للمتغير نفس اسم واف الكائن المُسند إليه، يمكن حذف اسم المتغير. لذلك يمكن كتابة { n: n } بالشكل { n }. والآن، أصبح بإمكاننا عرض القالب بعد أن أضفنا إليه البيانات. أضف الأسطر التالية على ملف views/index.ejs: <% if (locals.n) { %> <p>N: <%= n %></p> <% } %> ... وهكذا يعرض التطبيق المتغيرات المحلية n إن وجدت. احفظ الملف، ثم أعد تشغيل الخادم لتحديث التطبيق. سيُعرَض النموذج مع زر لإيجاد العدد الأولي Find Prime، حيث يأخذ التطبيق المدخلات من المستخدم ويعرضها تحت النموذج: أدخل عددًا ما ولاحظ أن العنوان URL سيتغير وسيضاف إليه العدد الذي أدخلته، على سبيل المثال، إن أدخلت العدد 40 سيصبح العنوان كالتالي: http://localhost:3000/?n=40 كما سيُعرض العدد الذي أدخلته أسفل النموذج على الشكل التالي N: 40. والآن بعد أن أصبح بإمكاننا إدخال قيمة للعدد N وعرضها، علينا إضافة دالة للعثور على أكبر عدد أولي أصغر أو مساوي للعدد N، وعرض النتيجة على الشاشة. أنشئ مجلد utils، ثم أنشئ الملف utils/findPrime.js. افتح الملف findPrime.js في المحرر ثم أضف الكود التالية لتعريف وظيفة أو دالة للعثور على العدد الأولي، ولا تنسَ حفظ الملف بعدها: utils/findPrime.js /** * Find the largest prime number less than or equal to `n` * @param {number} n A positive integer greater than the smallest prime number, 2 * @returns {number} */ module.exports = function (n) { let prime = 2; // initialize with the smallest prime number for (let i = n; i > 1; i--) { let isPrime = true; for (let j = 2; j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) { prime = i; break; } } return prime; }; يوّثق تعليق JSDoc عمل الدالة، إذ تبدأ الخوارزمية بالعدد الأولي الأول 2، ثم ثم تكرر العمل بدءًا من العدد n وتنقص الرقم بمقدار 1 في كل حلقة. وتستمر الدالة في حلقة التكرار والبحث عن عدد أولي حتى يصبح الرقم 2، وهو أصغر رقم أولي. تفترض كل حلقة أن العدد الحالي هو عدد أولي، ثم تتحقق من صحة هذا الافتراض، عن طريق التحقق من وجود عامل آخر للعدد الحالي آخر غير 1 ونفسه. إذا أمكن قسمة العدد الحالي على أي رقم أكبر من 1 وأقل من العدد نفسه دون باقي، فهو ليس عددًا أوليًا. ثم ستتحق الدالة بعد ذلك من العدد التالي. بعدها، أضف السطر الثاني إلى ملف server.js لاستيراد دالة العدد الأولي: const express = require('express'); const findPrime = require('./utils/findPrime'); ... عدّل على المسار الرئيسي لإيجاد العدد الأولى وتمرير قيمته إلى القالب من خلال إضافة السطر التالي إلى ملف server.js، ثم احفظ الملف: const prime = findPrime(n); والآن، لعرض النتيجة في القالب وإظهار قيمة N أضف الشيفرة التالية في ملف views/index.ejs: <% if (locals.n && locals.prime) { %> <p> The largest prime number less than or equal to <%= n %> is <strong><%= prime %></strong>. </p> <% } %> ... بدلًا عن: <% if (locals.n) { %> <p>N: <%= n %></p> <% } %> ولا تنسَ حفظ الملف، ثم أعد تشغيل الخادم. اختبر عمل الدالة عن طريق إدخال عدد ما، كالعدد 10، ستظهر رسالة: The largest prime number less than or equal to 10 is 7 ومفادها أن العدد الأولي الأعظمي الأصغر أو يساوي العدد 10 هو العدد 7. أصبح بإمكان التطبيق إيجاد وعرض رقم أولي وفقًا لرقم يدخله المستخدم، والآن علينا إضافة زر أعجبني. إضافة زر أعجبني ينتج تطبيقنا حاليًا طرق عرض ونتائج مختلفة بناءً على كل عدد N ندخله، ومن المرجح أن يظل المحتوى كما هو. سيوفر لنا زر أعجبني Like طريقة لتحديث محتوى العرض. يوضح لنا هذا الزر الحاجة إلى إبطال طريقة العرض المخزنة مؤقتًا عند تغير محتوياتها، إذ سيفيدنا ذلك عند التخزين المؤقت لطرق العرض المصيّرة لاحقًا في مقالنا. عند استخدام زر "أعجبني"، يجب تخزين بيانات الإعجاب في مكان ما. على الرغم من أن التخزين الثابت persistent storage مثالي، إلا أننا ستخزن الإعجابات في الذاكرة نظرًا لأن إنشاء قاعدة بيانات يقع خارج نطاق مقالنا. هكذا، ستكون البيانات سريعة الزوال، مما يعني أننا سنفقد كل البيانات عندما يتوقف الخادم. افتح ملف server.js وأضف المتغير التالي: /** * Key is `n` * Value is the number of 'likes' for `n` */ const likesMap = {}; يُستخدم الغرض likesMap كخريطة لتخزين إعجابات الأعداد. المفتاح هو n وقيمه هي عدد إعجابات n. يجب تهيئة إعجابات العدد عند إرساله. أضف السطر الثاني والثالث على ملف server.js لتهيئة إعجابات N: ... const prime = findPrime(n); // Initialize likes for this number when necessary if (!likesMap[n]) likesMap[n] = 0; const locals = { n, prime }; res.render('index', locals); .. تتحقق عبارة if من وجود إعجابات للعدد الحالي. في حالة عدم وجود إعجابات، يُهيَّئ likesMaps على القيمة 0. ثم أضف الإعجابات كمتغير محلي للعرض، عن طريق تعديل سطر المتغيرات المحلية ليصبح كما يلي ولا تنسَ حفظ الملف: const locals = { n, prime, likes: likesMap[n] }; res.render('index', locals); بعد أن أصبح لدينا بيانات الإعجابات، أصبح بإمكاننا عرض قيمتها وإضافة زر أعجبني. عدّل على ملف views/index.ejs لإضافة توصيف Markup لزر أعجبني كما يلي: <% if (locals.n && locals.prime) { %> <p> The largest prime number less than or equal to <%= n %> is <strong><%= prime %></strong>. </p> <form action="/like" method="get"> <input type="hidden" name="n" value="<%= n %>"> <input type="submit" value="Like"> <%= likes %> </form> <% } %> يجب أن يبدو ملف views/index.ejs على النحو التالي: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Find the largest prime number</title> </head> <body> <h1>Find the largest prime number</h1> <p> For any number N, find the largest prime number less than or equal to N. </p> <form action="/" method="get"> <label> N <input type="number" name="n" placeholder="e.g. 10" required> </label> <button>Find Prime</button> </form> <% if (locals.n && locals.prime) { %> <p> The largest prime number less than or equal to <%= n %> is <strong><%= prime %></strong>. </p> <form action="/like" method="get"> <input type="hidden" name="n" value="<%= n %>"> <input type="submit" value="Like"> <%= likes %> </form> <% } %> </body> </html> لا تنسَ حفظ الملف. ثم أعد تشغيل الخادم. سيظهر على الشاشة زر أعجبني له القيمة 0 بعد ظهور نتيجة العدد الأولي. يؤدي النقر فوق زر "أعجبني" إلى إرسال طلب GET إلى المسار like/، بالقيمة الحالية لـ N كوسيط استعلام عبر إدخال غير مرئي. لكن ستحصل على رسالة خطأ 404 والعبارة Cannot GET /like، لأن التطبيق ليس لديه مسار مطابق بعد. سنضيف الآن المسار اللازم للتعامل مع الطلب، وذلك عبر إضافة الأسطر التالية: app.get('/like', (req, res) => { const n = req.query.n; if (!n) { res.redirect('/'); return; } likesMap[n]++; res.redirect(`/?n=${n}`); }); ... يتحق المسار الجديد من وجود n وفي حال عدم وجودها نعود إلى المسار الرئيسي. أما في حال وجودها، فيزيد التطبيق عدد الإعجابات لهذا العدد. ثم يوجهنا إلى شاشة العرض التي ضغطنا فيها على زر "أعجبني". يجب أن يبدو الملف على النحو التالي: const express = require('express'); const findPrime = require('./utils/findPrime'); const app = express(); app.set('view engine', 'ejs'); /** * Key is `n` * Value is the number of 'likes' for `n` */ const likesMap = {}; app.get('/', (req, res) => { const n = req.query.n; if (!n) { res.render('index'); return; } const prime = findPrime(n); // Initialize likes for this number when necessary if (!likesMap[n]) likesMap[n] = 0; const locals = { n, prime, likes: likesMap[n] }; res.render('index', locals); }); app.get('/like', (req, res) => { const n = req.query.n; if (!n) { res.redirect('/'); return; } likesMap[n]++; res.redirect(`/?n=${n}`); }); const port = process.env.PORT || 3000; app.listen(port, () => console.log(`Example app is listening on port ${port}.`) ); احفظ الملف، ثم أعد تشغيل التطبيق واختبر زر "أعجبني"، يجب أن يزداد عدد الإعجابات مع كل نقرة. ملاحظة: يمكنك استخدام تابع POST بدلاً من GET لهذا المسار، والذي يوافق نمط RESTful أكثر لأننا حدثنا أحد الموارد. نستخدم في مقالنا تابع GET بدلاً من التعامل مع طلب POST حتى تتمكن من العمل مع وسطاء استعلام الطلب المألوفة. أصبح التطبيق مكتملًا الآن ويعمل جيدًا، ويمكنك الاستعداد لنشره على منصة App Platform. في الخطوة التالية، سنُوْدِع الشيفرة في غيت Git، ثم ندفعها إلى مستودع غيت هب GitHub. الخطوة الثالثة، إنشاء مستودع الشيفرات البرمجية سننشئ في هذه الخطوة مستودع شيفرات برمجية Code Repository كي نخزّن فيه الملفات اللازمة للنشر. سنُوْدِع commit الشيفرة في غيت Git، ثم ندفعها push أو نضيفها إلى مستودع غيت هب GitHub، الذي سنستخدمه لنشر التطبيق على App platform. إيداع الشيفرة في جيت سنُودع الشيفرة في جيت كي تصبح جاهزةً لإضافتها أو دفعها إلى جيت هب. ملاحظة: إن لم تسجل الدخول إلى حسابك وتضبط الإعدادات، فاحرص على إعداد غيت و مصادقته حسابك على غيت هب باستخدام بروتوكول SSH. أولًا، عليك تهيئة مستودع غيت: git init ثم عليك استبعاد اعتماديات التطبيق dependencies، وذلك بإنشاء ملف اسمه gitignore. وإضافة الشيفرة التالية فيه: .gitignore node_modules # macOS file .DS_Store ملاحظة: السطر DS_Store. خاص بالأجهزة التي تعمل باستخدام نظام ماك أو إس mac OS ولا حاجة لإضافة إن كان نظام التشغيل مختلفًا. والآن احفظ الملف. ثم أضف كل الملفات إلى غيت: git add . وأَودِع التغييرات بواسطة الأمر التالي: git commit -m "Initial commit" يُستخدم الخيار m- لتحديد رسالة إيداع من اختيارك. والآن بعد إيداع الشيفرة، ستحصل على خرج مماثل لما يلي: Output [main (root-commit) deab84e] Initial commit 6 files changed, 1259 insertions(+) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server.js create mode 100644 utils/findPrime.js create mode 100644 views/index.ejs أي أنك أودعت الشيفرة في غيت، والآن عليك دفعها إلى غيت هب. دفع الشيفرة إلى مستودع غيت هب أصبح بإمكانك الآن دفع الشيفرة إلى غيت هب، ثم ربط الشيفرة بمنصة App Platform ونشره. أولاً، سجل الدخول إلى غيت هب من المتصفح وأنشئ مستودعًا جديدًا باسم Express-memcache. ثم أنشئ مستودعًا فارغًا بدون ملفات README أو gitignore. أو ملفات الشهادات. يمكنك جعل المستودع خاصًا أو عامًا. كما يمكنك مراجعة توثيق غيت هب حول كيفية إنشاء مستودع جديد. ثم عد إلى الطرفية، وأضف المستودع الذي أنشأته بمثابة remote origin، وحدّث اسم المستخدم الخاص بك: git remote add origin https://github.com/your_username/express-memcache.git يوجه الأمر السابق غيت إلى المكان الذي يجب عليه إضافة الشيفرة فيه. ثم سمّي الفرع الافتراضي فرعًا رئيسيًا main: git branch -M main ثم أضف الشيفرة إلى مستودعك: git push -u origin main ثم أدخل بياناتك إذا طُلب منك ذلك. وستحصل على خرج مشابه لما يلي: Enumerating objects: 10, done. Counting objects: 100% (10/10), done. Delta compression using up to 8 threads Compressing objects: 100% (7/7), done. Writing objects: 100% (10/10), 9.50 KiB | 9.50 MiB/s, done. Total 10 (delta 0), reused 0 (delta 0), pack-reused 0 To https://github.com/your_username/express-memcache.git * [new branch] main -> main Branch 'main' set up to track remote branch 'main' from 'origin'. وبهذا أصبحت شيفرة التطبيق موجودةً على غيت هب، وأصبح التطبيق جاهزًا للنشر على منصة App Platform. الخطوة الرابعة، نشر التطبيق على منصة App Platform سننشر في هذه الخطوة، تطبيقنا على منصة تطبيقات App Platform. سننشئ حسابًا على المنصة ونسمح له بالوصول إلى مستودع غيت هب لنشر التطبيق. سنحدّث أولًا إعدادات البيئة كي يُتاح لها قراءة الضبط بواسطة عنوان البيئة PORT. تحديث إعدادات بيئة التطبيق سنسمح في هذه الفقرة لمتغيرات البيئة بالوصول وقراءة إعدادات منفذ التطبيق، لأن هذه الإعدادات ربما تتغير عند النشر، لذا فإن هذه الخطوة ستُمكّن التطبيق من الوصول إلى المنفذ من بيئة منصة التطبيقات. افتح ملف server.js في محرر النصوص البرمجية وتأكد من إضافة الأسطر التالية: ... const port = process.env.PORT || 3000; app.listen(port, () => console.log(`Example app is listening on port ${port}.`) ); تنّص هذه الأسطر على استخدام متغير البيئة port في حال وجوده، أو استخدام المنفذ الافتراضي 3000. والآن، أصبح التطبيق قادرًا على القراءة من منفذ بيئة منصة التطبيقات التي سننشره عليها. إنشاء ونشر التطبيق على منصة App Platform سنُعدّ التطبيق للنشر على منصة App Platform، ولكن تذكر أن هذه الخطوة مأجورة، وعليك دفع رسوم تشغيل التطبيق على منصة App Platform بالثانية (بدءًا من دقيقة واحدة على الأقل). يمكنك الإطلاع على الأسعار في صفحة المعاينة Review، كما يمكنك الاطلاع على نظام تسعير منصة App Platform للحصول على تفاصيل أكثر. أولاً، سجل الدخول إلى حسابك على DigitalOcean، ثم انقر على إنشاء create من لوحة تحكم التطبيقات Apps Dashboard. كما يمكنك الاطلاع على توثيق كيفية إنشاء التطبيقات في منصة App Platform. ثم ادخل إلى صفحة Create Resource From Source Code screen، واختر غيت هب كمزود الخدمة Service Provider، وامنح الإذن لـDigitalOcean للوصول إلى مستودعك. ننصحك بتحديد المستودع الذي تريد نشره فقط. سُتطالب بتثبيت تطبيق DigitalOcean GitHub. حدد مستودعك من القائمة وانقر فوق التالي Next. في شاشة الموارد Resources، انقر على تعديل الشريحة Edit Plan لتحديد حجم الاشتراك. سنستخدم في مقالنا الاشتراك الأساسي ذو خدمات الويب الأصغر حجمًا (512 ميغابايت من ذاكرة الوصول العشوائي vCPU | RAM) مخصصة لمورد express-memcache. إذ يوفر الاشتراك الأساسي وأصغر خدمة ويب موارد كافيةً لتطبيقنا التدريبي. بعد اختيار الاشتراك، انقر على رجوع Back. ثم انقر على علامة تبويب المعلومات info في شريط التنقل الأيسر وانتبه على المنطقة التطبيق، إذ سنحتاج إلى ذلك في الخطوة التالية لإضافة MemCachier من متجر DigitalOcean. أخيرًا، انقر على نافذة المعانية Review، ثم زر إنشاء موارد Create Resources لإنشاء التطبيق ونشره. سيستغرق الأمر بعض الوقت لإنشاء التطبيق ونشره. ستصلك رسالة عند الانتهاء فيها رابط التطبيق بعد نشره. بهذا نكون قد أنشأنا تطبيق Express يمكنه العثور على رقم أولي ويحتوي على زر أعجبني. ثم أَودَعنا شيفرة التطبيق إلى غيت ودفعناه إلى غيت هب، ثم نشرنا التطبيق على App Platform. والآن، لجعل تطبيق Express أسرع وأكثر قابلية للتوسع، سوف ننفذ ثلاث استراتيجيات للتخزين المؤقت للكائنات. ستحتاج إلى ذاكرة تخزين مؤقت Cache، والتي سننشئها في الخطوة التالية. الخطوة الخامسة، إعداد ذاكرة تخزين مؤقت للكائنات باستخدام MemCachier في هذه الخطوة، سننشئ ونضبط إعدادات ذاكرة تخزين مؤقت للكائنات. يمكنك استخدام أي ذاكرة تخزين مؤقت متوافقة مع memcached. سنستخدم في مقالنا إضافة MemCachier من متجر DigitalOcean. وذاكرة التخزين المؤقت MemCachier هي عبارة عن ذاكرة تخزين مؤقت تخزن البيانات على هيئة قيمة-مفتاح. أولًا، علينا إضافة MemCachier من متجر Digital Ocean، وللقيام بذلك انتقل إلى صفحة إضافة MemCachier، ثم انقر على Add MemCachier، ثم اختر المنطقة المناسبة لتطبيقك، يجب أن تختار المنطقة نفسها للتطبيق والذاكرة كي تخفف من التأخير بقدر الإمكان. كما يمكنك مراجعة إعدادات التطبيق للتأكد من المنطقة واختيار اشتراك معين. ثم، انقر على Add MemCachier لإضافة الذاكرة المؤقتة. ملاحظة: لمعرفة اختصارات اسماء المناطق، ننصحك بزيارة مركز بيانات DigitalOcean، فمثلًا منطقة سان فرانسيسكو اختصارها هو sfo3. والآن، عليك ضبط إعدادات التطبيق لاستخدام الذاكرة. انتقل إلى لوحة تحكم الإضافات Add-Ons dashboard ثم انقر على إضافة MemCachier للانتقال إلى لوحة التحكم. بعدها، انقر على زر عرض Show متغيرات الإعدادات Configuration Variables لعرض القيم التالية MEMCACHIER_USERNAME، MEMCACHIER_PASSWORD، MEMCACHIER_SERVERS. انتبه على هذه القيم لأننا سنحتاجها لاحقًا. سنحفظ الآن متغيرات إعدادات MemCachier كمتغيرات بيئة للتطبيق. انتقل إلى لوحة تحكم التطبيق ثم انقر على الإعدادات Settings. ثم من Components انقر على express-memc وانتقل لقسم متغيرات البيئة Environment Variables وانقر على تعديل Edit ثم أضف متغيرات إعدادات MemCachier ذات المفاتيح: (MEMCACHIER_USERNAME، MEMCACHIER_PASSWORD، MEMCACHIER_SERVERS) وأضف القيم كل منها وفقًا للقيم الموجودة في لوحة تحكم MemCachier> انقر على خيار التشفير Encrypt بجانب المفتاح MEMCACHIER_PASSWORD لتشفير كلمة المرور، ثم انقر على حفظ Save. والآن، علينا ضبط عميل ذاكرة memcache client في التطبيق باستخدام المتغيرات التي أدخلنا كي يستطيع التطبيق التخاطب مع الذاكرة. ثبّت المكتبة memjs في الطرفية: npm install memjs ثم أنشأ مجلد خدمات services، وأنشأ فيه الملف services/memcache.js وافتحه في المحرر. ثم استورد مكتبة memjs في أعلى الملف واضبط إعدادات عميل الذاكرة cache client: const { Client } = require('memjs'); module.exports = Client.create(process.env.MEMCACHIER_SERVERS, { failover: true, timeout: 1, keepAlive: true, }); ولا تنسَ حفظ الملف. تنشأ الشيفرة السابقة عميل لذاكرة التخزين المؤقتة MemCachier. أما بالنسبة للخيار failover، ضبطناه على القيمة true لاستخدام مجموعة حواسيب MemCachier عالية التوفر في حال حدوث الفشل. إذ إنه في حالة فشل الخادم، ستُرسل أوامر المفاتيح المخزنة على هذا الخادم تلقائيًا إلى الخادم التالي المتاح. ينصح باستخدام مهلة timeout مدتها ثانية واحدة إذ إنها أفضل للتطبيقات المنشورة من المهلة الافتراضية البالغة 0.5 ثانية. أما السطر keepAlive: true فيبقي الاتصال مع ذاكرة التخزين المؤقت مفتوحًا حتى في وضع الخمول، وهو أمر محبّذ لأن عملية إجراء الاتصال بطيئة، ويجب أن تكون ذاكرة التخزين المؤقت سريعة لتكون فعالة. حصلنا في هذه الخطوة على ذاكرة تخزين مؤقت باستخدام إضافة MemCachier من متجر DigitalOcean. ثم أضفنا إعدادات ذاكرة التخزين المؤقت كمتغيرات بيئة في منصة التطبيقات، كي نستطيع إعداد عميل باستخدام مكتبة memjs ويتمكن التطبيق من الاتصال بذاكرة التخزين المؤقت. والآن، أصبحنا جاهزين لتطبيق للتخزين المؤقت في Express، وهو ما سنتعلمه في خطوتنا التالية. الخطوة السادسة، تطبيق تقنيات التخزين المؤقت في Express باستخدام إضافة MemCachier أصبح بإمكانك الآن استخدام ذاكرة التخزين المؤقت للكائنات بعد نشر التطبيق وإضافة ميزة التخزين المؤقت MemCachier. إذ سننفذ في هذه الخطوة ثلاث تقنيات للتخزين المؤقت للكائنات. سنبدأ بالتخزين المؤقت للعمليات ذات الاستخدام الكثيف للموارد لتحسين سرعة الاستخدام وكفاءته. بعد ذلك، سنطبق تقنيات لتخزين طرق العرض المصيّرة بعد الإدخال لتحسين معالجة الطلب وتخزين الجلسات القصيرة مؤقتًا لإتاحة المجال لتوسيع نطاق تطبيقك فيما بعد. التخزين المؤقت للعمليات ذات الاستخدام الكثيف للموارد سنخزن العمليات الحوسبية ذات الاستخدام الكثيف للموارد تخزينًا مؤقتًا لتسريع التطبيق، مما يؤدي إلى استخدام وحدة المعالجة المركزية بكفاءة أكبر. إذ تُعد الدالة findPrime عملية حسابية تستخدم الموارد بكثافة عند إدخال عدد كبير. سنخزن نتائج الدالة مؤقتًا عند توفرها بدلاً من تكرار العملية الحسابية. أولاً، افتح ملف server.js لإضافة عميل الذاكرة memcache: const express = require('express'); const findPrime = require('./utils/findPrime'); const memcache = require('./services/memcache'); ... ثم خزّن عددًا أوليًا محسوبًا من قبل في الذاكرة المؤقتة كما يلي: ... const prime = findPrime(n); const key = 'prime_' + n; memcache.set(key, prime.toString(), { expires: 0 }, (err) => { if (err) console.log(err); }); ... ولا تنسَ حفظ الملف. لاحظ أن التابع set يقبل مفتاحًا key كوسيط أول، وقيمة للسلسلة أي value كوسيطه الثاني. لذا حولنا العدد الأولي إلى سلسلة، أما الشرط الثالث فيحرص على عدم انتهاء مدة العنصر المُخزّن، والشرط الرابع والأخير هو تابع استدعاء اختياري عند حدوث خطأ ما. ملاحظة1: يجب التعامل مع أخطاء ذاكرة التخزين المؤقت بحذر. إذ تعد هذه ذاكرة بمثابة تحسين ويجب ألا تؤدي إلى تعطل التطبيق. في من الممكن أن يعمل التطبيق على نحو جيد، وإن كان أبطأ، بدون ذاكرة التخزين المؤقت. ملاحظة 2: بإمكان التطبيق الآن العمل محليًا ولكن بدون تخزين مؤقت، وسيظهر خطأ في الخرج عند استدعاء memcache.set لأن التطبيق لن يستمكن من إيجاد خادم تخزين مؤقت، وستحصل حينها على خرج مشابه للتالي: Output MemJS: Server <localhost:11211> failed after (2) retries with error - connect ECONNREFUSED 127.0.0.1:11211 Error: No servers available ... لن تحتاج إلى التخزين المحلي لإكمال باقي خطوات المقال. إذا يمكنك تشغيل localhost:11211 في العنوان الذي يُعد العنوان الافتراضي لـ memjs. والآن، عليك إيداع التغييرات: git add . && git commit -m "Add memjs client and cache prime number" ثم أضف هذه التغييرات إلى غيت هب، والتي ستُنشر إلى منصة التطبيقات تلقائيًا: git push ستظهر رسالة على لوحة تحكم منصة التطبيقات تشير إلى أن تطبيقك قيد الإنشاء، بعد أن كانت حالته Deployed أي منشور. وعند اكتمال إنشاء التطبيق، افتح التطبيق في متصفحك وأدخل عددًا للعثور على أكبر عدد أولي أصغر أو مساوٍ له. ملاحظة: قد تظهر رسالة "Waiting for service" على لوحة التحكم، وتعني حالة انتظار الخدمة، وهذه الرسالة ستختفى من تلقاء نفسها، ولكن إن طال ظهورها عليك تحديث التطبيق للتأكد أن التطبيق قد نُشر بعد اكتمال إنشائه. والآن، عليك الرجوع إلى صفحة إضافات لوحة التحكم ثم النقر على View MemCachier لعرض لوحة تحليلات ذاكرة التخزين المؤقت. في هذه اللوحة، زدنا الخيار Set Cmds في لوحة All Time Stats وحالة العناصر Items في لوحة التخزين Storage بمقدار 1. في كل مرة ترسل عددًا، سيزداد كل من Set Cmds وItems. ويجب عليك الضغط على زر التحديث لتحميل الإحصائيات الجديدة. ملاحظة: يُعد التحقق من سجلات التطبيق على منصة App Platform أمرًا مفيدًا لتصحيح الأخطاء. يمكنك النقر من لوحة تحكم التطبيق على Runtime Logs لعرض الأخطاء. يمكن الاستفادة من العناصر المخزنة في الذاكرة المؤقتة. ستتحقق الآن مما إذا كان العنصر قد خُزّن مسبقًا، وإذا كان الأمر كذلك، فسوف يُعرض من ذاكرة التخزين المؤقت، وإلا سيبحث التطبيق عن العدد الأولي كما في السابق. عّدل ملف server.js، إذ عليك تعديل بعض الأسطر وإضافة بعد الاسطر الجديدة كما يلي: ... app.get('/', (req, res) => { const n = req.query.n; if (!n) { res.render('index'); return; } let prime; const key = 'prime_' + n; memcache.get(key, (err, val) => { if (err) console.log(err); if (val !== null) { // Use the value from the cache // Convert Buffer string before converting to number prime = parseInt(val.toString()); } else { // No cached value available, find it prime = findPrime(n); memcache.set(key, prime.toString(), { expires: 0 }, (err) => { if (err) console.log(err); }); } // Initialize likes for this number when necessary if (!likesMap[n]) likesMap[n] = 0; const locals = { n, prime, likes: likesMap[n] }; res.render('index', locals); }); }); ... تهيئ الشبفرة السابقة العدد الأولي prime بدون قيمة، باستخدام الكلمة المفتاحية Let، حيث أُعيدَ تعيين قيمتها. ثم يحاول تابع memcache.get استرداد العدد الأولي المخزن. توجد معظم شيفرة المتحكم الآن في تابع الاستدعاء memcache.get لأن نتيجته لازمة لتحديد كيفية التعامل مع الطلب. فإن كان ثمة قيمة مخزنة متاحة، فعليه استخدامها، وإلا عليه إجراء الحسابات اللازمة للعثور على العدد الأولي وتخزين النتيجة في ذاكرة التخزين المؤقت. إن القيمة التي يستدعيها تابع الاستدعاء memcache.get هي قيمة تخزين مؤقتة Buffer، لذا عليك تحويلها إلى سلسلة قبل تحويل التابع prime إلى عدد. أودع التغييرات ثم ادفعها إلى غيت هب لتنشرها: git add . && git commit -m "Check cache for prime number" && git push عندما ترسل رقمًا لم يخزّن بعد في التطبيق، ستزداد إحصائيات Set Cmds وحالة العناصر Items وإحصائيات الأخطاء get misses في لوحة تحكم MemCachier بمقدار 1. تحدث حالة الخطأ miss عند محاولة الحصول على العنصر من ذاكرة التخزين المؤقت قبل تعيينه، فالعنصر غير موجود في ذاكرة التخزين المؤقت، مما يؤدي إلى حدوث خطأ، ثم يخزّن العنصر بعد ذلك. عند إدخال عدد مخزّن مسبقًا، سيزداد عدد مرات الحصول على النتائج get hits. وهكذا نكون قد خزّنا العمليات ذات الاستخدام الكثيف للموارد تخزينًا مؤقتًا. بعد ذلك، سنخزّن طرق عرض التطبيق المصيّرة مؤقتًا. تخزين طرق العرض المصيّرة سنخزّن الآن طرق عرض التطبيق مؤقتًا باستخدام برنامج وسيط. أعددنا في خطوة سابقة ejs كمولد قوالب وأنشأنا قالبًا لعرض كل رقم مُدخل n. قد يستهلك إنشاء العرض كثيرًا من الموارد، لذا فإن تخزينه مؤقتًا يمكن أن يسرع معالجة الطلب ويستخدم موارد أقل. أولًا، أنشئ مجلدًا للبرنامج الوسيط وسمّه middleware. ثم أنشئ الملف middleware/cacheView.js وافتحه في المحرر. ثم أضف هذه الأسطر في ملف CacheView.js لدالة البرنامج الوسيط: const memcache = require('../services/memcache'); /** * Express middleware to cache views and serve cached views */ module.exports = function (req, res, next) { const key = `view_${req.url}`; memcache.get(key, (err, val) => { if (err) console.log(err); if (val !== null) { // Convert Buffer string to send as the response body res.send(val.toString()); return; } }); }; استوردنا في الشيفرة السابقة عميل الذاكرة memcache. ثم عرفنا عن مفتاح، مثل view_/?n=100. وبعدها، تحققنا من وجود عرض لهذا المفتاح في ذاكرة التخزين المؤقت باستخدام التابع memcache.get. إذا لم يكن هناك خطأ ووُجدت قيمة لهذا المفتاح، ينتهي الطلب عن طريق إرسال العرض مرةً أخرى إلى العميل. بعد ذلك، إذا لم يكن العرض مخزنًا، فعليك تخزينه مؤقتًا، عن طريق تعديل override التابع res.send بإضافة الأسطر التالية على ملف middleware/cacheView.js: const originalSend = res.send; res.send = function (body) { memcache.set(key, body, { expires: 0 }, (err) => { if (err) console.log(err); }); originalSend.call(this, body); }; يجب أن يصبح محتوى الملف middleware/cacheView.js كالتالي: const memcache = require('../services/memcache'); /** * Express middleware to cache views and serve cached views */ module.exports = function (req, res, next) { const key = `view_${req.url}`; memcache.get(key, (err, val) => { if (err) console.log(err); if (val !== null) { // Convert Buffer string to send as the response body res.send(val.toString()); return; } const originalSend = res.send; res.send = function (body) { memcache.set(key, body, { expires: 0 }, (err) => { if (err) console.log(err); }); originalSend.call(this, body); }; }); }; يمكنك تعديل التابع res.send باستعمال دالة تخزن العرض في ذاكرة التخزين المؤقت قبل استدعاء دالة الإرسال الأساسية send كالمعتاد. إذ يمكنك استدعاء دالة الإرسال الأساسية send باستخدام تابع الاستدعاء call الذي يستخدم this والذي يعبر عن context الحالي بعد تعليمة الذاكرة memcache.set. احرص على استخدام دالة مجهولة (وليس دالة سهمية)، كي تحدد قيمة this الصحيحة. بعد ذلك، مرر التحكم إلى البرنامج الوسيط عن طريق إضافة الأمر next: ... /** * Express middleware to cache views and serve cached views */ module.exports = function (req, res, next) { const key = `view_${req.url}`; memcache.get(key, (err, val) => { if (err) console.log(err); if (val !== null) { // Convert Buffer to UTF-8 string to send as the response body res.send(val.toString()); return; } const originalSend = res.send; res.send = function (body) { memcache.set(key, body, { expires: 0 }, (err) => { if (err) console.log(err); }); originalSend.call(this, body); }; next(); }); }; ... إن إضافة التابع next يؤدي استدعاء دالة البرنامج الوسيط التالي في التطبيق. لكن لا يوجد في مثالنا برامج وسيط آخر، لذلك يُستدعى المتحكم controller. يوّلد التابع res.render الخاص بـ Express صفحة عرض view، ثم يستدعي التابع res.send داخليًا باستخدام طريقة العرض. والآن، في وحدة تحكم المسار الرئيسي، يُستدعى تابع التعديل override عند استدعاء res.render، ليخزّن العرض في ذاكرة التخزين المؤقت قبل استدعاء دالة send الأصلية لإكمال الرد. ملاحظة: يمكنك تمرير استدعاء للتابع render في المتحكم، ولكن عليك تكرار شيفرة التخزين المؤقت للعرض في وحدة التحكم لكل مسار يخزن مؤقتًا. والآن، استورد البرنامج الوسيط في الملف server.js: const express = require('express'); const findPrime = require('./utils/findPrime'); const memcache = require('./services/memcache'); const cacheView = require('./middleware/cacheView'); ... ثم أضف الوسيط cacheView لاستخدامه في المسار الرئيسي مع التابع / Get: ... app.get('/', cacheView, (req, res) => { ... }); ... ثم أودع التغييرات وادفعها إلى غيت هب لنشرها: git add . && git commit -m "Add view caching" && git push عند إدخال عدد جديد، ستزداد إحصائيات لوحة تحكم MemCachier لكل من Set Cmds وItems وget misses بمقدار اثنين: مرة لحساب العدد الأولي ومرة للعرض. عند تحديث التطبيق بنفس الرقم، فسترى زيادةً بمقدار 1 في get hit لوحة التحكم. لأن صفحة العرض استُرِدت من ذاكرة التخزين المؤقت، لذلك لا توجد حاجة لجلب نتيجة العدد الأولي من التطبيق ملاحظة: إن خيار view cache مفعّل تلقائيًا في الإنتاج، لكن هذا الخيار لا يخزن محتوى خرج القالب، بل يخزن القالب فقط.ويعاد عرض الصفحة مع كل طلب، حتى عندما تكون ذاكرة التخزين المؤقت قيد التشغيل. إذًا فخيار view cache، مختلف ولكنه مكمل للتخزين المؤقت للعرض الذي طبقناه. قد تلاحظ بعد أن خزّنا العرض أن زر الاعجاب لا يعمل. إذا سجلت عدد الإعجابات، فستلاحظ أنها تتغير وتزداد، لكن العرض المخزّن بحاجة إلى التحديث عندما يتغير عدد الإعجابات. إذًا يجب إيقاف العرض المخزن مؤقتًا عند تغيير العرض. ثم سنوقف العرض المخزّن عندما يتغير عدد الإعجابات likes وذلك عن طريق حذفه من ذاكرة التخزين المؤقت. عدّل دالة إعادة التوجيه redirect في ملف server.js عن طريق إضافة الأسطر التالية: likesMap[n]++; // The URL of the page being 'liked' const url = `/?n=${n}`; res.redirect(url); لتصبح الدالة كما يلي: ... app.get('/like', (req, res) => { const n = req.query.n; if (!n) { res.redirect('/'); return; } likesMap[n]++; // The URL of the page being 'liked' const url = `/?n=${n}`; res.redirect(url); }); ... بعد تغير عدد الاعجابات في صفحة العرض، ستصبح النسخة المخزنة غير صالحة، لذا أضف الأسطر التالية لحذف عدد الإعجابات من ذاكرة التخزين المؤقت عندما تتغير الإعجابات likes: ... const url = `/?n=${n}`; // The view for this URL has changed, so the cached version is no longer valid, delete it from the cache. const key = `view_${url}`; memcache.delete(key, (err) => { if (err) console.log(err); }); res.redirect(url); ... يجب أن يكون ملف server.js مماثلًا لما يلي: const express = require('express'); const findPrime = require('./utils/findPrime'); const memcache = require('./services/memcache'); const cacheView = require('./middleware/cacheView'); const app = express(); app.set('view engine', 'ejs'); /** * Key is `n` * Value is the number of 'likes' for `n` */ const likesMap = {}; app.get('/', cacheView, (req, res) => { const n = req.query.n; if (!n) { res.render('index'); return; } let prime; const key = 'prime_' + n; memcache.get(key, (err, val) => { if (err) console.log(err); if (val !== null) { // Use the value from the cache // Convert Buffer string before converting to number prime = parseInt(val.toString()); } else { // No cached value available, find it prime = findPrime(n); memcache.set(key, prime.toString(), { expires: 0 }, (err) => { if (err) console.log(err); }); } // Initialize likes for this number when necessary if (!likesMap[n]) likesMap[n] = 0; const locals = { n, prime, likes: likesMap[n] }; res.render('index', locals); }); }); app.get('/like', (req, res) => { const n = req.query.n; if (!n) { res.redirect('/'); return; } likesMap[n]++; // The URL of the page being 'liked' const url = `/?n=${n}`; // The view for this URL has changed, so the cached version is no longer valid, delete it from the cache. const key = `view_${url}`; memcache.delete(key, (err) => { if (err) console.log(err); }); res.redirect(url); }); const port = process.env.PORT || 3000; app.listen(port, () => console.log(`Example app is listening on port ${port}.`) ); لا تنسَ حفظ الملف، ثم أودع التغييرات وادفعها للنشر: git add . && git commit -m "Delete invalid cached view" && git push والآن سيعمل زر الاعجاب في التطبيق وستتغير الإحصائيات التالية في لوحة تحكم MemCachier عند النقر على الزر: delete hits تزداد عند حذف العرض. get misses تزداد عند حذف العرض وعدم وجوده في ذاكرة التخزين المؤقت. get hits تزداد عند العثور على العدد الأولي في ذاكرة التخزين المؤقت. Set Cmds تزداد عند إضافة العرض إلى ذاكرة التخزين المؤقت. Items تبقى على حالها عند حذف أو إضافة العرض. وهكذا نكون قد طبقنا التخزين المؤقت للعرض وأبطلنا استخدام صفحات العرض المخزنة عند تغييرها. أما التقنية الأخيرة التي سننفذها هي التخزين المؤقت للجلسة. التخزين المؤقت للجلسات سنتعلم في هذه الفقرة كيفية إضافة جلسات Sessions وتخزينها مؤقتًا في تطبيق Express، مما يجعل ذاكرة التخزين المؤقت مخزنًا للجلسات. وحيث إن إحدى الاستخدامات الشائعة للجلسات هي تسجيل دخول المستخدم user login، لذا يمكننا اعتبار هذه الفقرة خطوةً أوليةً لتنفيذ نظام تسجيل دخول المستخدم في المستقبل (على الرغم من أن نظام تسجيل دخول المستخدم خارج عن نطاق مقالنا). يمكن أن يكون تخزين الجلسات قصيرة الأمد في ذاكرة التخزين المؤقت أسرع وأكثر قابليةً للتوسع من تخزينها في قواعد البيانات. ملاحظة: تعتبر ذاكرة التخزين المؤقت مثالية لتخزين الجلسات القصيرة التي انتهت مدتها. ومع ذلك، فإن ذاكرة التخزين المؤقت ليست دائمة؛ لذا تعد حلول التخزين الدائمة كقواعد البيانات أكثر ملاءمةً لتخزين الجلسات طويلة الأمد. والآن، ثبّت أداة الجلسات express-session كي تضيف جلسات إلى التطبيق وإلى مكتبة connect-memjs لاستخدام MemCachier كمخزن للجلسات: npm install express-session connect-memjs استورد ملف express-session و connect-memjs إلى ملف server.js: const express = require('express'); const findPrime = require('./utils/findPrime'); const memcache = require('./services/memcache'); const cacheView = require('./middleware/cacheView'); const session = require('express-session'); const MemcacheStore = require('connect-memjs')(session); ... تُمرَر جلسة البرنامج الوسيط يتم تمرير البرنامج الوسيط للجلسة إلى وحدة الاتصال connect في memcached، مما يسمح لها بالوراثة من Express.session.Store. عدّل إعدادات البرنامج الوسيط للجلسة كي يستخدا ذاكرة التخزين المؤقت كمخزن له، وذلك بإضافة الأسطر التالية: ... app.set('view engine', 'ejs'); app.use( session({ secret: 'your-session-secret', resave: false, saveUninitialized: true, store: new MemcacheStore({ servers: [process.env.MEMCACHIER_SERVERS], prefix: 'session_', }), }) ); ... يستخدم secret لتسجيل ملفات تعريف الارتباط للجلسة أو ما يُعرف باسم cookie. لا تنسَ استبدال your-session-secret بسلسلة مميزة. ملاحظة: يجب استخدام متغيرات البيئة لضبط secret لمراحل الإنتاج، وذلك بإضافة السطر secret: process.env.SESSION_SECRET || 'your-session-secret' لكن عندها يجب ضبط متغير البيئة في لوحة تحكم App Platform. يجبر الأمر Resave الجلسة على إعادة الحفظ إذا تُعدَل أثناء الطلب. ولأننا لا نريد تخزين العنصر في الذاكرة التخزين المؤقت مرة أخرى، لذا علينا ضبط قيمته على false. saveUninitialized: false is useful when you only want to save modified sessions, as is often the case with login sessions where a user property might be added to the session after authentication. In this case, you will store all sessions indiscriminately, so you set it to true. يُعد الأمر saveUninitialized: false مفيدًا لحفظ الجلسات المعدلة فقط، كما هو الحال غالبًا مع جلسات تسجيل الدخول، حيث يمكن إضافة خاصية مستخدم إلى الجلسة بعد المصادقة، حينها سنخزّن جميع الجلسات بصورة عشوائية، لذلك سنضبطها على القيمة true. أخيرًا، اربط قيمة store مع ذاكرة التخزين المؤقتة، واضبط بادئة ذاكرة التخزين المؤقت للجلسة على ._session وهذا يعني أن مفتاح عنصر الجلسة في الذاكرة سيبدو كالتالي: session_<session ID>. بعدها، أضف برامجًا وسيطًا لتصحيح الأخطاء على مستوى التطبيق، والتي ستساعد في تحديد الجلسات المخزنة قيد التنفيذ: ... app.use( session({ ... }) ); /** * Session sanity check middleware */ app.use(function (req, res, next) { console.log('Session ID:', req.session.id); // Get the item from the cache memcache.get(`session_${req.session.id}`, (err, val) => { if (err) console.log(err); if (val !== null) { console.log('Session from cache:', val.toString()); } }); next(); }); ... وهكذا سيسجل البرنامج الوسيط معرف الجلسة لكل طلب. ثم سيحصل على جلسة هذا المعرف من ذاكرة التخزين المؤقت ويسجل محتوياتها. حيث توضح هذه الطريقة أن الجلسات تعمل وتخزّن. احفظ الملف، ثم أودع التغييرات وادفعها للنشر: git add . && git commit -m "Add session caching" && git push أدخل رقمًا في التطبيق ثم تحقق من سجلات وقت التشغيل **Runtime Logs ** في لوحة التحكم للوصول إلى رسائل تصحيح الأخطاء. ستجد معرف الجلسة والقيمة التي سجلتها، مما يوضح أن الجلسات تعمل وتخزّن بصورة صحيحة. في لوحة تحكم MemCachier، عند تخزين العرض والجلسة، سترى ثلاث نتائج لكل تحديث للصفحة: واحدة لصفحة العرض، وواحدة للجلسة، وواحدة لجلسة برنامج تصحيح الأخطاء الوسيط. والآن، يمكنك التوقف عند هذه الخطوة، أو يمكنك الاطلاع على الخطوة السابعةالإضافية. الخطوة السابعة، حذف الموارد (اختيارية) ثمة رسوم عليك دفعها عند نشر التطبيق على منصة App platform، لذا يمكنك حذف التطبيق وإضافة MemCachier عند الانتهاء. انقر على الإجراءات Actions من لوحة التحكم ثم انقر على حذف التطبيق Destroy App. لحذف إضافة MemCachier، انقر على الإضافات Add-Ons، ثم على MemCachier، وانقر بعدها على الإعدادات والحذف Settings and Destroy. تلغى ذاكرة MemCachier المجانية بعد 30 يومًا من عدم استخدامها، ولكن يُعد تنظيف الادوات أمرًا جيدًا. ختامًا تعلمنا في مقالنا كيفية إنشاء تطبيق Express للعثور على عدد أولي باستخدام وكيفية إضافة زر "أعجبني". ثم رفعنا هذا التطبيق على غيت هب ونشرناه على منصة تطبيقات DigitalOcean. ثم سرّعنا التطبيق وجعلناه قابلًا للتوسع من خلال تنفيذ ثلاث تقنيات للتخزين المؤقت للكائنات باستخدام إضافة MemCachier للتخزين المؤقت للعمليات ذات الاستخدام الكثيفة للموارد، ومن خلال العرض view، والجلسات sessions. يمكنك الاطلاع على ملفات هذا المقال في مستودع مجتمع DigitalOcean، تحتوي المفاتيح في كل استراتيجيات التخزين المؤقت التي نفذناها على بادئة: _prime و _view و _session prime_ و view_ وsession_. بالإضافة إلى ميزة فضاء الاسم، توفر البادئة فائدةً إضافيةً وهي السماح بتحديد أداء ذاكرة التخزين المؤقت. استخدمنا في مقالنا شريحة المطورين developer plan في MemCachier، ولكن يمكنك تجربة شريحة مُدارة بالكامل تأتي مع مجموعة ميزات االفحص الدقيق Introspection، مما يتيح لك تتبع أداء البادئات الفردية. على سبيل المثال، يمكنك مراقبة معدل النقر hit rate أو نسبة النقر hit ratio على أي بادئة، مما يوفر رؤية تفصيلية لأداء ذاكرة التخزين المؤقت. إن أردت متابعة استخدام MemCachier، يمكنك مراجعة التوثيقات التالية. إذا واجهت مشاكلًا عند تطبيق إحدى هذه الخطوات، يمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- [للمقال ](How To Deploy an Express Application and Scale with MemCachier on DigitalOcean App Platform) من موقع DigitalOcean لكاتبيه Patrick O'Hanlon و Caitlin Postal. اقرأ أيضًا مدخل إلى إطار عمل الويب Express وبيئة Node دليل استخدام Node.js وإطار العمل Express للمبتدئين نشر تطبيق Express في بيئة الإنتاج مقدمة إلى القوالب Template في Express: إنشاء القالب الأساسي لموقع مكتبة محلية مثالًا
  5. تعد إدراة السجلات جزءًا أساسيًا من إدارة الخوادم، ولتفادي ظهور المشاكل في خادم الويب، ينصح بإعداد السجلات Logging لتوثيق الأحداث والأنشطة المهمة على الخادم إذ إن معلومات السجلات الموجودة على خادمك تزوّدك بالبيانات اللازمة لاستكشاف الأخطاء وإصلاحها وتقييم المشاكل عند ظهورها. سنلقي في هذا المقال نظرةً على إمكانات سجلات خادم Nginx ونتعلم كيفية ضبطها لتخدم احتياجاتك على أفضل وجه، وذلك باستخدام خادم افتراضي خاص VPS يعمل بنظام تشغيل أوبنتو Ubuntu 22.04، ولكن يمكنك استخدام أي توزيعة حديثة لنظام لينكس. المتطلبات: لإكمال هذا المقال بنجاح، ستحتاج إلى تجهيز بيئة العمل المكونة من: خادم أوبنتو 22.04 يحتوي على مستخدم غير جذري non-root user ذي صلاحيات sudo و مثبت عليه جدار حماية. يمكنك اعداده بالعودة إلى دليل إعداد الخادم الأولي تثبيت Nginx على خادمك. يمكنك الاستعانة بالمقال التالي لتثبيته على خادمك. أصبحت جاهزًا لبدء العمل بعد أن ثبّتَ Nginx على خادم أوبنتو 22.04. فهم آلية عمل سجل الأخطاء Error_log يستخدم خادم Nginx عدة سجلات للتحكم في سجلات النظام. ويسمى السجل المستخدم في الوحدة الأساسية بسجل الأخطاء أو Error_log صياغة سجل الأخطاء Error_log يُستخدم سجل الأخطاء Error_log لتسجيل رسائل الخطأ العادية. إن استخدمت خادم أباتشي Apache ستجد أن هذا السجل مشابه لسجل أخطاء أباتشي ErrorLog. يعتمد سجل الأخطاء Error_log على الصياغة التالية: /etc/nginx/nginx.conf error_log log_file log_level يحدد log_file الملف الذي ستُحفظ فيه السجلات، أما log_level فيحدد أدنى مستوى تسجيل ترغب في تسجيله. مستويات التسجيل يمكن ضبط سجل الأخطاء Error_log لتسجيل معلومات وفق ما تحتاجه. أما مستوى التسجيل فهو أحد المستويات التالية: emerg: يظهر في حالات الطوارئ حيث يكون النظام في حالة غير مستقرة alert: يظهر في المواقف الخطيرة التي تتطلب اتخاذ إجراء فورًا crit: يظهر عند حدوث المشاكل المهمة التي تحتاج إلى معالجة error: يظهر عند حدوث خطأ ما وفشل عملية ما warn: يظهر عند حدوث أمر غير مألوف، لكنه لا يدعو للقلق notice: يظهر عند حدوث أمر عادي، لكن يجب التنبيه عليه info: رسالة توضيحية debug: معلومات عن تصحيح الأخطاء تفيد في تحديد مكان حدوث المشكلة تعتبر المستويات الأعلى في القائمة السابقة ذات أولوية أعلى، فإذا حددت مستوىً ما، فإن السجل سيلتقط هذا المستوى، والمستويات الأعلى منه. على سبيل المثال، إذا حددت المستوى error فإن السجل سوف يجلب الرسائل التالية errorو crit و alert و emerg، وتجد مثالًا على هذا السجل في ملف الإعدادات الرئيسي.استخدم محرر النصوص الذي تفضله للوصول إلى ملف الإعدادات التالي، سوف نستخدم في مثالنا محرر النصوص نانو nano: sudo nano /etc/nginx/nginx.conf اذهب إلى أسفل الملف، إلى قسم إعدادات التسجيل Logging Settings # ولاحظ السجلات التالية: /etc/nginx/nginx.conf . . . ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; . . . إن أردت بأن لا يسجل error_log شيئًا، فعليك إرسال خرجه إلى /dev/null: . . . /etc/nginx/nginx.conf error_log /dev/null crit; . . . أما سجل access_log فسوف نناقشه في فقرة تالية. فهم آلية عمل سجل HttpLogModule يُعد سجل error_log جزءًا من الوحدة الأساسية core module، أما سجل access_log فيُعد جزءًا من وحدة HttpLogModule التي تزودنا بإمكانية تخصيص السجلات. كما توجد بضع سجلات أخرى في هذه الوحدة تساعد في إعداد السجلات المخصصة custom logs. سجل log_format يُستخدم سجل log_format لوصف التنسيق المستخدم في السجلات باستخدام النص العادي والمتغيرات. ثمة تنسيق جاهز يأتي مع Nginx ويسمى التنسيق المدمج combined، وهو تنسيق شائع مُستَخدم في عدة خوادم. إليك مثالًا على التنسيق المدمج إن لم يكن مُعَّرفًا مسبقًا واضطررت إلى تعريفه مع سجل log_format: /etc/nginx/nginx.conf log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; لاحظ أن التعريف يتضمن عدة أسطر وينتهي عند الفاصلة المنقوطة (;). أما الأسطر التي تبدأ بالعلامة ($) فهي تعبر عن المتغيرات، وتُفسَر المحارف التالية - ، [ ، ] حرفيًا. أما الصياغة العامة للسجل فهي كالتالي: /etc/nginx/nginx.conf log_format format_name string_describing_formatting; يمكنك استخدام المتغيرات التي تدعمها الوحدة الأساسية وذلك لصياغة سلاسل تسجيل logging strings خاصة. فهم آلية عمل سجل access_log يستخدم سجل access_log صياغة مشابهة لصياغة سجل الأخطاء Error_log، لكنه أكثر مرونة، ولذلك يستخدم لضبط التسجيل المخصص Custom logging. الصياغة العامة لسجل access_log هي كالتالي: /etc/nginx/nginx.conf access_log /path/to/log/location [ format_of_log buffer_size ]; إن القيمة الافتراضية لسجل access_log هي التنسيق المدمج combined الذي تحدثنا عنه سابقًا في سجل log_format، لكن يمكنك استخدام أي تنسيق معَرَّف في سجل log_format. قمة المخزّن المؤقت Buffer هي الحجم الأعظمي للبيانات التي يحتفظ بها خادم Nginx قبل أن ينقلها إلى السجل. ويمكنك أن تضغط حجم ملف السجل بواسطة إضافة المحدد gzip ضمن تعريف السجل، كما يلي: /etc/nginx/nginx.conf access_log /path/to/log/location format_of_log gzip; وبخلاف سجل الأخطاء Error_log، إن لم تُرِد التسجيل فبإمكانك إلغاؤه من ملف الإعدادات كالتالي، ولا حاجة لإرساله إلى /dev/null: /etc/nginx/nginx.conf . . . ## # Logging Settings ## access_log off; error_log /var/log/nginx/error.log; . . . تدوير السجلات مع ازدياد ملفات السجل، يصبح من الضروري إدارة آليات التسجيل لتجنب امتلاء مساحة القرص، وتدوير السجلات Log rotation هي عملية تبديل ملفات السجل وأرشفة الملفات القديمة لمدة زمنية محددة. لا يوفر Nginx أدوات لإدارة ملفات السجلات، لكنه يحتوي على آليات للمساعدة في تدوير السجلات. تدوير السجلات يدويًا يمكنك إنشاء سكربت لتدوير السجلات يدويًا، على سبيل المثال، لنقل ملف السجل الحالي إلى ملف جديد وأرشفته، يمكنك إتباع الخطة التالية: أعد تسمية أحدث سجل بإضافة اللاحقة .0 إلى اسمه، ثم أعد تسمية الملفات القديمة بإضافة اللاحقة .1 وهكذا على التوالي: mv /path/to/access.log /path/to/access.log.0 إن الأمر الذي يدوّر ملفات السجل هو التالي kill -USR1 `cat /var/run/nginx.pid` لا ينهي هذا الأمر عمليات خادم Nginx، لكنه يرسل لها إشارةً لتعيد تحميل ملفات السجل. سيؤدي هذا إلى تسجيل الطلبات الجديدة في ملف السجل المحدَّث: kill -USR1 `cat /var/run/nginx.pid` يخزّن خادم Nginx معرف العملية الرئيسة PID في الملف /var/run/nginx.pid الموجود أعلى ملف الإعدادات /etc/nginx/nginx.conf في السطر الذي يبدأ بكلمة pid: sudo nano /etc/nginx/nginx.conf /etc/nginx/nginx.conf user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; ... بعد تدوير السجلات، نفّذ الأمر sleep 1 كي تكتمل عملية النقل. كما يمكنك بعدها أن تضغط الملفات القديمة في ملف بصيغة .zip أو أن تجري العملية التي ترغب بها: sleep 1 [ post-rotation processing of old log file ] تدوير السجلات باستخدام برنامج logrotate يُستخدم برنامج logrotate لتدوير السجلات، وهو برنامج يُنَزّل تلقائيًا على نظام أوبنتو، كما يوجد سكربت مخصص لبرنامج logrotate على خادم nginx العامل بنظام أوبنتو. استخدم محرر النصوص الذي تفضله للوصول إلى ملف الإعدادات التالي، سوف نستخدم في مثالنا محرر النصوص nano : sudo nano /etc/logrotate.d/nginx عليك تذكر أن السطر الأول من الملف يحدد الموقع الذي ستُطَبق فيه أوامر الأسطر اللاحقة، إن غيّرت موقع تسجيل الملفات في ملف إعدادات Nginx، أما بقية الملف فيُشير إلى أن السجلات ستُدَور يوميًا وسيُحتَفظ ب 52 سجل قديم. لاحظ أن قسم postrotate يحتوي على أمر مشابه لآليات التدوير اليدوية التي طبقناها سابقًا: /etc/logrotate.d/nginx . . . postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript . . . يوجه القسم السابق Nginx إلى إعادة تحميل ملفات السجل عند اكتمال التدوير. خاتمة توفر إدارة السجلات وضبطها على نحو صحيح الوقت والجهد في حال حدوث مشكلة في الخادم، إذ إن الوصول إلى المعلومات التي تساعدك على تشخيص المشكلة يعد عاملًا مهمًا في حل المشكلة بسلاسة وسهولة. كما أن الاطلاع الدوري على سجلات الخادم يُعدّ أمرًا مهمًا لضمان عمل الموقع على نحو صحيح وعدم كشف أي بيانات حساسة. تعرفنا في هذا المقال على مقدمة عن التعامل مع السجلات في خادم Nginx يعمل بنظام تشغيل أوبنتو، كما يمكنك قراءة المزيد حول كشف المشاكل الشائعة للمواقع على خادوم لينكس. وللحصول على الدعم والمساعدة، أضف سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال How To Configure Logging and Log Rotation in Nginx on an Ubuntu VPS لكاتبه Justin Ellingwood. اقرأ أيضًا كيف تستعرض وتدير سجلات لينكس على أوبنتو وCentOS إدارة الحزم، أتمتة المهامّ ومراقبة السّجلات في Red Hat Enterprise Linux تثبيت وضبط خادم Nginx تثبيت خادم ويب Caddy على أوبنتو 16.04 دليل إعداد خادم ويب محلي خطوة بخطوة
  6. قد تواجه عدة أخطاء شائعة عند ضبط نطاق موقعك أو عند ضبط إعدادات دعم بروتوكول HTTPS. وإن إصلاح مشاكل بروتوكول DNS أو ما يُعرف ببروتوكول نظام تسمية النطاقات (Domain Name System) ليس بالأمر السهل، إذ يصعُب الجزم أن سبب الأخطاء هو بروتوكول DNS في حين أن سببها قد يكون في مكان آخر في بنيتك الشبكية. وفي حال طلبت من مسؤول الصيانة حل المشكلات المرتبطة بضبط نطاق موقعك ستسمع غالبًا منه العبارات التالية تباعًا: فكثيرًا ما تتكرر مشكلات DNS عند محاولة تنصيب شهادة SSL/HTTPS وضبط إعداداتها على خوادمك، عند استخدامك مثلًا لخدمة Let's Encrypt. سنراجع في هذا المقال بعض الأخطاء الشائعة التي قد تواجهها عند التعامل مع بروتوكولي DNS و HTTPS عند التعامل مع خدمة Let's Encrypt على وجه الخصوص، وسنُقدّم لك مجموعة نصائح وتوصيات يمكن تطبيقها سواء أكنت تستخدم خدمة DNS من مزود ديجيتال أوشن DigitalOcean أو من أي مزود آخر. سجلات DNS إن بروتوكول DNS هو المسؤول عن تعيين وتوجيه حركة البيانات إلى خوادم الويب باستخدام أسماء النطاقات، مثل your_domain.com بدلًا من الحاجة لاستخدام عناوين IP للمواقع. وتزوّد جميع مزودات النطاقات (ومن ضمنهم DigitalOcean) مستخدميها بواجهة خاصة لإدارة سجلات DNS. ولمطالعة مزيد من المعلومات حول أنواع سجلات نظام أسماء النطاق (DNS) يمكنك الرجوع إلى مقال مقدّمة إلى مُصطَلحات وعناصر ومفاهيم نظام أسماء النطاقات. إن أحد أكثر سجلات الـ DNS شيوعًا هو السجل A، والذي يشكّل رابطًا أساسيًا من اسم النطاق domain name إلى عنوان الخادم server address. لذا سنرّكز في هذا المقال على السجل A لكونه السجل الذي تحتاج إليه لإسناد أسماء النطاقات الأساسية إلى عناوين IP للخوادم. عند استخدام خدمة DNS من مزود DigitalOcean فإن السجل A سيكون مضبوطًا كما في الصورة التالية: تحديث أو ترحيل سجلات DNS إذا جربت تعديل سجلات DNS، فقد يستغرق تطبيق هذه التعديلات بعض الوقت، أقل من نصف ساعة، ونظرًا لأنه لا يمكنك اختبار DNS مباشرةً بعد تطبيق التعديلات، فقد تكون الأخطاء مضللة. ولن تتمكن من ضبط إعدادات خدمة LetsEncrypt على نطاقك حتى تنتقل إعدادات DNS نطاقك إلى معظم أو جميع خوادم أسماء النطاقات العالمية المسؤولة عن توجيه حركة المرور عبر الإنترنت وتحويل طلبات البحث عن عناوين IP للنطاقات إلى سجلات DNS المتعلقة بها. يمكنك الاستعانة بموقع whatsmydns.net للتحقق من أن تعديلات سجل DNS قد نُشرت إلى معظم خوادم أسماء النطاقات العالمية المستخدمة للبحث عن سجلات DNS. فإذا لم تعدل السجلات لديك محليًا يمكنك التحقق فيما إذا كانت قد عدلت في معظم المواقع العالمية، فقد يكون سبب المشكلة هو أن مزود خدمة الانترنت الذي تستخدمه ربما يكون أبطأ في إجراء التعديلات من المخدمات العالمية، لكن لن يستغرق الأمر أكثر من بضع دقائق في معظم الحالات. إن أردت التحقق من سجل DNS بعد فترة قصيرة من نشر التعديلات، فقد تحصل على نتائج مختلفة ومربكة من خادمك البعيد ومن متصفح الانترنت المحلي، ويحدث هذا الأمر عندما يطبق الخادم البعيد التعديلات قبل مزود خدمة الإنترنت الذي تتعامل معه. لاستبعاد احتمال حدوث هذا، استخدم الأمر nslookup لمعرفة ما هو عنوان IP الذي يشير إليه اسم النطاق، كالتالي: nslookup digitalocean.com $ Output … Name: digitalocean.com Addresses: 2606:4700::6810:b50f 2606:4700::6810:b60f 104.16.181.15 104.16.182.15 يمكنك بهذه الطريقة التأكد أن النتائج المحلية تطابق نتائج خوادم أسماء النطاقات العالمية. إن استخدام قيمة TTL مرتفعة أو ما يعرف بمدة البقاء Time-To-Live عند ضبط DNS، سيجعل التحديث يستغرق وقتًا أطول. إذ إن قيمة TTL الافتراضية المعتمدة في معظم مسجلي أسماء النطاقات هي 3600 ثانية، أو ساعة واحدة، وتُدرج عادةً هذه القيمة بجوار سجل A. تساعد قيمة مدة البقاء TTL الطويلة على تخزين الطلبات بفاعلية أكبر، ولكنها بالمقابل قد تجعل تغييرات DNS تستغرق وقتًا أطول في النشر. ننصحك في ضبط مدة TTL قصيرة مؤقتًا إذا أردت إجراء أو اختبار بعض التغييرات على DNS. أخطاء المتصفح ومشاكل إعدادات بروتوكول HTTPS قد تظن أحيانًا أنك ضبطت إعدادات بروتوكول HTTPS وإعدادات DNS على نحو صحيح، لكن قد تظهر لك رسائل خطأ في متصفح الويب عند طلب الموقع. للحصول على دليل عام حول رموز أخطاء HTTP، ننصحك بمراجعة المقال التالي حول كيفية إصلاح رموز أخطاء HTTP الشائعة. لا تشير معظم هذه الرموز إلى الخطأ بشكل صريح ومباشر ولكنها تنتج عن الإعدادات غير الصحيحة. على سبيل المثال، إذا استخدمت خادم إنجن إكس كوسيط عكسي Nginx Reverse Proxy لتوفير بوابة HTTPS لتطبيق آخر يعمل على خادمك، ولم تضبط إعدادات البوابة على نحو صحيح، فقد يظهر لك الخطأ ذو الرمز 502 الذي يدل على أن إنجن إكس غير قادر على إحالة الطلب. وأحد الأخطاء التي قد تظهر لك هو رسالة انتهاء صلاحية الشهادة، إذ إن شهادات LeysEncrypt تبقى صالحة لمدة ثلاثة أشهر فقط، على عكس شهادات HTTPS التجارية. وعند عدم تجديد الشهادة قبل انتهاء مدة الصلاحية يتسبب في ظهور الخطأ ERR_CERT_DATE_INVALID لكل من يحاول الوصول إلى موقعك. يبدو هذا الخطأ، عند استخدام متصفح كروم Chrome على النحو التالي: عندما تضبط إعدادات LetsEncrypt لأول مرة، تُفَعّل خاصيّة تجديد الشهادة تلقائيًا. كما ترسل خدمة LetsEncrypt بريدًا إلكترونيًا لتذكيرك عندما تكون شهادتك على وشك الانتهاء، لكن إن ضبطت هذه العملية بشكل خاطئ، أو لم ينجح تشغيلها، يمكنك تجديد الشهادة يدويًا عن طريق إعادة تشغيل الأمر certbot باستخدام الوسيط renew: sudo certbot renew --nginx -d example.com -d www.example.com ربما ستحتاج إلى إعادة تشغيل خادم الويب بعد تجديد الشهادة،وفي حال لم تقم بإجراء أي تعديلات أخرى على إعدادات خادمك يمكنك عندها أتمتة هذه العملية (عن طريق إضافته إلى أداة الجدولة cron) بواسطة تشغيل الأمر systemctl restart nginx بعد تجديد الشهادة. المحتوى المختلط عند تهجير محتوى برمجي معقد أو مختلط من بروتوكول HTTP إلى HTTPS قد تلاحظ فشلًا في عرض بعض الصور أو بعض مكونات الموقع. عندما تفتح طرفيّة أدوات المطور Developer Console ستجد أن هذه الأخطاء تعزى إلى "المحتوى المختلط"، كما في الصورة التالية: وسبب ذلك هو سياسة الويب الافتراضية التي تنص على عدم استخدام أو تضمين محتوى بروتوكول HTTP في المواقع التي تستخدم بروتوكول HTTPS. قد يظهر هذا الخطأ عندما يُحَمل موقع ما محتوىً من خادمي ويب مختلفين، أو عندما نُخَدّم تطبيق ويب بواسطة بوابة خادم Nginx لكن إعادة توجيه SSL لا تعمل على وجه صحيح. إذا كنت تستخدم خادم Nginx وتوجه البيانات/حركة البيانات إلى تطبيق آخر يعمل خلف خادم الويب، وظهرت لك رسالة تحذير المحتوى المختلط، يمكنك حينها إضافة معلومات لضبط توجيه SSL وذلك ضمن كتلة الموقع location: … location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto https; } وعدا عن ذلك، احرص على استخدام بروتوكول HTTPS في جميع المواقع التي تُخَدمها. كما يمكنك الاطلاع على المقال التالي عن أخطاء المحتوى المختلط الأخطاء التي تظهر عند تشغيل سكربت LetsEncrypt Certbot قد تظهر لك بعض الأخطاء عند تشغيل سكربت Certbot المتوفر من خدمة LetsEncrypt، بعض الأخطاء لها خرج يشرح سبب الخطأ ويمكنك اتباع الإرشادات المذكورة، وبعضها الآخر قد لا يكون واضحًا. على سبيل المثال، إذا ظهر لك خطأ انتهاء المدة أو Timing out في السكربت، فالأرجح أن المشكلة متعلقة بجدار الحماية Firewall : certbot --nginx -d example.com -d www.example.com الخرج Press Enter to Continue Waiting for verification… Cleaning up challenges Failed authorization procedure. example.com (http-01): urn:ietf:params:acme:error:connection :: The server could not connect to the client to verify the domain :: Fetching http://example.com/.well-known/acme-challenge/EWbLNaAWwRZGM1UCqSvbIIxFFaoH09wPUEwVuYucCb0: 93 Timeout during connect (likely firewall problem) وتحدث عادةً أخطاء انتهاء المدة أو Timeout بسبب عدم قدرة الاتصال على الحصول على استجابة أو تأكيد للعملية لأن جدار الحماية يهمل أو يتخلص من حركة البيانات. لتلافي حدوث هذا الخطأ، تأكد أن جدار الحماية لا يحجب المنفذ رقم 80 ولا المنفذ 443 قبل تشغيل certbot. تشير بعض الوثائق أنك ستحتاج إلى فتح واحد من المنفذين، إما المنفذ 80 أو المنفذ 443، ولكن افتح كلا المنفذين لاستبعاد إمكانية حدوث الأخطاء. إن كنت تستخدم UFW، أو Uncomplicated Firewall أي الجدار الناري غير المعقَّد، يمكنك تنفيذ ما سبق عن طريق تفعيل أمر الضبط الكامل Nginx Full: sudo ufw allow 'Nginx Full' ثم أعد تشغيل certbot بعد أن غيّرت إعدادات جدار الحماية. لكن، إن أعدت تشغيل certbot عدة مرات متتالية خلال مدة قصيرة فقد يظهر لك خطأ “failed validation limit” الذي يخبرك أنك وصلت إلى الحد المسموح به من محاولات التحقق: الخرج too many failed authorizations recently: see https://letsencrypt.org/docs/failed-validation-limit/ يجب عليك الانتظار لمدة ساعة قبل أن تستطيع إعادة المحاولة مجددًا من حسابك. يمكنك الاطلاع على التوثيق التالي للحصول على معلومات أكثر عن الحد المسموح به لمحاولات التحقق وأخطاء certbot الأخرى. إذا تلقيت أخطاء أخرى عند تشغيل certbot غير الأخطاء المتعلقة بالمدة Timeout أو أخطاء DNS أو مشاكل الاتصال، فمن المحتمل أن يكون سبب هذه الأخطاء مشكلةً في بيئةPython على خادمك والتي ضُبطت إعداداتها بواسطة certbot. يمكن إصلاح هذه الأخطاء دائمًا عن طريق إزالة certbot ثم إعادة تنزيله من الصفر. لن يؤثر ذلك على إعدادات HTTPS الحالية، بل سيؤثر فقط على الأدوات المستخدمة للحفاظ على تلك الإعدادات وتجديدها. لتنفيذ ذلك، يمكن اتباع الإرشادات في مقال كيف تؤمّن خادم ويب NGINX على أوبنتو حالة عدم عمل بروتوكول HTTPS مع عدم ظهور أخطاء مرئية إن تأكدت من أن Certbot وDNS يعملان على نحو صحيح، لكن موقعك لم ينتقل من استخدام HTTP إلى استخدام HTTPS، فسبب هذا عادةً هو مشكلة في إعدادات خادم الويب. يحدث certbot تلقائيًا إعدادات ضبط خادم الويب أولًا ثم يعمل بعدها، ولهذا يجب عليك تحديد الخادم nginx عند كتابة أمر تشغيل certbot كي يعلم ما هو نوع إعدادات الخادم الذي عليه تحديثها بعد تجديد الشهادة. لكن، إن كانت إعدادات خادم الويب الحالية معقدةً جدًا، فقد يفشل Certbot في تحديثه للانتقال إلى استخدام بروتوكول HTTPS، وستحتاج حينها إلى إجراء التغييرات بنفسك. أولًا، تأكد من إضافة كتلة اسم خادمك server_name في ملف ضبط إعدادات الخادم، إذ إنه بدون هذه الخطوة، لن يعلم certbot ما هي الإعدادات الواجب تحديثها. إن واجهت مشاكل بعد هذه الخطوة، فقد تحتاج إلى تشغيل certbot في الوضع المستقل Standalone mode يجلب الشهادة فقط، ثم ستحتاج إلى ضبط إعدادات خادم الويب يدويًا لاستخدام بروتوكول HTTPS. تتضمن الإعدادات الأساسية لخادم Ngnix الذي يستخدم بروتوكول HTTPS السطر التالي listen 443 ssl ومسار شهادة SSL والمفتاح Key كما يلي: … listen 443 ssl; # RSA certificate ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem; # Redirect non-https traffic to https if ($scheme != "https") { return 301 https://$host$request_uri; } … عند ضبط إعدادات خادم Nginx تذكر أنه يمكنك التحقق من التعديلات التي أجريتها على إعدادات خادم Nginx وتأكيدها بواسطة الأمر nginx -t قبل إعادة تشغيل الخادم. عند الانتهاء من التعديلات بإمكانك إعادة تشغيل خادم Nginx كي تأخذ الإعدادات الجديدة مفعولها باستخدام الأمر systemctl restart nginx sudo systemctl restart nginx ختامًا راجعنا في هذا المقال عدة أخطاء شائعة قد تظهر عند استخدام خدمة LetsEncrypt وتعلمنا خطوات إصلاحها، إذ إن الهدف من خدمة LetsEncrypt هو إتاحة استخدام البروتوكول الآمن HTTPS لجميع الأفراد في أي مكان ودون دفع أي تكاليف، وهي تُعد خدمةً سهلة الاستخدام عندما تعمل تلقائيًا بدون ظهور أيّة أخطاء، ولكن قد يكون التعامل معها مربكًا لمن لا يملك خبرةً كافية في ضبط إعدادات شهادة SSL أو DNS. إذا واجهت أي مشكلات عند استخدام خدمة LetsEncrypt يمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال How To Fix Common LetsEncrypt Errors من موقع DigitalOcean. اقرأ أيضًا مقدمة إلى خدمة Let’s Encrypt تنصيب شهادة SSL مجانية عبر خدمة Let's encrypt على خادوم لينكس كيفية استخدام وضع Certbot المستقل للحصول على شهادات SSL من Let’s Encrypt على دبيان 10 كيف تستعمل SSL و HTTPS مع ووردبريس
  7. ستتعلم في هذا المقال كيفية إنشاء لعبة حسية تفاعلية، لتخفيف التوتر وتحسين مستوى تركيز الفرد، أو لتوفير وسيلة للتواصل مع الآخرين. ستعمل في هذا المشروع على: توظيف مهاراتك لتصميم وتنفيذ آلة حسية يتفاعل معها المستخدم. استخدام عناصر دخل إلكترونية، مثل الأزرار buttons والمقاومات المتغيرة potentiometers للتحكم بعمل عناصر خرج، مثل مصابيح الليد LED والأجراس buzzers. تحسين آلتك بناءً على ملاحظات المستخدمين. معلومة: تدفع الألعاب الحسية المستخدمين على الاستمرار في استخدامها والتفاعل معها، ومنها ألعاب النقر المتكرر fidget toys التي تساعد في تخفيف التوتر وتحسين مستوى تركيز الفرد، وأيضًا الألعاب الحسية التكيُّفية التي توفر وسيلة للأشخاص ذوي الإعاقات الجسدية للتواصل مع الآخرين. قد تحفز الألعاب الحسية جميع الحواس أو تركز فقط على إحداها. سيعتمد المقال على ملف المشروع codes.zip لذا يمكنك تحميله وبدء العمل. الدليل الموجز لإنشاء لعبة إلكترونية تفاعلية تحفز الحواس إليك شرحًا مختصرًا عن أهداف هذا المشروع: استخدام عناصر دخل وخرج إلكترونية متنوعة. إنشاء لعبة تفاعلية متينة تشد المستخدمين. توفير بيئة عمل وتجربة استخدام مريحة. تصفير الإعدادات بناءً على مدخلات المستخدمين، أو بعد مدة زمنية معينة. تصميم اللعبة وفق نمط أو موضوع معين. معلومة: يُعنى علم الهندسة البشرية Ergonomics بتحسين الطريقة التي يتفاعل فيها البشر مع البيئة المحيطة بهم وإيجاد حلول للمشكلات التي قد تواجههم، وسنحصل عند تطبيقه على أدوات سهلة الاستخدام ومريحة. متطلبات المشروع يتطلب المشروع توفر العتاد الآتي: لوحة حاسوب راسبيري باي بيكو Raspberry Pi Pico مع أرجل مثبتة عليها. كبل USB لنقل البيانات ذو نهايات من النوع USB A و micro USB. عناصر إلكترونية وأسلاك توصيل. أما من ناحية البرمجيات، فلا بد من توفر الآتي: برنامج ثوني Thonny: وهو البيئة البرمجية التي سنستخدمها لكتابة الشيفرة بلغة بايثون. تثبيت برنامج Thonny سنعرض في الآتي طريقة تثبيت برنامج ثوني Thonny في أنظمة التشغيل المختلفة. تثبيت برنامج Thonny على نظام تشغيل راسبيري باي يأتي برنامج ثوني Thonny مثبتًا مع نظام تشغيل راسبيري باي، المعروف سابقًا براسبيان Raspbian، لكن قد تحتاج إلى تحديثه. انقر على الأيقونة في الزاوية العلوية اليسرى من الشاشة لفتح نافذة الطرفية Terminal، أو اضغط المفاتيح التالية معًا Ctrl+Alt+T. ثم اكتب الأمر التالي لتحديث نظام التشغيل وبرنامج Thonny: sudo apt update && sudo apt upgrade -y تثبيت برنامج Thonny على أنظمة التشغيل الأخرى يمكنك تثبيت ثوني Thonny على الحواسيب العاملة بنظام تشغيل لينكس، أو ويندوز، أو ماك، وذلك من الموقع الرسمي thonny.org. انقر على رابط التنزيل الموافق لنظام تشغيل حاسوبك من الزاوية العلوية اليمنى في الموقع، ثم انقر على الملفات بعد تنزيلها، وقد تظهر لك الرسالة التالية على نظام ويندوز: انقر على خيار المزيد من المعلومات "More info" ثم على التشغيل على أي حال "Run anyway". التعرف على واجهة برنامج Thonny عند فتح Thonny ستظهر لك الواجهة التالية: يمكنك الكتابة بلغة بايثون في النافذة الرئيسية الكبيرة، ثم النقر على زر التشغيل الأخضر Run للتنفيذ، ستظهر لك رسالة لحفظ الملف قبل تشغيله. اكتب الأمر التالي وشغّله: print('Hello World!') تغيير السمة والخط يمكنك التحكم بلون الخط وحجمه وتغيير السمة المُستخدمة في واجهة البرنامج، وذلك بالنقر على قائمة الأدوات Tools من الشريط أعلى الشاشة، ثم النقر على خيارات Options، ثم انقر بعدها على نافذة الخط والسمة Theme & Font واختر نوع الخط والسمة التي تفضلها من النافذة المنسدلة ثم انقر على زر موافق OK عند الانتهاء. ننصحك باختيار الخطوط البسيطة الواضحة والابتعاد عن الخطوط المزخرفة أو المشابهة لخط اليد لأنها قد تجعل القراءة أصعب. إعداد مكتبة picozero سنعمل في هذه الخطوة على إعداد مكتبة picozero وتوصيل لوحة راسبيري باي بيكو وإعداد برنامج مايكرو بايثون. أولًا، صِل الطرف الصغير لكبل USB إلى لوحة راسبيري باي والطرف الآخر إلى حاسوبك لتتمكن من برمجة اللوحة عن طريقه. ثانيًا، افتح محرر Thonny، ولاحظ ما هو الإصدار المستخدم من بايثون بقراءة النص الموجود في الزاوية السفلية اليمنى من الشاشة، انقر على النص واختر "MicroPython (Raspberry Pi Pico)‎"، إذا لم يكن هذا الخيار محددًا. سيطالبك Thonny بتثبيت برنامج MicroPython على حاسوب راسبيري باي بيكو إذا لم تستخدمه مسبقًا، فقط انقر على زر التثبيت Install. ثالثًا، أضف حزمة بيكو زيرو picozero من خلال النقر على قائمة الأدوات Tools من شريط القوائم في برنامج Thonny، ثم النقر على خيار إدارة الحزم Manage Packages. ثالثًا، اكتب "picozero"، ثم انقر على زر البحث Search on PyPi. رابعًا، انقر على picozero من نتائج البحث ثم انقر على زر التثبيت Install. استلهم أفكارك اطلع على المشاريع التالية واستلهم منها بعض الأفكار لصنع آلتك التفاعلية: مشروع الأضواء الليلية شغّل الفيديو، وشاهد كيف أحدثنا ثقوبًا صغيرةً في ورقة سوداء اللون للحصول على سماء مرصّعة بالنجوم داخل غرفتك. استخدم مصباح الليد متعدد الألوان RGB LED للحصول على تأثير الوميض، واستخدم الأزرار buttons لتشغيل وإطفاء الأضواء. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع والموجودة باسم "night_sky.py" من ملف المشروع codes.zip. مشروع النحلة الطنانة شغّل الفيديو ولاحظ أنه عند الضغط على أجنحة النحلة يصدر صوت طنين، إذ وضعنا ورق قصدير تحت الأجنحة وعند الضغط عليها تلامس قطعةً أخرى من القصدير، وهذا يجعل الجرس يصدر نغمةً ما، إذ يُصدر كل جناح صوتًا مختلفًا؛ كما أضفنا مقاومةً متغيرة للتحكم في مصباح ليد أزرق. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع والموجودة باسم "The buzzy bee.py" من ملف المشروع codes.zip. مشروع السيف المضيئ شغّل الفيديو ولاحظ كيف يضيء نصل السيف عند الضغط على الزر ويصدر الجرس الإلكتروني صوت طنين خافت، وعند تدوير قرص المقاومة المتغيرة يتغير لون النصل وحِدّة الطنين؛ ولإطفاء السيف علينا تدوير قرص المقاومة بالاتجاه المعاكس. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع والموجودة باسم "saber.py" من ملف المشروع codes.zip. مشروع الشمعة الإلكترونية استخدمنا في هذا المشروع مصباح ليد متعدد الألوان RGB LED يضيء باستمرار، وعند النفخ على الشمعة ينطفئ المصباح كما شعلة اللهب الحقيقية؛ حيث يؤدي النفخ إلى تلامس قطعتين من ورق القصدير فتنطفئ الشعلة مدةً قصيرةً، ثم تعود للعمل بعدها. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع والموجودة باسم "candle.py" من ملف المشروع codes.zip. إعداد فكرة اللعبة يجب عليك وضع خطة للعبتك وكيف سيتفاعل اللاعب معها، لذلك خطط عن طريق التفكير، أو الكتابة والرسم، أو عن طريق التعديل وإصلاح بعض أجزاء اللعبة، فالخيار متروك لك. تحديد غرض اللعبة فكر مليًّا في الهدف من اللعبة التي ستصممها، ما الغرض منها، هل تود تعريف طفل ما على الأصوات والأشكال؟ أم تريدها وسيلةً لتخفيف التوتر عن طريق الضغط على الأزرار وسماع الأصوات الموافقة لكل زر؟ أم تود تصميم أداة لمساعدة الأشخاص على التواصل والتعبير عن احتياجاتهم؟ تحديد الجمهور فكر مليًا في الجمهور المستهدف من اللعبة، من هم؟ هل تود تصميم اللعبة لتناسب احتياجات صديق ما، أو أحد أفراد العائلة، أو أحد الصفوف الدراسية، أو الأشخاص الذين يمارسون هواية ما؟ كما يمكنك استهداف جمهور أحد الموسيقيين، أو أن تصمم اللعبة لنفسك. تحديد مميزات اللعبة فكر مليًا في العناصر التي تود استخدامها في لعبتك؛ إذ تحتوي لوحة راسبيري باي بيكو على ثمانية أرجل أرضية GND، لذا يمكنك توصيل ثمانية عناصر فقط، وقد تستطيع توصيل أكثر من ثمانية عناصر إذا كان من الممكن أن يشترك بعضها برجل الأرض GND. عليك أخذ النقاط التالية في الحسبان عند التخطيط للعبتك: تُشَغّل مكبرات الصوت Speakers كل نغمة على حدى، لذلك ستحتاج لعدة مكبرات صوت لتشغيل عدة نغمات في نفس الوقت. توجد رجل تغذية واحدة ذات جهد 3 فولت على لوحة بيكو؛ أي يمكنك استخدام مقاومة متغيرة واحدة، كما أنه يوجد حدٌّ لقيمة التيار الذي توفره لوحة بيكو. إليك بعض الاقتراحات لعناصر الدخل والخرج التي يمكنك استخدامها معًا: مقاومة متغيرة واحدة وجرس إلكتروني واحد. أربعة أزرار جاهزة وجرس إلكتروني واحد. ثمانية مبدلات يدوية الصنع وجرس إلكتروني واحد. مقاومة متغيرة واحدة وجرسان، وزران. عدة أزرار وأجراس لعزف عدة نغمات في نفس الوقت. يمكنك استخدام ما يزيد عن ثمانية عناصر، ولكن عليك حينها استخدام رجل أرضية مشتركة GND. حدد هل تود استخدام الأزرار ومقاومة متغيرةً كعناصر دخل؟ أم تريد استخدام قواطع يدوية الصنع؟ وهل تريد عزف صوت معين، أم لحنًا ما أو عدة ألحان؟ هل تريد استخدام مصباح ليد ذو لون واحد؟ أم تفضل استخدام المصباح متعدد الألوان؟ اعتماد التصميم الخارجي للعبة حدد كيف تريد أن يبدو الشكل الخارجي للعبة: هل تريد اعتماد تصميم موجود مسبقًا، مثل شكل المكعب أو المفرقعات؟ هل تفضل اعتماد موضوع برنامجك التلفزيوني أو سلسلتك المفضلة من القصص المصورة، أو حتى أغنيتك المفضلة؟ هل تريد صنع غلاف خارجي للعبة من صناديق الورق المقوى، أو من القماش، أو البلاستيك؟ الآن، حضّر العناصر التي ستحتاجها لتنفيذ لعبتك قبل البدء، من عناصر دخل وخرج إلكترونية، وأسلاك توصيل، ولوحة بيكو، واختبر سلامة اللوحة عن طريق توصيلها بحاسوبك والتحقق من عمل مصباح الليد الموجود على اللوحة، باستخدام الشيفرة التالية: from picozero import pico_led from time import sleep pico_led.on() sleep(1) pico_led.off() تنفيذ اللعبة واختبارها حان الآن وقت إعداد لعبتك وتنفيذها. تذكر أنك تصنع لعبتك الخاصة وفقًا لما تهواه وتراه مناسبًا لك، لذا ليس عليك التقيد بالعناصر المقترحة في مقالنا، اختر منها ما تريد. قد تجد في أمثلتنا أن إحدى الأرجل مستخدمة لغرض ما، عندها استخدم رجلًا عامة أخرى ورجلًا أرضية، واحرص على تدوين أرقام الأرجل المستخدمة عند كتابة الشيفرة. إليك تذكرةً ببعض المهارات التي تعلمناها والتي ستفيدك في إنشاء لعبتك: توصيل عناصر الخرج استخدام رجل أرضية مشتركة تحتوي لوحة بيكو على ثمانية أرجل أرضية GND، لذلك لاستخدام ما يزيد عن ثمانية عناصر إلكترونية عليك إعادة استخدام إحدى الأرجل الأرضية، وستحتاج لما يلي: سلك توصيل نوع دبوس- مقبس. رقائق قصدير، وشريط لاصق ناقل، أو أي مادة ناقلة للتيار الكهربائي. شريط لاصق. أولًا، أنشئ شريطًا من ورق القصدير، أو من أي مادة ناقلة. ثانيًا، استخدم الشريط اللاصق لتوصيل سلك أحد الأرجل الأرضية مع شريط القصدير، كما يلي: ثالثًا، صِل القطب الموجب للعنصر الأول مع أحد الأرجل العامة GP على لوحة بيكو، والقطب السالب للعنصر مع شريط القصدير. رابعًا، لتوصيل المزيد من العناصر، صِل القطب الموجب للعنصر مع إحدى أرجل الأغراض العامة GP، والقطب السالب مع شريط القصدير. توصيل مصابيح الليد ذات اللون الواحد لتوصيل مصباح ليد واحد ستحتاج إلى ما يلي: لوحة راسبيري باي بيكو. مصباح ليد باللون الذي تفضله. مقاومة. سلكي توصيل نوع مقبس- مقبس. يجب توصيل مقاومة مع الرجل الموجبة الطويلة لمصباح الليد، وتوصيلها مع الرجل GP13 على لوحة بيكو. وتوصيل الرجل السالبة للمصباح مع أقرب رجل أرضية، كما هو موضح في المخطط التالي: أما لتوصيل عدة مصابيح ليد ذات اللون الواحد، ستحتاج إلى ما يلي: لوحة راسبيري باي بيكو. عدة مصابيح ليد باللون الذي تفضله. مقاومة لكل مصباح. سلكي توصيل نوع مقبس- مقبس لكل مصباح. يجب توصيل مقاومة مع الرجل الموجبة الطويلة لكل مصباح ليد؛ وتوصيل الرجل الموجبة للمصباح الأول مع الرجل GP13 على لوحة بيكو والسالبة مع أقرب رجل أرضية GND؛ وتوصيل الرجل الموجبة للمصباح الثاني مع الرجل GP8، والسالبة مع أقرب رجل أرضية GND؛ وتوصيل الرجل الموجبة للمصباح الثالث مع الرجل GP5، والسالبة مع أقرب رجل أرضية GND، كما هو موضح في المخطط التالي: إسناد مصابيح ليد إلى رجل معينة أو عدة أرجل على اللوحة استخدم الشيفرة التالية لإسناد مصباح وحيد إلى الرجل الموصول معها على لوحة بيكو: from picozero import LED led = LED(13) أما لإسناد عدة مصابيح ليد إلى أرجل لوحة بيكو: استورد تابع المصباح LED من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد المصابيح إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import LED led_1 = LED(13) led_2 = LED(8) led_2 = LED(5) ننصحك بتسمية المتغيرات بأسماء تدل على عملها، كأن تسمّي المصباح المسؤول عن تشغيل المصباح باللون المسؤول عنه، كما يلي: red_led = LED(13) green_led = LED(8) pink_led = LED(5) إضافة الشيفرة اللازمة لتشغيل مصباح ليد واحد أو عدة مصابيح إليك الدالة اللازمة لتشغيل المصباح: def excited(): # دالة تشغل اللون الموافق لمزاجك purple.on() # شغّل اللون البنفسجي أما الشيفرة اللازمة لتشغيل عدة مصابيح فهي على النحو التالي: def excited(): # شغّل اللون الموافق لشعورك بالحماس purple.on() # شغّل المصباح البنفسجي blue.off() # أطفئ المصباح الأزرق def worried(): # شغّل اللون الموافق لشعورك بالقلق purple.off() # أطفئ المصباح البنفسجي blue.on() # شغّل المصباح الأزرق توصيل مصابيح الليد متعددة الألوان ستحتاج لتوصيل مصباح ليد متعدد الألوان إلى ما يلي: لوحة راسبيري باي بيكو. مصباح ليد متعدد الألوان ذو مهبط مشترك. ثلاث مقاومات. أسلاك توصيل نوع مقبس- مقبس (عدد 8). يجب عليك توصيل مقاومة مع الأرجل الثلاثة الطويلة لمصباح الليد، أما الرجل الطويلة فهي رجل الأرضية ولا تحتاج إلى مقاومة. معلومة: لاحظ أنه لمصباح الليد متعدد الألوان أربعة أرجل، لذلك أمسك المصباح بحيث تكون الرجل الأرضية هي ثاني رجل من اليسار، وبحيث يصبح ترتيب الأرجل على النحو التالي: الرجل المسؤولة عن اللون الأحمرRed، ثم الرجل الأرضية GND، ثم الرجل المسؤولة عن اللون الأخضرGreen، فالأزرق Blue، وذلك ليسهُل عليك تذكر وظيفة كل رجل. صِل أرجل مصباح الليد وفقًا لما يلي: صِل الرجل المسؤولة عن اللون الأحمرR مع الرجل GP1 على لوحة بيكو. صِل الرجل الأرضية GND مع رجل الأرض GND على لوحة بيكو. صِل الرجل المسؤولة عن اللون الأخضرG مع الرجل GP2 على لوحة بيكو. صِل الرجل المسؤولة عن اللون الأزرق B مع الرجل GP3 على لوحة بيكو. لإسناد مصباح الليد متعدد الألوان إلى أرجل لوحة بيكو: استورد تابع المصباح متعدد الألوان RGBLED من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد المصباح إلى الأرجل الموصول معها على لوحة بيكو: from picozero import RGBLED rgb = RGBLED(red = 1, green = 2, blue = 3) استخدم الدالة اللازمة لتشغيل مصباح متعدد الألوان كما هو موضح في الشيفرة التالية: def happy(): # الشعور بالسعادة rgb.color = (0, 255, 0) # شغّل اللون الموافق لشعورك بالسعادة def sad(): # الشعور بالحزن rgb.color = (255, 0, 0) # شغّل اللون الموافق لشعورك بالحزن تمثيل الألوان بصيغة RGB: يمكننا تمثيل الألوان بصيغة يفهمها الحاسوب وذلك بالتعبير عن نسبة ما يحتويه اللون من اللون الأحمر والأخضر والأزرق، إذ تخزن هذه القيم في بايت (ثمانية بتات) وتكون قيمتها من 0 إلى 255. إليك جدولًا يوضح بعض القيم اللونية: اللون الأحمر الأخضر الأزرق أحمر 255 0 0 أخضر 0 255 0 أزرق 0 0 255 أصفر 255 255 0 أرجواني 255 0 255 سماوي 0 255 255 كما يمكنك الاستعانة بمنتقي الألوان من موقع w3schools للحصول على القيم الموافقة للون الذي تريده. توصيل مكبرات الصوت والأجراس الإلكترونية ستحتاج لتوصيل جرس إلكتروني واحد مع لوحة بيكو إلى سلكي توصيل نوع مقبس- مقبس. ابدأ بوصل الرجل الطويلة الموجبة للجرس مع الرجل GP5 على لوحة بيكو، وصِل الرجل السالبة مع أقرب رجل تأريض GND. لمعرفة الرجل الموجبة للجرس، ابحث عن الرجل الأطول، أو عن إشارة الموجب + أعلى الجرس. وتكون الشيفرة اللازمة لتوصيل جرس واحد على النحو التالي: from picozero import Speaker speaker = Speaker(5) أما لتوصيل جرسين إلكترونيين مع لوحة بيكو لخلق تأثير الصوت المجسم ستحتاج إلى أربعة أسلاك توصيل نوع مقبس- مقبس. أولًا، صِل الرجل الطويلة الموجبة للجرس الأول مع الرجل GP5 على لوحة بيكو، وصِل الرجل السالبة مع أقرب رجل تأريض GND، ثم صِل الرجل الموجبة للجرس الثاني مع الرجل GP10 على لوحة بيكو، والرجل السالبة مع أقرب رجل تأريض GND. وتكون الشيفرة اللازمة لتوصيل جرسين على النحو التالي: from picozero import Speaker speaker_1 = Speaker(5) speaker_2 = Speaker(10) ننصحك بتسمية المتغيرات Variables بأسماء تدل على وظيفتها، مثلًا عند إسناد صوت الطبل للمتغير Speaker_1 فسمّه drum_beat. ستحتاج لتوصيل السمّاعات مع لوحة بيكو إلى وصلة ذات نهاية بقطر 3 أو 5 مم (وليس وصلة USB)، وثلاثة مشابك تثبيت، وإلى اتباع الخطوات التالية: 1.صِل أحد المشابك مع أحد أرجل الأرض GND القريبة، وصِل المشبكين الآخرين مع الرجل GP5 والرجل GP10، كما هو موضح في الصورة أدناه. صِل نهاية المشبك الأول الموصول مع الرجل GP5، مع نهاية وصلة السمّاعات. صِل نهاية المشبك الثاني الموصول مع الرجل GP10،مع منتصف وصلة السمّاعات. صِل نهاية المشبك الموصول مع رجل الأرض GND مع جذر وصلة السمّاعات. معلومات مفيدة يجب معرفتها عن الصوت دعنا نطلع على بعض المعلومات المفيدة عن الأصوات قبل كتابة الشيفرة. النغمات المتاحة: تُوفر لنا مكتبة picozero ثمان وثمانين علامةً موسيقية، تتبع التدوين الغربي للموسيقا وتشمل جميع العلامات الموجودة في لوحة مفاتيح موسيقية كاملة الحجم. إليك بعض العلامات المُتاحة: b0 c1 c#1 d1 d#1 e1 f1 f#1 طول النغمة: توجد عدة طرق لتحديد طول النغمة: أولًا، تحديد طول نغمة واحدة باستخدام القيم، إذ يمكنك تحديد مدة النغمة الواحدة بإدخال قيمة في حقل الوسيط الثاني في دالة العزف: speaker.play(c_note, 0.1) # اعزف النغمة لمدة 0.1 ثانية ستُعزَف النغمة C في مثالنا لمدة 0.1 ثانية. ثانيًا، تحديد طول نغمة واحدة باستخدام الثوابت، إذ يمكنك تحديد مدة النغمة الواحدة بالتصريح عن أحد الثوابت في حقل الوسيط الثاني في دالة العزف بدلًا عن القيمة، وتعريف هذا الثابت كما يلي: BEAT = 1 # BEAT تعريف الثابت speaker.play(c_note, BEAT) # اعزف النغمة لمدة ثانية واحدة لاحظ أنه يمكننا استخدام الثابت BEAT لتحديد طول أي نغمة. ثالثًا، تحديد طول مجموعة من النغمات باستخدام القيم؛ فعند عزف لحن ما، يُفضل تخزين النغمات وطول كل منها في قائمة list، كما في مثالنا التالي، إذ خزّنا كل نغمة مع طولها في قائمة، وجمعنا النغمات الثلاث في قائمة: my_tune = [ ['d5', 1], ['d#5', 0.5], ['f5', 1.2]] # قائمة بالنغمات وطول كل منها احرص على كتابة النغمة ضمن علامتي اقتباس ' '. رابعًا، تحديد طول مجموعة من النغمات باستخدام الثوابت: ابدأ أولًا بتحديد طول النغمة الذي تريده باستخدام الثابت BEAT، اخترنا في مثالنا القيمة 0.4، ثم صرّح عن النغمات التي تود عزفها في قائمة ضمن علامتي ' ' واستخدم الثابت BEAT لتحديد طول النغمات: BEAT = 0.4 # طول النغمة الواحدة my_tune = [ ['d5', BEAT], ['d#5', BEAT / 2], ['f5', BEAT * 1.5]] # قائمة بالنغمات وطول كل منها يمكنك التحكم بعدد النغمات في الدقيقة BPM عن طريق تقسيم الثابت BEAT على عدد ما للحصول على نغمات أقصر، مثلًا 2 / BEAT، أو مضاعفته بضربه بعدد ما للحصول على نغمات أطول، مثلًا BEAT * 1.5 استخدام الأرقام عوضا عن النغمات: يمكنك الاستعاضة عن النغمات باستخدام قيم الترددات الموافقة لها، والتي تتراوح بين القيمة 150 إلى 10000، إليك المثال التالي لعزف نغمة ذات التردد 523 لثانية واحدة: speaker.play(523, 1) # اعزف النغمة ذات التردد 523 لثانية واحدة تحويل المقطوعات الموسيقية إلى نغمات: تُتيح لنا مكتبة "picozero" عزف المقطوعات الموسيقية الشهيرة واستخدامها في مشاريعنا، إذ تُستخدم الأحرف الإنجليزية للتعبير عن العلامات الموسيقية، وتستخدم الأرقام للتعبير عن موقع العلامة في السلم الموسيقي الكبير. على سبيل المثال، توجد العلامة C الوسطى في منتصف السلم الموسيقي ويعبر عنها بالرمز C4، وتزداد الأرقام المعبرة عن العلامة كلما صعدنا في السلم الكبير، وتنقص عند النزول. تحتوي المقطوعة الموسيقية علامات حادة يُعَبر عنها بالرمز # وتدعى "دييز". في مثالنا أدناه، توجد عدة علامات موسيقية حادة، أولها العلامة C الحادة والتي يرمز لها c#4. وقد تحتوي المقطوعة الموسيقية على علامات بسيطة يُشار إليها بالرمز ♭ وتدعى "بيمول"، لكن سنشير إليها في مشروعنا بالرمز # لعدم احتواء مكتبة picozero على شيفرة خاصة للتعبير عن العلامات البسيطة، وعلينا النزول نصف درجة في السلم الموسيقي للتحويل من علامة بسيطة إلى حادة. إليك الأمثلة التالية: تتحوّل العلامة البسيطة D إلى C حادة أو c#4. تتحوّل العلامة البسيطة E إلى D حادة أو d#4. تتحوّل العلامة البسيطة G إلى F حادة أو f#4. تتحوّل العلامة البسيطة A إلى G حادة أو g#4. أمثلة عن بعض الشيفرات الموسيقية الشيفرة اللازمة لعزف علامة موسيقية واحدة إليك مثالًا عن الشيفرة اللازمة لعزف العلامة C الوسطى لمدة نصف ثانية: def c_note(): speaker.play('c4', 0.5) # اعزف العلامة لمدة نصف ثانية الشيفرة اللازمة لعزف لحن موسيقي خزّن النغمات وطول كل منها في قائمة للحصول على لحن ما ، ثم شغّل اللحن باستخدام الدالة play: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5] ] def play_liten_mus(): speaker.play(liten_mus) الشيفرة اللازمة لتوليد تأثيرات صوتية مختلفة باستخدام الترددات يمكننا توليد تأثيرات صوتية ممتعة، أو مزعجة، وذلك بعزف نغمات قصيرة ذات ترددات مختلفة، إذ أنه كلما تغير التردد تختلف العلامة الموسيقية التي نسمعها وتختلف نغمتها. إليك الشيفرة التالية التي ترتفع فيها الترددات تدريجيًا لخلق صوت مبهج: def win(): # ترددات متزايدة for i in range(2000, 5000, 100): speaker.play(i, 0.05) # اعزف النغمة لمدة قصيرة جدًا أما المثال التالي فخفضنا فيه الترددات تدريجيًا لتوليد صوت زقزقة العصافير: def chirp(): # توليد صوت زقزقة العصافير for _ in range(2): # ترددات متناقصة for i in range(5000, 2999, -100): speaker.play(i, 0.02) # اعزف النغمة لمدة قصيرة جدًا sleep(0.2) غَيّر الترددات المستخدمة في حلقة التكرار for واستخدم الترددات ضمن المجال من 150 إلى 10000. الشيفرة اللازمة لتوليد ضجيج أبيض من صوت قرع الطبل إليك الشيفرة التالية: from picozero import Speaker from time import sleep from random import randint speaker = Speaker(5) for i in range(100): speaker.play(randint(500, 5000), duration=None) sleep(0.001) speaker.stop() sleep(0.5) الشيفرة اللازمة لعزف النغمات بصورة متكررة أنشئ قائمةً بالنغمات التي تريد عزفها وطول كل منها للحصول على لحن ما، ثم استخدم حلقة تكرار for لتشغيل اللحن نغمةً نغمة، أو علامةً علامة باستخدام الدالة play: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5] ] for note in liten_mus: speaker.play(note) الشيفرة اللازمة لعزف عدة نغمات متزامنة إذا أردت عزف لحن ما مثلًا، وتشغيل لحن أو تأثير صوتي آخر بالتزامن معه، فيمكنك ذلك بوضع wait=False في حقل الوسيط الثاني للدالة play . في مثالنا التالي، أنشأنا قائمةً بالنغمات التي نريد عزفها وطول كل منها، ثم عرّفنا اللحن الآخر المزعج، الذي سينطلق بالتزامن مع اللحن الأول عند الضغط على الزر، وسيتوقف معه عند إيقاف الشيفرة: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5] ] sound = [ [523, 0.1], [None, 0.1], [523, 0.4] ] def annoying_sound(): speaker2.play(sound, wait=False) # شغّل بالتزامن مع اللحن الأول button.when_pressed = annoying_sound try: speaker.play(liten_mus) finally: speaker.off() #أطفئ مكبر الصوت الأول عند إيقاف البرنامج speaker2.off() # أطفئ مكبر الصوت الثاني عند إيقاف البرنامج توصيل عناصر الدخل توصيل الأزرار مع لوحة بيكو ستحتاج لتوصيل زر واحد مع لوحة بيكو إلى ما يلي: لوحة راسبيري بيكو. زر إلكتروني. سلكي توصيل نوع مقبس-مقبس. صِل سلكي التوصيل مع أرجل الزر واستخدم الشريط اللاصق لتثبيتهما إن لزم الأمر، ثم صِل أحد السلكين مع الرجل GP18 والسلك الآخر مع أقرب رجل أرضية، لا يهمنا ترتيب توصيل الأسلاك إذ إنه لا توجد قطبية للزر. لتوصيل عدة أزرار إلكترونية مع لوحة بيكو ستحتاج إلى ما يلي: لوحة راسبيري بيكو. أزرار إلكترونية. سلكي توصيل نوع دبوس-مقبس لكل زر. توضح الصورة التالية طريقة توصيل ثلاثة أزرار مع لوحة بيكو، وإذا أردت توصيل زر رابع فما عليك سوى توصيله مع إحدى أرجل الأغراض العامة GP ورجل أرضية. استخدم سلكي توصيل نوع دبوس- مقبس لتوصيل الزر الأول مع الرجل GP18 ومع أقرب رجل أرضية GND، ثم صِل الزر الثاني مع الرجل GP22، والثالث مع الرجل GP28 بنفس الطريقة. استيراد تابع الزر Button من مكتبة picozero: إليك الشيفرة اللازمة لاستيراد تابع الزر Button من مكتبة picozero: from picozero import Button الشيفرة اللازمة لتوصيل زر إلكتروني واحد: لتوصيل زر إلكتروني علينا إسناده إلى الرجل الموصول معها على لوحة بيكو، كما يلي: from picozero import Button button = Button(18) الشيفرة اللازمة لتوصيل عدة أزرار إلكترونية: استورد تابع الزر Button من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد عدة أزرار إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import Button button_1 = Button(18) button_2 = Button(22) button_3 = Button(28) ننصحك بتسمية المتغيرات بأسماء تدل على عملها، كأن تسمّي الزر المسؤول عن تشغيل المصباح الأحمر red_button أو أي اسم آخر تراه مناسبًا. تشغيل نغمة معينة عند الضغط على كل زر: يمكنك إضافة عدة أزرار يستدعي كل منها دالة صوتية مختلفة عند الضغط عليها، وذلك باستدعاء الدالة الموافقة عند الضغط على الزر عن طريق ذكر اسمها بدون استخدام الأقواس. كما في المثال التالي: happy_button.when_pressed = happy sad_button.when_pressed = sad angry_button.when_pressed = angry تشغيل النغمة التالية عند الضغط على الزر: عرّف متغيرًا ما، وليكن option، لتخزين النغمة الحالية فيه واستدعاء الدالة التالية، واحرص على مطابقة أسماء الدوال في الشيفرة للدوال التي استخدمتها في الفقرة السابقة: option = 0 # خزّن النغمة الحالية في هذا المتغير def choice(): # استدعي الدالة الصوتية التالية وعدّل قيمة متغير التخزين global option if option == 0: energised() # دالة النغمة الأولى elif option == 1: calm() # دالة النغمة الثانية elif option == 2: focused() # دالة النغمة الثالثة elif option == 3: rgb.off() # انتقل إلى الخيار الثاني if option == 3: option = 0 else: option = option + 1 button.when_pressed = choice # استدعي الدالة التالية عند الضغط على الزر توصيل المبدل مع لوحة بيكو والشيفرة اللازمة لذلك توصيل مبدل يدوي الصنع أو زر مع لوحة بيكو: ستحتاج إلى سلكي توصيل نوع دبوس-مقبس. صِل أحدهما مع الرجل GP18 والسلك الآخر مع أقرب رجل أرضية، كما يلي: ثم يمكنك صنع مبدّل يدوي، كما تعلمنا في مشروع سابق، وتوصيلها مع اللوحة وذلك بتوصيل النهاية الحرة للأسلاك مع الجزء الناقل من المبدّل، مثل النحاس أو ورق القصدير. توصيل عدة قواطع يدوية أو أزرار مع لوحة بيكو: ستحتاج إلى سلكي توصيل نوع دبوس-مقبس لكل قاطعة تود توصيلها مع لوحة بيكو. استخدم سلكي توصيل نوع دبوس- مقبس لتوصيل المبدّل الأول مع الرجل GP18 ومع أقرب رجل أرضية GND، ثم صِل المبدّل الثاني مع الرجل GP22 ومع أقرب رجل أرضية، والثالث مع الرجل GP28 ورجل الأرضية بنفس الطريقة، كما هو موضح في المخطط التالي: لكتابة الشيفرة اللازمة لتوصيل المبدّل لا بُد من استيراد تابع المبدل Switch من مكتبة picozero كما هو موضح في الشيفرة التالية: from picozero import Switch استورد تابع المبدّل Switch من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد المبدّل إلى الرجل الموصولة معه على لوحة بيكو: from picozero import Switch switch = Switch(18) ولتوصيل عدة مبدّلات: استورد تابع المبدّل Switch من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد عدة مبدّلات إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import Switch switch_1 = Switch(18) switch_2 = Switch(22) switch_3 = Switch(28) ننصحك بتسمية المتغيرات بأسماء تدل على عملها، كأن تسمّي القاطعة المسؤولة عن تشغيل المصباح الأحمر red_switch أو أي اسم آخر تراه مناسبًا. توصيل المقاومات المتغيرة مع لوحة بيكو ستحتاج لتوصيل مقاومة متغيرة مع اللوحة إلى ما يلي: لوحة راسبيري بيكو. مقاومة متغيرة. أسلاك توصيل نوع مقبس-مقبس (عدد 3). توجد للمقاومة المتغيرة ثلاثة أرجل: رجل الأرضية GND، ورجل تشابهية Analogue، ورجل التغذية 3V3، وعند تدوير قرص المقاومة المتغيرة إلى أقصى اليسار سيشير السهم إلى الرجل الأرضية GND، وعند تدويره إلى أقصى اليمين سيشير السهم إلى رجل التغذية 3V3، أما الرجل الوسطى للمقاومة فهي الرجل التشابهية التي تستمد منها لوحة بيكو القيم لقراءتها. صِل سلك توصيل ذو نهايات مقبس-مقبس مع كل من أرجل المقاومة الثلاث، ثبت التوصيلات بالشريط اللاصق إن لزم الأمر. صِل النهاية الحرة للسلك الموصول مع رجل المقاومة ذات الرقم 1 مع رجل الأرض GND الموجودة بين الرجلين GP21 وGP22. صِل رجل المقاومة الوسطى مع الرجل GP26_A0 على لوحة بيكو. صِل رجل المقاومة ذات الرقم 3 مع رجل التغذية 3V3. استيراد تابع المقاومة المتغيرة Pot من مكتبة picozero: إليك الشيفرة اللازمة لاستيراد تابع المقاومة المتغيرة Pot من مكتبة picozero: from picozero import Pot وتكون الشيفرة اللازمة لتوصيل مقاومة متغيرة على النحو التالي: from picozero import Pot dial = Pot(0) # Connected to pin A0 (GP_26) عند استخدام مقاومة متغيرة للتحكم في الخرج، سنحتاج إلى تقسيم قيم المقاومة إلى أجزاء متساوية. كأن نستخدم التابع dial.value للحصول على قيم تتراوح بين 0 و 1، كما يمكننا ضرب القيمة ب 100 للحصول على نسبة مئوية؛ فإذا كان لديك خمس قيم يمكنك التحقق ما إذا كانت القيمة أقل من 20 أو 40 أو 60 أو 80 أو 100؛ أما إذا كان لديك ثلاث قيم يمكنك تقسيم القراءات للتحقق ما إذا كانت القيمة أقل من 33 أو 66 أو 100. إليك المثال التالي: while True: mood = dial.value * 100 # تحويل إلى نسبة مئوية print(mood) if mood < 20: happy() elif mood < 40: good() elif mood < 60: okay() elif mood < 80: unsure() else: unhappy() sleep(0.1) الآن، شغّل دارتك وتحقق أن جميع عناصر الدخل والخرج تعمل كما يجب، واستعن بفقرة تصحيح الأخطاء أدناه إذا واجهتك أي مشكلة. تصميم الهيكل الخارجي تثبيت العناصر داخل الورق المقوى أو البلاستيك بإمكانك تثبيت مصابيح الليد أو الأجراس أو المقاومات المتغيرة داخل قطع من الورق المقوى أو البلاستيك، وذلك بصنع ثقوب وإدخال العناصر وأسلاك التوصيل فيها، كما هو موضح: افصل الأسلاك عن العنصر، ثم أدخله في الثقب الذي أحدثته، ثم أعد توصيل الأسلاك. ستحتاج إلى استخدام أداة حادة لإحداث ثقب في المواد البلاستيكية. اطلب مساعدة أحد البالغين إذا لزم الأمر، واحرص على تذكر ما هي أرقام الأرجل الموصولة مع الأسلاك. استخدم الشريط اللاصق لتثبيت العناصر في مكانها. تبديد الضوء المنبعث من مصباح الليد نحصل عند تبديد ضوء مصباح الليد، أو نشره، على تأثير لطيف، وخاصة عند استخدام مصابيح الليد الشفافة، ذات اللون الواحد أو متعددة الألوان، وذلك بوضع المصباح خلف ورقة رقيقة أو شفافة، أو خلف شريط لاصق شفاف، مما سيجعل الضوء ينتشر على مساحة أوسع وبسطوع أقل، فيصبح أكثر راحةً للعين. كما يمكنك توجيه الضوء في اتجاه معين باستخدام ورقة بيضاء، وذلك لتحصل على أكبر قدر ممكن من الضوء. تثبيت أسلاك التوصيل باستخدام الشريط اللاصق يمكنك تثبيت أسلاك التوصيل باستخدام الشريط اللاصق، وإزالة الشريط اللاصق فيما بعد بكل سهولة لإعادة استخدام العناصر عند الحاجة. استخدام سكين الحرف تُعد سكاكين الحرف Crafts مفيدةً عند صنع الحرف اليدوية، لكن يجب أن تكون حذرًا جدًا عند استخدامها لأنها حادة جدًا ويمكن أن تسبب جروحًا وإصابات. احرص على وجود شخص بالغ عند استخدامك للسكاكين، أو اطلب منه استخدامها عوضًا عنك، كما ننصحك باستخدام لوح القص لحماية الأسطح، أو باستخدام لوح التقطيع الخشبي المتوفر في كل المطابخ. توصيل الأسلاك ببعضها قد تحتاج إلى أسلاك توصيل طويلة جدًا لتوصيل مصابيح الليد مع أرجل لوحة بيكو، أو يمكنك وصل الأسلاك ببعضها للحصول على سلك طويل، وذلك عبر توصيل سلك ذو نهايات دبوس-مقبس مع سلك ذو نهايات مقبس-مقبس للحصول على سلك مقبس-مقبس طويل جدًا، ويُطلق على هذه الطريقة اسم سلسلة الأقحوان daisy chaining. ننصحك باستخدام سلكين لهما اللون نفسه ليسهل تتبع السلك ومعرفة العنصر الموصول معه. تكمن مشكلة هذه الطريقة في أن الأسلاك قد تنفصل عن بعضها، ولذلك ينصح بلصقها بقطعة صغيرة من الشريط اللاصق. إنشاء مبدل فوري يعمل عند الإسقاط ستحتاج لإنشاء مبدّل فوري Drop switch ما يلي: لوحة راسبيري بيكو. سلكي توصيل نوع دبوس-مقبس. ورق قصدير. شريط لاصق. أولًا، أنشئ شريطين من ورق القصدير، أو من أي مادة ناقلة. ثانيًا، ثبت سلكي التوصيل مع شريطي القصدير باستخدام الشريط اللاصق، كما يلي: ثالثًا، الصق قطعةً من القصدير أسفل المجسم الذي ستضعه فوق شريط القصدير لإغلاق المبدّل. احرص على أن تكون قاعدة المجسم واسعةً بما يكفي لتوفير تماس بين سطحي القصدير. رابعًا، صِل النهايات الحرة للسلكين مع لوحة بيكو وأسقط المجسم لإغلاق المبدّل. إنشاء قاطعة يدوية تعمل عند السحب إليك ما سنحتاج إليه: مقص. ورق مقوى. رقائق القصدير. غراء وشريط لاصق. شرائط ملونة وورق ملون. قلم رصاص ومسطرة (اختياري). أولًا، قُصَّ الورق المقوى إلى ثلاثة مستطيلات متساوية الحجم. ثانيًا، قُصَّ مستطيلًا صغيرًا في منتصف المستطيل الأول، واحتفظ به لاستخدامه لاحقًا. ثالثًا، قُصَّ قطعًا من ورق القصدير بحجم المستطيلات الكبيرة، ثم الصقها عليها باستخدام الغراء، واحرص على عدم وضع الغراء على الوجه الخارجي لورق القصدير حتى لا تتأثر التوصيلات لاحقًا. رابعًا، قُصَّ أطراف المستطيل الصغير للحصول على شكل مدبب أو بشكل حرف V، ثم قلّم الأطراف بمقدار بضع ملميترات كي يتسع المستطيل الصغير في الفتحة. خامسًا، غلّف المستطيل الصغير بكامله بورق القصدير، واحرص على استخدام ورقة قصدير واحدة، إذ ستسمح هذه القطعة بمرور التيار عند إغلاق المبدّل. سادسًا، استخدم الشريط اللاصق لتثبيت على الوجه العلوي للمستطيلات. احرص على أن يكون الدبوس المعدني للسلك ملامسًا لورق القصدير، وأن يكون الجزء البلاستيكي الأسود ملامسًا لحافة المستطيل. سابعًا، أضف مزيدًا من الشريط اللاصق لتثبيت السلك ومنع انفكاكه عن طريق الخطأ. ثامنًا، ادهن بعض الغراء على المستطيل الذي فرّغنا منتصفه (الموجود في يسار الصورة) والصقه مع المستطيل المغطى بالقصدير (يمين الصورة)، واحرص على ألا تتلامس طبقتي القصدير الموجودة على حواف المستطيلات، قُصّها إذا لزم الأمر: أصبح المبدّل جاهزًا للاستخدام في مشروعك. تثبيت الأسلاك والعناصر باستخدام الشريط اللاصق يمكنك تثبيت العناصر مع أسلاك التوصيل، أو تثبيتها في مكانها باستخدام الشريط اللاصق، وإزالة الشريط اللاصق بكل سهولة لإعادة استخدام العناصر فيما بعد: أخيرًا، اختبر المشروع بعد انتهائك من تنفيذ التصميم الخارجي، واعرضه على أفراد العائلة أو الأصدقاء للحصول على ملاحظاتهم، وقرر هل تود إجراء أي تعديل؟ تصحيح الأخطاء قبل التعرف على المشاكل التي قد تواجهك عند تنفيذ المشروع وكيفية إصلاحها، عليك أولًا التحقق من سلامة لوحة بيكو: التحقق من سلامة لوحة بيكو باستخدام مصباح الليد استخدم مصباح الليد الموجود على لوحة بيكو للتحقق من سلامة اللوحة، وذلك بجعل المصباح يومض عند تشغيل الشيفرة بإضافة الشيفرة التالية في البداية: from picozero import pico_led from time import sleep pico_led.on() sleep(2) pico_led.off() تصحيح الأخطاء الموجودة في الشيفرة تحقق من وجود أي رسائل خطأ في نافذة صدفة Thonny وتحقق من محتواها، إن وجدت. راجع الشيفرة التي كتبتها وتحقق من خلوها من الأخطاء، مثل نسيان علامة : مثلًا، أو وجود مسافة بادئة دون الحاجة لها. تأكد من استيراد توابع العناصر التي ستستخدمها في مشروعك من مكتبة picozero مثل تابع مصباح الليد RGBLED أو الزر Button. استخدم تعليمة الطباعة print لإضافة شرح مختصر عند كل خطوة، مثل (البدء)print أو (ضبط المصباح على اللون الأخضر)print. لا تعمل بعض العناصر الإلكترونية كما يجب تأكد أن جميع العناصر متصلة ببعضها جيدًا، وتحقق من ثبات نقاط توصيل الأسلاك مع اللوحة ومع العناصر. تأكد أن أرقام الأرجل المستخدمة في الشيفرة مطابقة لأرقام الأرجل الموصولة مع مصباح الليد، وتأكد من إعادة وصل الأرجل في حال فصلتها عند العمل على تصميم شكل الآلة الموسيقية. تحقق من وصل العناصر وفق القطبية الصحيحة، إذ قد تحتوي بعض العناصر على قطب موجب + وآخر سالب -. في حال تحققت من جميع النقاط السابقة ولا زالت آلتك لا تعمل، فجرّب تبديل العناصر الإلكترونية بأخرى جديدة. لا يحدث شيء عند تشغيل الشيفرة تأكد أن جميع العناصر متصلة ببعضها جيدًا، وأنها موصولة مع الأرجل الصحيحة على اللوحة. تحقق من صدفة Thonny عند تشغيل الشيفرة؛ لربما نسيت نسيت تعريف بعض الدوال أو المتغيرات، أو قد تكون نسيت تعديل الشيفرة لتتناسب مع مشروعك. تحقق من صحة الشيفرة التي كتبتها، واستخدم تابع الطباعة print لإيضاح عمل الشيفرة. تحقق أنك استدعيت الدوال في الشيفرة. إليك مثالًا عن طريقة استدعاء الدالة، إذا عرفنا الدالة happy أولًا، ثم استدعيناها عن طريق التصريح عن اسمها (بدون وسطاء داخل الأقواس): def happy(): # الدالة الأولى rgb.color = (0, 255, 0) # اللون الموافق للدالة الأولى def sad(): # الدالة الثانية rgb.color = (255, 0, 0) # اللون الموافق للدالة الثانية happy() لا يضيء مصباح الليد عند استدعاء الدالة المسؤولة عن تشغيله تأكد من مطابقة الأرجل الموصول معها المصباح على لوحة بيكو للأرجل المسند إليها في الشيفرة. لا يضيء مصباح الليد باللون الصحيح تحقق من الشيفرة التي كتبتها وأن القيم اللونية مطابقة للون المستخدم، واستخدم منتقي الألوان التالي للتحقق من اللون المستخدم. لا تصدر النغمات أو أن صوتها مختلف عن الصوت المطلوب من غير المرجح أن تكون المشكلة في الشيفرة التي كتبتها، بما أنها كانت سليمةً قبل تنفيذ التصميم الخارجي للعبة، لذا عليك التحقق من التوصيلات والعناصر. تأكد من توصيل العناصر مع الأرجل الصحيحة، ستجدها في بداية الشيفرة. تأكد أن جميع العناصر موصولة مع بعضهًا جيدًا، واستخدم الشريط اللاصق لإحكام تثبيت العناصر. تأكد من عدم تغطية العناصر الناقلة في دارتك، مثل ورق القصدير بالغراء أو الشريط اللاصق. وذلك للمشاكل الآتية: يتأخر عزف النغمة عند الضغط على زر ما: عند استخدام أحد الأحداث events مثل حدث الضغط when_pressed لتشغيل دالة ما، فإن هذه الدالة ستُنفَذ حتى انتهائها وستمنع تشغيل أي شيء آخر في الشيفرة. sound = [ [523, 0.1], [None, 0.1], [523, 0.4] ] def annoying_sound(): speaker.play(sound, wait=False) # لا تؤخر تشغيل الشيفرة button.when_pressed = annoying_sound طول الأسلاك غير مناسب: إذا وجدت أن الأسلاك التي استخدمتها لا تفي بالغرض المطلوب بسبب قصر طولها، فما عليك إلا زيادة طولها، وفقًا لما تعلمناه في فقرة توصيل الأسلاك ببعضها. لا تثبُت الأسلاك والعناصر في مكانها: قد تكون بعض التوصيلات أمتن من غيرها، لذا ننصحك باستخدام الشريط اللاصق لإحكام تثبيت الأسلاك. حاول حل المشاكل الأخرى التي قد تواجهك عند التنفيذ وشاركنا طريقة الحل في منصة حسوب IO أو في أكاديمية حسوب. ترقية المشروع يمكنك ترقية مشروعك حين يتسنى لك ذلك، بإضافة مزيد من عناصر الدخل والخرج عليه، وتحسين تصميمه الخارجي، ولا تنسى اختباره مع الأصدقاء والعائلة لتحسين تجربة الاستخدام وفقًا لآرائهم، واطّلع على المشاريع التي أوردناها في مقدمة المقال لتستلهم منها بعض الأفكار. استخدمنا في النسخة الأصلية لمشروع الأضواء الليلية مصباح ليد متعدد الألوان وأحدثنا ثقوبًا صغيرةً في ورقة ليخرج منها الضوء ونحصل على تأثير مشابه لسماء مرصّعة بالنجوم، وأضفنا زرًا تشغيل وإطفاء المصباح. شاهد الفيديو ولاحظ كيف عملنا على ترقية المشروع بإضافة مصباح آخر متعدد الألوان لزيادة السطوع، ونشرنا الضوء على نطاق أوسع بوضع المصباح ضمن غلاف بلاستيكي شفاف، واستبدلنا الورق المقوى ذو الثقوب بمجسم ذي اثني عشر وجهًا، وحفرنا على كل وجه رمزًا لأحد الأبطال الخارقين في الرسوم المتحركة. الخاتمة تهانينا، فقد أتممت مشروع تصميم وتنفيذ لعبة حسية تفاعلية باستخدام لوحة راسبيري باي بيكو. إذا واجهت مشاكلًا عند تنفيذ هذا المشروع فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Sensory gadget من الموقع الرسمي لراسبيري باي. اقرأ أيضًا تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو صنع جهاز لعرض الحالة المزاجية باستخدام لوحة راسبيري باي بيكو صنع قلب نابض باستخدام لوحة راسبيري باي بيكو
  8. سنعمل في هذا المشروع على إنشاء آلة تصدر أصواتًا وموسيقى مختلفة باستخدام الأزرار buttons، والمبدّلات الإلكترونية switches، والمقاومات المتغيرة potentiometer. لنحصل على آلة مشابهة لما يلي: اصنع لوحة تصدر تأثيراتٍ صوتيةً مختلفةً عند الضغط عليها، وذلك باستخدام الورق المقوى ورقائق القصدير، ويمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع من ملف codes.zip. ستتعلم في هذا المشروع ما يلي: كيفية تصميم جهاز صوتي يعمل وفق غرضٍ معين. برمجة الجرس الإلكتروني buzzer لتشغيل تأثيرات صوتية وموسيقى. إنشاء واجهة تتيح للمستخدم التحكم بالأصوات. معلومة: تملك الأصوات تأثيرًا على حالتنا النفسية، فقد تكون مهدئةً، أو مزعجةً، أو منشِطة، فعلى سبيل المثال، يجد بعض الأطفال الرُضع لآلة الضجيج الأبيض Whitenoise تأثيرًا مهدئًا يساعدهم على الاسترخاء والنوم؛ بينما يستخدم منسقو الأغاني DJs أجهزةً محمولة لتوليد النغمات، ويستخدم محبو الدُعابة أجهزةً تصدر تأثيرات صوتية لإضحاك الناس. ماذا عنك؟ هل توجد آلة صوتية تستخدمها يوميًا؟ متطلبات المشروع عتاد: لوحة حاسوب راسبيري باي بيكو Raspberry Pi Pico مع أرجل مثبتة عليها. كبل USB لنقل البيانات ذو نهايات من النوع USB A و micro USB. مقاومات متغيرة potentiometer وأزرار buttons. جرس إلكتروني غير فعّال passive. أسلاك توصيل. بعض مستلزمات الأشغال اليدوية، مثل الورق المقوى، ورقائق القصدير، وشريط لاصق. مصباح ليد عادي أو متعدد الألوان RGB LED ذو مهبط مشترك common cathode، ومقاومات وأسلاك توصيل. (اختياري) جرس إلكتروني إضافي غير فعّال لخلق تأثير الصوت المجسم stereo. (اختياري) برمجيات برنامج ثوني Thonny: وهو البيئة البرمجية التي سنستخدمها لكتابة الشيفرة بلغة بايثون. تثبيت برنامج ثوني على نظام تشغيل راسبيري باي يأتي برنامج ثوني مثبتًا مع نظام تشغيل راسبيري باي، المعروف سابقًا براسبيان Raspbian، لكن قد تحتاج إلى تحديثه. انقر على الأيقونة في الزاوية العلوية اليسرى من الشاشة لفتح نافذة الطرفية Terminal، أو اضغط المفاتيح التالية معًا Ctrl+Alt+T. ثم اكتب الأمر التالي لتحديث نظام التشغيل وبرنامج ثوني: sudo apt update && sudo apt upgrade -y تثبيت برنامج ثوني على أنظمة التشغيل الأخرى يمكنك تثبيت ثوني على الحواسيب العاملة بنظام تشغيل لينكس، أو ويندوز، أو ماك، وذلك من الموقع الرسمي thonny.org انقر على رابط التنزيل الموافق لنظام تشغيل حاسوبك من الزاوية العلوية اليمنى في الموقع، ثم انقر على الملفات بعد تنزيلها، قد تظهر لك الرسالة التالية على نظام ويندوز: انقر على خيار المزيد من المعلومات "More info" ثم على التشغيل على أي حال "Run anyway". التعرف على واجهة برنامج ثوني ستظهر لك الواجهة التالية عند فتح ثوني: يمكنك الكتابة بلغة بايثون في النافذة الرئيسية الكبيرة، ثم النقر على زر التشغيل الأخضر Run للتنفيذ، ستظهر لك رسالة لحفظ الملف قبل تشغيله. اكتب الأمر التالي وشغّله: print('Hello World!') تغيير السمة والخط يمكنك التحكم بلون الخط وحجمه وتغيير السمة المُستخدمة في واجهة البرنامج، وذلك بالنقر على قائمة الأدوات Tools من الشريط أعلى الشاشة، ثم النقر على خيارات Options، ثم انقر بعدها على نافذة الخط والسمة Theme & Font واختر نوع الخط والسمة التي تفضلها من النافذة المنسدلة ثم انقر على زر موافق OK عند الانتهاء. ننصحك باختيار الخطوط البسيطة الواضحة والابتعاد عن الخطوط المزخرفة أو المشابهة لخط اليد لأنه قد تجعل القراءة أصعب. إعداد مكتبة picozero سنعمل في هذه الخطوة على إعداد مكتبة picozero وتوصيل لوحة راسبيري باي بيكو وإعداد برنامج مايكرو بايثون. أولًا، صِل الطرف الصغير لكبل USB إلى لوحة راسبيري باي والطرف الآخر إلى حاسوبك لتتمكن من برمجة اللوحة عن طريقه. ثانيًا، افتح محرر ثوني، ولاحظ ما هو الإصدار المستخدم من بايثون بقراءة النص الموجود في الزاوية السفلية اليمنى من الشاشة، انقر على النص واختر "MicroPython (Raspberry Pi Pico)‎"، إذا لم يكن هذا الخيار محددًا. سيطالبك ثوني بتثبيت برنامج MicroPython على حاسوب راسبيري باي بيكو إذا لم تستخدمه مسبقًا، فقط انقر على زر التثبيت Install. ثالثًا، أضف حزمة بيكو زيرو picozero من خلال النقر على قائمة الأدوات Tools من شريط القوائم في برنامج ثوني، ثم النقر على خيار إدارة الحزم Manage Packages. ثالثًا، اكتب "picozero"، ثم انقر على زر البحث Search on PyPi. رابعًا، انقر على picozero من نتائج البحث ثم انقر على زر التثبيت Install. استلهم أفكارك اطلع على المشاريع التالية واستلهم منها بعض الأفكار لصنع آلتك الموسيقية: لوحة العزف السحرية باستخدام مبدّل فوري أنشئ مبدّلًا فوريًا drop switch بلصق قطعة قصدير على مجسم شخصية ما وضعها فوق ورق القصدير ليبدأ العزف السحري. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع باسم drop_switch_player.py ضمن الملف المرفق codes.zip. آلة الإنذار شغّل الفيديو ولاحظ أنه عند سحب قطعة الورق المقوى، كما في مشروع مفرقعات الحفلات، ستتلامس قطعتا القصدير (الملصقتان على مشبك الملابس) وتغلق المبدّل، مما سيؤدي إلى تشغيل سلسلة من الأضواء والأصوات المزعجة. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع باسم soundalarm.py ضمن الملف المرفق الذكور سابقًا والمتاح بنهاية المقال. آلة موسيقية بسيطة شغّل الفيديو ولاحظ كيف تتحكم المقاومة المتغيرة بسرعة عزف النغمة من الجرس الأول، أما عند الضغط على الزر فتَصدُر عدة نغمات قصيرة من الجرس الثاني. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع باسم dj_desk.py ضمن الملف المرفق. تصميم الآلة الموسيقية فكِّر في الغرض من آلتك الموسيقية؟ وما هي الآلية التي سيتبعها المستخدم للتحكم بأصوات الآلة؟ أولًا، يجب عليك اختيار الآلة التي تود صنعها واختيار الغرض منها، ثم اختيار طريقة العزف، واختيار الجمهور المناسب لها، ويمكنك اختيار إحدى الاقتراحات التالية: صنع محاكاة لآلة موسيقية ما. صنع مشغل موسيقى. صنع آلة لتوليد التأثيرات الصوتية. *صنع آلةٍ تولّد أنغامًا مهدئةً، أو مزعجة. ثانيًا، عليك اختيار نوع الصوت الذي ستصدره الآلة، هل تريد: تشغيل نغمات موسيقية محددة، أو أغانٍ كاملة. تشغيل أصوات من الطبيعة، مثل صوت الرعد أو زقزقة العصافير. تشغيل الصوت حتى انتهائه، أم مقاطعة الصوت عند تشغيل صوت آخر. استخدام مقاومة متغيرة للتحكم بطبقة الصوت وسرعته. عدد العناصر التي يمكن توصيلها مع لوحة راسبيري باي بيكو تحتوي لوحة راسبيري باي بيكو على ثمانية أرجل أرضية GND، لذا يمكنك توصيل ثمانية عناصر فقط، وقد تستطيع توصيل أكثر من ثمانية عناصر إذا كان من الممكن أن يشترك بعضها برجل الأرض GND. عليك أخذ النقاط التالية في الحسبان عند التخطيط لآلتك: تُشَغّل مكبرات الصوت Speakers كل نغمة على حدى، لذلك ستحتاج لعدة مكبرات صوت لتشغيل عدة نغمات في نفس الوقت. توجد رجل تغذية واحدة ذات جهد 3 فولت على لوحة بيكو؛ أي يمكنك استخدام مقاومة متغيرة potentiometer واحدة، كما أنه يوجد حدٌّ لقيمة التيار الذي توفره لوحة بيكو. إليك بعض الاقتراحات لعناصر الدخل والخرج التي يمكنك استخدامها معًا: مقاومة متغيرة واحدة وجرس إلكتروني واحد. أربعة أزرار جاهزة وجرس إلكتروني واحد. ثمانية أزرار يدوية الصنع وجرس إلكتروني واحد. مقاومة متغيرة واحدة وجرسان، وزران. عدة أزرار وأجراس لعزف عدة نغمات في نفس الوقت. ثالثًا، قرر ما هو عدد الأزرار والأجراس التي تريد استخدامها عند تصميم آلتك؟ يمكن لآلتك أن تحتوي على: جرس إلكتروني واحد. جرسان لخلق تأثير الصوت المجسم، أو عزف النغمة وإيقاعها. سمّاعات، وستحتاج حينها إلى ثلاثة دبابيس تثبيت أو ما يُعرف بمشابك التمساح Alligator Clips لتوصيل السمّاعات. عدة أجراس إلكترونية. رابعًا، اختر ما هي العناصر التي تريد استخدامها؟ إليك بعض الاقتراحات: زر أو عدة أزرار. مقاومة متغيرة للتحكم بنغمة صوت الجرس وسرعة إيقاعه. أزرار أو مبدّلات يدوية الصنع. خامسًا، عليك اختيار الشكل الخارجي للآلة، وتحديد آلية توصيل عناصر الدخل والخرج معها. تساعدك الإجابة على الأسئلة التالية في اختيار التصميم الخارجي: هل تريد اعتماد تصميم مماثل لآلة موسيقية تقليدية، مثل البيانو مثلًا؟ صنع أزرار أو مبدّلات يدوية؟ وصنع هيكل خارجي للآلة؟ رسم مشهد ما واستخدام الأزرار لتوليد الأصوات. لا بأس إذا لم يكن لديك تصورٌ واضحٌ لتصميم الآلة في ذهنك، إذ يمكنك التعديل على تصميمك عند البدء بصنعه. إضافة الأصوات سنعمل في هذه الخطوة على توصيل الجرس الإلكتروني وكتابة الشيفرة اللازمة لإصدار الأصوات، ثم اختبارها، لذلك ننصحك بالبدء بتنفيذ الأساسيات أولًا، ثم العمل على ترقية المشروع حين يتسنى لك ذلك. توصيل الأجراس الإلكترونية والسماعات مع لوحة بيكو سنعرض فيما يلي كيفية توصيل الأجراس الإلكترونية والسماعات مع لوحة بيكو. توصيل جرس إلكتروني واحد مع لوحة بيكو ستحتاج إلى سلكي توصيل نوع مقبس- مقبس socket-socket. صِل الرجل الطويلة،الموجبة للجرس الإلكتروني غير الفعّال مع الرجل GP5 على لوحة بيكو، وصِل الرجل السالبة مع أقرب رجل تأريض GND. لمعرفة الرجل الموجبة للجرس، ابحث عن الرجل الأطول، أو عن إشارة الموجب + أعلى الجرس. توصيل جرسين لخلق تأثير الصوت المجسم stereo ستحتاج لتوصيل جرسين إلكترونيين غير فعّالين مع لوحة بيكو إلى أربعة أسلاك توصيل نوع مقبس- مقبس. أولًا، صِل الرجل الطويلة الموجبة للجرس الأول مع الرجل GP5 على لوحة بيكو، وصِل الرجل السالبة مع أقرب رجل تأريض GND، ثم صِل الرجل الموجبة للجرس الثاني مع الرجل GP10 على لوحة بيكو، والرجل السالبة مع أقرب رجل تأريض GND. توصيل السماعات مع لوحة بيكو ستحتاج لتوصيل السمّاعات مع لوحة بيكو إلى وصلة ذات نهاية بقطر 3 أو 5 مم (وليس وصلة USB)، وثلاثة مشابك تثبيت، وإلى اتباع الخطوات التالية: 1.صِل أحد المشابك مع أحد أرجل الأرض GND القريبة، وصِل المشبكين الآخرين مع الرجل GP5 والرجل GP10، كما هو موضح في الصورة أدناه. صِل نهاية المشبك الأول، الموصول مع الرجل GP5، مع نهاية وصلة السمّاعات. صِل نهاية المشبك الثاني، الموصول مع الرجل GP10،مع منتصف وصلة السمّاعات. صِل نهاية المشبك الموصول مع رجل الأرض GND مع جذر وصلة السمّاعات. استخدام رجل أرضية مشتركة تحتوي لوحة بيكو على ثمانية أرجل أرضية GND، لذلك لاستخدام ما يزيد عن ثمانية عناصر إلكترونية عليك إعادة استخدام إحدى الأرجل الأرضية، وستحتاج لما يلي: سلك توصيل دبوس- مقبس. رقائق قصدير، وشريط لاصق ناقل، أو أي مادة ناقلة للتيار الكهربائي. شريط لاصق. أولًا، أنشئ شريطًا من ورق القصدير، أو من أي مادة ناقلة. ثانيًا، استخدم الشريط اللاصق لتوصيل سلك أحد الأرجل الأرضية مع شريط القصدير كما يلي: ثالثًا،صِل القطب الموجب للعنصر الأول مع أحد الأرجل العامة GP على لوحة بيكو، والقطب السالب للعنصر مع شريط القصدير. رابعًا، لتوصيل المزيد من العناصر، صِل القطب الموجب للعنصر مع إحدى أرجل الأغراض العامة GP، والقطب السالب مع شريط القصدير. كتابة الشيفرة اللازمة لربط اللوحة مع الجرس استورد تابع المكبر الصوتي Speaker من مكتبة picozero، ثم أسند أرقام أرجل لوحة بيكو مع الجرس الوحيد للتابع Speaker: from picozero import Speaker speaker = Speaker(5) وتكون الشيفرة اللازمة لتوصيل جرسين على النحو التالي: from picozero import Speaker speaker_1 = Speaker(5) speaker_2 = Speaker(10) ننصحك بتسمية المتغيرات Variables بأسماء تدل على وظيفتها، مثلًا عند إسناد صوت الطبل للمتغير Speaker_1 فسمّه drum_beat. كتابة الشيفرة اللازمة لإصدار الصوت عرّف دالة الصوت بكتابة def قبل اسم الدالة، ثم اختر اسمًا مناسبًا ومعبرًا عن الصوت الذي ستصدره آلتك، فعلى سبيل المثال، إذا أردت أن تصدر آلتك صوتًا مزعجًا، فسمِّ دالة الصوت annoying_sound. def sound_1(): # استبدل الدالة باسم دالتك معلومة: موسيقا Chiptune الرُقاقة أو ما يُعرف بموسيقا الثمانية بتات، هي موسيقا صُنعية تُوَّلد بواسطة برمجة الرقائق المسؤولة عن إصدار الصوت في الحواسيب لتصدر أصواتًا ذات ترددات معينة، استعاضةً عن استخدام الآلات الموسيقية التقليدية. تجد هذا النوع من الموسيقا في ألعاب الفيديو ذات طراز الريترو Retro، وفي صالات الألعاب. على الرغم من تطور التقنيات المستخدمة في صناعة وبرمجة الموسيقا، إلا أن العديد من الأشخاص يستمتعون بإنشاء هذا النوع من الموسيقا والاستماع إليه بسبب طرازه القديم، كما يمكنك عزف أي مقطوعة موسيقية باستخدام هذه التقنية. معلومات مفيدة يجب معرفتها دعنا نطلع على بعض المعلومات المفيدة عن الأصوات قبل كتابة الشيفرة: النغمات المتاحة تُوفر لنا مكتبة "picozero" ثمان وثمانين علامةً موسيقية، تتبع التدوين الغربي للموسيقا وتشمل جميع العلامات الموجودة في لوحة مفاتيح موسيقية كاملة الحجم. إليك بعض العلامات المُتاحة: b0 c1 c#1 d1 d#1 e1 f1 f#1 طول النغمة توجد عدة طرق لتحديد طول النغمة، هي: أولًا، تحديد طول نغمة واحدة باستخدام القيم، إذ يمكنك تحديد مدة النغمة الواحدة بإدخال قيمة في حقل الوسيط الثاني في دالة العزف: speaker.play(c_note, 0.1) # اعزف النغمة لمدة 0.1 ثانية ستُعزَف النغمة C في مثالنا لمدة 0.1 ثانية. ثانيًا، تحديد طول نغمة واحدة باستخدام الثوابت، إذ يمكنك التصريح عن أحد الثوابت في حقل الوسيط الثاني في دالة العزف بدلًا عن القيمة، وتعريف هذا الثابت، وذلك كما يلي: BEAT = 1 # BEAT تعريف الثابت speaker.play(c_note, BEAT) # اعزف النغمة لمدة ثانية واحدة لاحظ أنه يمكننا استخدام الثابت BEAT لتحديد طول أي نغمة. ثالثًا، تحديد طول مجموعة من النغمات باستخدام القيم، فعند عزف لحن ما، يُفضل تخزين النغمات وطول كل منها في قائمة list، كما في مثالنا التالي، إذ خزّنا كل نغمة مع طولها في قائمة، وجمعنا النغمات الثلاث في قائمة: my_tune = [ ['d5', 1], ['d#5', 0.5], ['f5', 1.2]] # قائمة بالنغمات وطول كل منها احرص على كتابة النغمة ضمن علامتي اقتباس ' '. رابعًا، تحديد طول مجموعة من النغمات باستخدام الثوابت، بحيث نبدأ باستخدام الثابت BEAT، إذ اخترنا في مثالنا القيمة 0.4، ثم نصرّح عن النغمات التي نود عزفها في قائمة ضمن علامتي ' '، ونستخدم الثابت BEAT لتحديد طول النغمات: BEAT = 0.4 # طول النغمة الواحدة my_tune = [ ['d5', BEAT], ['d#5', BEAT / 2], ['f5', BEAT * 1.5]] # قائمة بالنغمات وطول كل منها للتحكم بعدد النغمات في الدقيقة BPM يمكنك تقسيم الثابت BEAT على عدد ما للحصول على نغمات أقصر، مثلًا 2 / BEAT، أو مضاعفته بضربه بعدد ما للحصول على نغمات أطول، مثلا BEAT*1.5. استخدام الأرقام عوضا عن النغمات يمكنك الاستعاضة عن النغمات باستخدام قيم الترددات الموافقة لها، والتي تتراوح بين القيمة 150 إلى 10000، إليك المثال التالي لعزف نغمة ذات التردد 523 لثانية واحدة: speaker.play(523, 1) # اعزف النغمة ذات التردد 523 لثانية واحدة تحويل المقطوعات الموسيقية إلى نغمات تُتيح لنا مكتبة picozero عزف المقطوعات الموسيقية الشهيرة واستخدامها في مشاريعنا، إذ تستخدم الأحرف الإنجليزية للدلالة على العلامات الموسيقية، والأرقام للدلالة على موقع العلامة في السلم الموسيقي الكبير. على سبيل المثال، توجد العلامة C الوسطى في منتصف السلم الموسيقي ويعبر عنها بالرمز C4. تزداد الأرقام التي تدل على العلامة كلما صعدنا في السلم الكبير، وتنقص عند النزول. تحتوي المقطوعة الموسيقية علامات حادة يُشار إليها بالرمز # وتدعى "دييز". في مثالنا أدناه، توجد عدة علامات موسيقية حادة، أولها العلامة C الحادة والتي يرمز لها c#4. وقد تحتوي المقطوعة الموسيقية على علامات بسيطة يُشار إليها بالرمز ♭ وتدعى "بيمول"، لكن سنشير إليها في مشروعنا بالرمز # لعدم احتواء مكتبة "picozero" على شيفرة خاصة للدلالة على العلامات البسيطة، وعلينا النزول نصف درجة في السلم الموسيقي للتحويل من علامة بسيطة إلى حادة. إليك الأمثلة التالية: تتحوّل العلامة البسيطة D إلى C حادة أو c#4. تتحوّل العلامة البسيطة E إلى D حادة أو d#4. تتحوّل العلامة البسيطة G إلى F حادة أو f#4. تتحوّل العلامة البسيطة A إلى G حادة أو g#4. أمثلة عن بعض الشيفرات الموسيقية إليك مثالًا عن الشيفرة اللازمة لعزف علامة موسيقية واحدة ولتكن العلامة C الوسطى مثلًا لمدة نصف ثانية: def c_note(): speaker.play('c4', 0.5) # اعزف العلامة لمدة نصف ثانية أما لعزف لحن موسيقي، لا بُد من تخزين النغمات وطول كل منها في قائمة للحصول على لحن ما، ثم تشغيل اللحن باستخدام دالة play، كما هو مبين في الشيفرة التالية: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5] ] def play_liten_mus(): speaker.play(liten_mus) الشيفرة اللازمة لتوليد تأثيرات صوتية مختلفة باستخدام الترددات يمكننا توليد تأثيرات صوتية ممتعة، أو مزعجة، وذلك بعزف نغمات قصيرة ذات ترددات مختلفة، إذ أنه كلما تغير التردد تختلف العلامة الموسيقية التي نسمعها وتختلف نغمتها. إليك الشيفرة التالية التي ترتفع فيها الترددات تدريجيًا لخلق صوت مبهج: def win(): # ترددات متزايدة for i in range(2000, 5000, 100): speaker.play(i, 0.05) # اعزف النغمة لمدة قصيرة جدًا أما المثال التالي، فقد خفضنا فيه الترددات تدريجيًا لتوليد صوت زقزقة العصافير: def chirp(): # توليد صوت زقزقة العصافير for _ in range(2): # decreasing frequency for i in range(5000, 2999, -100): speaker.play(i, 0.02) # اعزف النغمة لمدة قصيرة جدًا sleep(0.2) غَيّر الترددات المستخدمة في حلقة التكرار for واستخدم الترددات ضمن المجال من 150 إلى 10000. الشيفرة اللازمة لتوليد ضجيج أبيض من صوت قرع الطبل from picozero import Speaker from time import sleep from random import randint speaker = Speaker(5) for i in range(100): speaker.play(randint(500, 5000), duration=None) sleep(0.001) speaker.stop() sleep(0.5) الشيفرة اللازمة لعزف النغمات بصورة متكررة أنشئ قائمةً بالنغمات التي تريد عزفها وطول كل منها للحصول على لحن ما، ثم استخدم حلقة تكرار for لتشغيل اللحن نغمةً نغمة باستخدام الدالة play: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5] ] for note in liten_mus: speaker.play(note) الشيفرة اللازمة لعزف عدة نغمات متزامنة إذا أردت عزف لحن ما مثلًا، وتشغيل لحن أو تأثير صوتي آخر بالتزامن معه، فيمكنك ذلك بوضع wait=False في حقل الوسيط الثاني للدالة play. أنشأنا في مثالنا التالي قائمةً بالنغمات التي نريد عزفها وطول كل منها، ثم عرّفنا اللحن الآخر، المزعج، الذي سينطلق بالتزامن مع اللحن الأول عند الضغط على الزر، وسيتوقف معه عند إيقاف الشيفرة: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5] ] sound = [ [523, 0.1], [None, 0.1], [523, 0.4] ] def annoying_sound(): speaker2.play(sound, wait=False) # شغّل بالتزامن مع اللحن الأول button.when_pressed = annoying_sound try: speaker.play(liten_mus) finally: speaker.off() #أطفئ مكبر الصوت الأول عند إيقاف البرنامج speaker2.off() # أطفئ مكبر الصوت الثاني عند إيقاف البرنامج الشيفرة اللازمة لاستدعاء دالة ما لاستدعاء دالة ما عليك تعريفها أولًا، ثم التصريح عنها بكتابة اسمها. إليك المثال التالي الذي استدعينا فيه الدالة chirp: def chirp(): # توليد صوت زقزقة العصافير for _ in range(2): for i in range(5000, 2999, -100): speaker.play(i, 0.02) sleep(0.2) chirp() مرحلة التنفيذ أولًا، اكتب الشيفرة اللازمة لتشغيل آلتك الموسيقية، واحرص على عدم ترك مسافة قبل اسم الدالة عند استدعائها. ثانيًا، شغّل الشيفرة للتحقق من عمل آلتك وإصدارها للأصوات، إذ قد يستمر صوت الجرس حتى بعد إيقاف الشفرة، لذلك عليك استعمال try و finally كي يتوقف صوت عند إيقاف الشفرة، كما في المثال التالي: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5] ] try: for note in liten_mus: speaker.play(note) finally: speaker.off() # أطفئ مكبر الصوت عند إيقاف البرنامج تصحيح الأخطاء قبل التعرف على المشاكل التي قد تواجهك في هذه الخطوة وكيفية إصلاحها، عليك أولًا التحقق من سلامة لوحة بيكو، لذلك استخدم مصباح الليد الموجود على لوحة بيكو للتحقق من سلامة اللوحة، وذلك بجعل المصباح يومض عند تشغيل الشيفرة بإضافة الشيفرة التالية في ملف main.py: from picozero import pico_led from time import sleep pico_led.on() sleep(2) pico_led.off() تصحيح الأخطاء الموجودة في الشيفرة تحقق من وجود أي رسائل خطأ في نافذة صدفة shell ثوني وتحقق من محتواها، إن وجدت. راجع الشيفرة التي كتبتها وتحقق من خلوها من الأخطاء، مثل نسيان علامة :، أو وجود مسافة بادئة دون الحاجة لها. تأكد من استيراد توابع العناصر التي ستستخدمها في مشروعك من مكتبة "picozero"، مثل تابع مصباح الليد RGBLED أو الزر Button. استخدم تعليمة الطباعة print لإضافة شرح مختصر عند كل خطوة، مثل (البدء)print أو (ضبط المصباح على اللون الأخضر)print. لا تعمل بعض العناصر الإلكترونية كما يجب تأكد أن جميع العناصر متصلة ببعضها جيدًا، وتحقق من ثبات نقاط توصيل الأسلاك مع اللوحة ومع العناصر. تأكد أن أرقام الأرجل المستخدمة في الشيفرة مطابقة لأرقام الأرجل الموصولة مع مصباح الليد، وتأكد من إعادة وصل الأرجل، في حال فصلتها عند العمل على تصميم شكل الآلة الموسيقية. تحقق من وصل العناصر وفق القطبية الصحيحة، إذ قد تحتوي بعض العناصر على قطب موجب + وآخر سالب -. في حال تحققت من جميع النقاط السابقة ولازالت آلتك لاتعمل، فجرب تبديل العناصر الإلكترونية بأخرى جديدة. صوت النغمة مختلف عن الصوت المطلوب تحقق من خلو الشيفرة التي كتبتها من الأخطاء وأنها مطابقة للشيفرة في مثالنا. عَدّل على النغمات ومدتها للحصول على الصوت المطلوب. يتأخر عزف النغمة عند الضغط على زر ما عند استخدام أحد الأحداث events مثل حدث الضغط when_pressed لتشغيل دالة ما، فإن هذه الدالة ستُنفَذ حتى انتهائها وستمنع تشغيل أي شيء آخر في الشيفرة. إذا أردت عزف لحن ما مثلًا من حدث ما، وتشغيل لحن أو تأثير صوتي آخر بالتزامن معه، فيمكنك ذلك بوضع wait=False في حقل الوسيط الثاني للدالة play: sound = [ [523, 0.1], [None, 0.1], [523, 0.4] ] def annoying_sound(): speaker.play(sound, wait=False) # لا تؤخر تشغيل الشيفرة button.when_pressed = annoying_sound حاول حل المشاكل الأخرى التي قد تواجهك عند التنفيذ وشاركنا طريقة الحل في منصة حسوب IO. احرص على اتباع ما يلي عند كتابة الشيفرات اللازمة لإصدار النغمات الموسيقية، وعند اختبارها: تعريف الدالة. كتابة الشيفرة الصحيحة. استدعاء الدالة. اختبار الدالة. عند اختبار الشيفرة، ننصحك بإضافة رمز التعليق # قبل الدالة التي لا تريد تشغيلها، أو حذف استدعاء الدالة لتتمكن من سماع النغمة التي تريد اختبارها. التحكم بالأصوات سنعمل في هذه الخطوة على إنشاء وسيلة للمستخدم للتحكم في الأصوات باستخدام عناصر دخل مختلفة، وكتابة الشيفرة اللازمة لذلك. حدد أولًا ما هي عناصر الدخل التي تود استخدامها. إليك الاقتراحات التالية: استخدام زر خاص بكل نغمة، أو لحن أو تأثير. استخدام زر لتشغيل الصوت التالي. استخدام سلكين نوع دبوس-مقبس وتوصيلهما إما مع مبدّل إلكتروني أو زر. استخدام مقاومة متغيرة للتحكم بسرعة إيقاع النغمات. ستحتاج استخدام سلكي توصيل نوع مقبس-مقبس لكل زر، وثلاثة أسلاك نوع مقبس-مقبس للمقاومة المتغيرة. توصيل عناصر الدخل مع لوحة بيكو سنشرح في الآتي كيفية توصل عناصر الدخل مع لوحة بيكو توصيل زر إلكتروني واحد مع اللوحة لتوصيل زر مع لوحة بيكو ستحتاج إلى ما يلي: لوحة راسبيري بيكو. زر إلكتروني. سلكي توصيل نوع مقبس-مقبس. صِل سلكي التوصيل مع أرجل الزر واستخدم الشريط اللاصق لتثبيتهما إن لزم الأمر، ثم صِل أحد السلكين مع الرجل GP18 والسلك الآخر مع أقرب رجل أرضية. لا يهمنا ترتيب توصيل الأسلاك إذ لا توجد قطبية للزر. توصيل عدة أزرار مع اللوحة ستحتاج لتوصيل عدة أزرار مع لوحة بيكو إلى ما يلي: لوحة راسبيري بيكو. أزرار إلكترونية. سلكي توصيل نوع دبوس-مقبس لكل زر. توضح الصورة التالية طريقة توصيل ثلاثة أزرار مع لوحة بيكو، وإذا أردت توصيل زر رابع فما عليك سوى توصيله مع إحدى أرجل الأغراض العامة GP ورجل أرضية. استخدم سلكي توصيل نوع دبوس- مقبس لتوصيل الزر الأول مع الرجل GP18 ومع أقرب رجل أرضية GND. ثم صِل الزر الثاني مع الرجل GP22، والثالث مع الرجل GP28 بنفس الطريقة. توصيل مقاومة متغيرة مع اللوحة ستحتاج إلى ما يلي: لوحة راسبيري بيكو. مقاومة متغيرة. أسلاك توصيل نوع مقبس-مقبس (عدد 3). يوجد للمقاومة المتغيرة ثلاثة أرجل: رجل الأرضية GND، ورجل تشابهية Analogue، ورجل التغذية 3V3؛ وعند تدوير قرص المقاومة المتغيرة إلى أقصى اليسار سيشير السهم إلى الرجل الأرضية GND؛ وعند تدويره إلى أقصى اليمين سيشير السهم إلى رجل التغذية 3V3؛ أما الرجل الوسطى للمقاومة فهي الرجل التشابهية التي تستمد منها لوحة بيكو القيم لقراءتها . صِل سلك توصيل ذو نهايات مقبس-مقبس مع كلٍ من أرجل المقاومة الثلاث، وثبّت التوصيلات بالشريط اللاصق إن لزم الأمر. صِل النهاية الحرة للسلك الموصول مع رجل المقاومة ذات الرقم 1 مع رجل الأرض GND الموجودة بين الرجلين GP21 و GP22. صِل رجل المقاومة الوسطى مع الرجل GP26_A0 على لوحة بيكو. صِل رجل المقاومة ذات الرقم 3 مع رجل التغذية 3V3. توصيل مبدل يدوي أو زر مع لوحة بيكو ستحتاج إلى سلكي توصيل نوع دبوس-مقبس، وصِل أحدهما مع الرجل GP18 والسلك الآخر مع أقرب رجل أرضية، كما يلي: يمكنك أيضًا صنع قاطعة يدوية، كما تعلمنا في مشروع سابق، وتوصيلها مع اللوحة وذلك بتوصيل النهاية الحرة للأسلاك مع الجزء الناقل من المبدّل مثل النحاس أو ورق القصدير. توصيل عدة مبدلات يدوية أو أزرار مع لوحة بيكو ستحتاج إلى سلكي توصيل نوع دبوس-مقبس لكل مبدّل تود توصيله مع لوحة بيكو. استخدم سلكي توصيل نوع دبوس- مقبس لتوصيل المبدّل الأول مع الرجل GP18 ومع أقرب رجل أرضية GND، ثم صِل المبدّل الثاني مع الرجل GP22 ومع أقرب رجل أرضية، والثالث مع الرجل GP28 ورجل الأرضية بنفس الطريقة، كما هو موضح في المخطط التالي: إسناد عناصر الدخل إلى أرجل معينة على اللوحة علينا الآن إنشاء متغيرات لإسناد عناصر الدخل للأرجل الموصولة معها: حالة زر واحد استورد تابع الزر Button من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد الزر إلى الرجل الموصول معها على لوحة بيكو: from picozero import Button button = Button(18) حالة عدة أزرار استورد تابع الزر Button من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد عدة أزرار إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import Button button_1 = Button(18) button_2 = Button(22) button_3 = Button(28) ننصحك بتسمية المتغيرات بأسماء تدل على عملها، كأن تسمّي الزر المسؤول عن تشغيل المصباح الأحمر red_button أو أي اسم آخر تراه مناسبًا. حالة مبدل واحد استورد تابع المبدّل Switch من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد المبدّل إلى الرجل الموصولة معه على لوحة بيكو: from picozero import Switch switch = Switch(18) حالة عدة مبدلات استورد تابع المبدّل Switch من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد عدة مبدّلات إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import Switch switch_1 = Switch(18) switch_2 = Switch(22) switch_3 = Switch(28) ننصحك بتسمية المتغيرات بأسماء تدل على عملها، كأن تسمّي القاطعة المسؤولة عن تشغيل المصباح الأحمر red_switch أو أي اسم آخر تراه مناسبًا. حالة مقاومة متغيرة استورد تابع المقاومة المتغيرة Pot من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد المقاومة المتغيرة إلى الرجل الموصولة معها على لوحة بيكو: from picozero import Pot dial = Pot(0) # Connected to pin A0 (GP_26) الشيفرة اللازمة لتشغيل عناصر الدخل الآن، عليك استدعاء الدوال اللازمة لتشغيل عناصر الدخل: تشغيل نغمة معينة عند الضغط على كل زر يمكنك إضافة عدة أزرار يستدعي كل منها دالة صوتية مختلفة عند الضغط عليها، وذلك باستدعاء الدالة الموافقة عند الضغط على الزر عن طريق ذكر اسمها بدون استخدام الأقواس، كما في المثال التالي: annoying_button.when_pressed = annoying_sound calming_button.when_pressed = calming_sound happy_button.when_pressed = happy_sound تأكد من مطابقة أسماء الدوال في الشيفرة للدوال التي استخدمتها في مشروعك. تشغيل النغمة التالية عند الضغط على الزر عرّف متغيرًا ما، وليكن option، لتخزين النغمة الحالية فيه واستدعاء الدالة التالية، واحرص على مطابقة أسماء الدوال في الشيفرة للدوال التي استخدمتها في الفقرة السابقة: option = 0 # خزّن النغمة الحالية في هذا المتغير def choice(): # استدعي الدالة الصوتية التالية وعدّل قيمة متغير التخزين global option if option == 0: annoying_sound() # دالة النغمة الأولى elif option == 1: calming_sound() # دالة النغمة الثانية elif option == 2: happy_sound() # دالة النغمة الثالثة elif option == 3: rgb.off() # انتقل إلى الخيار الثاني if option == 3: option = 0 else: option = option + 1 button.when_pressed = choice # نستدعي الدالة التالية عند الضغط على الزر التحكم في سرعة عزف النغمة باستخدام المقاومة المتغيرة استخدم الشيفرة التالية للتحكم في سرعة عزف النغمة: BEAT = 0.4 liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT], ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT], ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT], ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT], ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2], ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5]] for note in liten_mus: speaker.play(note) sleep(dial.value) # ترك مدة قصيرة بين النغمات اعتمادًا على قيمة المقاومة المتغيرة أخيرًا، شغّل الشيفرة وتحقق من عملها، وتأكد أنه بإمكانك التبديل بين النغمات عند النقر على الأزرار أو المبدّلات، وتغيير سرعة عزف النغمة باستخدام المقاومة المتغيرة. تصحيح الأخطاء قبل التعرف على المشاكل التي قد تواجهك في هذه الخطوة وكيفية إصلاحها، عليك أولًا التحقق من سلامة لوحة بيكو، لذلك استخدم مصباح الليد الموجود على لوحة بيكو للتحقق من سلامة اللوحة، وذلك بجعل المصباح يومض عند تشغيل الشيفرة بإضافة الشيفرة التالية في ملف main.py: from picozero import pico_led from time import sleep pico_led.on() sleep(2) pico_led.off() تصحيح الأخطاء الموجودة في الشيفرة تحقق من وجود أي رسائل خطأ في نافذة صدفة ثوني وتحقق من محتواها، إن وجدت. راجع الشيفرة التي كتبتها وتحقق من خلوها من الأخطاء، مثل نسيان علامة :، أو وجود مسافة بادئة دون الحاجة لها. تأكد من استيراد توابع العناصر التي ستستخدمها في مشروعك من مكتبة "picozero"، مثل تابع مصباح الليد RGBLED أو الزر Button. استخدم تعليمة الطباعة print لإضافة شرح مختصر عند كل خطوة، مثل (البدء)print أو (ضبط المصباح على اللون الأخضر)print. لا تعمل بعض العناصر الإلكترونية كما يجب تأكد أن جميع العناصر متصلة ببعضها جيدًا، وتحقق من ثبات نقاط توصيل الأسلاك مع اللوحة ومع العناصر. تأكد أن أرقام الأرجل المستخدمة في الشيفرة مطابقة لأرقام الأرجل الموصولة مع مصباح الليد، وتأكد من إعادة وصل الأرجل، في حال فصلتها عند العمل على تصميم شكل الآلة الموسيقية. تحقق من وصل العناصر وفق القطبية الصحيحة، إذ قد تحتوي بعض العناصر على قطب موجب + وآخر سالب -. في حال تحققت من جميع النقاط السابقة ولازالت آلتك لاتعمل، فجرب تبديل العناصر الإلكترونية بأخرى جديدة. إعداد الهيكل الخارجي للآلة سنعمل الآن على إعداد الهيكل الخارجي لآلتنا الموسيقية. أولًا، إليك بعض الأسئلة لتساعدك في اعتماد التصميم الخارجي لآلتك: ما هي المواد التي تود استخدامها؟ هل جميعها متوفرة لديك؟ هل تود استخدام أزرار أو مبدّلات يدوية؟ ما هو غرض عملها؟ كيف ستثبت العناصر بحيث تكون متينة وسهلة الاستخدام؟ معلومة: يختص مهندسو الصوت Acoustic engineers بدراسة علم الصوت وتوفير أفضل تجربة للحضور والمستمعين. الآن، مهندسنا الصغير، حان دورك لتصميم آلتك الموسيقية بحيث تصدر أصواتًا عالية الجودة وتوفر تجربة ممتعة. ثانيًا، جهّز المواد التي ستستخدمها لتنفيذ تصميمك. إليك بعض الاقتراحات: الورق المقوى. المواد البلاستيكية المعاد تدويرها. ألعاب قديمة أو قطع الليغو Lego. شريط لاصق. كما يمكنك استخدام الطابعة ثلاثية الأبعاد إن توفر لك ذلك. اطلب مساعدة أحد البالغين عند الحاجة لاستخدام المقص، أو مسدس السيليكون، أو سكين الحرف؛ واحرص على حفظ ملف الشيفرة، وتصغير نافذة ثوني عند البدء بتنفيذ التصميم؛ تجنبًا للنقر على لوحة المفاتيح والتعديل على الشيفرة دون قصد. ثالثًا، ابدأ بصنع المبدّلات اليدوية والأزرار التي تود استخدامها، إذ ستحتاج إلى استخدام مادة ناقلة مثل ورق القصدير لتكون بمثابة نقطة الأرض GND وتوصيل الأرجل ذات الأغراض العامة GP معها، إذ يمكن للوحة بيكو التحسس لحالة الأرجل فيما إذا كان متصلة أم لا. إنشاء مبدل فوري يعمل عند الإسقاط ستحتاج لإنشاء مبدّل فوري Drop switch إلى ما يلي: لوحة راسبيري بيكو. سلكي توصيل نوع دبوس-مقبس. ورق قصدير. شريط لاصق. أولًا، أنشئ شريطين من ورق القصدير، أو من أي مادة ناقلة. ثانيًا، ثبّت سلكي التوصيل مع شريطي القصدير باستخدام الشريط اللاصق، كما يلي: ثالثًا، ألصق قطعةً من القصدير أسفل المجسم الذي ستضعه فوق شريط القصدير لإغلاق المبدّل، واحرص على أن تكون قاعدة المجسم واسعةً بما يكفي لتوفير تماس بين السلكين. رابعًا، صِل النهايات الحرة للسلكين مع لوحة بيكو وأسقط المجسم لإغلاق المبدّل. إنشاء مبدل يدوي يعمل عند السحب إليك ما سنحتاج إليه: مقص. ورق مقوى. رقائق القصدير. غراء وشريط لاصق. شرائط ملونة وورق ملون. قلم رصاص ومسطرة (اختياري). أولًا، قُصَّ الورق المقوى إلى ثلاثة مستطيلات متساوية الحجم. ثانيًا، قُصَّ مستطيلًا صغيرًا في منتصف المستطيل الأول، واحتفظ به لاستخدامه لاحقًا. ثالثًا، قُصَّ قطعًا من ورق القصدير بحجم المستطيلات الكبيرة، ثم الصقها عليها باستخدام الغراء، واحرص على عدم وضع الغراء على الوجه الخارجي لورق القصدير حتى لا تتأثر التوصيلات لاحقًا. رابعًا، قُصَّ أطراف المستطيل الصغير للحصول على شكل مدبب أو بشكل حرف V، ثم قلّم الأطراف بمقدار بضع ملميترات كي يتسع المستطيل الصغير في الفتحة. خامسًا، غلّف كامل المستطيل الصغير بورق القصدير، واحرص على استخدام ورقة قصدير واحدة، إذ ستسمح هذه القطعة بمرور التيار عند إغلاق المبدّل. سادسًا، استخدم الشريط اللاصق لتثبيت نهايات الدبابيس على الوجه العلوي للمستطيلات، واحرص على أن يكون الدبوس المعدني للسلك ملامسًا لورق القصدير، وأن يكون الجزء البلاستيكي الأسود ملامسًا لحافة المستطيل. سابعًا، أضف مزيدًا من الشريط اللاصق لتثبيت السلك ومنع انفكاكه عن طريق الخطأ. ثامنًا، ادهن بعض الغراء على المستطيل الذي فرّغنا منتصفه (الموجود في يسار الصورة) والصقه مع المستطيل المغطى بالقصدير (يمين الصورة). واحرص على ألا تتلامس طبقتي القصدير الموجودتين على حواف المستطيلات، وقُصّها إن لزم الأمر. أصبح المبدّل جاهزًا للاستخدام في مشروعك. استخدام سكين الحرف تُعد سكاكين الحرف Crafts مفيدةً عند صنع الحرف اليدوية، لكن يجب أن تكون حذرًا جدًا عند استخدامها لأنها حادةً جدًا ويمكن أن تسبب جروحًا وإصابات. احرص على وجود شخص بالغ عند استخدامك للسكاكين، أو اطلب منه استخدامها عوضًا عنك، كما ننصحك باستخدام لوح القص لحماية الأسطح، أو باستخدام لوح التقطيع الخشبي المتوفر في كل المطابخ. ننصحك بتدوين أرقام الأرجل التي استخدمتها والعناصر الموصولة معها، إذ سيساعدك ذلك في إعادة توصيل العناصر بعد فصلها. ستجد الأرجل المستخدمة في بداية الشيفرة. أخيرًا، جمّع قطع آلتك الموسيقية معًا، وإذا احتوت آلتك على غطاء، فأجّل تركيبه حتى تتأكد من إضافة جميع العناصر اللازمة. واستخدم الشريط اللاصق لإحكام تثبيت الأسلاك. توصيل الأسلاك ببعضها قد تحتاج إلى أسلاك توصيل طويلة جدًا لتوصيل مصابيح الليد مع أرجل لوحة بيكو، أو يمكنك وصل الأسلاك ببعضها للحصول على سلك طويل، وذلك عبر توصيل سلك ذو نهايات دبوس-مقبس مع سلك ذو نهايات مقبس-مقبس للحصول على سلك مقبس-مقبس طويل جدًا، وتدعى هذه الطريقة بسلسلة الأقحوان daisy chaining. ننصحك باستخدام سلكين لهما اللون نفسه ليسهل تتبع السلك ومعرفة العنصر الموصول معه. تكمن مشكلة هذه الطريقة في أن الأسلاك قد تنفصل عن بعضها، ولذلك ينصح بلصقها بقطعة صغيرة من الشريط اللاصق. تثبيت العناصر داخل الورق المقوى أو البلاستيك يمكنك تثبيت مصابيح الليد أو الأجراس أو المقاومات المتغيرة داخل قطع من الورق المقوى أو البلاستيك، وذلك بصنع ثقوب وإدخال العناصر وأسلاك التوصيل فيها، كما هو موضح: افصل الأسلاك عن العنصر، ثم أدخله في الثقب الذي أحدثته، ثم أعد توصيل الأسلاك. ستحتاج إلى استخدام أداة حادة لإحداث ثقب في المواد البلاستيكية. اطلب مساعدة أحد البالغين إن لزم الأمر، واحرص على تذكر ما هي أرقام الأرجل الموصولة مع الأسلاك. استخدم الشريط اللاصق لتثبيت العناصر في مكانها. كما يمكنك تثبيت العناصر مع أسلاك التوصيل، أو تثبيتها في مكانها باستخدام الشريط اللاصق، وإزالة الشريط اللاصق بكل سهولة لإعادة استخدام العناصر فيما بعد. خامسًا، الآن بعد أن انتهيت من تنفيذ الهيكل الخارجي، عليك تشغيل الآلة والتحقق أنها تعمل كما ينبغي. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: طول الأسلاك غير مناسب إذا وجدت أن الأسلاك التي استخدمتها لا تفي بالغرض المطلوب بسبب قصر طولها، فما عليك إلا زيادة طولها، وفقًا لما تعلمناه في فقرة توصيل الأسلاك ببعضها. لا تثبُت الأسلاك والعناصر في مكانها قد تكون بعض التوصيلات أمتن من غيرها، لذا ننصحك باستخدام الشريط اللاصق لإحكام تثبيت الأسلاك. ترقية المشروع يمكنك ترقية مشروعك حين يتسنى لك ذلك. فكّر في المناسبات التي يمكنك استخدام آلتك الموسيقية فيها؟ مثل إنشاء مقاطع موسيقية لفيديو ما، أو عزف لحن هادئ عندما تحتاج إلى الاسترخاء، أو إزعاج أصدقائك بنغمة حادة ذات إيقاع سريع. إليك بعض الاقتراحات: اختبر أداء الآلة أمام جمهورك، ثم حدّد النقاط التي عليك تحسينها. أضف مزيدًا من الأزرار وعناصر التحكم مثل المقاومات المتغيرة والمبدّلات. أضف مزيدًا من البريق على آلتك باستخدام مصابيح الليد. أضف مزيدًا من التحسينات على الهيكل الخارجي لآلتك. إليك المشروع التالي إذ تتغير النغمة ولون مصباح الليد وفقًا للأزرار، كما يمكنك الاطلاع على المشاريع التي زودناك بها في مقدمة المقال لتستلهم منها بعض الأفكار، أو الاطلاع على معرض مشاريع الآلات الموسيقية. الخاتمة تهانينا، فقد أتممت مشروع تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو. ننصحك بتنفيذ مشروع تصميم وتنفيذ لعبة حسية تفاعلية باستخدام لوحة راسبيري باي بيكو ومقاومة متغيرة في خطوتك التالية. إذا واجهت مشاكلًا عند تنفيذ هذا المشروع، فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Sound machine من الموقع الرسمي لراسبيري باي. الملف المرفق للمشروع: codes.zip. اقرأ أيضًا صنع جهاز لعرض الحالة المزاجية باستخدام لوحة راسبيري باي بيكو صنع قلب نابض باستخدام لوحة راسبيري باي بيكو تصميم محاكاة لمفرقعات الحفلات باستخدام لوحة راسبيري باي بيكو
  9. ستتعلم في هذا المقال كيفية تصميم وإنشاء جهاز للتعبير عن مشاعرك باستخدام مصابيح الليد، بحيث تحصل على نتيجة مشابهة لما يلي: تمعن في الصورة المتحركة أعلاه وحاول معرفة كيف يعمل هذا المصباح التفاعلي، لاحظ كيف تُستَخدم الإضاءة المختلفة للتعبير عن المشاعر، وكيف يغير المستخدم لون الإضاءة. كما يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع من code.zip. معلومة: يُعد الاهتمام بالمزاج والأحاسيس إحدى وسائل العناية بالصحة؛ إذ من الطبيعي الشعور بالحزن أو السعادة، أو الحماس. أعطِ كل شعور حقه، ودوّن مشاعرك وأخبر الآخرين حولك إذا احتجت ذلك، وهذا ما يُعرف بعملية التحقق من الحالة المزاجية Mood check-in. ستتعلم في هذا المشروع ما يلي: كيفية التعبير عن المشاعر باستخدام الأضواء. استخدام عناصر دخل إلكترونية لتمكين المستخدمين من التعبير عن مشاعرهم. كتابة الشيفرة اللازمة للتحكم بإضاءة مصابيح الليد وخلق تأثيرات مختلفة. متطلبات المشروع عتاد لوحة حاسوب راسبيري باي بيكو Raspberry Pi Pico مع أرجل مثبتة عليها. كبل USB لنقل البيانات ذو نهايات من النوع USB A و micro USB. مقاومات متغيرة potentiometer وأزرار buttons. مصباح ليد متعدد الألوان RGB LED ذو مهبط مشترك Common cathode أو مصباح ليد وحيد اللون. أسلاك توصيل ومقاومات عادية resistors. بعض مستلزمات الأشغال اليدوية، مثل الورق المقوى، ورقائق القصدير، وشريط لاصق. برمجيات برنامج ثوني Thonny: وهو البيئة البرمجية التي سنستخدمها لكتابة الشيفرة بلغة بايثون. تثبيت برنامج ثوني على نظام تشغيل راسبيري باي يأتي برنامج ثوني مثبتًا مع نظام تشغيل راسبيري باي، المعروف سابقًا براسبيان Raspbian، لكن قد تحتاج إلى تحديثه. انقر على الأيقونة في الزاوية العلوية اليسرى من الشاشة لفتح نافذة الطرفية Terminal، أو اضغط المفاتيح التالية معًا Ctrl+Alt+T. ثم اكتب الأمر التالي لتحديث نظام التشغيل وبرنامج ثوني: sudo apt update && sudo apt upgrade -y تثبيت برنامج ثوني على أنظمة التشغيل الأخرى يمكنك تثبيت ثوني على الحواسيب العاملة بنظام تشغيل لينكس، أو ويندوز، أو ماك، وذلك من الموقع الرسمي thonny.org. انقر على رابط التنزيل الموافق لنظام تشغيل حاسوبك من الزاوية العلوية اليمنى في الموقع، ثم انقر على الملفات بعد تنزيلها، وقد تظهر لك الرسالة التالية على نظام ويندوز: انقر على خيار المزيد من المعلومات "More info" ثم على التشغيل على أي حال "Run anyway". التعرف على واجهة برنامج ثوني ستظهر لك الواجهة التالية عند فتح ثوني: يمكنك الكتابة بلغة بايثون في النافذة الرئيسية الكبيرة، ثم النقر على زر التشغيل الأخضر Run للتنفيذ، ستظهر لك رسالة لحفظ الملف قبل تشغيله. اكتب الأمر التالي وشغّله: print('Hello World!') تغيير السمة والخط يمكنك التحكم بلون الخط وحجمه وتغيير السمة المُستخدمة في واجهة البرنامج، وذلك بالنقر على قائمة الأدوات Tools من الشريط أعلى الشاشة، ثم النقر على خيارات Options. انقر بعدها على نافذة الخط والسمة Theme & Font واختر نوع الخط والسمة التي تفضلها من النافذة المنسدلة ثم انقر على زر موافق OK عند الانتهاء. ننصحك باختيار الخطوط البسيطة الواضحة والابتعاد عن الخطوط المزخرفة أو المشابهة لخط اليد لأنه قد تجعل القراءة أصعب. إعداد مكتبة picozero سنعمل في هذه الخطوة على إعداد مكتبة picozero وتوصيل لوحة راسبيري باي بيكو وإعداد برنامج مايكرو بايثون. أولًا، صِل الطرف الصغير لكبل USB إلى لوحة راسبيري باي والطرف الآخر إلى حاسوبك لتتمكن من برمجة اللوحة عن طريقه. ثانيًا، افتح محرر ثوني، ولاحظ ما هو الإصدار المستخدم من بايثون بقراءة النص الموجود في الزاوية السفلية اليمنى من الشاشة، انقر على النص واختر "MicroPython (Raspberry Pi Pico)‎"، إذا لم يكن هذا الخيار محددًا. سيطالبك ثوني بتثبيت برنامج MicroPython على حاسوب راسبيري باي بيكو إذا لم تستخدمه مسبقًا، فقط انقر على زر التثبيت Install. ثالثًا، أضف حزمة بيكو زيرو picozero من خلال النقر على قائمة الأدوات Tools من شريط القوائم في برنامج ثوني، ثم النقر على خيار إدارة الحزم Manage Packages. ثالثًا، اكتب "picozero"، ثم انقر على زر البحث Search on PyPi. رابعًا، انقر على picozero من نتائج البحث ثم انقر على زر التثبيت Install. استلهم أفكارك اطلع على المشاريع التالية واستلهم منها بعض الأفكار: مشروع البطاقات التعبيرية لاحظ كيف غلفنا بطاقات ذات أحجام مختلفة بورق القصدير وكتبنا الحالة المزاجية عليها، وعند وضع البطاقات داخل الصندوق تُغلَق الدارة ويضيء المصباح باللون الموافق للبطاقة. لدينا ثلاث بطاقات، واحدة للتعبير عن الشعور بالسعادة، والثانية عن الحزن، والثالثة عن الغضب. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع باسم drop_switch.py ضمن الملف المرفق code.zip. مشروع أيقونة الحالة المزاجية استخدمنا مقاومةً متغيرةً مع مصباح ليد متعدد الألوان كي يتمكن المستخدم من التعبير عن مزاجه بواسطة إدارة ذراع المقاومة لتغير لون المصباح إلى اللون الموافق لشعوره. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع باسم mood_dial.py ضمن الملف المرفق code.zip. مشروع مؤشر التركيز استُخدمت ثلاثة مصابيح ليد عادية للتعبير عن ثلاث رموز يمكن استخدامها في القاعة الدراسية، إذ يعني الرمز الأول "يرجى التزام الهدوء وعدم الإزعاج"، أما الرمز الثاني فيعبر عن الحاجة للمساعدة، والرمز الأخير يعني أن المستخدم لا يحتاج إلى مساعدة. يمكنك الاطلاع على الشيفرة اللازمة لتنفيذ هذا المشروع باسم focus_indicator.py من هنا ضمن الملف المرفق code.zip. تصميم الجهاز عليك الآن التفكير في كيفية التعبير عن المشاعر المختلفة باستخدام أداتك أو جهازك؟ والآلية التي سيختار بها المستخدم الشعور المناسب. أولًا، فكر مليًّا في الغرض من الأداة التي ستصنعها، ولمن تريد توجيهها؟ هل تريد استخدامها للتواصل مع البالغين، أو الأصدقاء؟ هل تريد استخدامها لمساعدة الأشخاص الذين يجدون صعوبةً في التواصل؟ أم تفضل استخدامها لتراقب تغيرات مزاجك وتدونها؟ ثانيًا، قرر ما الذي تود التعبير عنه باستخدام أداتك. هل تود التعبير عما تشعر به، مثل السعادة، أو الحزن، أو الغضب؟ أم تود ضبط الجو العام لمكان ما؛ أي جو هادئ أو نشط؟ أم تريد استخدام أداتك في قاعة دراسية لطلب المساعدة، أو عدم الإزعاج؟ كما يمكنك استخدام أداتك عند البدء في أمر جديد للتعبير عن شعورك بالقلق، أو الحماس، أو التشتت. ثالثًا، فكر كيف تود التعبير عن المشاعر المختلفة باستخدام أنماط مختلفة من الأضواء والألوان. ما هي الألوان التي ستستخدمها؟ يُستخدم اللون الأحمر عادةً للتعبير عن الحب أو الغضب، أما اللون الأزرق فيستخدم للتعبير عن الحزن أو الشعور بالراحة. إليك لمحةً عن دلالات بعض الألوان حول العالم: يرمز اللون الأحمر في الثقافة الصينية للحظ والبهجة والسعادة. يعبر اللون الأصفر والبرتقالي والأحمر في معظم الثقافات عن السعادة. كما تعبر الألوان الساطعة عن الحماس. يستخدم اللون الأزرق والأخضر للتعبير عن السكينة والاسترخاء، لكن يُعد ارتداء اللون الأخضر على خشبة المسرح أمرًا جالبًا للحظ السيء. الآن دون ملاحظاتك على ورقة ما، أو ارسم التصميم الذي تود اعتماده في جهازك، كي تتشكل لديك خطةً لاتباعها عند العمل. رابعًا، قرر ما هو نوع المصابيح التي تود استخدامها. هل تود استخدام مصابيح ليد عادية (ذات لون واحد)؟ أم تفضل استخدام المصابيح متعددة الألوان؟ تحتوي لوحة بيكو على ثمانية أرجل أرضية GND، لذلك يمكنك توصيل ثمانية عناصر إلكترونية فقط مع لوحة بيكو، كما تحتوي اللوحة على رجل تغذية واحدة ذات جهد 3 فولت؛ أي يمكنك استخدام مقاومة متغيرة potentiometer واحدة، ويوجد حدٌّ لقيمة التيار الذي توفره لوحة بيكو، ولذلك ننصحك باستخدام مصباحي ليد متعددي الألوان، أو ستة مصابيح ليد عادية ذات لون واحد. إليك بعض الاقتراحات لعناصر الدخل والخرج التي يمكنك استخدامها معًا: ثلاثة أزرار وثلاثة مصابيح ليد وحيدة اللون. مقاومة متغيرة واحدة ومصباح ليد متعدد الألوان ذو مهبط مشترك. زر واحد ومصباح ليد متعدد الألوان ذو مهبط مشترك. أربعة أزرار ومصباح ليد متعدد الألوان ذو مهبط مشترك. خامسًا، قرر ما هي العناصر الإلكترونية التي تود استخدامها، إذ يمكنك استخدام الأزرار الجاهزة، أو المقاومات المتغيرة، أو الأزرار والمبدًلات يدوية الصنع. سادسًا، فكر مليًّا في التصميم الخارجي لأداتك، كيف ستوصل العناصر الإلكترونية معها؟ بإمكانك تثبيت العناصر داخل لعبة أو مجسم ما، أو جعل أداتك قابلة للارتداء، مثل سوار مثلًا؛ كما يمكنك أن تستوحي بعض الأفكار من المشاريع الموجودة في مقدمة مقالنا. لا بأس إن لم يكن لديك الآن تصوُّر واضح لأداتك، إذ يمكنك التعديل على التصميم أثناء العمل. إضافة الشيفرة اللازمة للتحكم بالإضاءة سنعمل في هذه الخطوة على توصيل مصابيح الليد مع لوحة بيكو وإضافة الشيفرة اللازمة للتحكم في إضاءتها، واختبار عملها. ننصحك بتنفيذ المشروع خطوةً خطوة، بدءًا من الأساسيات، ثم العودة وترقية المشروع حين يتسنى لك ذلك. معلومة: عند تنفيذ مشروع ما يُنصح بإنشاء نموذج أولي Prototyping، أي صنع نسخة مبسطة عن المشروع النهائي لتختبر عمله، وتتأكد أنه يقدم الحلول التي صُنع من أجلها. سنعمل الآن على إنشاء نموذج أولي لمشروعنا لاختبار التوصيلات والشيفرة، واكتشاف الأمور التي علينا تحسينها قبل البدء بتنفيذ التصميم النهائي للجهاز وتوصيل العناصر. أولًا، صِل مصابيح الليد مع لوحة بيكو بإتباع الإرشادات التالية: توصيل عدة مصابيح ليد ذات اللون الواحد ستحتاج لتوصيل عدة مصابيح ليد ذات اللون الواحد إلى ما يلي: لوحة راسبيري باي بيكو. عدة مصابيح ليد باللون الذي تفضله. مقاومة لكل مصباح. سلكي توصيل نوع مقبس- مقبس لكل مصباح. يجب توصيل مقاومة مع الرجل الموجبة الطويلة لكل مصباح ليد، كما هو موضح في المخطط التالي؛ إذ تُوصل الرجل الموجبة للمصباح الأول مع الرجل GP13 على لوحة بيكو والسالبة مع أقرب رجل أرضية GND؛ وتُوصل الرجل الموجبة للمصباح الثاني مع الرجل GP8، والسالبة مع أقرب رجل أرضية GND، وتُويل الرجل الموجبة للمصباح الثالث مع الرجل GP5، والسالبة مع أقرب رجل أرضية GND. توصيل مصباح ليد متعدد الألوان مع لوحة بيكو ستحتاج لتوصيل مصباح ليد متعدد الألوان إلى ما يلي: لوحة راسبيري باي بيكو. مصباح ليد متعدد الألوان ذو مهبط مشترك. ثلاث مقاومات. أسلاك توصيل نوع مقبس- مقبس (عدد 8). يجب عليك توصيل مقاومة مع الأرجل الثلاثة الطويلة لمصباح الليد، أما الرجل الطويلة فهي رجل الأرضية ولا تحتاج إلى مقاومة. معلومة: لاحظ أنه لمصباح الليد متعدد الألوان أربعة أرجل، لذلك أمسك المصباح بحيث تكون الرجل الأرضية هي ثاني رجل من اليسار، بحيث يصبح ترتيب الأرجل على النحو التالي: الرجل المسؤولة عن اللون الأحمرRed، ثم الرجل الأرضية GND، ثم الرجل المسؤولة عن اللون الأخضرGreen، فالأزرق Blue، وذلك ليسهُل عليك تذكر وظيفة كل رجل. صِل أرجل مصباح الليد وفقًا لما يلي: الرجل المسؤولة عن اللون الأحمر R مع الرجل GP1 على لوحة بيكو. الرجل الأرضية GND مع رجل الأرض GND على لوحة بيكو. الرجل المسؤولة عن اللون الأخضرG مع الرجل GP2 على لوحة بيكو. الرجل المسؤولة عن اللون الأزرق B مع الرجل GP3 على لوحة بيكو. ثانيًا، استورد تابع مصباح الليد العادي LED، أو متعدد الألوان RGBLED من مكتبة picozero، ثم استخدم الشيفرة اللازمة لإسناد المصباح إلى الأرجل الموصول معها على لوحة بيكو. استخدم الشيفرة التالية لإسناد مصابيح الليد العادية إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import LED led_1 = LED(13) led_2 = LED(8) led_2 = LED(5) ننصحك بتسمية المتغيرات بأسماء تدل على عملها، كأن تسمّي المصباح المسؤول عن تشغيل المصباح باللون المسؤول عنه، كما يلي: red_led = LED(13) green_led = LED(8) pink_led = LED(5) استخدم الشيفرة التالية لإسناد مصباح الليد متعدد الألوان إلى أرجل لوحة بيكو بعد استيراد تابع المصباح متعدد الألوان RGBLED من مكتبة picozero: from picozero import RGBLED rgb = RGBLED(red = 1, green = 2, blue = 3) ثالثًا، أضف التأثير الضوئي الذي تفضله على المصابيح، وذلك باختيار إحدى الدوال التالية وإضافتها على الشيفرة: تُستخدم الشيفرة التالية لتشغيل وإطفاء عدة مصابيح ليد عادية: def excited(): # شغّل اللون الموافق لشعورك بالحماس purple.on() # شغّل المصباح البنفسجي blue.off() # أطفئ المصباح الأزرق def worried(): # شغّل اللون الموافق لشعورك بالقلق purple.off() # أطفئ المصباح البنفسجي blue.on() # شغّل المصباح الأزرق استخدم الدوال الثلاث التالية: blink و pulse و cycle لإضفاء مزيج من التأثيرات الضوئية على مشروعك، إذ يمكنك التبديل بين التأثيرات عند الضغط على زر وحيد. يمكنك إضفاء تأثير الوميض أو النبض على مصباح ليد عادي باستخدام دالة الوميض blink أو النبض pulse لتشغيل وإطفاء المصباح بصورةٍ متكررة، كما هو مبين في الشيفرة التالية: def available(): # شغّل الدالة الموافقة للشعور الأول red.off() # أطفئ المصباح الأحمر green.blink() def do_not_disturb(): # شغّل الدالة الموافقة للشعور الأول green.off() # أطفئ المصباح الأخضر red.pulse() امزج بين عدة ألوان واستخدم الدالتين السابقتين للحصول على التأثير الذي تريده في مشروعك. يمكنك كذلك استخدام دالة الوميض blink أو النبض pulse أو التكرار cycle لتشغيل وإطفاء مصباح ليد متعدد الألوان بصورةٍ متكررة، كما هو مبين في الشيفرة التالية: def energise(): rgb.blink() # شغّل المصباح الأحمر لثانية واحدة، والأخضر لثانية، والأزرق لثانية def neutral(): rgb.pulse(fade_times=3) # تفعيل تأثير النبض البطيء def relax(): rgb.cycle(fade_times=4) يمكنك الاستعانة بالشيفرة التالية لجعل مصباح الليد متعدد الألوان يضيء وفق لون معين: def happy(): #شغّل اللون الموافق لشعورك بالسعادة rgb.color = (0, 255, 0) # شغّل اللون الأخضر def sad(): # شغّل اللون الموافق لشعورك بالحزن rgb.color = (255, 0, 0) # شغّل اللون الأحمر ننصحك بإضافة تعليقات ضمن الشيفرة وكتابة اللون الموافق بجانب كل قيمة لونية ليسهُل عليك تذكر الألوان التي استخدمتها عند مراجعة الشيفرة. رابعًا، عليك التعديل على الشيفرة واستدعاء الدالة التي استخدمتها، وذلك بكتابة اسمها في سطر منفصل، بعد التعريف عنها، ثم اختبر الشيفرة. إليك المثال التالي، الذي استدعينا فيه الدالة happy في نهاية الشيفرة: def happy(): #شغّل اللون الموافق لشعورك بالسعادة rgb.color = (0, 255, 0) # شغّل اللون الأخضر def sad(): # شغّل اللون الموافق لشعورك بالحزن rgb.color = (255, 0, 0) # شغّل اللون الأحمر happy() # غيّر هذا السطر بما يوافق الدالة التي تريد استدعائها احرص على عدم ترك مسافات في بداية السطر الذي استدعيت فيه التابع. تمثيل الألوان بصيغة RGB يمكننا تمثيل الألوان بصيغة يفهمها الحاسوب وذلك بالتعبير عن نسبة ما يحتويه اللون من اللون الأحمر والأخضر والأزرق، إذ تخزّن هذه القيم في بايت (ثمانية بتات) وتكون قيمتها من 0 إلى 255. إليك جدولًا يوضح بعض القيم اللونية: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } اللون الأحمر الأخضر الأزرق أحمر 255 0 0 أخضر 0 255 0 أزرق 0 0 255 أصفر 255 255 0 أرجواني 255 0 255 سماوي 0 255 255 كما يمكنك الاستعانة بمنتقي الألوان من موقع w3schools للحصول على القيم الموافقة للون الذي تريده. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: تصحيح الأخطاء الموجودة في الشيفرة تحقق من وجود أي رسائل خطأ في نافذة صدفة Shell ثوني وتحقق من محتواها، إن وجدت. راجع الشيفرة التي كتبتها وتحقق من خلوها من الأخطاء، مثل نسيان علامة : مثلًا، أو وجود مسافة بادئة دون الحاجة لها. تأكد من استيراد توابع العناصر التي ستستخدمها في مشروعك من مكتبة picozero، مثل تابع مصباح الليد متعدد الالوان RGBLED أو الزر Button. استخدم تعليمة الطباعة print لإضافة شرح مختصر عند كل خطوة، مثل ('البدء')print، أو ('ضبط المصباح على اللون الأخضر')print. لا تعمل بعض العناصر الإلكترونية كما يجب تأكد أن جميع العناصر متصلة ببعضها جيدًا، وتحقق من ثبات نقاط توصيل الأسلاك مع اللوحة ومع العناصر. تأكد أن أرقام الأرجل المستخدمة في الشيفرة مطابقة لأرقام الأرجل الموصولة مع مصباح الليد، وتأكد من إعادة وصل الأرجل، في حال فصلتها عند العمل على تصميم الهيكل الخارجي للجهاز. تحقق من وصل العناصر وفق القطبية الصحيحة، إذ قد تحتوي بعض العناصر على قطب موجب + وآخر سالب -. في حال تحققت من جميع النقاط السابقة ولا زال الجهاز لا يعمل، فجرب تبديل العناصر الإلكترونية بأخرى جديدة. لا يضيء مصباح الليد عند استدعاء الدالة المسؤولة عن تشغيله تأكد من تطابق الأرجل الموصول معها المصباح على لوحة بيكو للأرجل المسند إليها في الشيفرة. لا يضيء مصباح الليد باللون الصحيح تحقق من الشيفرة التي كتبتها وأن القيم اللونية مطابقة للون المستخدم، استخدم منتقي الألوان التالي للتحقق من اللون المستخدم. حاول حل المشاكل الأخرى التي قد تواجهك عند التنفيذ وشاركنا طريقة الحل في منصة حسوب IO أو في أكاديمية حسوب. اختيار الحالة المزاجية المناسبة سنضيف في هذه الخطوة وسيلةً تتيح للمستخدم اختيار المزاج المناسب باستخدام زر، أو مقاومة متغيرة. أولًا، حدد عناصر الدخل التي تود استخدامها. إليك الاقتراحات التالية: تخصيص زر لكل مزاج. استخدام زر واحد للتبديل بين المشاعر. استخدام مبدّل يدوي الصنع. استخدام مقاومة متغيرة لاختيار المزاج بناءً على قيمة المقاومة. ستحتاج إلى سلكي توصيل نوع مقبس-مقبس لكل زر تنوي استخدامه، أو ثلاثة أسلاك لكل مقاومة متغيرة. ثانيًا، صِل عناصر الدخل التي اخترتها مع لوحة بيكو باتباع الإرشادات التالية: توصيل زر إلكتروني واحد ستحتاج لتوصيل زر مع لوحة بيكو إلى ما يلي: لوحة راسبيري باي بيكو. زر إلكتروني. سلكي توصيل نوع مقبس-مقبس. صِل سلكي التوصيل مع أرجل الزر واستخدم الشريط اللاصق لتثبيتهما إذا لزم الأمر، ثم صِل أحد السلكين مع الرجل **GP18 **والسلك الآخر مع أقرب رجل أرضية. لا يهم ترتيب توصيل الأسلاك إذ لا توجد قطبية للزر. توصيل عدة أزرار إلكترونية ستحتاج لتوصيل عدة أزرار مع لوحة بيكو إلى ما يلي: لوحة راسبيري باي بيكو. أزرار إلكترونية. سلكي توصيل نوع دبوس-مقبس لكل زر. توضح الصورة التالية طريقة توصيل ثلاثة أزرار مع لوحة بيكو، وإذا أردت توصيل زر رابع فما عليك سوى توصيله مع إحدى أرجل الأغراض العامة GP ورجل أرضية. استخدم سلكي توصيل نوع دبوس- مقبس لتوصيل الزر الأول مع الرجل GP18 ومع أقرب رجل أرضية GND، ثم صِل الزر الثاني مع الرجل GP22، والثالث مع الرجل GP28 بنفس الطريقة. توصيل مقاومة متغيرة مع اللوحة ستحتاج إلى ما يلي: لوحة راسبيري باي بيكو. مقاومة متغيرة. أسلاك توصيل نوع مقبس-مقبس (عدد 3). يوجد للمقاومة المتغيرة ثلاثة أرجل: رجل الأرضية GND، ورجل تشابهية Analogue، ورجل التغذية 3V3، وعند تدوير قرص المقاومة المتغيرة إلى أقصى اليسار يشير السهم إلى الرجل الأرضية GND، وعند تدويره إلى أقصى اليمين، يشير السهم إلى رجل التغذية 3V3، أما الرجل الوسطى للمقاومة فهي الرجل التشابهية التي تستمد منها لوحة بيكو القيم لقراءتها. صِل سلك توصيل ذو نهايات مقبس-مقبس مع كل أرجل المقاومة الثلاث، وثبت التوصيلات بالشريط اللاصق إن لزم الأمر كما يلي: صِل النهاية الحرة للسلك الموصول مع رجل المقاومة ذات الرقم 1 مع رجل الأرض GND الموجودة بين الرجلين GP21 و GP22. صِل رجل المقاومة الوسطى مع الرجل GP26_A0 على لوحة بيكو. صِل رجل المقاومة ذات الرقم 3 مع رجل التغذية 3V3. توصيل مبدل يدوية الصنع أو زر مع لوحة بيكو ستحتاج إلى سلكي توصيل نوع دبوس-مقبس، بحيث تصِل أحدهما مع الرجل GP18 والسلك الآخر مع أقرب رجل أرضية، كما يلي: ثم يمكنك صنع مبدّل يدوي، كما تعلمنا في مشروع سابق، وتوصيلها مع اللوحة وذلك بتوصيل النهاية الحرة للأسلاك مع الجزء الناقل من المبدّل، مثل النحاس أو ورق القصدير. توصيل عدة مبدلات يدوية أو أزرار مع لوحة بيكو ستحتاج إلى سلكي توصيل نوع دبوس-مقبس لكل مبدّل تود توصيله مع لوحة بيكو. استخدم سلكي توصيل نوع دبوس- مقبس لتوصيل المبدّل الأول مع الرجل GP18 ومع أقرب رجل أرضية GND، ثم صِل المبدّل الثاني مع الرجل GP22 ومع أقرب رجل أرضية، والثالث مع الرجل GP28 ورجل الأرضية بنفس الطريقة، كما هو موضح في المخطط التالي: ثالثًا، عليك استيراد التابع الموافق لعنصر الدخل الذي استخدمته من مكتبة picozero، ثم إنشاء متغيرات لإسناد عناصر الدخل للأرجل الموصولة معها. لا تنس أنه بإمكانك استيراد عدة توابع معًا، كما يلي: from picozero import LED, Button لتوصيل زر إلكتروني واحد، علينا إسناده إلى الرجل الموصول معها على لوحة بيكو، كما يلي: from picozero import Button button = Button(18) ولتوصيل عدة أزرار إلكترونية، استورد تابع الزر Button من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد عدة أزرار إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import Button button_1 = Button(18) button_2 = Button(22) button_3 = Button(28) ننصحك بتسمية المتغيرات بأسماء تدل على عملها، كأن تسمّي الزر المسؤول عن تشغيل المصباح الأحمر red_button أو أي اسم آخر تراه مناسبًا. من أجل توصيل مبدّل واحد، استورد تابع المبدّل Switch من مكتبة picozero، ثم استخدم الشيفرة التالية لإسناد المبدّل إلى الرجل الموصولة معه على لوحة بيكو: from picozero import Switch switch = Switch(18) أما لتوصيل عدة مبدّلات، استورد تابع المبدّل Switch من مكتبة picozero ثم استخدم الشيفرة التالية لإسناد عدة مبدّلات إلى الأرجل الموصولة معها على لوحة بيكو: from picozero import Switch switch_1 = Switch(18) switch_2 = Switch(22) switch_3 = Switch(28) ننصحك بتسمية المتغيرات بأسماء معبرة عن عملها، كأن تسمّي المبدّل المسؤول عن تشغيل المصباح الأحمر red_switch أو أي اسم آخر تراه مناسبًا. ويمكنك الاستعانة بالشيفرة التالية لتوصيل مقاومة متغيرة: from picozero import Pot dial = Pot(0) # A0 موصولة مع الرجل رقم رابعًا، أضف الشيفرة اللازمة لاستدعاء الدوال بناءً على عناصر الدخل التي استخدمتها. الشيفرة اللازمة لتشغيل الشعور التالي عند الضغط على الزر عرّف متغيرًا ما، وليكن option، لتخزين المزاج الحالي فيه واستدعاء الدالة التالية، واحرص على مطابقة أسماء الدوال في الشيفرة للدوال التي استخدمتها في الفقرة السابقة: option = 0 # خزّن الخيار الحالي في هذا المتغير def choice(): # استدعي الدالة التالية وعدّل قيمة متغير التخزين global option if option == 0: energised() # دالة المزاج الأول elif option == 1: calm() # دالة المزاج الثاني elif option == 2: focused() # دالة المزاج الثالث elif option == 3: rgb.off() # انتقل إلى الخيار الثاني if option == 3: option = 0 else: option = option + 1 button.when_pressed = choice # استدعي الدالة التالية عند الضغط على الزر الشيفرة اللازمة لتشغيل مزاج معين عند الضغط على زر معين يمكنك إضافة عدة أزرار يستدعي كل منها دالة موافقة لمزاج مختلف عند الضغط عليها وذلك عن طريق ذكر اسمها دون استخدام الأقواس، كما في المثال التالي: happy_button.when_pressed = happy sad_button.when_pressed = sad angry_button.when_pressed = angry الشيفرة اللازمة لاستدعاء دالة ما بناء على قيمة المقاومة المتغيرة عند استخدام مقاومة متغيرة للتحكم في الخرج، سنحتاج إلى تقسيم قيم المقاومة إلى أجزاء متساوية، كأن نستخدم التابع dial.value للحصول على قيم تتراوح بين 0 و 1، كما يمكننا ضرب القيمة بالرقم 100 للحصول على نسبة مئوية؛ فإذا كان لديك خمس قيم، يمكنك التحقق ما إذا كانت القيمة أقل من 20 أو 40 أو 60 أو 80 أو 100؛ أما إذا كان لديك ثلاث قيم يمكنك تقسيم القراءات إلى 33 و 66 و 100. إليك المثال التالي: while True: mood = dial.value * 100 # تحويل إلى نسبة مئوية print(mood) if mood < 20: happy() elif mood < 40: good() elif mood < 60: okay() elif mood < 80: unsure() else: unhappy() sleep(0.1) أخيرًا، شغّل الشيفرة لاختبار المشروع، وتحقق أنه يمكنك التبديل بين الحالات المزاجية المتاحة واختيار أحدها، وإذا واجهت مشاكل عند التنفيذ في هذه الخطوة فراجع فقرة تصحيح الأخطاء السابقة. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: تصحيح الأخطاء الموجودة في الشيفرة تحقق من وجود أي رسائل خطأ في نافذة صدفة ثوني وتحقق من محتواها، إن وجدت. راجع الشيفرة التي كتبتها وتحقق من خلوها من الأخطاء، مثل نسيان علامة : مثلًا، أو وجود مسافة بادئة دون الحاجة لها. تأكد من استيراد توابع العناصر التي ستستخدمها في مشروعك من مكتبة picozero، مثل تابع مصباح الليد متعدد الالوان RGBLED أو الزر Button. استخدم تعليمة الطباعة print لإضافة شرح مختصر عند كل خطوة، مثل ('البدء')print، أو ('ضبط المصباح على اللون الأخضر')print. لا تعمل بعض العناصر الإلكترونية بالدخل أو الخرج كما يجب تأكد أن جميع عناصر الدخل أو الخرج متصلة ببعضها جيدًا، وتحقق من ثبات نقاط توصيل الأسلاك مع اللوحة ومع العناصر. تأكد أن أرقام الأرجل المستخدمة في الشيفرة مطابقة لأرقام الأرجل الموصولة مع مصباح الليد، وتأكد من إعادة وصل الأرجل، في حال فصلتها عند العمل على تصميم الهيكل الخارجي للجهاز. تحقق من وصل العناصر وفق القطبية الصحيحة، إذ قد تحتوي بعض العناصر على قطب موجب + وآخر سالب -. في حال تحققت من جميع النقاط السابقة ولا زال الجهاز لا يعمل، فجرب تبديل العناصر الإلكترونية بأخرى جديدة. حاول حل المشاكل الأخرى التي قد تواجهك عند التنفيذ وشاركنا طريقة الحل في منصة حسوب IO أو في أكاديمية حسوب. تنفيذ الهيكل الخارجي حان الآن وقت تنفيذ الهيكل الخارجي لجهاز اختبار الحالة المزاجية. أولًا، أجب على الأسئلة التالية لتساعدك في اختيار التصميم الخارجي: ما هي المواد التي تود استخدامها؟ هل تتوفر جميعها لديك؟ ما نوع المبدّلات التي تود صنعها؟ وما هي آلية عملها؟ كيف ستُثبّت العناصر الإلكترونية، مثل المقاومة المتغيرة ومصباح الليد، بحيث تبقى متينةً وسهلة الاستخدام؟ وهل تود استخدام ناشرًا لضوء الليد؟ معلومة: في علم البصريات Optics الذي يُعنى بدراسة الضوء والإبصار، يُعَّرف الناشر Diffuser بأنه أي مادة قادرة على تشتيت الضوء؛ فقد يكون ضوء بعض مصابيح الليد موجهًا في اتجاه معين، وبالتالي لا يمكن رؤيته جيدًا من مسافة بعيدة؛ أو قد يكون ساطعًا ومؤلمًا للعين عند النظر إليه من زاوية معينة. يساعد استخدام الناشر في حل هذه المشكلات ونشر الضوء بطريقة مريحة للعين ومُرضية، كما أنه بسيط الصنع، إذ ما عليك سوى استخدام ورقة رقيقة لتغطية المصباح والحصول على ناشر. إليك المثال التالي الذي استخدمنا فيه بالونًا لنشر الضوء، كما استخدمنا عدة بطاقات مختلفة الحجم وغلّفناها بورق القصدير والنحاس لغلق الدارة وتفعيل الحالة المزاجية الموافقة للبطاقة. ثانيًا، جهز المواد التي ستستخدمها لتنفيذ الهيكل الخارجي لجهازك. إليك بعض الاقتراحات: الورق المقوى. المواد البلاستيكية المعاد تدويرها. ألعاب قديمة أو قطع الليغو Lego. شريط لاصق. كما يمكنك استخدام الطابعة ثلاثية الأبعاد إن توفر لك ذلك. لا تنسَ طلب مساعدة أحد البالغين عند الحاجة لاستخدام المقص، أو أي أداة حادة أو ساخنة. ثالثًا، اصنع الغلاف الخارجي والواجهة لجهازك بالاستعانة بالإرشادات التالية، واطلب مساعدة أحد البالغين عند الحاجة. تثبيت العناصر داخل الورق المقوى أو البلاستيك بإمكانك تثبيت مصابيح الليد أو الأجراس أو المقاومات المتغيرة داخل قطع من الورق المقوى أو البلاستيك، وذلك بصنع ثقوب وإدخال العناصر وأسلاك التوصيل فيها، كما هو موضح في الصورة التالية: افصل الأسلاك عن العنصر، ثم أدخله في الثقب الذي أحدثته، ثم أعد توصيل الأسلاك. ستحتاج إلى استخدام أداة حادة لإحداث ثقب في المواد البلاستيكية، اطلب مساعدة أحد البالغين إن لزم الأمر. واحرص على تذكر ما هي أرقام الأرجل الموصولة مع الأسلاك. استخدم الشريط اللاصق لتثبيت العناصر في مكانها. تبديد الضوء المنبعث من مصباح الليد نحصل عند تبديد أو نشر ضوء مصباح الليد على تأثير لطيف، وخاصة عند استخدام مصابيح الليد الشفافة، ذات اللون الواحد أو متعددة الألوان، وذلك بوضع المصباح خلف ورقة رقيقة أو شفافة، أو خلف شريط لاصق شفاف، مما سيجعل الضوء ينتشر على مساحة أوسع وبسطوع أقل، فيصبح أكثر راحةً للعين. كما يمكنك توجيه الضوء في اتجاه معين باستخدام ورقة بيضاء، وذلك لتحصل على أكبر قدر ممكن من الضوء. تثبيت أسلاك التوصيل باستخدام الشريط اللاصق يمكنك تثبيت أسلاك التوصيل باستخدام الشريط اللاصق وإزالة الشريط اللاصق فيما بعد بكل سهولة لإعادة استخدام العناصر عند الحاجة. استخدام سكين الحرف متعدد الاستخدامات تُعد سكاكين الحرف Crafts مفيدة عند صنع الحرف اليدوية، لكن يجب أن تكون حذرًا جدًا عند استخدامها لأنها حادة جدًا ويمكن أن تسبب جروحًا وإصابات. احرص على وجود شخص بالغ عند استخدامك للسكاكين، أو اطلب منه استخدامها عوضًا عنك، كما ننصحك باستخدام لوح القص لحماية الأسطح، أو باستخدام لوح التقطيع الخشبي المتوفر في كل المطابخ. رابعًا، ثبت العناصر الإلكترونية في الهيكل الخارجي لجهازك وصِلها مع واجهة الجهاز. توصيل الأسلاك ببعضها قد تحتاج إلى أسلاك توصيل طويلة جدًا لتوصيل مصابيح الليد مع أرجل لوحة بيكو، أو يمكنك وصل الأسلاك ببعضها للحصول على سلك طويل، وذلك عبر توصيل سلك ذو نهايات دبوس-مقبس مع سلك ذو نهايات مقبس-مقبس للحصول على سلك مقبس-مقبس طويل جدًا، وتدعى هذه الطريقة باسم سلسلة الأقحوان daisy chaining. ننصحك باستخدام سلكين لهما اللون نفسه ليسهل تتبع السلك ومعرفة العنصر الموصول معه. تكمن مشكلة هذه الطريقة في أن الأسلاك قد تنفصل عن بعضها، ولذلك ينصح بلصقها بقطعة صغيرة من الشريط اللاصق. خامسًا، شغّل الشيفرة واختبر عمل كل عنصر بدقة، وتأكد أن جميع العناصر تعمل كما ينبغي بعد أن ثبّتها في جهازك. واستعن بفقرة تصحيح الأخطاء إذا واجهت مشكلةً ما. ترقية المشروع بما أنك أصبحت على دراية بالمهارات المطلوبة لتصميم جهاز يعرض الحالة المزاجية وكتابة الشيفرة اللازمة لذلك، يمكنك ترقية المشروع حين يتسنى لك، بالبحث عن بعض الأجهزة والأدوات المماثلة، ثم قرر هل ترغب في تحسين جهازك أو إضافة بعض الميزات عليه؟ جرّب جهازك مع الآخرين للحصول على ملاحظاتهم وترقية المشروع بناءً عليها، وننصحك بالإطلاع على الشيفرة الخاصة بالمشاريع التي ذكرناها في المقدمة لتتعرف على آلية عملها وتستوحي بعض الأفكار منها. إليك بعض الاقتراحات التي يمكنك تنفيذها: اختبار الجهاز مع الأصدقاء والعائلة لتحسين تجربة الاستخدام وفقًا لآرائهم. إضافة المزيد من الحالات المزاجية، والألوان، والتأثيرات الضوئية. تحسين التصميم الخارجي للجهاز. إضافة الأصوات على الجهاز باستخدام الأجراس الإلكترونية Buzzers. كما يمكنك التعديل على شيفرة المشروع وتطوير نمط الوميض، والنبض والتكرار، أو إضافة توقيت، وألوان، أو تحديد عدد معين لمرات تكرار الأنماط، وذلك كما يلي: إضفاء تأثير الوميض أو النبض على مصباح ليد يمكنك إضفاء تأثير الوميض أو النبض على مصباح ليد عادي عن طريق استخدام دالة الوميض blink لتشغيل وإطفاء المصباح بصورةٍ متكررة. الشيفرة اللازمة لتطبيق تأثير الوميض على مصباح ليد عادي باستخدام دالة blink هي على النحو التالي: led.blink() # تشغيل المصباح لثانية واحدة ثم إطفاءه لثانية print("Blinking") # اطبع ما بين القوسين مباشرةً sleep(6) led.off() والشيفرة اللازمة لتطبيق تأثير الوميض عددًا معينًا من المرات، هي: led.blink(on_time=1, off_time=0.5, n=3, wait=True) print("Finished blinking") # اطبع ما بين القوسين بعد تشغيل المصباح وإطفاءه ثلاث مرات لاحظ أنه عند عدم ضبط مدة الإطفاء off_time، ستكون مدتها مطابقةً لمدة التشغيل on_time. أما الشيفرة اللازمة لزيادة سطوع المصباح تدريجيًا باستخدام تابع النبض pulse، تكون على النحو التالي: led.pulse() # زيادة السطوع لمدة ثانية واحدة ثم تخفيفه ثانية print("Pulsing") # اطبع ما بين القوسين مباشرةً توضح الشيفرة التالية الشيفرة اللازمة للتحكم في سرعة النبض وعدد مرات التكرار led.pulse(fade_in_time=2, fade_out_time=1, n=4, wait=True) #زيادة السطوع لمدة ثانيتين ثم تخفيفه لمدة ثانية print("Finished pulsing") # طبع ما بين القوسين بعد 4 نبضات كما يمكنك دمج التأثيرين السابقين للحصول على تأثيرات ساحرة: led.blink(on_time=1, off_time=1, fade_in_time=1, fade_out_time=1) # تشغيل المصباح لثانية واحدة ثم إطفاءه لثانية وتخفيف السطوع أثناء ذلك print("Fancy") # اطبع ما بين القوسين مباشرةً ملاحظة: يستمر تنفيذ دالتي الوميض blink والنبض pulse إلى أن يُستدعى تابع الإطفاء off أو إلى أن نستدعي الدالتين بإعدادات جديدة. استخدم التعليمة wait=True وحدد n والتي هي عدد مرات تنفيذ التأثير. إضفاء تأثير الوميض أو النبض أو التكرار على مصباح متعدد الألوان استخدم دالة الوميض blink لتبديل الألوان في مصباح الليد متعدد الألوان، كما هو مبين في الشيفرة التالية: rgb.blink() # تشغيل اللون الأحمر لمدة ثانية، ثم الأخضر لثانية، ثم الأزرق لثانية print("Blinking") # اطبع ما بين القوسين مباشرةً sleep(6) rgb.off() أما الشيفرة اللازمة لتطبيق تأثير الوميض على لون واحد في مصباح متعدد الألوان فهي على النحو التالي: # اجعل اللون البنفسجي يومض لمدة ثانيتين، ثم أطفئه لنصف ثانية rgb.blink(on_times=(2, 0.5), colors=((255, 0, 255), (0, 0, 0)), wait=True, n=3) print("Finished blinking") # اطبع ما بين القوسين بعد ثلاثة تكرارات اعتمد على الشيفرة التالية لتطبيق تأثير الوميض عددًا معينًا من المرات بتوقيت وألوان مختلفة: # اجعل اللون البنفسجي يومض لمدة ثانية، والأخضر لنصف ثانية، والأزرق لربع ثانية rgb.blink((1, 0.5, 0.25), colors=((255, 0, 0), (0, 255, 0), (0, 0, 255)), wait=True, n=2) print("Finished blinking") # اطبع ما بين القوسين بعد تكرارين لاحظ أنه عند عدم تحديد مدة الإطفاء off_time، ستكون مدتها مطابقة لمدة التشغيل on_time. استعن بالشيفرة التالية لتغيير سطوع المصباح متعدد الألوان ولونه تدريجيًا باستخدام تابع النبض pulse: rgb.pulse() # شغّل اللون الأحمر لمدة ثانية، ثم الأخضر لثانية، ثم الأزرق print("Pulsing") # اطبع ما بين القوسين مباشرةً للتحكم في سرعة النبض للمصباح متعدد الألوان وعدد مرات التكرار: # خفف سطوع اللون البنفسجي لمدة ثانيتين، ثم أطفئ المصباح لمدة نصف ثانية وكرر العملية 3 مرات rgb.pulse(fade_times=(2, 0.5), colors=((255, 0, 255), (0, 0, 0)), wait=True, n=3) print("Finished pulsing") # اطبع ما بين القوسين بعد ثلاثة تكرارات أما للتبديل بين الألوان تدريجيًا باستخدام تابع التكرار cycle، تكون الشيفرة على النحو التالي: rgb.cycle() # التدوير بين الألوان تدريجيًا من الأحمر للأخضر، ثم الأخضر للأزرق، ثم الأزرق للأحمر print("Cycle") # اطبع ما بين القوسين مباشرةً تساعد الشيفرة التالية في التحكم في اللون والمدة وعدد مرات التكرار # بدّل بين الألوان بترتيب معاكس وبسرعة أبطأ rgb.cycle(fade_times=3, colors=((0, 0, 255), (0, 255, 0), (255, 0, 0)), wait=True, n=2) rgb.off() ملاحظة: يستمر تنفيذ دالتي الوميض blink والنبض pulse إلى أن يُستدعى تابع الإطفاء off أو إلى أن نستدعي الدالتين بإعدادات جديدة. استخدم التعليمة wait=True واضبط n والتي هي عدد مرات تنفيذ التأثير. إليك الفيديو التالي ليوضح لك تأثير الوميض blink وخفوت الإضاءة عند تطبيق تأثير النبض pulse، كما يمكنك التعديل على جهازك لاحقًا وإضافة حالات مزاجية جديدة بناءً على المواقف التي تمر بها. والإطلاع على معرض مشاريع أداة اختبار الحالة المزاجية لتستوحي منها بعض الأفكار، ولا تنسى مشاركة مشروعك مع الأصدقاء أو مشاركته معنا على منصة حسوب IO. الخاتمة تهانينا، فقد أتممت مشروع تصميم وتنفيذ جهاز لعرض الحالة المزاجية باستخدام لوحة راسبيري باي بيكو ننصحك بتنفيذ مشروع تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو في خطوتك التالية، وإذا واجهت مشاكلًا عند تنفيذ هذا المشروع، يمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Mood indicator من الموقع الرسمي لراسبيري باي. اقرأ أيضًا صنع قلب نابض باستخدام لوحة راسبيري باي بيكو تصميم محاكاة لمفرقعات الحفلات باستخدام لوحة راسبيري باي بيكو إنشاء مصباح ليد يومض وفق نمط معين باستخدام حاسوب راسبيري باي بيكو
  10. سنتعلم في هذه المقال كيفية صنع قلب نابض من الورق ومصباح ليد LED ومقاومة متغيرة potentiometer للتحكم بمعدل ضربات القلب. شغّل الفيديو وراقب ما الذي سيحدث عند تدوير قرص المقاومة المتغيرة. تحذير: سنستخدم في هذا المشروع أضواءً وامضةً والتي قد تسبب اختلاجات أو نوبات شقيقة عند نسبة صغيرة جدًا من الناس، كما أن هذه الأعراض قد تظهر عند الأشخاص السليمين الذين لم يعانوا مسبقًا من الشقيقة أو من نوبات الصرع المُحرَضة من قِبَل الإضاءة العالية، لذلك ننصحك بإيقاف العمل على هذا المشروع ومراجعة طبيب مباشرةً إذا واجهت أية أعراض. ستتعلم في هذا المشروع ما يلي: كيفية استخدام المقاومة المتغيرة ذات القرص dial لتغيير معدل ضربات القلب. كيفية الحصول على إضاءة نابضة باستخدام مصباح الليد. تشغيل لوحة راسبيري باي بيكو Raspberry Pi Pico من مصدر طاقة غير الحاسوب. معلومة: يعطينا الدخل التشابهي Analogue مجالًا من القيم المختلفة، على عكس النظام الرقمي Digital الذي يعطي إما القيمة 1 أو 0 (تشغيل أو إطفاء). تُعّد المقاومة المتغيرة من أجهزة الدخل التشابهي، إذ أن لها قرص دوّار يمكن من خلاله زيادة القيم أو إنقاصها. تحتوي لوحة بيكو على أرجل دخل تشابهية يمكننا استخدامها في مشروعنا لقراءة القيم التشابهية. متطلبات المشروع عتاد: لوحة حاسوب راسبيري باي بيكو مع أرجل مثبتة عليها. كبل USB لنقل البيانات ذو نهايات من النوع USB A و micro USB. مصباح ليد أحمر اللون، أو اللون الذي تفضله مع مقاومة موصولة مع أسلاك من نوع مقبس. مقاومة متغيرة واحدة. أسلاك توصيل ذات نهايات مقبس-مقبس socket-socket (عدد 3). أسلاك توصيل ذات نهايات دبوس-مقبس pin-socket (عدد 3). بعض مستلزمات الأشغال اليدوية: ورق ملون أحمر اللون إن وجد، ورقائق قصدير، وشريط لاصق. مصباح ليد أزرق اللون ومقاومة وأسلاك توصيل إضافية (اختياري). أسلاك التوصيل تُستخدم أسلاك التوصيل لنقل التيار الإلكتروني بين العناصر الإلكترونية، عند إنشاء النماذج الأولية من المشاريع لسهولة توصيلها مع العناصر وفصلها، دون الحاجة لتلحيمها (إنشاء توصيلات دائمة عن طريق صهر المعدن)، وتوجد ثلاثة أنواع من أسلاك التوصيل حسب نهاياتها: أسلاك توصيل ذات نهايات مقبس-مقبس socket-socket. أسلاك توصيل ذات نهايات دبوس-مقبس pin-socket. أسلاك توصيل ذات نهايات دبوس-دبوس pin-pin. نهاية الدبوس هي قطعة معدنية قصيرة تخرج من الطرف البلاستيكي الأسود للسلك،و يمكن إدخالها في طرف المقبس، أو لوحة التجارب، وهي على الشكل التالي: نهاية المقبس هي ثقب في الطرف البلاستيكي الأسود للسلك يمكن إدخال نهاية الدبوس، أو أرجل العناصر الإلكترونية فيه. شراء أسلاك التوصيل قد تلاحظ عند شرائك أسلاك التوصيل أنها تسمى ذكر - ذكر أو أنثى - أنثى، أو ذكر - أنثى، وهي تسميات قديمة إذ يدل الذكر على نهاية الدبوس، والأنثى على نهاية المقبس، ويجب استخدام مصطلحي الدبوس والمقبس لوصف أسلاك التوصيل لأنها أكثر شمولًا. برمجيات برنامج ثوني Thonny: وهو البيئة البرمجية التي سنستخدمها لكتابة الشيفرة بلغة بايثون. تثبيت برنامج ثوني على نظام تشغيل راسبيري باي يأتي برنامج ثوني مثبتًا مع نظام تشغيل راسبيري باي، المعروف سابقًا براسبيان Raspbian، لكن قد تحتاج إلى تحديثه. انقر على الأيقونة في الزاوية العلوية اليسرى من الشاشة لفتح نافذة الطرفية Terminal، أو اضغط المفاتيح التالية معًا Ctrl+Alt+T. ثم اكتب الأمر التالي لتحديث نظام التشغيل وبرنامج ثوني: sudo apt update && sudo apt upgrade -y تثبيت برنامج ثوني على أنظمة التشغيل الأخرى يمكنك تثبيت ثوني على الحواسيب العاملة بنظام تشغيل لينكس، أو ويندوز، أو ماك، وذلك من الموقع الرسمي thonny.org. انقر على رابط التنزيل الموافق لنظام تشغيل حاسوبك من الزاوية العلوية اليمنى في الموقع، ثم انقر على الملفات بعد تنزيلها، وقد تظهر لك الرسالة التالية على نظام ويندوز: انقر على خيار المزيد من المعلومات "More info" ثم على التشغيل على أي حال "Run anyway". التعرف على واجهة برنامج ثوني عند فتح ثوني ستظهر لك الواجهة التالية: يمكنك الكتابة بلغة بايثون في النافذة الرئيسية الكبيرة، ثم النقر على زر التشغيل الأخضر Run للتنفيذ، ستظهر لك رسالة لحفظ الملف قبل تشغيله. اكتب الأمر التالي وشغّله: print('Hello World!') تغيير السمة والخط يمكنك التحكم بلون الخط وحجمه وتغيير السمة المستخدمة في واجهة البرنامج، وذلك بالنقر على قائمة الأدوات Tools من الشريط أعلى الشاشة، ثم النقر على خيارات Options، ثم انقر بعدها على نافذة الخط والسمة Theme & Font واختر نوع الخط والسمة التي تفضلها من النافذة المنسدلة ثم انقر على زر موافق OK عند الانتهاء. ننصحك باختيار الخطوط البسيطة الواضحة والابتعاد عن الخطوط المزخرفة أو المشابهة لخط اليد لأنها قد تجعل القراءة أصعب. قراءة قيم المقاومة المتغيرة توفِّر لنا المقاومة المتغيرة مجالًا من القيم المختلفة، ويمكننا مشاهدة هذه القيم والتأثير الحاصل عند تغييرها باستخدام الراسم plotter في ثوني. مبدأ عمل المقاومة المتغيرة المقاومة المتغيرة هي إحدى أجهزة الدخل التشابهي، إذ تتغير قيمة المقاومة فيها بتدوير القرص الموجود أعلاها، ولها ثلاثة أرجل؛ رجل للتغذية 3V3، رجل تشابهية لقراءة القيم، ورجل للتأريض GND. إذ تزوِّد الرجل 3V3 المقاومة بالتغذية وتتغير القراءة المُزودة من قِبَل الرجل التشابهية تبعًا لقيمة المقاومة المُعَيّرة. معلومة: تحتوي لوحة بيكو على أرجل دخل تشابهية يمكننا استخدامها لتوصيل عناصر الدخل التشابهي، مثل المقاومة المتغيرة، وهذه الأرجل هي A0، وA1، وA2، كما يمكن للوحة بيكو التحسس لقيم الجهد ضمن المجال 0 فولت إلى 3.3 فولت باستخدام هذه الأرجل. خطوات توصيل المقاومة المتغيرة للدارة أولًا، أمسك المقاومة المتغيرة كما في الصورة أدناه ولاحظ وجود القرص الدوّار أعلاها، والذي يمكن تدويره مع اتجاه دوران عقارب الساعة أو عكسه، ولاحظ وجود ثلاث أرجل للمقاومة. عند تدوير القرص إلى أقصى اليسار يشير السهم إلى الرجل الأرضية GND، وعند تدويره إلى أقصى اليمين يشير السهم إلى رجل التغذية 3V3 أما الرجل الوسطى للمقاومة فهي الرجل التشابهية التي تستمد منها لوحة بيكو القيم لقراءتها. ثانيًا، افصل لوحة بيكو عن حاسوبك،ثم وَصّل سلك توصيل ذو نهايات مقبس-مقبس مع كل أرجل المقاومة الثلاث، ثبت التوصيلات بالشريط اللاصق إن لزم الأمر. صِل النهاية الحرة للسلك الموصول مع رجل المقاومة ذات الرقم 1 مع رجل الأرض GND الموجودة بين الرجلين GP21 و GP22. صِل رجل المقاومة الوسطى مع الرجل GP26_A0 على لوحة بيكو. صِل رجل المقاومة ذات الرقم 3 مع رجل التغذية 3V3. ثالثًا، صِل لوحة بيكو بحاسوبك، ثم افتح برنامج ثوني وأنشئ ملفًا جديدًا واكتب فيه الشيفرة التالية لطباعة print قيم المقاومة المتغيرة: from picozero import Pot # هو اختصار لاسم المقاومة المتغيرة باللغة الانجليزية Pot from time import sleep dial = Pot(0) # A0(GP26) موصولة مع الرجل رقم while True: print(dial.value) sleep(0.1) #إبطاء خرج المقاومة أضفنا السطر الأخير (sleep(0.1 لإبطاء قراءة القيم وطباعتها من المقاومة المتغيرة حتى نتمكن من مشاهدتها في ثوني. رابعًا، شغّل الشيفرة، ثم دوّر قرص المقاومة وراقب تغيرات القيم في نافذة صدفة Shell ثوني. لاحظ أن القيم تتغير بسرعة كبيرة يَصعُب معها إدراك ما يحدث، لذلك سنستخدم الراسم plotter في ثوني لمشاهدة التغير وتمثيله بيانيًا. خامسًا، انقر على قائمة العرض View ثم على الراسم Plotter،ستظهر نافذة الراسم بجانب نافذة الصدفة. شغّل الشيفرة ثم دوّر قرص المقاومة وراقب تغيرات القيم على الراسم. يجب أن تكون القيم 0 (أو قريبةً من الصفر) عندما يكون قرص المقاومة مُدارًا إلى أقصى اليسار، وأن تكون 1 (أو قريبةً من الواحد) عندما يكون القرص في أقصى اليمين. ملاحظة: قد تظهر لك القيم معكوسةً؛ أي قد يعطي الراسم قيمة 1 عندما يكون قرص المقاومة في أقصى اليسار، في هذه الحال عليك التبديل بين السلكين الموصلين مع رجل التغذية 3V3 ورجل التأريض GND. حساب عدد الضربات في الدقيقة BPM تعطينا المقاومة المتغيرة قيمًا تتراوح بين 0 و 1، ولكن علينا تحويل هذه القيم إلى قيم متوافقة من 40 (ضربات قلب رياضي رشيق) إلى 180 ضربة في الدقيقة. معلومة: BPM هي اختصار لعدد الضربات في الدقيقة Beats per minute، ويُستخدم للتعبير عن معدل نبضات القلب والإيقاع الموسيقي، وكلّما كان عدد النبضات أو الضربات أكبر كان المعدل أعلى، ويُستخدم في مجال اللياقة لقياس شدة التمارين على الجسم، إذ يُنصح ألا يتجاوز معدل ضربات قلبك 85% من المعدل الأعظمي عند ممارستك الرياضة. يمكنك حساب المعدل الأعظمي بإنقاص عمرك من العدد 220، فالمعدل الأعظمي لطفل ذو 12 عامًا هو 208 ضربة في الدقيقة، ويجب ألا يتجاوز 176 ضربة عند ممارسة التمارين، وهو نفس المعدل لإيقاع موسيقى Drum ‘n’ Bass. سنستخدم المقاومة المتغيرة للتحكم بمعدل ضربات القلب في مشروعنا. عدّل على الشيفرة لطباعة القيم ورسمها ضمن مجال يتراوح من 40 إلى 180 ضربة، كما يلي: from picozero import Pot from time import sleep dial = Pot(0) heart_min = 40 heart_max = 180 heart_range = heart_max - heart_min # حساب الفرق بين المعدل الأعظمي والأصغري while True: bpm = heart_min + dial.value * heart_range # تحويل قيمة المقاومة إلى معدل ضربات القلب print(bpm) sleep(0.1) لاحظ أن المجال الذي يتراوح ضمنه معدل الضربات heart_range يُحسب مثل متغير variable في بداية الشفرة، بينما يُحسب معدل ضربات القلب bpm الذي يعتمد على قيمة المقاومة المتغيرة ضمن حلقة while. شغّل الشيفرة ثم دوّر قرص المقاومة وراقب تغيرات القيم في الراسم وفي نافذة الصدفة، إذ يجب أن تتراوح القيم بين الأعداد من 40 إلى 180. تصحيح الأخطاء إليك بعض الأخطاء التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: يظهر البرنامج رسالة خطأ في الشيفرة قد تظهر لك رسالة " You have a syntax error"، تحقق عندها من الشيفرة التي كتبتها وتأكد أنها مطابقة للشيفرة في مثالنا. توقفت المقاومة المتغيرة عن العمل تحقق من متانة توصيل الأسلاك مع المقاومة. صنع قلب ورقي سنعمل في هذه الخطوة على صنع قلب من الورق لتغليف مصباح الليد وتبديد ضوءه. معلومة: الحرف الورقية Papercraft هو فن صنع مجسمات ثنائية أو ثلاثية الأبعاد من الورق، وتتعدد الخيارات التي يمكن تنفيذها من منحوتات إلى ملابس ورقية، حتى إنشاء نماذج باستخدام الورق المُعّجن papier-mâché، أو مجسمات باستخدام فن طَيّ الورق أو ما يُعرف بفن الأوريغامي origami، وذلك إما باستخدام قصاصات من الورق أو لفّه. اختر إحدى الطريقتين التاليتين لصنع القلب الورقي: قص شكل القلب سنستخدم المقص للحصول على شكل قلب بسيط من الورق: قُصَّ شكلين من الورق ثم الصقهما ببعضهما باستخدام الشريط اللاصق: صنع شكل القلب باستخدام فن طي الورق سنتعلم في هذه الخطوة كيفية صنع شكل القلب باستخدام فن طيّ الورق (الأوريغامي). أولًا، احضر قطعةً مربعةً من الورق (أي نوع من الورق سيفي بالغرض، لكن استخدام الورق الرقيق سيجعل الليد أكثر سطوعًا). ثانيًا، اطوِ الورقة إلى النصف لتحصل على شكل المثلث وذلك بطّي أحد الرؤوس حتى يلامس الرأس المقابل، ثم افرد الورقة: ثالثًا، اطوِ الورقة إلى النصف مجددًا لتحصل على شكل المثلث، ثم افردها: رابعًا، اطوِِ الرأس العلوي إلى منتصف المربع، لتحصل على شكل الدرع. خامسًا، اطوِ الرأس السفلي حتى يلامس الحافة العلوية وتحصل على الشكل التالي: سادسًا، اطوِ الحافتين اليمنى واليسرى للأعلى بزاوية 90 درجة، حتى تتلاقى حافتاهما السفليّتان في منتصف المربع: سابعًا، اطوِ الحواف العليا والجانبية للخلف: ثامنًا، استخدم الشريط اللاصق لتثبيت الحواف على طول شكل القلب. أصبح الشكل جاهزًا للاستخدام، اقلبه على الوجه الأخر واستمتع بإنجازك. إضافة مصباح الليد سنبث الحياة في مشروعنا بإضافة الليد وجعل القلب يبدو كأنه ينبض. تحذير: سنستخدم في هذا المشروع أضواءً وامضةً، ما قد يُسبب اختلاجات أو نوبات شقيقة عند نسبة صغيرة جدًا من الناس، كما أن هذه الأعراض قد تظهر عند الأشخاص السليمين الذين لم يعانوا مسبقًا من الشقيقة أو من نوبات الصرع المُحرَضة من قِبَل الإضاءة العالية، لذلك ننصحك بإيقاف العمل على هذا المشروع ومراجعة طبيب مباشرةً إذا واجهت أية أعراض. سنوصل في البداية مصباح ليد أحمر اللون مع مقاومة باتباع إحدى الطريقتين التاليتين: توصيل الليد مع مقاومة وأسلاك توصيل باستخدام شريط عازل ستحتاج لتوصيل الليد مع مقاومة وأسلاك توصيل باستخدام شريط عازل إلى ما يلي: أسلاك توصيل نوع مقبس-مقبس (عدد 2). مقاومة. مصباح ليد. شريط عازل. مقص. كما تعلمنا سابقًا، فإن لمصباح الليد رجل قصيرة سالبة، وأخرى طويلة هي الموجبة. كما يمكنك التمييز بين القطبين عن طريق تلمّس حافة الجزء البلاستيكي للمصباح بإصبعك؛ إذ أن الطرف السالب هو الطرف الأقرب إلى الحافة المسطحة للمصباح. أولًا، اثنِ أحد طرفي المقاومة حول الرجل الموجبة لمصباح الليد. ثم لُف طرف المقاومة حول رجل مصباح الليد ثلاث مرات، كما في الصورة التالية: ثانيًا، قُص قطعة من الشريط العازل والصقه على الجزء الملفوف من المقاومة ليساعد في تثبيتها. ثالثًا، أدخل سلك توصيل في النهاية الحرة للمقاومة، ثم صل سلكًا آخر مع الرجل السالبة لمصباح الليد. كما يمكنك استخدام الشريط العازل لتثبيت التوصيلات. توصيل الليد مع مقاومة وأسلاك توصيل باستخدام اللحام وأنابيب الانكماش الحراري تنبيه: ستحتاج إلى مساعدة أحد البالغين لتنفيذ هذه الخطوة وخاصةً عند استخدام مسدس اللحام. أولًا، ستحتاج إلى مصباح ليد، ومقاومة (ذات قيمة 70 أوم أو أكبر)، سلكي توصيل نوع مقبس-مقبس، ومسدس لحام، وأسلاك قصدير، وأنابيب انكماش حراري. ثانيًا، سخّن إحدى رجلي الليد لبضع ثوان باستخدام مسدس اللحام ثم اصهر اصبع القصدير فوقها، وكرّر العملية على الرجل الأخرى. اطلب مساعدة أحد البالغين لتنفيذ هذه الخطوة. ثالثًا، الآن سخّن إحدى رجلي المقاومة لبضع ثوان باستخدام مسدس اللحام ثم اصهر اصبع القصدير فوقها، وكرر العملية على الرجل الأخرى. اطلب مساعدة أحد البالغين لتنفيذ هذه الخطوة. رابعًا، ضع رجل الليد الموجبة فوق رجل المقاومة ثم مرر مسدس اللحام عليهما كي تلتحما معًا. خامسًا، قص النهاية البلاستيكية السوداء لسلكي التوصيل، ثم انزع الغلاف البلاستيكي للسلكين حتى تحصل على الجزء النحاسي بدون عزل، كما هو موضح: سادسًا، اصهر بعض القصدير على نهايتي السلكين. سابعًا، ادخل أنبوب انكماش حراري في كلٍ من السلكين. ثامنًا، ضع النهاية المكشوفة لسلك التوصيل الأول فوق الليد، ثم سخنهما كي يلتحما، وكرّر العملية مع السلك الثاني والمقاومة. تاسعًا، اسحب أنبوب الانكماش الحراري إلى نهاية السلك ليغطي موضع اللحام. عاشرًا، سخن أنبوب الانكماش الحراري باستخدام الحافة العريضة من مسدس اللحام حتى ينكمش حول سلك التوصيل. أخيرًا، اختبر الليد بتوصيل إحدى السلكين إلى أحد أرجل الأرضية GND على لوحة بيكو، والسلك الآخر إلى إحدى أرجل 3V3. الآن، وبعد الانتهاء من توصيل الليد والمقاومة، صّل الرجل السالبة لمصباح الليد مع رجل الأرض GND، والموجبة مع الرجل GP13 على لوحة بيكو، كما تعلمنا في مشروع اليراعات الوامضة. معلومة: عملت عالمة الفضاء ماجي أدرين بوكوك Maggie Aderin-Pocock على العديد من الأدوات الإلكترونية مثل ملحقات للتلسكوب، وكاشف ألغام محمول، وأجهزة أُرسلت إلى الفضاء لجمع بيانات تساعد في فهم سبب تغير المناخ، والمدهش أن ماجي لم تكن قادرةً على شراء تلسكوب عندما كانت مراهقة، لذا صنعت تلسكوبها الخاص مستخدمةً الزجاج لصنع العدسات ومعرفتها في الإلكترونيات والبرمجة. ما رأيك عالمِنا الصغير، هل هناك أداة ترغب في صنعها؟ أضف الشيفرة التالية لبرمجة الليد: from picozero import Pot, LED # أضفنا تابع الليد من المكتبة from time import sleep dial = Pot(0) led = LED(13) # احرص على كتابة الرقم الصحيح للرجل ثم أضف الشيفرة التالية للتحكم بسطوع الليد: while True: bpm = heart_min + dial.value * heart_range print(bpm) beat = 60/bpm # زِد سطوع الليد في النصف الأول من النبضة brighter_time = beat / 2 # خفِّف سطوع الليد في النصف الثاني من النبضة dimmer_time = beat / 2 # انتظر حتى تنتهي النبضة الأولى led.pulse(brighter_time, dimmer_time, n=1, wait=True) لاحظ أن الدالة ()pulse تخلق تأثير النبض للمصباح عن طريق زيادة سطوعه وانقاصه. احرص على إضافة شرط الإنتظار wait=True على السطر الأخير من الشيفرة، وإلا سيُعاد تنفيذ حلقة while مباشرةً وسيُعاد النبض. الآن، شغّل الشيفرة وراقب كيف يخبو ويسطع ضوء المصباح، ثم دوّر قرص المقاومة المتغيرة وراقب كيف تتسرع ومضات المصباح كما لو أنها نبضات قلب. ضع الليد داخل القلب الورقي أو خلفه للحصول على تأثير النبض. تصحيح الأخطاء إليك بعض الأخطاء التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: يظهر البرنامج رسالة خطأ في الشيفرة قد تظهر لك رسالة " You have a syntax error"، تحقق عندها من الشيفرة التي كتبتها وتأكد أنها مطابقة للشيفرة في مثالنا. توقفت المقاومة المتغيرة عن العمل تحقق من متانة توصيل الأسلاك مع المقاومة. لا يضيء مصباح الليد الموصول تحقق من توصيل الليد مع الأرجل الصحيحة وفقًا للمخطط في مقالنا، وتحقق من متانة التوصيلات، وإذا استمرت المشكلة فاستبدل مصباح الليد بآخر. استخدام مصدر تغذية محمول يمكنك تغذية لوحة بيكو من أي مصدر تغذية آخر غير الحاسوب باستخدام كبل USB. تشغيل المشروع تلقائيا باستخدام ملف main.py عند توصيل لوحة بيكو بمصدر طاقة وتشغيلها، تشغّل اللوحة تلقائيًا ملف "main.py" والذي يمكننا من خلاله تشغيل مشروعنا. أولًا، انقر على قائمة ملف File ثم اختر حفظ باسم Save as. ثانيًا، انقر على خيار الحفظ في راسبيري باي بيكو. ثم اختر مكانًا مناسبًا لحفظ الملف وسمّه "main.py". عند حفظ أي ملف باسم "main.py" على لوحة بيكو، سيعمل البرنامج تلقائيًا عند تغذية اللوحة بمصدر تغذية خارجي مثل البطارية. تغذية لوحة بيكو بمصدر تغذية خارجي باستخدام كبل USB تتطلب لوحة راسبيري باي بيكو تغذيتها بمصدر طاقة يؤمن تغذية تتراوح بين 1.8 فولت و 5.5 فولت بالحد الأعظمي، والذي يمكن توفيره باستخدام معظم محولات USB. فعلى سبيل المثال،يوفر محول micro USB الرسمي من راسبيري تيارًا يصل إلى 2.5 أمبير عند جهد قيمته 5.1 فولت. كما يمكن أيضًا تشغيل لوحة راسبيري باي بيكو باستخدام بطارية مع كبل USB ذو نهايات USB و micro USB، إذ توفر هذه البطارية تيارًا يصل إلى 2.1 أمبير عند جهد قيمته 5 فولت. ثالثًا، افصل لوحة بيكو عن حاسوبك، ثم صِلها مع البطارية أو منبع التغذية الخارجي. شَغّل منبع الطاقة، ثم دوّر قرص المقاومة للتحكم بسرعة النبض. تصحيح الأخطاء إليك بعض الأخطاء التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: لا يضيء مصباح الليد الموصول تحقق من تشغيل البطارية التي وصلتها، ومن شحنها، وغَيّر كبل USB المستخدم، وإذا لم يفلح الأمر فعليك تغيير البطارية. صِل لوحة بيكو بالحاسوب وتحقق من حفظ الملف "main.py" عليها، وتحقق أن لاحقة الملف هي "py.". ترقية المشروع يمكنك ترقية مشروعك حين يتسنى لك ذلك، واستخدامه لتزيين غرفتك ومساعدتك على الاسترخاء وذلك بتخفيف سرعة النبضات، أو زيادتها لتتناسب مع ما تستمع إليه من الموسيقى. إليك بعض الاقتراحات لترقية مشروعك: صنع قلب ورقي آخر أكثر تعقيدًا. إضافة مصباح ليد ذو لون أزرق ليمثل حركة الدم الخالي من الأوكسجين الداخل والخارج من القلب. إضافة صوت لنضات القلب باستخدام جرس إلكتروني غير فعّال passive buzzer. إضافة مزيدٍ من القلوب الورقية ومصابيح الليد (اختر الألوان التي تفضلها) وجعلها تنبض في نفس الوقت. كما يمكنك الاطلاع على الشيفرة النهائية للمشروع من ملفه beating-heart-en-solutions. الخاتمة تهانينا، فقد أتممت مشروع استخدام لوحة راسبيري باي بيكو للحصول قلب صناعي نابض. ننصحك بتنفيذ مشروع جهاز عرض الحالة المزاجية باستخدام لوحة راسبيري باي بيكو في خطوتك التالية، وإذا واجهتك مشاكلًا عند تنفيذ هذا المشروع فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Beating heart من الموقع الرسمي لراسبيري باي. اقرأ أيضًا المقال السابق: تصميم محاكاة لمفرقعات الحفلات باستخدام لوحة راسبيري باي بيكو إنشاء مصباح ليد يومض وفق نمط معين باستخدام حاسوب راسبيري باي بيكو تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي تجميع راسبيري باي والتحضير لاستعماله ربط راسبيري باي بعناصر إلكترونية وبرمجتها باستخدام سكراتش وبايثون
  11. سنتعلم في هذا المقال كيفية تصميم محاكاة لمفرقعات الحفلات باستخدام لوحة راسبيري باي بيكو Raspberry Pi Pico ومصابيح ليد LED وجرس إلكتروني Buzzer. استخدمنا في مشروع سابق مصباح ليد ذو لون واحد، أما في مشروعنا هذا فسنستخدم نوعًا مختلفًا من المصابيح وهو مصباح LED متعدد الألوان والذي يعرف باسم RGB LED، لنحصل على نتيجة مشابهة لما يلي، إذ يضيء المصباح بلونٍ بنفسجي Purple وينطلق الجرس الإلكتروني: معلومة: تُستخدم مفرقعات الحفلات Party poppers في الاحتفالات في جميع أنحاء العالم، فما عليك سوى أن تسحب الخيط المتدلي منها، لتفرقع وتصدر قُصاصاتٍ ملونةً في الهواء. لربما لم تراها مسبقًا، لكن من المؤكد أنك تعرف الرمز التعبيري الخاص بها. ستتعلم في هذا المشروع ما يلي: كيفية كتابة شيفرة للتحكم بألوان مصباح الليد متعدد الألوان RGB LED ودرجة سطوعها. كيفية التحكم برنين الجرس الإلكتروني buzzer. كيفية صنع مبدّل من الورق المقوى ورقائق القصدير. متطلبات المشروع سنوضح فيما يلي متطلبات إنجاز هذا المشروع عتاد لوحة حاسوب راسبيري باي بيكو مع أرجل مثبتة عليها. كبل USB لنقل البيانات ذو نهايات من النوع USB A و micro USB. جرس إلكتروني غير فعّال passive buzzer. مقاومة resistor بقيمة 100 أوم ( يمكن استعمال أي مقاومة ذات قيمة 75Ω -220Ω). (عدد 3) أسلاك توصيل ذات نهايات مقبس-مقبس socket-socket (عدد 6). أسلاك توصيل ذات نهايات دبوس-مقبس pin-socket (عدد 2). مصباح ليد متعدد الألوان RGB LED ذو مهبط مشترك common cathode (عدد 1). بعض مستلزمات الأشغال اليدوية، مثل الورق المقوى السميك، ورقائق القصدير، وخيوط، وشرائط أو ورق ملون، وشريط لاصق. برمجيات برنامج ثوني Thonny (وهو البيئة البرمجية التي سنستخدمها لكتابة الشيفرة بلغة بايثون). تثبيت برنامج ثوني على نظام تشغيل راسبيري باي يأتي برنامج ثوني مثبتًا مع نظام تشغيل راسبيري باي، المعروف سابقًا براسبيان Raspbian، ولكن قد تحتاج إلى تحديثه. انقر على الأيقونة في الزاوية العلوية اليسرى من الشاشة لفتح نافذة الطرفية Terminal، أو اضغط المفاتيح التالية معًا Ctrl+Alt+T، ثم اكتب الأمر التالي لتحديث نظام التشغيل وبرنامج ثوني: sudo apt update && sudo apt upgrade -y تثبيت برنامج ثوني على أنظمة التشغيل الأخرى يمكنك تثبيت ثوني على الحواسيب العاملة بنظام تشغيل لينكس، أو ويندوز، أو ماك، وذلك من الموقع الرسمي thonny.org. انقر على رابط التنزيل الموافق لنظام تشغيل حاسوبك من الزاوية العلوية اليمنى في الموقع، ثم انقر على الملفات بعد تنزيلها، فتظهر لك الرسالة التالية على نظام ويندوز: انقر على خيار المزيد من المعلومات "More info"، ثم على التشغيل على أي حال "Run anyway". التعرف على واجهة برنامج ثوني ستظهر لك الواجهة التالية عند فتح ثوني: يمكنك الكتابة بلغة بايثون في النافذة الرئيسية الكبيرة، ثم النقر على زر التشغيل الأخضر Run للتنفيذ، فستظهر لك رسالة لحفظ الملف قبل تشغيله. اكتب الأمر التالي وشغّله: print('Hello World!') تغيير السمة والخط يمكنك التحكم بلون الخط وحجمه وتغيير السمة المستخدمة في واجهة البرنامج، وذلك بالنقر على قائمة الأدوات Tools من الشريط أعلى الشاشة، ثم النقر على خيارات Options. انقر بعدها على نافذة الخط والسمة Theme & Font واختر نوع الخط والسمة التي تفضلها من النافذة المنسدلة، ثم انقر على زر موافق OK عند الانتهاء. ننصحك باختيار الخطوط البسيطة الواضحة والابتعاد عن الخطوط المزخرفة أو المشابهة لخط اليد لأنه قد تجعل القراءة أصعب. تشغيل مصباح الليد متعدد الألوان استخدمنا في مشروع سابق مصباح ليد ذو لون واحد، أما في مشروعنا هذا فسنستخدم مصباح LED متعدد الألوان يعرف باسم RGB LED، وسنوصّله مع لوحة راسبيري باي بيكو لنجعله يضيء باللون الذي نريده. معلومة: مصباح ليد RGB هو اختصار للألوان الثلاثة التالية: الأحمرRed، والأخضرGreen والأزرق Blue، إذ تُتيح لك هذه المصابيح التحكم في مقدار إشعاع كل لون باستخدام الشيفرة البرمجية. تمثيل الألوان بصيغة RGB يمكننا تمثيل الألوان بصيغة يفهمها الحاسوب وذلك بالتعبير عن نسبة ما يحتويه اللون من اللون الأحمر والأخضر والأزرق، إذ تخزن هذه القيم في بايت (ثمانية بتات) وتكون قيمتها من 0 إلى 255. إليك جدولًا يوضح بعض القيم اللونية: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } اللون الأحمر الأخضر الأزرق أحمر 255 0 0 أخضر 0 255 0 أزرق 0 0 255 أصفر 255 255 0 أرجواني 255 0 255 سماوي 0 255 255 كما يمكنك الاستعانة بمنتقي الألوان من موقع w3schools للحصول على القيم الموافقة للون الذي تريده. احرص على فصل لوحة راسبيري باي بيكو عن حاسوبك قبل توصيل العناصر الإلكترونية معها، وذلك تفاديًا لزيادة تحميل الدارة أو حدوث قصر للدارة والتسبب بإتلافها. توصيل المقاومات مع مصباح الليد متعدد الألوان باستخدام أسلاك التوصيل وشريط لاصق ستحتاج لتوصيل الليد متعدد الألوان مع المقاومات باستخدام الشريط اللاصق ما يلي: أربعة أسلاك توصيل نوع مقبس-مقبس، ويفضل أن تكون حمراء وخضراء وزرقاء اللون. مصباح ليد متعدد الألوان ذو مهبط مشترك. ثلاث مقاومات متماثلة القيمة حوالي 220 أوم (يمكن استخدام مقاومات بقيم تتراوح بين 100 أوم و 470 أوم). شريط عازل ملون أحمر وأخضر وأزرق إن وُجِد. مقص. الطريقة الصحيحة لتوصيل الليد يكون لمصباح الليد متعدد الألوان عادةً رجل طويلة هي رجل المهبط cathode والتي يجب توصيلها مع الأرض GND، ويكون ترتيب الأرجل على النحو التالي: الحمراء، ثم رجل المهبط الطويلة، ثم الخضراء، فالزرقاء. لاحظ أن أرجل المصباح غير ملونة فهي مصنوعة من المعدن، وإنما كل رجل مسؤولة عن لون معين. باعد بين الرجل الحمراء ورجل المهبط بحذر. توصيل المقاومة مع الرجل الحمراء للمصباح اثنِ أحد طرفي المقاومة حول الرجل الحمراء لمصباح الليد، ولفّه حولها ثلاث مرات. تثبيت المقاومة باستخدام الشريط العازل قُص قطعة من الشريط العازل والصقه على الجزء الملفوف من المقاومة ليساعد على تثبيتها. توصيل مقاومة مع الرجل الخضراء والزرقاء للمصباح صِل مقاومة مع كل من الرجلين الخضراء والزرقاء للمصباح كما في الخطوة السابقة، وثبتها بالشريط العازل. يُفضّل استخدام شريط مماثل للون الرجل، إن توفر. توصيل الأسلاك بالأرجل الأربعة للمصباح صِل رجل المهبط الطويلة للمصباح مع سلك توصيل، ثم صِل الأرجل الثلاثة الملونة للمصباح مع أسلاك التوصيل وذلك بإدخال الطرف الحر للمقاومة في القطعة البلاستيكية السوداء للسلك، كما ننصح بقص مقدار 1 سنتيمتر من رجل المقاومة لتسهيل عملية إدخالها في السلك، وبعزل أرجل المقاومات باستخدام الشريط العازل حتى لا تتلامس مع بعضها ولتثبيت الأسلاك، كما يمكنك اختيار ألوان أسلاك موافقة لألوان أرجل المصباح إذا توفر ذلك. يمكنك إتباع ما يلي لضمان ثبات التوصيلات: لَفُّ التوصيلات حول بعضها بإحكام. غلَف كامل الأسلاك بالشريط العازل لتخفيف الضغط على نقطة الاتصال. تجميع الأسلاك، أو المقاومات، ولفّها بالشريط العازل، لكن احرص على فصل أرجل المصباح والمقاومات عن الأسلاك، كما يلي: كما يمكنك لصق شريط شفاف على المصباح لبعثرة الضوء وتخفيف شدته. توصيل المقاومات مع مصباح الليد متعدد الألوان باستخدام مسدس اللحام وأنابيب الانكماش الحراري تنبيه: ستحتاج مساعدة أحد البالغين في تنفيذ هذه الخطوة وخاصةً عند استخدام مسدس اللحام heat shrink؛ إذ ستحتاج لتلحيم الليد متعدد الألوان مع المقاومات ما يلي: أربعة أسلاك توصيل ملونة نوع مقبس-مقبس، ويفضّل أن تكون حمراء وخضراء وزرقاء وسوداء اللون. ثلاث مقاومات متماثلة القيمة ( 70 أوم أو قيمة أعلى). مصباح ليد متعدد الألوان ذو مهبط مشترك. أسلاك قصدير، وأنابيب انكماش حراري ومسدس لحام. قطاعة أسلاك أو أداة تعرية stripper. إيجاد الرجل الحمراء للمصباح أوجد الرجل الحمراء للمصباح كما تعلمنا سابقًا، ثم باعد بين الأرجل بحذر، وثبت المصباح بيدك أو باستخدام أدوات مساعدة، أو ملاقط معدنية: وضع طبقة من القصدير على أرجل المصباح مرر إصبع القصدير ومسدس اللحام على كل من الأرجل لبضع ثوان حتى تحصل على طبقة متساوية من القصدير. وضع طبقة من القصدير على أرجل المقاومات كرّر الخطوة السابقة بتطبيق القصدير على طرفي المقاومات الثلاث. تلحيم المقاومات مع أرجل المصباح ضع رجل المصباح فوق رجل المقاومة ثم سخن القصدير باستخدام مسدس اللحام كي تلتحما معًا. ثم كرر هذه الخطوة على باقي الأرجل، عدا رجل المهبط الطويلة. توصيل الأسلاك مع أرجل المصباح قُصَّ نهاية سلك التوصيل لتحصل على طول مناسب ثم انزع مقدار 1 سنتيمتر من الغلاف البلاستيكي للسلك باستخدام قطّاعة الأسلاك لتحصل على السلك النحاسي، ثم أدخل أنبوب الانكماش الحراري في السلك، وكرّر العملية للأسلاك الأربعة. اصهر اصبع القصدير فوق النهاية النحاسية للسلك ثم لحّمها مع رجل المهبط الطويلة لمصباح الليد، واستخدم سلكًا أسود اللون إن أمكن، ثم لحّم الأسلاك الأخرى مع المقاومات الثلاث، كما يلي: حرّك أنابيب الانكماش الحراري للأعلى إلى أن تلامس قاعدة المصباح، لتغطي المقاومات ونقاط اللحام، ثم سخّنها باستخدام الحافة العريضة لمسدس اللحام حتى تنكمش وتشكل طبقةً إضافيةً من العزل. الآن، بعد أن أحكمنا أنابيب الانكماش على الأسلاك، أصبحنا جاهزين لتوصيل مصباح الليد متعدد الألوان مع أرجل الأغراض العامة GPIO للوحة راسبيري بيكو. توجد أربعة أرجل لمصباح الليد متعدد الألوان، رجل لكل لون، ورجل مهبط مشتركة تُوصل مع الأرض GND. امسك مصباح الليد واتبع الصورة أعلاه للتعرف على الأرجل من اليمين لليسار، ولاحظ أن الرجل الأولى مسؤولة عن اللون الأحمر Red، والثانية الطويلة هي رجل المهبط توَصّل مع الأرض GND، أما الثالثة فهي للون الأخضر Green، والرابعة للأزرق Blue. اقلب لوحة راسبيري بيكو على الوجه الآخر وابحث عن الأرجل ذات التسميات التالية: GP1، و GP2، و GP3، و GND، ثم صِل السلك الموصول مع الرجل الحمراء للمصباح مع الرجل GP1، ورجل المهبط (ذات القطبية السالبة) إلى رجل الأرضية GND، والرجل الخضراء مع الرجل GP2 والزرقاء مع GP3، كما هو موضح في الصورة التالية: صِل لوحة بيكو مع حاسوبك باستخدام كبل micro USB، ثم أنشئ ملفًا جديدًا في برنامج ثوني بالنقر على قائمة ملف File من شريط القوائم الموجود أعلى الشاشة، ثم سمّه "party_popper.py". أضف الشيفرة التالية لاستيراد التابع RGBLED من مكتبة picozero، وإنشاء المتغير rgb الذي سيُمَكّننا من التحكم في إضاءة مصباح الليد متعدد الألوان الذي وصلناه مع لوحة بيكو. from picozero import RGBLED from time import sleep rgb = RGBLED(red=1, green=2, blue=3) # إسناد أرقام للأرجل كما يمكنك كتابة السطر الأخير من الشيفرة السابقة باستخدام أرقام الأرجل كما يلي: RGBLED(1, 2, 3) أنشئ الدالة pop لتشغيل المصباح وجعله يضيء بلون معين، وطباعة رسالة ما في صدفة shell ثوني، لتستدل على أن الدالة قد استُدعيت، ثم استدعِ الدالة بكتابة ()pop: from picozero import RGBLED from time import sleep rgb = RGBLED(red=1, green=2, blue=3) # إسناد أرقام للأرجل def pop(): print("Pop") # في صدفة ثوني Pop اطبع rgb.color = (255, 0, 255) # اللون البنفسجي sleep(2) rgb.off() pop() # pop استدعاء الدالة أخيرًا، شغَل الملف لاختبار الشيفرة وتحقق أن المصباح يضيء لمدة ثانيتين باللون البنفسجي (إذ وضعنا القيمة العظمى للون الأحمر والأزرق)، وأن الرسالة "Pop" تظهر في صدفة ثوني عند تشغيل الشيفرة. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك وكيفية إصلاحها: تظهر رسالة مفادها أن تابع RGBLED غير معرف قد تظهر لك الرسالة التالية "RGBLED is not defined" التي تعني أن التابع RGBLED غير معّرف، ولحل هذه المشكلة تأكد من استيراد التابع من مكتبة picozero، وذلك بإضافة السطر التالي في بداية الشيفرة: from picozero import RGBLED لا تظهر رسالة Pop في الصدفة تحقق من خلو الشيفرة التي كتبتها من الأخطاء ومن مطابقتها للشيفرة في مقالنا. لا يضيء مصباح الليد متعدد الألوان قد تظهر رسالة "Pop" في الصدفة لكن المصباح لا يضيء، وهنا عليك اتباع ما يلي: التحقق من أن أسلاك التوصيل موصولة من الأرجل الصحيحة للمصباح ولوحة بيكو. التحقق من متانة التوصيلات. تبديل مصباح الليد للتأكد من أنه لم يحترق. لا يضيء مصباح الليد باللون البنفسجي تأكد أن أرجل المصباح موصولة مع الأرجل الصحيحة للوحة بيكو، ثم اختبر بالترتيب إضاءة المصباح بالألوان الثلاثة الأساسية عند تعديل القيم في الشيفرة لتصبح (255,0,0) للون الأحمر، و (0,255,0) للون الأخضر، و (0,0,255) للون الأزرق. قد تحتاج لتبديل أسلاك التوصيل. إذا أضاء المصباح بلون واحد، فلربما وصّلت رجل المهبط للمصباح مع الرجل المخصصة لذلك اللون على لوحة بيكو. ننصحك باستخدام تابع الطباعة print لطباعة الرسائل في الصدفة مما قد يسهل عملك عند تصحيح الأخطاء، كأن تطبع رسالةً مفادها أنك تختبر اللون الأحمر ("print ("testing the color red عند اختبارك للألوان. اختيار الألوان اختر اللون الذي تفضله مما يلي ثم عدل مركباته في الشيفرة: الأحمر: (255,0,0) الأخضر: (0,255,0) الأزرق: (0,0,255) السّماوي: (0,255,255) الأصفر: (255,255,0) الوردي: (255,0,50) عدّل على القيم لتحصل على الدرجة المناسبة من اللون المطلوب، وجرّب دمج اللون الأحمر والأخضر والأزرق معًا لتحصل على اللون الأبيض، كما يمكنك تخفيف سطوع اللون بتخفيض القيمة المعبرة عنه، فالقيمة (100,0,0) تعطي لونًا أحمرًا، لكنه أقل سطوعًا من (255,0,0). إضافة الصوت سنضيف في هذه الخطوة جرسًا إلكترونيًا غير فعّال ليصدر صوتًا كما في مفرقعات الحفلات، وسنكتب الشيفرة اللازمة لذلك. سنبدأ أولًا بالتعريف بالأجراس الإلكترونية الفعّالة active وغير الفعالة passive ثم سنجري الخطوات اللازمة لإضافة الصوت. معلومة: يوجد نوعان من الأجراس الإلكترونية، أحدها فعّال، والآخر غير فعّال، والفرق بينهما هو أن الجرس الفعّال يصدر الصوت نفسه دائمًا، أما غير الفعّال فيمكنه إصدار عدة نغمات، ويتطلب الوصل مع مصدر طاقة وإشارة معينة لعزف النغمة المختارة. الأجراس الإلكترونية غير الفعالة الأجراس الإلكترونية ومكبرات الصوت ينشأ الصوت عن الاهتزاز والحركة، فكل ما يؤدي لتحريك جزيئات الهواء يمكن أن يصدر صوتًا. يعتمد مبدأ عمل الأجهزة الميكانيكية Mechnical عادةً على طرق قطعتين معدنيتين ببعضها، فالجرس يهتز عند قرعه مما يسبب تحريك الهواء حوله. تعتمد الأجهزة الكهروميكانيكية Electromechnical على الكهرباء لتحريك ملف من الأسلاك والذي بدوره يُحّرك حاجزًا بسرعة كبيرة مما يؤدي إلى توليد الصوت عن طريق تحريك الهواء حوله. تعتمد الأجهزة الكهروانضغاطية Piezoelectric مبدأ تغيير حجم بعض المواد عند تطبيق جهد عليها، إذ تُغيَر قيمة الجهد بسرعة فيتغير حجم المادة بسرعة كبيرة فيتحرك الهواء حولها. عندما تتحرك المادة بسرعة كبيرة ينتج عنها أصوات حادة النغمة، وعندما تتحرك مسافة كبيرة تنتج أصواتًا مرتفعة النغمة. مكبرات الصوت والسماعات تندرج مكبرات الصوت والسمّاعات ضمن الأجهزة الكهروميكانيكية، وتشمل مجموعةً واسعةً من الأجهزة بدءًا بمكبرات الصوت الضخمة المستخدمة في الحفلات الموسيقية، وانتهاءً بسمّاعات الرأس الشخصية. عليك تغيير الجهد المطبق على مكبر الصوت باستمرار لتشغيله، وكلما غيرت الجهد بسرعة أكبر (أي غيرت تردد الإشارة frequency) كلما حصلت على صوت أكثر حدة، أما للحصول على صوت مرتفع فعليك رفع قيمة الجهد (أي مطال الإشارة amplitude). نستخدم الكبل ذو مقبس السمّاعات headphone jack التالي لتوصيل مكبرات الصوت والسمّاعات مع باقي الأجهزة. يجب عليك تحديد التردد الذي سيعمل ويهتز به مكبر الصوت، للحصول على نغمة الصوت التي تريدها. الأجراس الإلكترونية تندرج الأجراس الإلكترونية Buzzers ضمن الأجهزة الكهروانضغاطية، ويدعى الجرس العادي بالجرس غير الفعّال، ومبدأ عمله مماثل لعمل مكبرات الصوت؛ إذ يلعب تردد تغير الجهد، وقيمة هذا التغير دورًا في تغيير نغمة الصوت ومستوى الصوت. يجب عليك تحديد التردد الذي سيهتز به الجرس الإلكتروني غير الفعّال، للحصول على نغمة الصوت التي تريدها؛ أما الأجراس الفعّالة فتحتوي على مكونات إضافية تثبت تردد العمل فيها، ولذلك يمكنك فقط تشغيلها أو إطفاءها ولا يمكنك تغيير النغمة. يوضح القسم الأيمن من الصورة التالية الأجراس غير الفعّالة. أولًا، لاحظ أن الجرس له رجل طويلة لها قطبية موجبة (+) ورجل قصيرة قطبيتها سالبة (-)، كما في مصباح الليد؛ أما إذا كانت الأرجل متشابهةً في الطول فعليك البحث عن إشارة الموجب (+) الموجودة أعلى الجرس. ثانيًا، صِل الجرس مع لوحة بيكو باستخدام سلكي توصيل نوع مقبس-مقبس، وذلك بوصل الرجل الطويلة للجرس مع الرجل GP5 والقصيرة مع أحد أرجل الأرضية GND. معلومة: يمكن للبشر سماع الأصوات التي تتراوح تردداتها بين 20 هرتز (الأصوات المنخفضة جدًا) إلى الترددات من رتبة 20000 هرتز (الأصوات المرتفعة جدًا)، وبإمكان الأطفال واليافعين سماع الأصوات المرتفعة أفضل من كبار السن، كما أن النغمات الموسيقية تتوافق مع ترددات صوتية معينة؛ فعلى سبيل المثال، توافق العلامة C4 (العلامة سي الوسطى) التردد 262 هرتز، إذ تُقاس الترددات بواحدة الهرتز Hertz أو اختصارًا Hz وهي عدد الهزات في الثانية. إذًا، سيؤدي إرسال الإشارة الصحيحة للجرس إلى اهتزازه وفق التردد الصحيح وبالتالي سنحصل على النغمة الموسيقية الموافقة. ثالثًا، عدّل الشيفرة المكتوبة في الملف "party_popper.py" لتبدو كما يلي، ثم شغّلها لاختبار عمل الجرس: from picozero import RGBLED, Speaker from time import sleep rgb = RGBLED(red=1, green=2, blue=3) # إسناد أرقام للأرجل speaker = Speaker(5) def pop(): print("Pop") # اطبع ما بين القوسين في صدفة ثوني rgb.color = (255, 0, 255) # اللون البنفسجي speaker.play(262, 1) # ذات التردد 262 لثانية واحدة C4 اعزف العلامة rgb.off() pop() لاحظ أننا استوردنا التابع Speaker من المكتبة في السطر الأول. رابعًا، تمتع بإنشاء مزيج من الأصوات والأضواء ,التي ستصدرها دارتنا عند تشغيلها، إذ أنشأنا في مثالنا صوتًا احتفاليًا "تا-دا Ta-da" يَصدُر بالتزامن مع وميض الليد باللون البنفسجي. خامسًا، عدّل على الشيفرة لتبدو كما يلي: from picozero import RGBLED, Speaker from time import sleep rgb = RGBLED(red=1, green=2, blue=3) # إسناد أرقام للأرجل speaker = Speaker(5) def pop(): print("Pop") # اطبع ما بين القوسين في صدفة ثوني rgb.color = (255, 0, 255) # Purple speaker.play(262, 0.1) # ذات التردد 262 لمدة 0.1 ثانية C4 اعزف العلامة rgb.color = (0, 0, 0) # المصباح مطفىء sleep(0.1) rgb.color = (255, 0, 255) # اللون البنفسجي speaker.play(262, 0.6) # ذات التردد 262 لمدة 0.6 ثانية C4 اعزف العلامة rgb.off() pop() سادسًا، شغّل الشيفرة وتحقق أن المصباح والجرس الإلكتروني يعملان معًا. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: تظهر رسالة مفادها أن تابع مكبر الصوت Speaker غير معرف أضف Speaker , على نهاية السطر الأول من الشيفرة. لا تظهر رسالة Pop في الصدفة تحقق من خلو الشيفرة التي كتبتها من الأخطاء ومن مطابقتها للشيفرة في مقالنا. لا يضيء مصباح الليد متعدد الألوان عليك اتباع ما يلي: التحقق من أن أسلاك التوصيل موصولة مع الأرجل الصحيحة للمصباح وللوحة بيكو. التحقق من متانة التوصيلات. تبديل مصباح الليد للتأكد من أنه لم يحترق. لا يصدر الجرس الإلكتروني صوتا لحل المشكلة عليك اتباع ما يلي: التحقق من أن أسلاك التوصيل موصولة مع الأرجل الصحيحة للجرس. التحقق من متانة التوصيلات. التحقق من استخدام جرس إلكتروني غير فعّال. التحقق من استخدام ترددات ضمن مجال الترددات المسموعة (من 15 هرتز إلى 15000 هرتز). تشغيل الدارة سنعمل في هذه الخطوة على إنشاء محاكاة بسيطة للمبدّل الإلكتروني باستخدام سلكي توصيل، وذلك لتشغيل دارتنا وإطلاق مفرقعات الحفلة. معلومة: تُقَام عروض الصوت والضوء Light and sound shows في الاحتفالات في جميع أنحاء العالم، وتكون ممتعةً وتفاعليةً وباستخدام أدوات مستدامة sustainable وقابلة لإعادة الاستخدام reusable، مثل الطائرات دون طيّار Drones، والليزر، وعروض الإسقاط، خلافًا لما يُستَخدم سابقًا من أغراض استهلاكية غير صديقة للبيئة، مثل مفرقعات الحفلات والألعاب النارية. أولًا، جهّز سلكي توصيل نوع دبوس- مقبس لاستخدامهما مثل مبدّل يدوي، ثم صِل السلك الأول مع الرجل GP18 والثاني مع رجل الأرض GND القريبة. معلومة: توجد طريقتان لتشغيل الشيفرة المعتمدة على دخل من عنصر خارجي (مثل المبدّلات أو الحساسات)، الأولى هي بإنشاء حلقة تكرار والتحقق من حالة الدخل باستمرار وتدعى هذه العملية باسم الجسّ Polling، واستخدمناها سابقًا في مشروع اليراعات الوامضة باستخدام الليد؛ بينما تعتمد الطريقة الثانية على استدعاء دالة عند تغير حالة الدخل، باستخدام أحداث events تتحسس للتغيرات ومن ثم تتعامل معها. ثانيًا، عدّل على الشيفرة كي تستدعي مكتبة picpzero الدالة pop كلما فُتِح المبدّل (أي فصلنا سلكي التوصيل عن بعضهما)، ولا تنسى إدراج تابع المبدّل Switch من المكتبة في السطر الأول: from picozero import RGBLED, Speaker, Switch from time import sleep rgb = RGBLED(red=1, green=2, blue=3) # إسناد أرقام للأرجل pull = Switch(18) speaker = Speaker(5) def pop(): print("Pop") # اطبع ما بين القوسين في صدفة في ثوني rgb.color = (255, 0, 255) # اللون البنفسجي speaker.play(262, 0.1) # لمدة 0.1 ثانية C4 اعزف العلامة rgb.color = (0, 0, 0) # # المصباح مطفىء sleep(0.1) rgb.color = (255, 0, 255) # اللون البنفسجي speaker.play(262, 0.6) # لمدة 0.6 ثانية C4 اعزف العلامة rgb.off() pull.when_opened = pop # استدعاء الدالة عند فتح المبدّل عند استخدام الحدث when_opened تُستدعى الدالة pop والتي لا يمكن مقاطعتها إلى أن تكمل عملها، وهذا الأنسب لمشروعنا؛ إذ نود تشغيل المؤثرات الصوتية والضوئية عند فتح المبدّل وتشغيل دارتنا، أي تشغيل مفرقعات الحفلة. احرص على عدم إضافة الأقواس ( ) في نهاية السطر pull.when_opened = pop إذ أن مهمة هذا السطر هو استدعاء الدالة pop من مكتبة picozero كلما تحقق الحدث when_opened. ثالثًا، شغّل البرنامج، ثم افصل سلكي التوصيل عن بعضهما لاختبار عمل المصباح والجرس الإلكتروني عند فتح المبدّل. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك في هذه الخطوة وكيفية إصلاحها: تظهر رسالة مفادها أن تابع المبدل Switch غير معرف أضف Switch , على نهاية السطر الأول من الشيفرة. تعمل الشيفرة قبل فصل المبدل تحقق من أن أسلاك المبدّل موصولة مع الأرجل الصحيحة على لوحة بيكو. تحقق من متانة توصيل أسلاك المبدّل وأن الأسلاك بحالة جيدة. تحقق من استبدال السطر ()pop بالسطر pull.when_opened = pop. لا تظهر رسالة Pop في الصدفة تحقق من خلو الشيفرة التي كتبتها من الأخطاء ومن مطابقتها للشيفرة في مقالنا. لا يضيء مصباح الليد متعدد الألوان أو أن الجرس الإلكتروني لا يعمل تحقق من أن أسلاك التوصيل موصولة من الأرجل الصحيحة للمصباح ولوحة بيكو. تحقق من متانة التوصيلات. بدِّل مصباح الليد للتأكد من أنه لم يحترق. تزيين المبدل سنصنع غلافًا خارجيًا مزخرفًا للمبدّل من الورق المقوى ورقائق القصدير والغراء، لنحصل على نتيجة مشابهة لما يلي: بعد أن تأكدنا من عمل الدارة، سنضيف مظهرًا مزخرفًا على المبدّل اليدوي، إليك ما سنحتاج إليه: مقص. ورق مقوى. رقائق القصدير. غراء وشريط لاصق. شرائط ملونة وورق ملون. قلم رصاص ومسّطرة (اختياري). أولًا، قُصَّ الورق المقوى إلى ثلاثة مستطيلات متساوية الحجم، استخدمنا الأبعاد التالية 3سم × 5سم؛ وإذا لم يتوفر لديك قلم رصاص ومسّطرة، قُص المستطيل الأول ثم ضعه فوق الورق المقوى وقُصَّ حوله للحصول على مستطيلات متماثلة. ثانيًا، قُص مستطيلًا صغيرًا في منتصف المستطيل الأول، واحتفظ به لاستخدامه لاحقًا. ثالثًا، قُصّ قطعًا من ورق القصدير بحجم المستطيلات الكبيرة، ثم الصقها عليها باستخدام الغراء، واحرص على عدم وضع الغراء على الوجه الخارجي لورق القصدير حتى لا تتأثر التوصيلات لاحقًا. رابعًا، قُصَّ أطراف المستطيل الصغير للحصول على شكل مدبب أو بشكل حرف V، ثم قلّم الأطراف بمقدار بضع ميليمترات كي يتسع المستطيل الصغير في الفتحة. خامسًا، غلّف المستطيل الصغير بكامله بورق القصدير، واحرص على استخدام ورقة قصدير واحدة، إذ ستسمح هذه القطعة بمرور التيار عند إغلاق المبدّل. سادسًا، افصل لوحة بيكو عن حاسوبك، وافصل سلكي المبدّل الموصولين مع الرجل GP18 ورجل الأرضية GND، ثم استخدم الشريط اللاصق لتثبيتها على الوجه العلوي للمستطيلات. احرص على أن يكون الدبوس المعدني للسلك ملامسًا لورق القصدير، وأن يكون الجزء البلاستيكي الأسود ملامسًا حافة المستطيل. أضف مزيدًا من الشريط اللاصق لتثبيت السلك ومنع انفكاكه عن طريق الخطأ. سابعًا، أعد توصيل الأسلاك مع الرجل GP18 ورجل الأرض GND، ثم صِل لوحة بيكو بحاسوبك وشغّل الشيفرة. افتح المبدّل وأغلقه عن طريق ملامسة المستطيلات المغطاة بالقصدير مع بعضها. يجب أن يعمل مصباح الليد والجرس عند فتح المبدّل. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك وكيفية إصلاحها: يستمر الجرس والمصباح بالعمل تحقق من أسلاك التوصيل، وتأكد أن جميع العناصر متصلة ببعضها جيدًا. احرص على عدم ملامسة القصدير، إذ أن جسمك يعد ناقلًا للتيار وقد يعمل على إغلاق الدارة أو فتحها. إذا استمرت هذه المشكلة، فعليك إعادة قص المستطيلات وتغليفها بالقصدير، فقد تكون المشكلة منها. لا تعمل المفرقعات عند فتح المبدل تأكد أن أسلاك التوصيل موصولة مع الأرجل الصحيحة. تحقق من متانة توصيل الأسلاك بالأرجل على لوحة بيكو، ومتانة توصيلها بالقصدير، إذ يجب أن تكون جميع العناصر متصلة ببعضها جيدًا. شغّل الشيفرة ثم أغلق المبدّل وافتحه وتأكد أن الحدث when_opened يتولد، وتأكد أن الشيفرة التي كتبتها مطابقة للشيفرة في مثالنا. ثامنًا، افصل لوحة بيكو عن حاسوبك، وافصل سلكي المبدّل الموصولين مع الرجل GP18 ورجل الأرضية GND، ثم ادهن بعض الغراء على المستطيل الذي فرّغنا منتصفه (الموجود في يسار الصورة) والصقه مع المستطيل المغطى بالقصدير (يمين الصورة)، وبهذا نكون أنشأنا حاجزًا بين طبقتي القصدير، ووفرنا مساحةً لإدخال المستطيل الصغير ضمنها لإغلاق المبدّل بسلاسة وإطلاق المفرقعات عند فتحه. يجب أن تحصل على الشكل التالي، واحرص على ألا يتلامس القصدير الموجود على حواف المستطيلات، وقُصّه إن لزم الأمر: اختبر الدارة باتباع ما يلي: أعد توصيل لوحة بيكو مع حاسوبك، ثم أعد توصيل الأسلاك مع الرجل GP18 ورجل الأرض GND. أدخل المستطيل الصغير داخل المبدّل (المستطيلين) لإغلاقه. شغّل الشفرة ثم اسحب المستطيل الصغير لفتح المبدّل وإطلاق المفرقعات. إذا لم تعمل الدارة وتنطلق المفرقعات عند فتح المبدّل، فعليك التأكد من عدم وجود القصدير على حواف المستطيلات، قُصّه إن وُجِد، وتأكد أنك ضغط على زر التشغيل Run لتشغيل الشيفرة. يمكنك إضافة قصاصات ملونة، أو شريطًا ملونًا على المستطيل الصغير لإضفاء بعض الحيوية عليه. ترقية المشروع بإمكانك ترقية المشروع حين يتسنى لك ذلك، واستخدامه للاحتفال كلما نفّذت مشروعًا أو تعلمت مهارةً جديدة، أو كلما أصلحت خطأً ما. إليك بعض الاقتراحات لترقية مشروعك: تعديل الشيفرة وإضافة مزيدٍ من الأضواء والأصوات، استخدم الترددات ضمن المجال (250 هرتز- 500 هرتز) للحصول على نغمات مناسبة. اصنع غلافًا خارجيًا من الورق للجرس ولمصباح الليد، كأن تضعهما ضمن مخروط ورقي. زيّن المبدّل، واجعله أكثر متانة. أعد تشكيل الدارة بما يتناسب مع مناسبة معينة؛ كأن تغير لون إضاءة المصباح وفقًا للون علم بلدك أو فريقك الرياضي المفضل، وحاول الحصول على نغمة مناسبة للحدث. يمكنك الاطلاع على الشيفرة النهائية للمشروع من rpf.io. الخاتمة تهانينا، فقد أتممت مشروع تصميم محاكاة لمفرقعات الحفلات باستخدام لوحة راسبيري باي بيكو، ويمكنك تنزيل كامل شيفرة المشروع من مجلد party-popper-en-solutions. ننصحك بتنفيذ مشروع القلب النابض باستخدام لوحة راسبيري باي بيكو ومقاومة متغيرة في خطوتك التالية. إذا واجهت مشاكلًا عند تنفيذ هذا المشروع، فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Party popper من الموقع الرسمي لراسبيري باي. اقرأ أيضًا المقال السابق: إنشاء مصباح ليد يومض وفق نمط معين باستخدام حاسوب راسبيري باي بيكو تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي تجميع راسبيري باي والتحضير لاستعماله ربط راسبيري باي بعناصر إلكترونية وبرمجتها باستخدام سكراتش وبايثون
  12. سنتعلم في هذا المقال كيفية استخدام حاسوب راسبيري باي بيكو Raspberry Pi Pico لبناء مصباح ليد LED يومض مثل حشرة اليراعة، وذلك بتعلُّم كيفية توصيل المصباح إلى مبدّل Switch للتحكم بالإضاءة. لنحصل على نتيجة مشابهة لما يلي: راقب نمط الوميض المتكرر لمصباح الليد. معلومة: المتحكمات المُصغرّة Microcontrollers هي حواسيب صغيرة جدًا تُشَغّل الشيفرات البرمجية والتفاعل مع العناصر الإلكترونية، مثل مصابيح الليد والقواطع الإلكترونية، وتُصَمم عادةً لتنفيذ مهمة واحدة لذلك ليس لها نظام تشغيل. يُعد المتحكم المًصغر راسبيري باي بيكو Raspberry Pi Pico خيارًا مناسبًا للمبتدئين والخبراء أيضًا لتطوير عناصر ومنتجات إلكترونية نظرًا لتكلفته المنخفضة. ستتعلم في هذا المشروع ما يلي: كيفية التعامل مع حاسوب راسبيري باي بيكو. توصيل مصباح ليد ومبدّل إلكتروني مع أرجل لوحة راسبيري باي باستخدام أسلاك التوصيل. برمجة حاسوب راسبيري باي بيكو باستخدام برنامجي مايكروبايثون MicroPython وبرنامج ثوني Thonny. متطلبات المشروع سنعرض في الآتي المتطلبات اللازم توفرها للعمل على هذا المشروع عتاد لوحة حاسوب راسبيري باي بيكو مع أرجل مثبتة عليها. كبل USB لنقل البيانات ذو نهايات من النوع USB A و micro USB. مصباح ليد باللون الذي تفضله. مقاومة resistor بقيمة 100 أوم، تسمى واحدة المقاومة أوم ويرمز لها بالرمز التالي Ω ( يمكن استعمال أي مقاومة ذات قيمة تتراوح ضمن المجال 75Ω -220Ω). أسلاك توصيل ذات نهايات مقبس-مقبس socket-socket (عدد 3). أسلاك توصيل ذات نهايات دبوس-مقبس pin-socket (عدد 1). شريط لاصق شفاف (اختياري). أسلاك التوصيل تُستخدم أسلاك التوصيل لنقل التيار الكهربائي بين العناصر الإلكترونية عند إنشاء النماذج الأولية من المشاريع لسهولة توصيلها مع العناصر وفصلها، دون الحاجة إلى تلحيمها (إنشاء توصيلات دائمة عن طريق صهر المعدن). توجد ثلاثة أنواع من أسلاك التوصيل تبعًا لنهاياتها، وهي: أسلاك توصيل ذات نهايات مقبس-مقبس socket-socket. أسلاك توصيل ذات نهايات دبوس-مقبس pin-socket. أسلاك توصيل ذات نهايات دبوس-دبوس pin-pin. نهاية الدبوس هي قطعة معدنية قصيرة تخرج من الطرف البلاستيكي الأسود للسلك، ويمكن إدخالها في طرف المقبس، أو لوحة التجارب، وهي على الشكل التالي: نهاية المقبس تبدو نهاية المقبس مثل قطعة بلاستيكية سوداء تحتوي ثقب يمكن إدخال نهاية الدبوس فيه أو إدخال أرجل العناصر الإلكترونية: شراء أسلاك التوصيل قد تلاحظ عند شرائك أسلاك التوصيل أنها تُسمى ذكر - ذكر، أو أنثى - أنثى، أو ذكر - أنثى، وهي تسميات قديمة إذ يدل الذكر على نهاية الدبوس، والأنثى على نهاية المقبس، ويجب استخدام مصطلحي الدبوس والمقبس لوصف أسلاك التوصيل لأنها أكثر شمولًا. برمجيات برنامج ثوني: وهو البيئة البرمجية التي سنستخدمها لكتابة الشيفرة بلغة بايثون. تثبيت برنامج ثوني على نظام تشغيل راسبيري باي يأتي برنامج ثوني مثبتًا مع نظام تشغيل راسبيري باي، المعروف سابقًا براسبيان Raspbian، لكن قد تحتاج إلى تحديثه. انقر على الأيقونة في الزاوية العلوية اليسرى من الشاشة لفتح نافذة الطرفية Terminal، أو اضغط المفاتيح التالية معًا Ctrl+Alt+T. ثم اكتب الأمر التالي لتحديث نظام التشغيل وبرنامج ثوني: sudo apt update && sudo apt upgrade -y تثبيت برنامج ثوني على أنظمة التشغيل الأخرى يمكنك تثبيت ثوني على الحواسيب العاملة بنظام تشغيل لينكس، أو ويندوز، أو ماك، وذلك من الموقع الرسمي thonny.org. انقر على رابط التنزيل الموافق لنظام تشغيل حاسوبك من الزاوية العلوية اليمنى في الموقع، وانقر على الملفات بعد تنزيلها، قد تظهر لك الرسالة التالية على نظام ويندوز: انقر على خيار المزيد من المعلومات "More info" ثم على التشغيل على أي حال "Run anyway". التعرف على واجهة برنامج ثوني عند فتح ثوني، ستظهر لك الواجهة التالية: يمكنك الكتابة بلغة بايثون في النافذة الرئيسية الكبيرة، ثم النقر على زر التشغيل الأخضر Run للتنفيذ، ستظهر لك رسالة لحفظ الملف قبل تشغيله. اكتب الأمر التالي وشغّله: print('Hello World!') تغيير السمة والخط يمكنك التحكم بلون الخط وحجمه وتغيير المظهر المُستخدم في واجهة البرنامج، وذلك بالنقر على قائمة الأدوات Tools من الشريط أعلى الشاشة، ثم النقر على خيارات Options. انقر بعدها على نافذة الخط والسمة Theme & Font واختر نوع الخط والسمة التي تفضلها من النافذة المنسدلة، ثم انقر على زر موافق OK عند الانتهاء. ننصحك باختيار الخطوط البسيطة الواضحة والابتعاد عن الخطوط المزخرفة أو المشابهة لخط اليد لأنها تجعل القراءة أصعب. تجهيز لوحة راسبيري باي بيكو للعمل سنعمل في هذه الخطوة على توصيل لوحة راسبيري باي بيكو وإعداد برنامج مايكرو بايثون. معلومة: مايكرو بايثون أو MicroPython باللغة الإنجليزية، هو مُفَسِر للغة البرمجة بايثون مخصص للمعالجات المصغرة المماثلة لراسبيري باي بيكو، ويمكن بواسطته كتابة الشفرة بلغة بايثون للتخاطب مع العناصر الإلكترونية. أولًا، صِل الطرف الصغير لكبل USB إلى لوحة راسبيري باي. ثانيًا، صِل الطرف الآخر للكبل مع حاسوبك المكتبي أو المحمول. ثالثًا، افتح برنامج ثوني، ولاحظ ما هو الإصدار المستخدم من بايثون بقراءة النص الموجود في الزاوية السفلية اليمنى من الشاشة، انقر على النص واختر "MicroPython (Raspberry Pi Pico)‎"، إذا لم يكن هذا الخيار محددًا. سيطالبك ثوني بتثبيت برنامج MicroPython على حاسوب راسبيري باي بيكو إذا لم تستخدمه مسبقًا، فقط انقر على زر التثبيت Install. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك عند تثبيت مايكرو بايثون وكيفية إصلاحها: ظهور رسالة خطأ أثناء تثبيت البرنامج قد تظهر لك رسالة خطأ أثناء تثبيت البرنامج، عندها عليك اتباع ما يلي: افصل لوحة راسبيري باي بيكو، ثم أعد توصيلها، وأوقف عملية التثبيت بالنقر على زر التوقف Stop ثم أعد تشغيلها. حدوث مشكلة أثناء تثبيت البرنامج قد تحدث مشكلة ما أثناء تثبيت البرنامج وتفقد الاتصال بلوحة راسبيري بيكو. لذلك، تأكد أولًا أن راسبيري باي بيكو موصولٌ مع حاسوبك بواسطة كبل micro USB، ثم انقر على القائمة الموجودة أسفل الزاوية اليمنى في واجهة ثوني، ستظهر لك نافذة توضح المُفَسِرات interpreters المتاحة: إذا لم تجد راسبيري بيكو وبرنامج مايكرو بايثون ضمن القائمة، يجب عليك إعادة توصيل لوحة راسبيري باي بيكو مع النقر على زر BOOTSEL لتثبيتها مثل جهاز تخزين، ثم إعادة تثبيت برنامج مايكرو بايثون، كما في الخطوة السابقة. فقدان الإتصال مع لوحة راسبيري باي بيكو قد تفقد الإتصال بلوحة راسبيري باي بيكو بعد إكمال تثبيت البرنامج، حينها عليك التأكد من سلامة كبل micro USB الذي تستخدمه، وأنه مخصص لنقل البيانات وليس مخصصًا لنقل الطاقة فقط، جرّب تبديل الكبل كحلٍ أخير؛ وإذا لم تنجح أي من الحلول السابقة ولا زلت لا تستطيع الإتصال بلوحة راسبيري باي بيكو، فقد يكون العطل من اللوحة ذاتها. ستحتاج لتثبيت مكتبة بيكو زيرو picozero، وهي إحدى مكتبات مايكرو بايثون المخصصة لمستخدمي راسبيري باي بيكو المبتدئين. رابعًا، انقر على قائمة الأدوات Tools من شريط القوائم في برنامج ثوني، ثم انقر على خيار إدارة الحزم Manage Packages لإضافة حزمة بيكو زيرو. خامسًا، ستظهر لك نافذة إدارة الحزم التالية، اكتب "picozero"، ثم انقر على زر البحث Search on PyPi: انقر على picozero من نتائج البحث ثم انقر على زر التثبيت Install. أغلق النافذة عند انتهاء عملية التثبيت، ثم أغلق برنامج ثوني وافتحه مجددًا. إذا واجهت مشاكل عند تثبيت مكتبة "picozero" في ثوني، يمكنك تنزيل ملف المكتبة ثم حفظه على حاسوب راسبيري باي بيكو. تنزيل حزمة picozero باستخدام حاسوب آخر إذا لم يتوفر لديك اتصالًا بالإنترنت على الحاسوب الموصول مع لوحة راسبيري باي بيكو، أو أنك لا تمتلك صلاحيةً لتثبيت الحزم باستخدام ثوني، فيمكنك تنزيل حزمة "picozero" من حاسوب آخر ثم نقلها باستخدام وحدة تخزين USB إلى راسبيري باي بيكو، وذلك بإتباع الخطوات التالية: انتقل إلى مستودع بيكو زيرو على غيت هب GitHub من خلال المتصفح المفضّل لديك. انقر بزر الفأرة الأيمن على الصفحة ثم انقر على خيار حفظ الصفحة باسم Save page as،واختر أين تريد حفظ الملف وأبقِ على اسمه كما هو "picozero.py"، وإذا ظهر لك اسم الملف بصيغة ملف نصي "picozero.txt"، غَيّر لاحقته يدويًا إلى "picozero.py" واختر النوع جميع الملفات All files كما هو موضح في الصورة التالية: أو يمكنك رفع ملف Thonny والذي تجده أيضًا في مرفقات المشروع في نهاية المقال. الآن، أنت أمام خيارين، إما أن تستخدم مدير الملفات في ثوني، أو أن تنسخ الملف وتلصقه في ثوني. نقل الملفات باستخدام مدير الملفات في ثوني أولًا، صِل لوحة راسبيري باي بيكو مع حاسوبك باستخدام كبل microUSB. ثانيًا، افتح ثوني من قائمة التطبيقات، ثم انقر على قائمة العرض View من شريط الأدوات، واختر عرض الملفات Files. ثالثًا، استعن بالمسار للانتقال للمجلد الذي حفظت فيه ملف "picozero.py". رابعًا، انقر بزر الفأرة الأيمن على ملف "picozero.py"، ثم انقر على خيار رفع إلى المجلد الجذر / Upload to من القائمة. أصبح لديك الآن نسخة من مكتبة "picozero.py" على حاسوب راسبيري باي بيكو. نسخ الملفات باستخدام ثوني أولًا، حدّد كامل النص في ملف "picozero.py" عن طريق الضغط على مفتاحي Ctrl + a من لوحة المفاتيح، ثم اضغط على مفتاحي Ctrl +c لنسخه. ثانيًا، افتح واجهة ثوني وانقر على النافذة الفارغة "untitled"، ثم اضغط على مفتاحي Ctrl +v للصق محتوى مكتبة "picozero.py" إلى الملف. ثالثًا، احفظ الملف بالنقر على مفتاحي Ctrl +s ثم انقر على خيار الحفظ في بيكو Raspberry Pi Pico. رابعًا، سمِّ الملف "picozero.py"، ثم انقر على زر موافق OK. اختبار لوحة راسبيري باي بيكو سنختبر في هذه الخطوة جاهزية لوحة راسبيري باي بيكو للعمل، وذلك عن طريق اختبار مصباح الليد الصغير الموجود أعلى اللوحة، فإذا أضاء فهذا يعني أن اللوحة مُعَّدة وجاهزة للعمل. معلومة: "مصباح ليد" أو LED هو اختصار لاسم العنصر الإلكتروني Light-emitting Diode أي الثنائي الباعث للضوء، ويعتمد هذا المصباح على مبدأ التألق الكهربائي Electroluminescence، إذ تضيئ بعض المواد عند مرور التيار الكهربائي عبرها. يكون لمصباح الليد طرفان، أحدهما طويل وهو يمثل القطب الموجب (+)، والطرف القصير يمثل القطب السالب (-)، كما يمكنك التمييز بين القطبين بأن الطرف السالب هو الطرف الأقرب للحافة المسطحة للمصباح. المس الحافة بإصبعك لتلاحظ الفرق. من الضروري الانتباه وتوصيل الليد وفق القطبية الصحيحة لأنه لن يضيء عند عكسها. أولًا، لاحظ وجود الليد على لوحة بيكو، بجانب منفذ USB، كما هو موضح في الصورة التالية: ثانيًا، افتح برنامج ثوني وأنشئ ملفًا جديدًا فيه، وذلك بالنقر على قائمة ملف File، ثم النقر على خيار إنشاء ملف جديد New، ولاحظ أنك ستحصل على مساحة عمل جديدة فارغة. تُتيح لنا مكتبة "picozero" المثبتة مسبقًا، برمجة العناصر الإلكترونية الموصولة مع لوحة بيكو، لكن يجب علينا التصريح عن العناصر التي سنستخدمها في بداية الشيفرة البرمجية لاستيرادها من مكتبة "picozero". ثانيًا، اكتب الشيفرة التالية في مساحة العمل الفارغة في ثوني لاستيراد عنصر الليد من مكتبة picozero: from picozero import pico_led pico_led.on() ثالثًا، انقر على قائمة ملف File ثم اختر حفظ باسم Save as وانقر على خيار الحفظ في حاسوبك This computer وليس الحفظ في راسبيري باي بيكو. اختر مكانًا مناسبًا لحفظ الملف وسمّه "firefly.py". رابعًا، حان الآن وقت اختبار لوحة راسبيري باي بيكو، لذلك انقر على زر التشغيل الأخضر (زر دائري فيه مثلث أبيض) في ثوني، لتنفيذ الشيفرة، إذ يجب أن يضيء الليد على لوحة بيكو دليلًا على سلامتها. تصحيح الأخطاء إليك بعض المشاكل التي قد تواجهك وكيفية إصلاحها: زر التشغيل غير مفعل قد يظهر زر التشغيل باللون الرمادي، أي أنه غير مفعّل، في هذه الحالة عليك اتباع مايلي: انقر على زر التوقف STOP الأحمر. تأكد أن لوحة راسبيري باي بيكو موصولة مع حاسوبك بواسطة كبل USB. انقر على أيقونة مايكرو بايثون (أو راسبيري باي بيكو) الموجودة في الزاوية السفلية اليمنى في واجهة ثوني، لإعادة الاتصال. افصل كبل USB ثم أعد توصيله. يظهر البرنامج رسالة خطأ في الشيفرة تحقق من الشيفرة التي كتبتها وتأكد أنها مطابقة للشيفرة في مثالنا. لا يوجد خطأ في الشيفرة ولكن الليد لا يضيء غيّر كبل USB وتأكد أنك تستخدم كبلًا مخصصًا لنقل البيانات USB data؛ وإذا كان لديك لوحة راسبيري باي بيكو أخرى، جرب تبديل اللوحة. لاحظ أن الليد سوف يظل مضيئًا حتى تكتب شيفرةً أخرى لإطفائه، أو إلى أن تفصل لوحة بيكو. خامسًا، اكتب الشيفرة التالية لاستيراد التابع sleep لإيقاف الليد عن العمل لمدة ثانية واحدة، ثم إطفائه. from picozero import pico_led from time import sleep pico_led.on() sleep(1) pico_led.off() سادسًا، انقر على زر التشغيل الأخضر play لتشغيل الشيفرة. سيحفظ برنامج ثوني الملف على لوحة بيكو ثم سيشغله. تحقق أن الليد يضيء ثم ينطفئ، وأبقِ عينيك مفتوحتين جيدًا لأنه سيضيء لثانية واحدة فقط. لا تقلق، يمكنك تشغيل الشيفرة عدة مرات للتحقق. تصحيح الأخطاء يظهِر البرنامج رسالة تفيد بأن تابع التوقف sleep غير معرف أضف السطر التالي على برنامجك لتعريف تابع التوقف sleep وإصلاح المشكلة: from time import sleep توصيل مصباح ليد بلوحة بيكو وتشغيله سنعمل في هذه الخطوة على توصيل مصابيح الليد مع مقاومة ثم توصيلها بلوحة راسبيري بيكو باستخدام أسلاك التوصيل، وذلك لكتابة الشيفرة اللازمة لتشغيل المصابيح وجعلها تومض. يجب أن نحصل عند إتمام هذه الخطوة على مصباح ليد موصول مع مقاومة ولوحة راسبيري باي بيكو باستخدام سلكيّ توصيل نوع مقبس-مقبس. لا يهم لون سلك التوصيل الذي تستخدمه، كما أنه لديك حرية اختيار لون مصباح الليد، لكن عادةً ما تكون أضواء حشرة اليراعة باللون الأصفر أو البرتقالي أو الأخضر، فننصحك باختيار إحدى هذه الألوان. تعمل المقاومة على التحكم بالتيار المار في الدارة وبالتالي جعل مصباح الليد يستمر في العمل فترةً أطول وحمايته من الإحتراق. توصيل الليد مع مقاومة وأسلاك توصيل باستخدام شريط عازل ستحتاج لتوصيل الليد إلى ما يلي: أسلاك توصيل نوع مقبس-مقبس (عدد 2). مقاومة. مصباح ليد. شريط عازل. مقص. الطريقة الصحيحة لتوصيل الليد كما تعلمنا سابقًا، فإن لمصباح الليد رجل قصيرة سالبة، وأخرى طويلة هي الموجبة. يمكنك التمييز بين القطبين عن طريق لمس الحافة المسطحة للجزء البلاستيكي للمصباح بإصبعك؛ إذ أن الطرف السالب هو الطرف الأقرب إلى الحافة المسطحة للمصباح. أولًا، اثنِ أحد طرفي المقاومة حول الرجل الموجبة لمصباح الليد. ثم لُف طرف المقاومة حول رجل مصباح الليد ثلاث مرات، كما في الصورة: ثانيًا، قُص قطعة من الشريط العازل والصقه على الجزء الملفوف من المقاومة ليساعد في تثبيتها. ثالثًا، أدخل سلك توصيل في النهاية الحرة للمقاومة، ثم صِل سلكًا آخر مع الرجل السالبة لمصباح الليد. يمكنك أيضًا استخدام الشريط العازل لتثبيت التوصيلات. توصيل الليد مع مقاومة وأسلاك توصيل باستخدام اللحام وأنابيب الانكماش الحراري تنبيه: ستحتاج إلى مساعدة أحد البالغين لتنفيذ هذه الخطوة وخاصةً عند استخدام مسدس اللحام. أولًا، ستحتاج إلى مصباح ليد، ومقاومة (ذات قيمة 70 أوم أو أكبر)، سلكي توصيل نوع مقبس-مقبس، ومسدس أو كاوي لحام، وأسلاك قصدير، وأنابيب انكماش حراري. ثانيًا، سخّن إحدى رجلي الليد لبضع ثوان باستخدام مسدس اللحام ثم اصهر اصبع القصدير فوقها، وكرّر العملية على الرجل الأخرى. اطلب مساعدة أحد البالغين لتنفيذ هذه الخطوة. ثالثًا، سخّن إحدى رجلي المقاومة لبضع ثوان باستخدام مسدس اللحام ثم اصهر اصبع القصدير فوقها، وكرّر العملية على الرجل الأخرى. اطلب مساعدة أحد البالغين لتنفيذ هذه الخطوة. رابعًا، ضع رجل الليد الموجبة فوق رجل المقاومة ثم مرّر مسدس اللحام عليهما كي تلتحما معًا. خامسًا، قص النهاية البلاستيكية السوداء لسلكي التوصيل، ثم انزع الغلاف البلاستيكي للسلكين حتى تحصل على الجزء النحاسي بدون عزل، كما هو موضح: سادسًا، اصهر بعض القصدير على نهايتي السلكين. سابعًا، ادخل أنبوب انكماش حراري في كلٍ من السلكين. ثامنًا، ضع النهاية المكشوفة لسلك التوصيل الأول فوق الليد، ثم سخّنهما كي يلتحما، وكرّر العملية مع السلك الثاني والمقاومة. تاسعًا، اسحب أنبوب الانكماش الحراري إلى نهاية السلك ليغطي موضع اللحام. عاشرًا، سخن أنبوب الانكماش الحراري باستخدام الحافة العريضة من مسدس اللحام حتى ينكمش حول سلك التوصيل. أخيرًا، اختبر الليد بتوصيل إحدى السلكين إلى أحد أرجل الأرضية GND على لوحة بيكو، والسلك الآخر إلى إحدى أرجل 3V3. لاحظ أنه يوجد على لوحة بيكو 40 رجلًا معدنية تتوضع على حافة اللوحة تُمكّنك من توصيل تجهيزات خارجية مع لوحة بيكو، مثل الليد والمقاومة والمبدّلات. اقلب لوحة بيكو ولاحظ وجود مسميات توضيحية بجانب كل رجل. ابحث عن رجل الأغراض العامة GP13 وَوصل الرجل الموجبة لليد (الرجل الموصولة مع المقاومة) معها، واحرص على إدخال القطعة البلاستيكية السوداء للسلك في الرجل المعدنية بإحكام حتى نهايتها. بعد ذلك، صِل السلك الموصول مع الطرف السالب لمصباح الليد مع رجل الأرضية GND على اللوحة تحت الرجل GP13 لإكمال الدارة والتحكم فيها عن طريق الشيفرة التي سنكتبها . استخدمنا في الخطوة الأخيرة التابع pico_led لإضاءة مصباح الليد الموجود على لوحة بيكو، لكن يجب علينا استيراد LEDمن مكتبة picozero لإضافة مصابيح ليد خارجية والتحكم بها. أضف LED , على السطر الأول من الشيفرة، إذ يمكنك استيراد عدّة عناصر من المكتبة عن طريق الفصل بينها بفاصلة. عدّل على الشيفرة لتبدو كما يلي: from picozero import pico_led, LED from time import sleep pico_led.on() sleep(1) pico_led.off() firefly = LED(13) # استخدم الرجل ذات الرقم 13 firefly.on() لاحظ أننا أسندنا مصباح الليد إلى الرجل GP13، في السطر ما قبل الأخير، وسمينا التابع firefly أي يراعة، ثم شغّلنا المصباح في السطر الأخير. الآن، انقر على زر التشغيل Play لتنفيذ الشيفرة وتشغيل المصباح. أخيرًا، قُص جناحان من الورق المقوى أو الشريط اللاصق وألصقها حول مصباح الليد للحصول على مظهر اليراعة. تصحيح الأخطاء إليك بعض الأخطاء التي قد تواجهها في هذه الخطوة وكيفية إصلاحها: لا تعمل الشيفرة التي كتبتها تأكد من خلو الشيفرة التي كتبتها من الأخطاء وقارنها مع مثالنا، ثم أعد تشغيل الشيفرة بالنقر على زر Play، سيومض مصباح الليد الموجود على لوحة بيكو عند تنفيذ الشيفرة بنجاح. لا يضيء مصباح الليد الذي وصلته تحقق من توصيل الرجل السالبة (القصيرة) للمصباح مع الرجل الأرضية للوحة بيكو، وتوصيل الرجل الموجبة الطويلة مع المقاومة ثم مع الرجل GP13. تحقق من نقاط اللحام، أو نقاط التوصيل، وتأكد أن جميع العناصر متصلة ببعضها جيدًا. غَيّر مصباح الليد. جعل مصباح الليد يومض سنضيف الشيفرة اللازمة لجعل المصباح يومض باستمرار مثل يراعة مضيئة في الطبيعة. معلومة: اليراعَة هي إحدى أنواع الخنافس، وتدعى أحيانًا بسراج الليل أو الحُبَاحِب lightning bug، تعتمد على التلألؤ البيولوجي لتومض وتتعرف على الحشرات الأخرى من نفس فصيلتها، إذ أن لكل فصيلة نمط وميض معين. أولًا، أضف حلقة تكرار مستمرة while True:‎ على الشيفرة السابقة مع الأزمنة التالية التي تمثل نمط الوميض ليراعة حقيقية، واحرص على ترك مسافة بادئة في الأسطر أسفل حلقة التكرار: firefly = LED(13) # Use GP13 while True: firefly.on() sleep(0.5) firefly.off() sleep(2.5) نصيحة: يضيف برنامج ثوني عند الضغط على مفتاح Tab عند بداية السطر أربع مسافات فارغة، وعند الضغط على مفتاح Enter فإنه سيضيف نفس المسافة السابقة على السطر الجديد. ثانيًا، شغّل الشيفرة لاختبار وميض اليراعة. لتفادي المشكلات تأكد أن الوصلات ثابتة في مكانها وتحقق من وجود المسافات في حلقة while. إضافة مبدل switch سنضيف في هذه الخطوة مبدّلًا يشبه عمله عمل الزر، للتحكم بتشغيل الليد وإطفائه. معلومة: المبدّل هو عنصر إلكتروني يسمح بإكمال الدارة الكهربائية وتمرير التيار عند إغلاقه، ويمنع مروره عند فتحه، ومن أشكاله الزر الذي يسمح بتوصيل الدارة عند الضغط عليه، أما أبسط أشكاله فهو توصيل سلكين ببعضهما للحصول على مبدّل، وفصلهما عن بعضهما لفتحه. أولًا، جهّز سلكي توصيل الأول ذو نهايات من نوع دبوس-مقبس، والثاني ذو نهايات من نوع مقبس-مقبس، وذلك لتحضير مبدّل بسيط، واختر للسلك اللون الذي تفضله. ثانيًا، صل أحد السلكين مع الرجل GP18 والآخر مع رجل التأريض GND، لا يهم أيُّ السلكين وصلت مع أيّ رجل. ثالثًا، أضف عنصر المبدّل Switch من مكتبة picozero بإضافة Switch , في نهاية السطر الأول من الشيفرة. ثم أسند المبدّل إلى الرجل GP18: from picozero import pico_led, LED, Switch from time import sleep pico_led.on() sleep(1) pico_led.off() firefly = LED(13) # استخدم الرجل ذات الرقم 13 Switch = Switch (18) # استخدم الرجل ذات الرقم 18 تستشعر لوحة بيكو عناصر الدخل عند توصيلها مع رجل الأرضية GND وإحدى أرجل الأغراض العامة GP. عند توصيل سلكي التوصيل ببعضهما، تكتمل الدارة ويمر التيار الكهربائي، فتستشعر لوحة بيكو أن المُبدّل قد أُغلق. رابعًا، أضف الأسطر التالية على برنامجك للتحقق من حالة المبدّل باستخدام التابع if وتشغيل الليد فقط إذا كان المبدّل مغلقًا (أي أن السلكين موصولين ببعضهما): Switch = Switch (18) # استخدم الرجل ذات الرقم 18 while True: if switch.is_closed: # السلكان متصلان ببعضهما firefly.on() sleep(0.5) # شَغّل المصباح مدة نصف ثانية firefly.off() sleep(2.5) #أطفئ المصباح مدة ثانيتين ونصف else: # السلكان غير متصلان firefly.off() sleep(0.1) # تأخير بسيط لمدة 0.1 ثانية خامسًا، شَغّل الشيفرة بدون توصيل السلكين ولاحظ ما الذي سيحدث؟ ستنفذ شيفرة حالة الفصل else أي أن المصباح لن يضيء. سادسًا، صِل السلكين وراقب ما الذي سيحدث؟ يجب أن يومض المصباح. افصل السلكين عن بعضهما ولاحظ أن المصباح سينطفئ، لكن فصل السلكين لن يقطع التغذية الكهربائية عن المصباح، إذ يتوقف المصباح عن العمل فقط عند تشغيل السطر firefly.off()‎. يمكنك تنفيذ المشروع مع أصدقائك، ومزامنة عمل المصابيح عن طريقة توصيل الأسلاك في نفس الوقت. ترقية المشروع بإمكانك ترقية المشروع حين يتسنى لك ذلك، واستخدامه لتزيين غرفتك وإضفاء لمسةٍ تذكرك بالطبيعة. معلومة: يُعد قضاء الوقت في أحضان الطبيعة أمرًا مفيدًا للصحة ومحفزًا على توليد المشاعر الإيجابية، لكن حين لا يكون ذلك متاحًا لك، يمكنك وضع نبتةً ما في منزلك، أو محاكاة الطبيعة بمشروع مثل مشروعنا. إليك بعض المقترحات لترقية مشروعك: إضافة مصباح ليد آخر وجعله يضيء وفق نفس النمط. تغيير نمط وميض المصباح، بالبحث عن أنماط وميض اليراعات في الطبيعة. وضع المصباح في إناء زجاجي لتزيين غرفتك، كما في الصورة التالية: كما يمكنك الاطلاع على الشيفرة النهائية للمشروع ومف المشروع من ملف Thonny. خاتمة تهانينا، فقد أتممت مشروع استخدام حاسوب راسبيري باي بيكو للحصول على مصباح ليد يومض وفق نمط معين. ننصحك بتنفيذ مشروع تصميم محاكاة لمفرقعات الحفلات باستخدام لوحة راسبيري باي بيكو في خطوتك التالية، وإذا واجهت مشاكلًا عند تنفيذ هذا المشروع فيمكنك الحصول على الدعم والمساعدة عن طريق إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال LED Firefly من الموقع الرسمي لراسبيري باي. اقرأ أيضًا تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي تجميع راسبيري باي والتحضير لاستعماله ربط راسبيري باي بعناصر إلكترونية وبرمجتها باستخدام سكراتش وبايثون
  13. سنتعلم في هذا المقال كيفية إنشاء لعبة حجرة- ورقة- مقص، يكون خصمنا فيها هو الحاسوب، بحيث نُشكّل الحركات بيدنا ليتعرف عليها الحاسوب ويلعب الحركة المعاكسة. سنستخدم في هذا المشروع أساسيات تعلّم الآلة ولغة بايثون python، وسندرّب نموذجًا للتعرف على البيانات باستخدام أداة Teachable Machine. هدفنا الحصول على نسخة بسيطة مشابهة لعمل هذا الروبوت المدهش: يتطلب هذا المشروع وجود معرفة مُسبقة لدى القارئ بلغة بايثون Python وخاصًة الأفكار التالية: المتغيرات Variables. الدوال Functions، وكيفية إنشاء دوال تقبل وسطاء arguments. أساسيات إنشاء نموذج لتعلّم الآلة machine learning. كيفية استخدام واجهة سطر الأوامر على حاسوبك للانتقال إلى مجلد ما. ننصحك بكتاب البرمجة بلغة بايثون الذي يغطي كل تلك الأفكار. ستحتاج في هذا المشروع إلى: حاسوب فيه كاميرا. اتصال بالإنترنت. حساب غوغل. ستتعلم في هذا المشروع: كيفية إنشاء نموذج Model رؤية آلية وتدريبه باستخدام موقع Teachable Machine من غوغل. ما يجب عليك أخذه بالحسبان عند إنشاء نموذج لضمان عمله عند تجربته. كيفية تضمين نموذج منُشأ مسبقًا في تطبيق سطح مكتب. كما يمكنك الحصول على الملفات المطلوبة لهذا المشروع من هنا. التعرف على موقع Teachable Machine سنستخدم في مشروعنا موقع Teachable Machine، وهو أداةٌ مقدمةٌ من غوغل والتي تُتيح إنشاء نماذج لتعلّم الآلة في المتصفح، لذلك سننشئ نموذجًا يمكنه التعرف على الصور، ثم سنستخدم هذا النموذج في لعبة سننشئها على الحاسوب. يمكن للنماذج المنشأة على موقع Teachable Machine التعرف على الصور، والأصوات ووضعيات الجسم، ولكننا سنستخدم الصور فقط في مشروعنا هذا. أولًا، انتقل إلى صفحة تدريب نموذج للتعرف على الصور في Teachable Machine، حيث ستجد واجهة النموذج الفارغ التالية: لاحظ أن النموذج فيه صنفين، وبما أننا نريد إنشاء لعبة "حجرة، ورقة، مقص" فسنحتاج لإنشاء صنفٍ ثالث. ثانيًا، انقر على زر إضافة صنف Add a class، لإضافة صنف ثالث إلى النموذج. ثالثًا، سمِّ الأصناف الثلاثة "rock, paper, scissors" على التتالي بالنقر على رمز القلم بجانب كل صنف، واحرص على تسمية الأصناف بالترتيب الصحيح وباللغة الانجليزية، أي الصنف الأول "rock"، والثاني "paper" والثالث "scissors" لتفادي حصول الأخطاء عند كتابة الشيفرة وتنفيذها في الخطوات التالية. تجميع بيانات التدريب نحن الآن بحاجة إلى إضافة بيانات لتدريب الأصناف الثلاثة. لاحظ أن لكل صنف خيارين لإضافة الصور، الأول باستخدام كاميرا الويب Webcam والثاني عن طريق تحميل الصور Upload. يمكنك تحميل مجموعة صور إيماءات "حجرة، ورقة، مقص" من حاسوبك، أو يمكنك استخدام خيار كاميرا الويب ًWebcam لإلتقاط صور للإيماءات الثلاث، كما يمكنك استخدام لوحة راسبيري باي مزودة بكاميرا لالتقاط صور وذلك بعد إعداد الكاميرا. أولًا، انقر على خيار الكاميرا لصنف المقص "rock"، فستظهر لك رسالةٌ على الشاشة تسألك إن كنت تريد السماح لموقع Teachable Machine بالوصول إلى كاميرا حاسوبك واستخدامها، انقر على خيار السماح Allow. ثانيًا، انقر على زر التسجيل الأزرق لإلتقاط الصور وشَكّل بقبضة يدك الأخرى شكل الحجرة، وحرّك يدك وغير وضعيتها ليتكون لدينا بيانات متنوعة للتدريب. ستظهر الصور التي التقطها في قسم إضافة عينات الصور Add Image Samples على الجهة اليمنى، استمر بالتقاط الصور حتى تحصل على 300 عينة على الأقل، إذ كلما زاد عدد الصور كلما زادت دقة نموذج التعلم الآلي الذي سننشئه. إليك بعض الاقتراحات لتحسين جودة بيانات التدريب وتنويعها: استخدم يديك الاثنتين بالتناوب. اطلب من شخص آخر مساعدتك في تشكيل جميع الإيماءات الثلاثة، وإلا فإن النموذج سيربط الإيماءة مع الشخص الأول. غيِّر تعابير وجهك. غيّر المكان الذي تجلس فيه. غيّر مستوى الإضاءة في مكان جلوسك، أو تنقَّل بين أماكن مضيئة وأخرى مظلمة. ننصحك بعدم تسجيل الصور الخاصة بالصنف الواحد دفعةً واحدة، التقط بعض الصور للصنف الأول ثم الثاني، وهكذا، وذلك كي تتجنب تعلُّم النموذج أمرًا خاطئًا؛ كأن يربط تعبير وجهك أو حركة شخص ما في الخلفية بإيماءةٍ ما. هل لديك اقتراحات لأمور أخرى يجب أخذها بالحسبان؟ ثالثًا، التقط صور الصنفين الآخرين بطريقة مماثلة. إنشاء نموذج التعلم الآلي حان الآن وقت إنشاء النموذج وتدريبه بعد أن حصلنا على البيانات اللازمة. أولًا، انقر على زر تدريب النموذج Train Model. عند بدء تدريب النموذج يجب عليك إبقاء صفحة Teachable Machine مفتوحةً في المتصفح وإلا سيتوقف التدريب. لا تقلق، فلن يستغرق التدريب سوى فترة قصيرة، وسيظهر لك على الشاشة عدد مرات المرور على كامل بيانات التدريب أو ما يُدعى epoch، وستتمكن بعد انتهاء التدريب، من اختبار النموذج في مستطيل المعاينة Preview، شكّل الإيماءات باستخدام يدك واختبر دقة عمل النموذج، إذ أن النسب المئوية أدنى شاشة المعاينة تعبر عن مدى صحة تفسير الإيماءة. اختبر نموذجك بدقة، وإذا لم ترضَ عن النتائج فإليك بعض الاقتراحات لتحسينها: أضف مزيدًا من بيانات التدريب لكل من الأصناف. زَد عدد مرات المرور epoch لزيادة وقت التدريب، وذلك بالنقر على الخيارات المتقدمة Advanced في مربع التدريب: تذكر أن النموذج لا بُد له أن يخطئ، لذلك حين تشعر أنك حصلت على نتيجة ترضاها، انقر على زر تصدير النموذج Export Model كي تتمكن من استخدامه في اللعبة التي سننشئها. انقر على نافذة تنسرفلو TensorFlow في الشاشة التي ستظهر لك، ثم اختر نوع كيراس Keras لتحويل النموذج، ثم انقر بعدها على زر تنزيل النموذج Download my model. أصبحت الآن جاهزًا لإنشاء اللعبة. إعداد اللعبة ستجد في هذه الخطوة أننا سنزودك ببرنامج اللعبة مكتوبًا بلغة بايثون، أي أنه ليس عليك كتابة الشيفرة وإنما التركيز على فهم آلية تعلّم الآلة في هذا المشروع، ومع ذلك يمكنك تحسين واجهة اللعبة إذا كانت لديك أساسيات التعامل مع واجهات المستخدم الرسومية GUI، كما يمكنك تعديل آلية اختيار الحاسوب خطوته التالية؛ بحيث يفوز اللاعب دائمًا، أو يمكنك جعله يختار خطوته عشوائيًا. أولاً، نزّل الملف الأولي للمشروع وأعدّه للعمل وفق نظام تشغيل حاسوبك، كما يلي: نظام ويندوز نزّل الملف الأولي المضغوط للمشروع وفُك ضغطه في مجلد مناسب على حاسوبك. *نزّل المكتبات اللازمة لعمل المشروع باستخدام واجهة سطر الأوامر command line interface -أو اختصارًا CLI-، والتي تُدعى موجه الأوامر command prompt في نظام ويندوز. تذكر أن واجهة سطر الأوامر ليست واجهة رسومية، إذ يجب عليك كتابة دليل الملف للوصول إليه، بدلًا من مجرد الضغط عليه، سواءٌ كان الدليل نسبيًا relative path أي المكان الحالي للملف، أو كان الدليل مطلقًا absolute path أي دليل كامل بدءًا من قرص التخزين على الحاسب، أو من جذر نظام الملفات root أي يبدأ بهذه الإشارة /. انتقل إلى مجلد المشروع الذي نزلته، ثم انقر على شريط التنقل وانسخ دليل الملف. استبدل اسم المجلد directory في نافذة موجه الأوامر باسم المجلد[directory_path] للانتقال إلى مجلد مشروعك، حتى يصبح بإمكانك تنفيذ أوامر بايثون. cd [directory_path] اكتب الأمر التالي الذي يستخدم نظام إدارة الحزم pip في بايثون لتنصيب المكتبات اللازمة من الإنترنت، والذي قد يستغرق بعض الوقت: pip install requirements.txt ننصحك بتنصيب المكتبات اللازمة باستخدام الأمر pip عوضًا عن تنزيلها يدويًا، لأن بعض المكتبات قد تحتاج إلى مكتبات أخرى أو ما يُعرف بالاعتماديات dependencies والتي ينصبها "pip" تلقائيًا، إذ يمكن استخدام "pip" لتنصيب قائمة من المكتبات التي يحتاجها المشروع، والتي غالبًا تضمن في مجلد يسمى "requirements.txt". نظام ماك أو إس MacOS تدعى واجهة سطر الأوامر في نظام ماك بالطرفية Terminal. اكتب الأمر التالي في الطرفية وذلك للانتقال إلى المجلد الرئيسي home والذي تدل عليه الإشارة التالية ~: cd ~ الآن بعد أن أصبحنا في المجلد الرئيسي، اكتب الأمر التالي لتنصيب سكربت مكتوب بلغة باش Bash لتسهيل تنزيل البرنامج الأولي للعبة: curl -L http://rpf.io/proj-rps | sudo bash -s $USER كما يمكنك الإطلاع على السكربت إذا أحببت ذلك. قد يستغرق الأمر بعض الوقت أو بضع دقائق، بناءً على سرعة حاسوبك وسرعة اتصال الإنترنت لديك، وستلاحظ بمجرد انتهاء التثبيت مجلدًا جديدًا ضمن المجلد الرئيسي باسم "amazing_image_identifier". انتقل إلى المجلد الجديد باستخدام الأمر cd: cd amazing_image_identifier نظامي لينكس وراسبيان يدعى نظام التشغيل الخاص براسبيري باي بنظام راسبيان Raspbian، أو راسبيري باي أو إس Raspberry Pi OS وهو مبنيٌ على إحدى توزيعات لينكس. انتقل إلى المجلد الرئيسي home: cd ~ الآن بعد أن أصبحنا في المجلد الرئيسي، اكتب الأمر التالي لتنصيب سكربت مكتوب بلغة باش Bash لتسهيل تنزيل البرنامج الأولي للعبة: curl -L http://rpf.io/proj-rps | sudo bash -s $USER قد يستغرق الأمر بعض الوقت أو بضع دقائق بناءً على سرعة حاسوبك وسرعة اتصال الإنترنت لديك، وستلاحظ بمجرد انتهاء التنصيب مجلدًا جديدًا ضمن المجلد الرئيسي باسم "rps_by_hand". انتقل إلى المجلد الجديد باستخدام الأمر cd: cd rps_by_hand والآن بعد أن أصبح برنامج اللعبة جاهزًا ومنصبًا على حاسوبك، حان وقت تشغيله. ثانيًا، شغّل البرنامج باستخدام الأمر التالي في نظامي ويندوز ولينكس: python project.py والأمر التالي لنظام ماك: python3 project.py قد يستغرق تشغيل البرنامج بعض الوقت، ولكن عند تشغيله ستظهر لك الشاشة التالية: حان الآن وقت ربط النموذج باللعبة. ربط النموذج باللعبة أولًا، فُكَّ ضغط الملف "converted_keras.zip" الذي نزلته من موقع Teachable Machine، ثم انسخ منه الملف "keras_model.h5" والصقه في المجلد الذي يحتوي على شيفرة برنامج اللعبة. لاحظ أن ملف التسميات "labels.txt" في المجلد المضغوط، يحتوي على قائمة بالتسميات القابلة للقراءة وأرقام العقد التي تتطابق معها في خرج النموذج، وبما أنه ليس لدينا سوى ثلاث تصنيفات categories في مشروعنا: الحجرة، والورقة، والمقص، فقد ضمّنّا هذه التسميات في شيفرة اللعبة بقائمة list تدعى "THROWS"، لكن عندما يحتوي المشروع على تصنيفات عديدة فيفضل قراءة الملف "labels.txt" وتحميله إلى المشروع تلقائيًا باستخدام أوامر بايثون. ثانيًا، أصبح بإمكانك تحميل النموذج داخل اللعبة، بعد أن وضعته وبرنامج اللعبة في نفس المجلد، وذلك بإضافة السطر التالي قبل دالة get_player_throw: model = tf.keras.models.load_model('keras_model.h5', compile=False) عدّل على دالة get_player_throw بإضافة الشيفرة التالية، التي تعمل على تمرير الصورة التي التقطتها اللعبة إلى النموذج ليتنبأ ما هي الإيماءة، ثم يمرر نتيجة التنبؤ إلى اللعبة، لتختار اللعبة على أساسها الحركة المعاكسة وفقًا لشيفرتها: def get_player_throw(): image = tf.keras.preprocessing.image.load_img(IMG_NAME, target_size=(IMAGE_SIZE, IMAGE_SIZE)) image = tf.keras.preprocessing.image.img_to_array(image) image = np.expand_dims(image, axis=0) prediction_result = model.predict(image) best_prediction = THROWS[np.argmax(prediction_result[0])] return best_prediction إليك شرحًا مبسطًا للشيفرة السابقة: تُحوّل الأسطر التي تبدأ بالمعامل image الصور إلى الصيغة المناسبة للنموذج. يحتوي السطر prediction_result على نتيجة التنبؤ من النموذج بصيغة أرقام تدل على أرجحية صحة كل تخمين. يعتمد السطر best_predicion على التنبؤ ذي الأرجحية الأعلى، بينما يجلب التابع np.argmax دليل ذلك التنبؤ ويستخدمه ليعرف تسمية التنبؤ في القائمة THROWS شغّل البرنامج عدّة مرات، وإذا لم ترضَ عن جودة التخمينات، ففكر ما هي الاختلافات التي قد تحدث بين بيانات التدريب والمُدخلات التي تقدمها للعبتك والتي قد تؤثر على الجودة؟ فقد يؤثر اختلاف شدة الإضاءة أو ارتداءك ملابسًا مختلفة، لذلك سجّل مزيدًا من بيانات التدريب في Teachable Machine، ودرّب النموذج مرةً أخرى، ثم نزّله واستبدل نموذج اللعبة الحالي به. خاتمة تهانينا، فقد أتممت مشروع إنشاء لعبة "حجرة- ورقة- مقص" باستخدام لغة بايثون، والذي استخدمت فيه أساسيات تعلّم الآلة، ودرّبت نموذجًا للتعرف على البيانات باستخدام أداة Teachable Machine. أطلق العنان لإبداعك ونفّذ مشاريع مماثلة في خطوتك التالية. إذا واجهت مشاكلًا مع لغة بايثون، فيمكنك الحصول على الدعم والمساعدة عن طريق إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Rock, paper, scissors by hand من الموقع الرسمي لراسبيري باي. اقرأ أيضًا الدليل السريع إلى لغة البرمجة بايثون Python 3 تعرف على أشهر لغات برمجة الألعاب برمجة لعبة اختبار ذهني باستخدام سكراتش برمجة لعبة متاهة باستخدام محرك يونيتي Unity النسخة العربية الكاملة من كتاب البرمجة بلغة بايثون
  14. سنعمل في هذا المقال على إنشاء لعبة متاهة مرئية باستخدام محرك الألعاب الشهير يونيتي Unity، بحيث تكون الشخصية الرئيسية هي روبوت نتحكم بحركته، وسنتعلم الأدوات اللازمة لتطوير اللعبة. سنتعلم في هذا المشروع ما يلي: كيفية إنشاء أشكال ثلاثية الأبعاد. كيفية تغيير لون وحجم وموضع الكائنات. كيفية تعديل طريقة عرض اللعبة بحيث تتبع حركة اللاعب. كيفية إضافة شيفرة برمجية إلى الكائنات للتحكُّم في حركتها وتصرفاتها. ستحتاج في هذا المشروع إلى: عتاد: حاسوب يعمل بنظام ويندوز أو ماك، قادر على تشغيل يونيتي. برمجيات: محرر يونيتي، ويفضل تنصيبه مع تطبيق Unity Hub، الذي يتيح لك تثبيت عدة إصدارات من محرر يونيتي وإدارة الإضافات extensions. قد تستغرق عملية التنزيل وقتًا طويلًا نظرًا لحجم البرنامج الكبير نسبيًا، لذلك ننصحك بتنزيله وتنصيبه قبل بدء المشروع. إعداد المشروع أولًا، افتح محرر يونتي وانقر علىNew لإنشاء مشروع جديد: ثانيًا، سمِّ المشروع "Beginner Unity Sushi"، أو أي اسمٍ آخر تفضله، ثم انقر على خيار إنشاء المشروع Create Project وانتظر إلى أن يظهر مشروعك على الشاشة. ثالثًا، انقر على قائمة تخطيط الصفحة Layout الموجودة أعلى الزاوية اليمنى للشاشة، ثم اختر الوضع الافتراضي Default. رابعًا، تأكد من وجود مجلد المشاهد "scenes" في نافذة الممتلكات Assets؛ وفي حال عدم وجوده، أنشِئه عن طريق النقر على شريط القائمة menu الموجود أعلى القائمة، ثم النقر على شريط الممتلكات Assets الموجود في اليسار. انقر بعدها على خيار إنشاء Create، ثم على مجلد Folder، وسمّ المجلد "scenes". خامسًا، حان الآن وقت حفظ المشهد الأولي المرفق مع المشروع وذلك من القائمة العلوية بالنقر على ملف File، ثم احفظ المشهد باسم Save Scene as وسمّه "MazeRoboBegins" واحفظه في مجلد المشاهد "scenes" ضمن مجلد "Assets". ننصحك بحفظ المشروع بعد كل تعديلٍ تجريه عليه، وذلك بالنقر على File من القائمة أعلى الشاشة، ثم النقر على خيار Save Scenes، كما يمكنك اختصارًا النقر على مفتاحي Ctrl و S في أجهزة الويندوز، ومفتاحي Cmd و S في أجهزة ماك. إنشاء الشخصية الرئيسية ستكون الشخصية الرئيسية في لعبتنا عبارة عن رجل آلي نتحكم في حركته ضمن المتاهة، ولكن علينا تصميمه أولًا! أولًا، اصنع جسم الرجل الآلي بحيث يكون له شكل الكبسولة، وذلك بالنقر على الخيارات التالية بالترتيب: GameObject > 3D Object > Capsule. ثانيًا، انقر على جسم الرجل الآلي، وستظهر لك نافذة وحدة المراقب Inspector، حيث يمكنك إعداد الكائنات وتغيير خصائصها. سمِّ الكبسولة "MazeRobo" بكتابة اسم الكائن أعلى نافذة المراقب inspector كما هو موضح أدناه: ثالثًا، انقر على رمز المسنن في مربع التحويل Transform في نافذة وحدة المراقب، ثم اختر إعادة الضبط Reset وذلك لوضع الكائن في منتصف منصة العرض. رابعًا، لا زلنا بحاجةٍ إلى مزيد من الأشكال لتكوين رجلنا الآلي. لذلك، أضف مكعبًا Cube بالنقر على الخيارات التالية GameObject > 3D Object > Cube ثم أضف كرةً على النحو التالي: GameObject > 3D Object > Sphere، ثم غيِّر اسم المكعب إلى "Shades" والكرة إلى "Nose". خامسًا، لاحظ ظهور الكائنات الثلاثة ضمن قائمة على يسار الشاشة، انقر على الكائن "Nose" واسحبه ثم أفلته فوق "MazeRobo" كي يتحرك بحركته، وافعل المثل مع الكائن "Shades"، كما هو موضح أدناه: وبهذه الطريقة يمكننا تجميع الاشكال والحصول على شخصيات متكاملة من أشكال بسيطة. سادسًا، انقر على الكائن "Shades" ولاحظ وجود ثلاث إحداثيات (X, Y, Z) في نافذة المراقب inspector في قسم Transform تتحكم بموضع الكائن. غَيّر قيم الإحداثيات وشاهد ما الذي سيحدث، وضَع الرمز ~ أمام بعض القيم، ثم اعتمد القيم التالية: X = 0 Y = 0.64 Z = 0.42 سابعًا، أسند قيم الإحداثيات التالية للكائن "Nose": X = 0 Y = 0.5 Z = 0.5 الآن، يجب علينا تعديل شكل الكائنين لنحصل على شكلٍ مشابهٍ للرجل الآلي، وذلك بتعديل الحجم Scale وفقًا للقيم التالية للكائن "Shades": X = 0.64 Y = 0.16 Z = 0.16 والقيم التالية للكائن "Nose": X = 0.16 Y = 0.16 Z = 0.16 ليصبح لدينا الرجل الآلي التالي: تلوين الرجل الآلي أولًا، أنشئ مجلدًا جديدًا بالنقر على الخيارات التالية بالترتيب: Assets > Create > Folder، انقر بالزر الأيمن للفأرة عليه ثم انقر على خيار إعادة التسمية Rename وسمّه "Materials". ثانيًا، أنشئ مادتين جديدتين بالنقر على Assets > Create > Material وسمّهما "EyeBlack" و "NoseRed". لاحظ ظهور المادتين اللتين أنشأتهما في مجلد المواد "Materials" في نافذة المشروع Project أسفل الشاشة، وفي حال وجدتهما خارجه، فاسحبهما إلى داخل المجلد "Materials". يمكن تغيير لون مادة ما عن طريقة تغيير قيمة بياضها albedo في نافذة المراقب inspector، بالنقر على المستطيل الأبيض بجانب أداة اختيار اللون، ثم انتقاء اللون المناسب. ثالثًا، اختر اللون الأسود لمادة العين "EyeBlack" والأحمر لأنف الرجل الآلي "NoseRed". رابعًا، انقر على الكائن "Shades" ثم انقر على خيار the Materials في قسم Mesh Renderer، وانقر بعدها على الدائرة الصغيرة بجانب العنصر "0 Element" واختر منها "EyeBlack". الآن، أصبح لدى الرجل الآلي نظارات شمسية سوداء. خامسًا، كرِّر الخطوة السابقة واختر "NoseRed". الآن، أصبح لدى الرجل الآلي نظارات شمسية وأنف أحمر. التحكم بالرجل الآلي يجب عليك إضافة مكوّن الجسم الصلب RigidBody لتتمكن من تحريك الرجل الآلي. أولًا، انقر على الرجل الآلي، ثم على Component > Physics > Rigidbody للتحكم بالرجل الآلي في اللعبة. لاحظ أنه عند النقر على الرجل الآلي سيظهر قسم الجسم الصلب RigidBody في نافذة المراقب Inspector. انقر على قسم القيود Constraints لفتحه، ثم فعّل خيار تثبيت الدوران Freeze Rotation على محاور الإحداثيات الثلاث، وفعّل تثبيت الموقع Freeze Position على محور Y فقط. أصبحت الآن الشخصية الرئيسية للعبة جاهزة، لكن بإمكانك إضفاء طابع شخصي عليها عن طريق تغيير الألوان أو إضافة مزيدٍ من الأشكال إليها باستخدام خيار الكائنات ثلاثية 3D Objects الأبعاد كما في الخطوة السابقة، وحين تصبح راضيًا عن هيئة الرجل الآلي، انتقل إلى الخطوة التالية. إنشاء عالم اللعبة سنعمل في هذه الخطوة على إنشاء عالم اللعبة، أو المنصة التي سيتحرك عليها الرجل الآلي. أولًا، أضف الكائن Quad ليكون بمثابة الأرضية للعبة، وذلك بالنقر على الخيارات التالية: GameObject > 3D Object > Quad، وسمِّ الكائن "Ground" أي أرضية. ثانيًا، اضبط قيمة الدوران على محور X على القيمة 90 في مربع التحويل Transform في نافذة المراقب ثم عدّل الحجم للكائن Scale وفق القيم التالية: X = 40.96 Y = 40.96 Z = 1 لاحظ أن وضعية الرجل الآلي تحتاج إلى تعديل، إذ يظهر منتصفه عالقًا في الأرضية. ثالثًا، عدّل إحداثيات الموضع للرجل الآلي من نافذة التحويل Transform وفقًا لما يلي: X = 0 Y = 1 Z = 0 رابعًا، أضف مكعبًا Cube بالنقر على الخيارات التالية GameObject > 3D Object > Cube ليكون بمثابة حائطٍ في المتاهة، ثم أسند إليه إحداثيات الموضع التالية: X = -2 Y = 1.5 Z = 0 خامسًا، غيّر مقياس الحجم Y Scale للكائن الجديد إلى القيمة 3، ثم سمِّ الكائن "Wall". سادسًا، أنشئ مادةً جديدةً للحائط Assets > Create > Materials وغيّر قيمة البياض albedo لإعطائها اللون الأزرق، ثم سمّها "WallBlue". سابعًا، أسند المادة الزرقاء "WallBlue" للحائط "Wall" عن طريق سحبها وإفلاتها فوق الحائط، أو من خيار MeshRender > Materials من نافذة المراقب. سنعمل في الخطوات التالية على تحويل هذا الحائط إلى متاهة. تحريك الرجل الآلي سنكتب، في هذه الخطوة، الشيفرة اللازمة لتحريك الرجل الآلي. أولًا، أنشئ مجلدًا جديدًا من نافذة المشروع Project بالنقر على Assets > Create > Folder، وسمِّ المجلد "Scripts". ثانيًا، أنشئ مجلدًا داخل مجلد Scripts لكتابة الشيفرة بلغة #C بالنقر على Assets > Create > C# Script وسمّه "RoboMover". ثالثًا، انقر مزدوجًا على مجلد RoboMover لفتحه في المحرر ولاحظ أنك ستحصل على الشيفرة التالية: using System.Collections; using System.Collections.Generic; using UnityEngine; public class RoboMover : MonoBehaviour { // تُستخدم هذه الدالة للتهيئة void Start () { } //تُستدعى دالة التعديل مرةً واحدةً عند تصيير كل إطار void Update () { } } لنلقي نظرةً معمقةً على الشيفرة لنفهم آلية عملها: تهيئ الأسطر الثلاثة الأولى البرنامج للعمل. using System.Collections; using System.Collections.Generic; using UnityEngine; يُعّرف السطر التالي الصنف RoboMover من النوع العام public وتُكتب محتويات الصف داخل القوسين { }. public class RoboMover : MonoBehaviour { صرّحنا بعدها عن دالتين هما دالة البدء Start ودالة التعديل Update، ولاحظ أنهما فارغتان الآن، إذ سنُعدّلهما فيما بعد: void Update() { } الدالة Function: هي مجموعةٌ من التعليمات موجهةٌ للحاسوب ليُنفذ أمرًا ما، وتُسمى باسمٍ يدل على عملها. فعلى سبيل المثال، كثيرًا ما نستخدم الأمر "أعّد لي كوبًا من الشاي" في حياتنا اليومية والذي يماثل الدالة، إذ يعلم هنا الشخص الخطوات اللازمة لتحضير كوب الشاي وليس علينا تذكيره بها في كل مرة، فقط علينا ذكر الأمر؛ وكذلك الأمر بالنسبة للحاسوب، يكفي ذكر الأمر أو الدالة مع خطوات التنفيذ مرةً واحدةً، ثم نكتفي بعدها باستدعاء الدالة عن طريق ذكر اسمها فقط. لاحظ أن الدالة هنا من النوع الفارغ void أي أنها لا تعيد قيمةً بعد تنفيذها، على عكس مثال إعداد كوب الشاي، ولكن لو طلبنا إضافة الحليب على الشاي، هنا يكون نوع الدالة فارغًا لأنها تغيّر من خواص كوب الشاي فقط ولا تعيد لنا شيئًا. بعد التصريح عن نوع الدالة، يجب أن نذكر اسمها متبوعًا بقوسين دائريين () ولنا أن نتركهما فارغين أو نمرّر فيهما معاملات أو وسطاء الدالة، كأن نقول "حضّر لي كوبًا من الشاي (مع مكعبين من السكر)"، ثم نضع بعد ذلك التعليمات التي يجب أن تنفذها الدالة داخل القوسين {}، مثل اِغلِ الماء، ضع الماء في إبريق الشاي، أضِف أكياس الشاي، وهكذا. رابعًا، أضف الأسطر التالية على الشيفرة داخل الصنف، واحذف دالة البدء () void Start لأننا لن نحتاجها: public class RoboMover : MonoBehaviour { public float moveSpeed = 4.0f; public Rigidbody rb; public Transform tf; أضفنا ثلاثة متغيرات variables على الشيفرة لتسهيل استدعاء ما تدل عليه، إليك شرحًا موجزًا لعملها: المتغير moveSpeed: يدل على سرعة الحركة وهو رقم عشري من النوع العائم Float (عدد عشري). المتغير rb: يدل هذا المتغير إلى مركبة الجسم الصلب للرجل الآلي. المتغير tf: يشير هذا المتغير إلى مكون التحويل Transform. خامسًا، أضف الأسطر التالية إلى دالة التعديل Update: // تُستدعى دالة التعديل مرةً واحدةً عند لكل إطار void Update () { Vector3 desiredDirection = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical")); desiredDirection = moveSpeed * desiredDirection; desiredDirection = Time.deltaTime * desiredDirection; rb.MovePosition (rb.position + desiredDirection); } يُنشئ السطر الأول شعاعًا للمسافة المطلوبة desiredDirection، وهو مكونٌ من ثلاث مركبات للإحداثيات، اثنتان منهما للاتجاهات التي يدخلها اللاعب Input، والمركبة الثالثة هي العمق depth وقيمتها ثابتة 0.0. بعدها نضرب المسافة desiredDirection بمتغير السرعة moveSpeed، ثم نضرب المسافة desiredDirection بالمتغير Time.deltaTime والذي يشير للزمن منذ آخر عملية تعديل، ما يضمن أن الإحداثيات تتغير بدقة مهما كان نوع الجهاز الذي يُشغِّل اللعبة. إذًا، سيتحرك الرجل الآلي "MazeRobo" من خلال القيمة المحسوبة والمُخزنة في desiredDirection بالإتجاه الذي نحدّده وبخطوات صغيرة، عند كل تحديثٍ للشاشة. لا تنسى حفظ الشيفرة بالنقر على قائمة ملف File، ثم على حفظ Save. سادسًا، اسحب ملف الشيفرة RoboMover وأفلته فوق كائن MazeRobo في القائمة التسلسلية Hierarchy، كما هو موضح أدناه: سيظهر قسم خاص بالشيفرة "RoboMover" في نافذة المراقب أسفل قسم الجسم الصلب "Rigidbody": لاحظ وجود حقلين فارغين في قسم "RoboMover" هما rb و tf الذين يشيران إلى الجسم الصلب Rigidbody والتحويل Transform على الترتيب. انقر عليهما واسحبهما إلى الحقلين الفارغين كي تحصل على القيم المطلوبة لتحريك الرجل الآلي: أصبحت الآن جاهزًا للعب. انقر على زر اللعب Play الموجود في منتصف واجهة يونيتي، واستخدم مفاتيح الأسهم لتحريك الرجل الآلي، وانقر على زر Play مرةً أخرى لإيقاف اللعبة. تحسين الحركة سنعمل في هذه الخطوة على تحسين حركة الرجل الآلي، إذ أنه يمشي مستقيمًا ولا يستدير أو يلتفت حوله. أولًا، أضف السطر التالي على الشيفرة تحت دالة rb.MovePosition: rb.MoveRotation (Quaternion.LookRotation (desiredDirection, Vector3.up)); إذ يجعل هذا السطر الرجل الآلي MazeRobo ينظر إلى وجهته. ثانيًا، شغّل اللعبة وتحقق من حركة الرجل الآلي. لاحظ أنه أصبح يستدير باتجاه حركته، لكن سرعان ما يعود إلى الاتجاه الأصلي عند توقفه عن الحركة. سنعمل على إصلاح ذلك فيما يلي، ولكن علينا أولًا فهم سبب حدوث ذلك؟ تعتمد يونيتي القيمة 0 إتجاهًا افتراضيًا، لذلك عندما لا يُدخل اللاعب قيمةً، أي عندما لا يحرك الرجل الآلي، تكون قيمة الإدخال 0 ويتجه الرجل الآلي بالإتجاه الافتراضي، لذلك يجب علينا تعديل الشيفرة بحيث يستدير الرجل الآلي فقط وفقًا لمدخلات اللاعب. إذًا، سنعدل على الشيفرة بحيث نجعل الرجل الآلي يتحرك ويستدير فقط إذا كانت قيمة الإدخال من اللاعب أكبر من القيمة 0.01. ثالثًا، ضع جزء الشيفرة المتعلق بالإتجاه داخل تعليمة if ليُنفَّذ عند تحقق الشرط. سنغير الشرط فيما بعد، لكن اجعله الآن محققًا دائمًا بتمرير القيمة true مكان الشرط: // تُستدعى دالة التعديل مرةً واحدةً لكل إطار void Update () { if (true) { Vector3 desiredDirection = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical")); desiredDirection = moveSpeed * desiredDirection; desiredDirection = Time.deltaTime * desiredDirection; rb.MovePosition (rb.position + desiredDirection); rb.MoveRotation (Quaternion.LookRotation (desiredDirection, Vector3.up)); } } الآن، شغّل اللعبة مرةً أخرى وتحقق من حركة الرجل الآلي. رابعًا، أضف الأسطر التالية على دالة التعديل Update للحصول على القيمة المطلقة absolute value لمدخلات اللاعب، أي قيمة الرقم دون إشارته: void Update () { float inputHorizontal = Mathf.Abs (Input.GetAxis ("Horizontal")); float inputVertical = Mathf.Abs (Input.GetAxis ("Vertical")); if (true) { عندما تعطي الكائن أمرًا بالحركة للأمام فإن يونيتي يفسر هذا الأمر على أنه رقم موجب (1)، أما عندما تعطي أمرًا بالحركة للخلف فإن يونيتي يفسره على أنه رقم سالب (1-)، ولأننا نريد فقط تريد حجم الرقم، بغض النظر عن إشارته، استخدمنا القيمة المطلقة للرقم، إذ أن القيمة المطلقة لرقمٍ ما هي القيمة الموجبة للرقم أو الصفر. الآن، علينا تعديل شروط تعليمة if بحيث تتحقق فيما إذا كانت قيمة inputHorizontal أكبر من 0.01 أو إذا كانت قيمة inputVertical أكبر من 0.01، وسنحتاج إلى استخدام العامل أو orوالذي نمثله باستخدام شرطتين عموديتين || في لغة سي شارب #C، إذ تُوضع الشرطتين بين الحالتين اللتين نود التحقق منهما، كما يلي: condition A || condition B أما للعامل و فنستخدم الرمز التالي "&&". عدّل تعليمة if لتبدو كما يلي: if (inputHorizontal > 0.01f || inputVertical > 0.01f) { بعد هذا التعديل، يجب أن يستدير الرجل الآلي باتجاه حركته ويبقى كذلك، وإليك شيفرة دالة التعديل كاملةً كي تتحقق منها: void Update () { float inputHorizontal = Mathf.Abs (Input.GetAxis ("Horizontal")); float inputVertical = Mathf.Abs (Input.GetAxis ("Vertical")); if (inputHorizontal > 0.01f || inputVertical > 0.01f) { Vector3 desiredDirection = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical")); desiredDirection = moveSpeed * desiredDirection; desiredDirection = Time.deltaTime * desiredDirection; rb.MovePosition (rb.position + desiredDirection); rb.MoveRotation (Quaternion.LookRotation (desiredDirection, Vector3.up)); } ملاحقة الكاميرا سنعمل في هذه الخطوة على تعديل نطاق عرض الكاميرا بحيث تلاحق حركة الرجل الآلي. أولًا، انقر على الكاميرا الرئيسية Main Camera في نافذة القائمة التسلسلية Hierarchy من نافذة المراقب inspector، وأسند القيم التالية لمركبة الموضع، والدوران، والحجم، بالترتيب: الموضع: X: 0 Y: 9 Z: -5 الدوران: X: 60 Y: 0 Z: 0 الحجم: X: 1 Y: 1 Z: 1 شغّل اللعبة لتتحقق من حركة الكاميرا، وستلاحظ أنها لا تتبع حركة الرجل الآلي بعد، ولتحقيق ذلك يجب عليك تحديث موضع الكاميرا في كل إطار، بإضافة الشيفرة التي سنوردها أدناه. ثانيًا، أنشئ مجلدًا جديدًا لحفظ الشيفرة داخل مجلد Scripts بالنقر على Assets > Create > C# Script وسمّه "CameraMover". أضف المتغيرات الثلاث التالية داخل الصنف CameraMover: public class CameraMover : MonoBehaviour { public Transform tf; public Transform playerTransform; public Vector3 distanceBetweenPlayerAndCam; تتبِّع الأسطر السابقة التي أضفناها حركة ما يلي: موضع الكاميرا tf. موضع الرجل الآلي playerTransform. إحداثيات الموضع بين الكاميرا والرجل الآلي distanceBetweenPlayerAndCam. ثالثًا، حدِّد المسافة الابتدائية بين الكاميرا والرجل الآلي بإضافة السطر التالية على دالة البدء Start: void Start () { distanceBetweenPlayerAndCam = tf.position - playerTransform.position; } رابعًا، أضف السطر التالي لدالة Update للحفاظ على المسافة ذاتها في كل الإطارات: void Update () { tf.position = playerTransform.position + distanceBetweenPlayerAndCam; } خامسًا، أضف الشيفرة للكاميرا، وذلك بالنقر على خيار الكاميرا الأساسية Main Camera من القائمة، ثم اسحب شيفرة الصنف CameraMover وأفلتها فوق الكاميرا، ثم انقر على خيار الكاميرا الأساسية Main Camera من القائمة واسحبه إلى الحقل "Tf" في نافذة المراقب، واسحب MazeRobo إلى الحقل "Player Transform"، كما هو موضح أدناه: والآن، شغّل اللعبة ولاحظ كيف تلاحق الكاميرا حركة الرجل الآلي. إضافة مزيد من العناصر سنضيف الآن كرةً على المتاهة ليلعب بها الرجل الآلي. أولًا، أنشئ كرةً بالنقر على GameObject > 3D Object > Sphere وسمّها "Ball". ثانيًا، أسند القيم التالية لموضع الكرة: X: 0 Y: 1 Z: 2 ثالثًا، أنشئ مادةً لونها أخضر وسمّها "BallGreen"، ثم طبِّقها على الكرة بسحبها وإفلاتها عليها. شغّل اللعبة، وستلاحظ أن الكرة لا تتحرك عندما يلامسها الرجل الآلي. سنعمل على إصلاح ذلك فيما يلي. رابعًا، انقر على الكرة وفعّل خيار الجسم الصلب Rigidbody وذلك من Component > Physics > Rigidbody. الآن، شغّل اللعبة واختبر حركة الكرة. الفوز بعد أن أصبحت لدينا العناصر الرئيسية للعبة جاهزةً، علينا أن نحدد طريقةً للفوز. أولًا، أضف مكعبًا وسمّه "WinZone" ولوّنه بلونٍ مناسب، ثم حدِّده من القائمة التسلسلية وانقر لتحديد خيار Is Trigger من قسم Box Collider من نافذة المراقب: ثانيًا، أسند القيم التالية لموضع المكعب الجديد: X: -5 Y: 1 Z: -2 الآن سنكتب شيفرةً تتيح للمكعب "WinZone" التحسُّس للكرة عندما تلمسه، لذلك يجب علينا وضع علامة على الكرة. ثالثًا، انقر على الكرة في القائمة التسلسلية، ثم انقر على خيار الوسم Tag في نافذة المراقب: رابعًا، انقر على خيار إضافة وسم Add Tag ثم انقر على الرمز + لإضافة وسمٍ جديد وسمّه "Ball". خامسًا، انقر مرةً ثانيةً على الكرة في القائمة التسلسلية، ثم انقر على حقل الوسم Tag في نافذة المراقب مرةً ثانية واِختر الوسم الجديد الذي أضفناه. الآن، سنضيف بعض المؤثرات للاحتفال بفوز اللاعب. سادسًا، أنشئ Particle System بالنقر على GameObject > Effects > Particle System وسمّه "Fireworks" أي ألعاب نارية. سابعًا، انقر على كائن الألعاب النارية وألغِ تحديد المربع بجانب اسمه في نافذة المراقب، وذلك لإخفاء الكائن. ثامنًا، اختر اللون الأولي Start Color للألعاب النارية من نافذة المراقب، ثم أسند لإحداثيات الموضع قيمًا مطابقةً لقيم المكعب "WinZone". تاسعًا، أنشئ مجلدًا داخل مجلد Scripts لكتابة الشيفرة بلغة #C وسمّه WinZone، ثم امسح منه دالتي Start و Update وأضف عليه الشيفرة التالية: public GameObject fireworks; void OnTriggerEnter (Collider col) { if (col.transform.CompareTag ("Ball")) { fireworks.SetActive (true); } } تتحقق الشيفرة المُضافة من ملامسة أي جسم صلب للمكعب "WinZone" وتسند المتغير col للجسم الصلب، أما إذا كان الجسم الصلب هو الكرة، فسيظهر الكائن fireworks لتنطلق الألعاب النارية. عاشرًا، احفظ ملف الشيفرة ثم اسحبه وأفلته فوق WinZone في القائمة التسلسلية، ثم انقر على WinZone واسحب كائن الالعاب النارية الموجود أدناه إلى قسم الألعاب النارية "fireworks" في نافذة المراقب، كما هو موضح: أخيرًا، احفظ اللعبة ثم شغّلها واستمتع بتجربة اللعبة التي أنشأتها. ترقية اللعبة لاحظ أن المتاهة التي أنشأناها ليست مكتملة، ومهمتك الآن هي العمل على إكمالها وإضافة مزيدٍ من المكعبات وتعديل مركبات الحجم والموضع لتكون بمثابة جدران للمتاهة، ووضع مكعب الفوز في مكان يصعُب الوصول إليه. لا تنسى مشاركة اللعبة مع أصدقائك. خاتمة بهذا تكون قد أنشأت لعبتك الأولى على محرك الألعاب الشهير يونتي، تهانينا. ننصحك بالاستمرار والإطلاع على دروس صناعة الألعاب باستخدام يونيتي الموجودة على أكاديمية حسوب. إذا واجهت مشاكل مع يونيتي فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب ترجمة -وبتصرف- للمقال Robot maze من الموقع الرسمي لراسبيري باي. اقرأ أيضًا برمجة لعبة اختبار ذهني باستخدام سكراتش برمجة لعبة تفاعلية باستخدام سكراتش تصميم وبرمجة لعبة قفز باستخدام سكراتش لغات برمجة الألعاب تعرف على أشهر محركات الألعاب Game Engines
  15. سنتعلم في هذا المقال كيفية إنشاء اختبار ذهني في الرياضيات يكون لدى اللاعب فيه 30 ثانية لإعطاء أكبر عدد ممكن من الإجابات الصحيحة. لنحصل على نتيجة مشابهة لما يلي: ستحتاج في هذا المشروع إلى: عتاد: جهاز حاسوب. برمجيات: برنامج سكراتش scratch الإصدار الثالث (إما نسخة سطح المكتب أو نسخة المتصفح). كما يمكنك الحصول على المشروع كاملًا من ملف brain-game-solution. ستتعلم في هذا المقال: كيفية استخدام رسائل البث في سكراتش. كيفية استخدام كتل المظاهر وتخصيصها. إعداد الأسئلة أولًا، افتح نسخة سطح المكتب من سكراتش،أو انتقل للعمل على المشروع في نسخة المتصفح. ثانيًا، أضف كائنًا وخلفيةً من اختيارك، اخترنا في مثالنا الخلفية "Room 2" والكائن جيغا Giga. ثالثًا، انقر على الكائن، ثم أضف متغيرين من قائمة المتغيرات لتخزين أعداد السؤال فيهما: انقر على قائمة كتل المتغيرات، ثم انقر على خيار إنشاء متغير: ثم سمِّ المتغير باسمٍ مناسب، "العدد الأول" مثلًا، واختر ما إذا كنت تريد جعله متاحًا للاستخدام في جميع الكائنات أم فقط في هذا الكائن. سيظهر المتغير على المنصة، انقر عليه بالزر الأيمن للفأرة لتغيير طريقة عرضه أو إخفائه، كما يمكنك إخفاءه عن طريق إلغاء تحديده من قائمة كتل المتغيرات، ثم أنشئ متغيرًا آخر بنفس الطريقة وسمّه العدد الثاني. سنستخدم كتلة توليد الأعداد عشوائيًا من كتل المتغيرات، والتي تولد أعدادًا عشوائيةً تلقائيًا، وذلك للحصول على رقم سؤال الاختبار تلقائيًا دون الحاجة لإدخاله. رابعًا، أضف الكتلتين التالتين إلى الكائن جيغا الذي اخترته لإسناد قيمتين عشوائيتين للمتغيرات، وذلك بإضافة كتلة اجعل العدد مساويًا، ثم اسحب كتلة عدد عشوائي بين إليها من كتل المتغيرات: خامسًا، أضف كتلةً لسؤال اللاعب عن الإجابة وأضف عليها كتلتي اربطمن كتل العمليات وضع فيهما متغير العدد الأول والثاني، وضع في المنتصف رمز العملية الحسابية التي تريد السؤال عنها: ثم أضف كتلة إذا…. وإلا للتحقق من الإجابة، واختر كتلة العمليات المناسبة واسحبها إلى داخل شرط كتلة إذا ثم اسحب متغيري العدد الاول والثاني داخلها: اجمع الكتل مع بعضها لتحصل على الكتل التالية: سادسًا، ننصح باستخدام كتلة كرّر باستمرار، بحيث تستمر اللعبة في توليد أرقام عشوائية وتوليد الأسئلة للاعب. اسحب الكتل السابقة داخلها كما يلي: اختبر المشروع، وأجب مرةً إجابة صحيحة على السؤال، ثم أجب إجابةً خاطئة،ما الرسالة التي تظهر لك على المنصة في كل مرة؟ إضافة مؤقت سنضيف في هذه الخطوة عدادًا للوقت على المنصة باستخدام كتلالمتغيرات، بحيث يبدأ العد من 30 ثانية ويتناقص حتى ينتهي الوقت المتاح للإجابة. أولًا، انقر على الخلفية التي اخترتها، ثم انقر على خيار إنشاء متغير من قائمة كتل المتغيرات وسمّه "الوقت" أو "مؤقت". أضف الكتل التالية لجعل قيمة المتغير الابتدائية تساوي "30"، ثم تنقص قيمته تدريجيًا بمقدار 1 كل ثانية حتى تصل للصفر. ثانيًا، أنشئ رسالة بث جديدة وسمِّها "النهاية"، ثم أضفها إلى كتل متغير الوقت لإرسال رسالة إلى جميع الكائنات لإعلامها بانتهاء الوقت. ثالثًا، انقر على الكائن في مشروعك وأضف الكتل التالية لإيقاف عمل المقاطع البرمجية عند استلام رسالة "النهاية": اختبر اللعبة، هل تستمر الأسئلة في الظهور حتى انتهاء الوقت؟ إضافة نتيجة سنضيف في هذه الخطوة متغيرًا لتسجيل نقاط اللاعب بحيث يحصل اللاعب على نقطة عند كل إجابة صحيحة. تُعد هذه الخطوة اختياريًة، يمكنك تنفيذها أو تجاهلها، لكننا ننصح بتنفيذها لإضفاء روح التنافس على اللعبة. أولًا، أنشئ متغيرًا، كما تعلمنا سابقًا، وسمّه النتيجة وأسند إليه القيمة 0 بإضافة الكتلة التالية تحت كتلة النقر على العلم الأخضر: ثم أنشئ متغيرًا ثانيًا وسمّه أعلى نتيجة، وسيكون لديك المتغيرات التالية في المشروع: ثانيًا، أضف الكتلتين التاليتين ليحصل اللاعب على نقطة عند الإجابة الصحيحة، وليخسر نقطةً عند الإجابة الخاطئة: ثالثًا، أضف الكتل التالية، داخل كتلة كرر باستمرار للتحقق عند نهاية الاختبار ما إذا كانت نتيجة اللاعب الحالية أعلى من النتيجة العليا، عندها يعتمد البرنامج نتيجة اللاعب الحالية على أنها أعلى نتيجة: يجب أن تبدو الكتل لديك كما يلي: كما يمكنك إعادة تعيين نتيجة اللاعب إلى الصفر إذا أعطى إجابة خاطئة. فكّر في الكتل اللازمة لتحقيق ذلك. ويمكنك أيضًا جعل الكائن يتفاعل بتغيير مظهره عند الإجابة الصحيحة والخاطئة. إضافة زر لبدء اللعبة سنضيف في هذه الخطوة زرًا يتيح للاعب إعادة الاختبار عدة مرات. أولًا، اختر أحد الأزرار من مكتبة الكائنات بكتابة "Button" في مربع البحث، ثم استخدم أداة النص في محرر الرسام لإضافة عبارة تصف عمله: ثانيًا، أضف الكتل التالية إلى الزر: لاحظ أن زر البدء سيظهر عند نقر العلم الأخضر، وسيختفي عندما ينقر اللاعب عليه ويبث رسالة "البداية" للكائنات الأخرى كي يتفاعلو معها. إذًا، يجب علينا تعديل الكتل البرمجية التي استخدمناها لتمكين ذلك. ثالثًا، استبدل كتلة العلم الأخضر بكتلة عندما أتلقى البداية، كي يبدأ برنامجنا بالأسئلة عندما يتلقى أمرًا بذلك بعد النقر على زر البدء: الآن، انقر على العلم الأخضر واختبر اللعبة. لاحظ أن الوقت يبدأ عند النقر على العلم الأخضر وليس عند النقر على زر البدء. استعن بالخطوة السابقة لحل هذه المشكلة. رابعًا، أضف الكتل التالية على كائن الزر لجعله يظهر من جديد عند نهاية الاختبار: ننصح بتقليل الوقت إلى بضع ثوان، لتسهيل اختبار اللعبة: خامسًا، أضف الكتل التالية لتغيير شكل زر البدء عند وضع مؤشر الفأرة عليه: بحيث يصبح شكل الزر على النحو التالي: إضافة تأثيرات رسومية سنضيف في هذه الخطوة مؤثرات رسوميةً خاصةً بالإجابة الصحيحة وأخرى خاصةً بالإجابة الخاطئة لإضفاء الحيوية على الاختبار. أولًا، أضف كائن إشارة الصح من مكتبة الكائنات بكتابة "Button4" في مربع البحث، وسمّه النتيجة، ثم أضف عليه مظهر إشارة الخطأ بالبحث عن "Button5". أعد تسمية المظهرين كما يلي: ثانيًا، عدِّل على الكتل البرمجية واستبدل كتلتي "قُل" بكتلتي "بُث" كما يلي: ثالثًا، أضف الكتل التالية لكائن النتيجة لتظهر الإشارة المناسبة على المنصة عند الإجابة: كتل إشارة الصح: وكتل إشارة الخطأ: وعند النقر على العلم الأخضر: رابعًا، اختبر اللعبة وتحقق من ظهور رمز الصح عند الإجابة الصحيحة ورمز الخطأ عند الخاطئة. لاحظ أن الكتل الخاصة بالإجابة الصحيحة والخاطئة متشابهةٌ جدًا، لذلك سننشئ كتلةً خاصةً لتسهيل العمل. خامسًا، انقر على كائن النتيجة، ثم انقر على كتل لبناتي من قائمة المقاطع البرمجية وانقر على خيار إنشاء لبنة، وسمِّ الكتلة الجديدة "مؤثرات": اكتب اسم اللبنة الجديدة، ثم انقر على زر موافق: لاحظ أنه ستظهر لك كتلة عرّف على الشاشة، وهي كتلةٌ ورديةٌ تشبه القبعة. إذا لم تجدها فانقر على زر تصغير الشاشة، أو اسحب شريط الشاشة نحو اليمين أو اليسار. سادسًا، اسحب الكتل البرمجية ("اظهر" و"انتظر" و"اختف") أسفل الكتلة الجديدة كما يلي: سابعًا، احذف كتلتي الإخفاء والإظهار وأبقِ على كتلة تغيير المظهر، ثم أضف كتلة المؤثرات، كما يلي: لاحظ أنه بتخصيص كتلة المؤثرات واستخدامها قد وفّرنا عدد الخطوات اللازمة للتعديل على الكتل، فنكتفي بتعريفها مرةً واحدةً، ثم نذكرها مفردةً عندما نريد استخدامها. تحقق من ذلك بتعديل وقت الانتظار إلى ثانيتين. هل لاحظت عدد الخطوات اللازمة لذلك؟ ثامنًا، عدِّل على الكتل وأضف تأثيرًا لمظهري إشارة الصح والخطأ كما يلي: ويمكنك التعديل على الكتل البرمجية وإضافة تأثيرات أخرى مختلفة عن التأثير الذي اخترناه. ترقية المشروع حان الآن وقت ترقية المشروع، إليك بعض الاقتراحات الممكن تنفيذها: إضافة شاشة بداية ما رأيك بإضافة خلفية تكون بمثابة شاشة بدء للعبة؟ لتنفيذ ذلك، يجب عليك إضافة خلفية جديدة واستخدام كتلتي عندما أتلقى البداية وعندما أتلقى النهاية للتبديل بين الخلفيات، ولا تنسى استخدام كتلتي الإخفاء والإظهار للكائنات عند التبديل بين الخلفيات، وكتل إظهار وإخفاء لمتغيري الوقت والنتيجة. إليك الكتل المطلوبة: كما يمكنك الإستعانة بالمشروع الكامل للإطلاع على الكتل اللازمة لتنفيذ ذلك. إضافة مؤثرات صوتية أضِف مؤثرات صوتية وموسيقى على الاختبار لزيادة حماس اللاعب، إليك بعض الاقتراحات الممكن تنفيذها: تشغيل صوتٍ خاص لكل من الإجابة الصحيحة والخاطئة. تشغيل صوت للمؤقت. -تشغيل صوت عند انتهاء الوقت المخصص للإجابة. كما يمكنك تشغيل الموسيقى عند إجراء الاختبار بإضافة أحد كتل الأصوات على المنصة: إضافة تحدي يمكنك تعديل المشروع وإضافة تحدي بحيث يجب على اللاعب الإجابة على عشرة أسئلة بأسرع ما يمكن، بدلاً من الإجابة على أكبر عددٍ ممكن من الأسئلة خلال ثلاثين ثانية. فكِّر، ما هي الكتل اللازمة لتنفيذ ذلك؟ إضافة إرشادات يمكنك إضافة شاشة إرشادات لشرح كيفية عمل الاختبار للاعب، وذلك بإضافة زر للإرشادات، وخلفية جديدة، ولا تنسى إضافة زر "رجوع" كي يستطيع اللاعب العودة إلى شاشة البدء. كما يمكنك الإطلاع على المشروع كاملًا من خلال ملف brain-game-solution. خاتمة تهانينا، فقد أتممت مشروع إنشاء اختبار ذهني باستخدام سكراتش. ننصحك بتنفيذ مشروع برمجة لعبة متاهة باستخدام محرك يونيتي Unity في خطوتك التالية. إذا واجهت مشاكلًا مع برنامج سكراتش، فيمكنك الحصول على الدعم والمساعدة عن طريق إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب، ولا تنسى مشاركتنا مشروعك على مجتمع سكراتش في منصة حسوب IO. ترجمة -وبتصرف- للمقال Brain Game من الموقع الرسمي لراسبيري باي. اقرأ أيضًا برمجة لعبة سباق القوارب باستخدام سكراتش تصميم وبرمجة لعبة قفز باستخدام سكراتش إنشاء لعبة الطبول الموسيقية باستخدام سكراتش برمجة مشروع عصا التعاويذ السحرية باستخدام سكراتش تعرف على أشهر لغات برمجة الألعاب
×
×
  • أضف...