جدول المحتويات:

لعبة ليغو ميني ميموري: 5 خطوات (مع صور)
لعبة ليغو ميني ميموري: 5 خطوات (مع صور)

فيديو: لعبة ليغو ميني ميموري: 5 خطوات (مع صور)

فيديو: لعبة ليغو ميني ميموري: 5 خطوات (مع صور)
فيديو: تجربة كل اقراص بلايستيشن على PS5 #ps5 2024, ديسمبر
Anonim
Image
Image
لعبة ليغو ميني ميموري
لعبة ليغو ميني ميموري

منذ عام أو نحو ذلك ، كتبت Instructable حول تثبيت مجموعة من مصابيح LED في Lego Mini Cooper. كان الابتكار ، كما كان ، هو أنه يمكن التحكم في مصابيح LED باستخدام هاتف ذكي (أو من خلال أي متصفح ويب ، في هذا الشأن).

كما وصفت بشق الأنفس في Instructable ، فإن معظم الجهد في ذلك الوقت كان يتعلق بتوصيل الأسلاك المصغرة دون أن ينهار كل شيء. إلى حد ما لدهشتي ، نجت Mini في وقت لاحق من رحلة من كونيتيكت إلى تورنتو وعملت ، أكثر أو أقل ، منذ ذلك الحين.

"إذا لم يتم كسرها ، فقد أصلحها حتى تصبح" ستكون نقشتي ، في أحسن الأحوال ، لذلك عندما عاد Mini إلى المنزل لعيد الميلاد ، فقد حان الوقت لـ Lego Mini 2.0. بعد كل شيء ، إذا تمكنت Tesla من دفع تحديثات البرامج لسياراتها ، فما مدى صعوبة ذلك؟

كان لدي بعض الأفكار:

  • تحسين واجهة المستخدم عالية الكفاءة إلى حد ما
  • أضف قرن!
  • تحسين ميزة "الأضواء التلقائية" ؛ والأهم
  • أضف وظيفة لعبة (حتى أنني أدركت أن حداثة تشغيل وإطفاء أضواء Mini بهاتفك سوف تتلاشى عاجلاً أم آجلاً)

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

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

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

لكن أولاً ، كنت بحاجة إلى إجراء بعض التعديلات الطفيفة على الجهاز.

الخطوة 1: المكونات والأدوات والموارد

المكونات والأدوات والموارد
المكونات والأدوات والموارد

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

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

وبالمثل ، لا توجد حاجة إلى أدوات أو موارد إضافية بخلاف تلك المدرجة للمشروع الأصلي.

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

الخطوة 2: تعديل الأجهزة

تعديل الأجهزة
تعديل الأجهزة

كان المشروع الأصلي يحتوي على مصابيح LED داخلية RGB يمكن التحكم فيها بشكل فردي. استهلكت هذه ثلاثة دبابيس على NodeMCU ، والتي كنت أستخدمها كلوحة تطوير. بعد التشاور المنفصل مع مالك Lego Mini ، تم تحديد أن RGB LEDs كانت ميزة غير مستخدمة بشكل كافٍ. كان هذا ذكاءً مهمًا لأنني كنت بحاجة إلى تحرير دبوس للجرس / البوق.

مخطط الدائرة أعلاه مأخوذ من المشروع الأصلي. كان التغيير الوحيد المطلوب لهذا المشروع هو إزالة RGB LEDs واستخدام المسامير الثلاثة المحررة على النحو التالي:

  • D1 لإشارة التحكم في الجرس (والتي يتم توصيلها مباشرة أيضًا بمصدر الطاقة 5VDC)
  • D7 لمصباح LED داخلي أبيض
  • D8 لواحد من تلك المصابيح الملونة الوامضة ، والتي أطلق عليها اسم ضوء "الديسكو"

ينفصل الجرس نفسه بدقة تحت حجرة المحرك ، لذا كان تشغيل الأسلاك مرة أخرى إلى NodeMCU أمرًا سهلاً.

الخطوة الثالثة: تحديث واجهة المستخدم الرسومية

تحديث واجهة المستخدم الرسومية
تحديث واجهة المستخدم الرسومية
تحديث واجهة المستخدم الرسومية
تحديث واجهة المستخدم الرسومية
تحديث واجهة المستخدم الرسومية
تحديث واجهة المستخدم الرسومية

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

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

    • تشغيل الصوت وإيقافه
    • ضبط المنطقة الزمنية (تحصل Mini على وقت من الإنترنت حتى تتمكن من وميض أضواءها على مدار الساعة بالوقت المناسب)
    • ضبط وقت تشغيل "الأضواء التلقائية" وإيقاف تشغيل المصابيح الأمامية بناءً على مستوى الإضاءة المحيطة
    • إعادة تعيين الدرجة العالية واسم الدرجة العالية (المخزن في EEPROM)

يؤدي فصل الوظائف بهذه الطريقة إلى تجربة أكثر شبهاً بالتطبيق. كان الحصول على NodeMCU لخدمة صفحات متعددة أحد التحديات التي واجهها هذا المشروع. بعد تجربة طريقتين مختلفتين ، صادفت الكود الذي تراه في الأسطر 232 إلى 236 من مخطط Arduino الرئيسي. يعمل هذا بشكل رائع - ببساطة قم بإنشاء ملف الفهرس الخاص بك ثم قم بتسمية الصفحات اللاحقة page1 ، page2 وما إلى ذلك ، وجدت أنه كان علي وضع جميع ملفات الموارد (CSS والصور) في مجلد بيانات الجذر ولكن هذه ليست مشكلة حقيقية لمواقع هذا الحجم.

بعد ذلك ، كان علي العمل مع CSS و Javascript لصنع شيء يبدو أنه ينتمي إلى Lego Mini. نظرًا لأنني لا أعرف شيئًا عن أي من الموضوعين ، فقد كان هناك الكثير من البحث على Google هنا قبل الحصول على شيء كنت سعيدًا به. لقد بدأت بنسخ لبنة ليغو على غرار CSS على CodePen بلا خجل. أردت أيضًا الابتعاد عن تسمية الأزرار بالنصوص والانتهاء باستخدام رسومات بسيطة من Icons8 ، والتي كانت مثالية لأغراضي. سقط النوع الباقي في مكانه من هناك. يتم عرض الصفحات بشكل جيد على جميع أجهزة iPhone التي اختبرتها عليها. نأمل أن يكون الشيء نفسه صحيحًا بالنسبة لهواتف Android أيضًا (يبدو جيدًا على متصفح Chrome لسطح المكتب).

الخطوة 4: كود اللعبة

كود اللعبة
كود اللعبة

يتم الاتصال بين خادم NodeMCU ومتصفح الهاتف الذكي عبر Websockets. بعد أن يضغط المستخدم على زر ، يرسل المتصفح حرفًا نصيًا إلى NodeMCU يتوافق مع واحد أو أكثر من مصابيح Mini. يتم إرسال شخصيات إضافية للتحكم في تدفق اللعبة. ثم يتخذ كود Arduino إجراءً بناءً على الحرف الذي تم استلامه. يمكن لاتصالات Websocket معالجة الأحرف الثنائية والنصية فقط ، لذا يلزم إجراء بعض التحويل للأعداد الصحيحة (مثل المنطقة الزمنية).

كما ذكرت ، كنت أتوقع في الأصل استخدام الكود من مشروع Hackster المرتبط لوظائف اللعبة الأساسية. ما كنت أتوقع حدوثه هو أنه بعد أن يضغط اللاعب على زر ، سيضيء مؤشر LED المقابل وسيعمل الرمز على قراءة رقمية على جميع مصابيح LED لمعرفة ما إذا كان الضوء الصحيح قد أضاء (مشروع Hackster يتحقق من مدخلات الزر المادي ولكن إنها نفس الفكرة). لقد نجح هذا ، نوعًا ما ، ولكن لأسباب لا تزال غير واضحة بالنسبة لي ، ليس تمامًا. حوالي 10 ٪ من الوقت الذي يقول فيه Mini أنه تم الضغط على زر غير صحيح بينما ، في الواقع ، كان الزر الصحيح هو الصحيح. بدا كل شيء على ما يرام بناءً على ما يمكنني رؤيته في الشاشة التسلسلية وفي وحدة تحكم المتصفح ، لذلك ليس لدي أي فكرة عن سبب عدم نجاحها.

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

يتم الآن التعامل مع توقيت إدخالات الأزرار باستخدام Javascript على جانب المتصفح (أسمح بمدة 10 ثوانٍ سخية جدًا بين إدخالات الأزرار) ويتم الآن التحكم في تدفق اللعبة بالكامل بواسطة اللاعب بدلاً من الترميز الثابت. تشتمل الشاشة على نوافذ تعرض الوقت المتبقي لإجراء الضغط على الزر التالي وعدد الإدخالات المتبقية قبل إرسال التسلسل بشكل صحيح بواسطة المشغل.

يتم تخزين الدرجة العالية في EEPROM (أو ما يمر لـ EEPROM في عالم ESP8266) وإذا حقق اللاعب درجة عالية جديدة ، فإن المربع المنبثق يسمح له بإدخال اسم من اختياره ، والذي يتم تخزينه أيضًا في EEPROM. يمكن إعادة تعيين هذه القيم عبر صفحة الإعداد (أنا متأكد من أنه قد تكون هناك أسباب مشروعة لذلك).

مع كل ما قيل ، لقد أعدت استخدام جزء لائق من رمز لعبة Hackster الذي أدى إلى تسريع الأمور كثيرًا.

الخطوة 5: باقي الكود

بقية المدونة
بقية المدونة

مقارنةً برمز مشروع Hackster ، يبدو رسم Arduino الخاص بي ضخمًا ، حتى بدون كل HTML و CSS و Javascript في ملفات البيانات. لكن الجزء الأكبر من الرسم التخطيطي عبارة عن مجموعة من الوظائف المتعلقة بالعمليات الأساسية مثل إنشاء الخادم وإدارته ، والحصول على وقت NTP ، و mDNS ، وتوفير التحديث عبر الهواء ، وإدارة WiFi ، وإدارة ملفات SPIFFS وما شابه ذلك.

إن Javascript في ملفات HTML مخصصة أساسًا للتعامل مع رسائل Websocket (المستلمة والمرسلة) وزيادة تفاعل واجهة المستخدم الرسومية.

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

أوه ، نسيت تقريبا. الكود موجود على GitHub هنا. بعد التنزيل ، ضع الحزمة بأكملها في مجلد جديد ، وقم بتحميل رسم Arduino ، ثم محتويات مجلد البيانات في SPIFFS.

موصى به: