Mündəricat:

Lego Mini Yaddaş Oyunu: 5 addım (şəkillərlə birlikdə)
Lego Mini Yaddaş Oyunu: 5 addım (şəkillərlə birlikdə)

Video: Lego Mini Yaddaş Oyunu: 5 addım (şəkillərlə birlikdə)

Video: Lego Mini Yaddaş Oyunu: 5 addım (şəkillərlə birlikdə)
Video: MƏNTİQ SUALLARI #2 - Məktəbəqədər uşaqlar üçün (4-6 yaş) 2024, Noyabr
Anonim
Image
Image
Lego Mini Yaddaş Oyunu
Lego Mini Yaddaş Oyunu

Bir il əvvəl Lego Mini Cooper -də bir dəstə LED quraşdırmaq üçün bir təlimat yazdım. Yenilik, LED -lərin bir smartfonla (və ya hər hansı bir veb brauzer vasitəsilə) idarə oluna bilməsi idi.

Bu Təlimat kitabında zəhmətkeşliklə təsvir etdiyim kimi, o vaxtkı səylərin çoxu hər şey dağılmadan Mini -ni bağlamaqla bağlı idi. Bir az təəccübləndim ki, Mini sonradan Konnektikutdan Torontoya bir səfərdən sağ çıxdı və o vaxtdan bu yana az -çox çalışdı.

"Sınıq olmasaydı, düzəldənə qədər düzəltdi" ən yaxşı halda mənim epitafım olacaq, buna görə Mini Milad üçün evə qayıtdıqda Lego Mini 2.0 üçün vaxt gəldi. Bütün bunlardan sonra, Tesla proqram yeniləmələrini avtomobillərinə ötürə bilsə, nə qədər çətin ola bilər?

Bir neçə fikrim var idi:

  • Olduqca çirkin istifadəçi interfeysini təkmilləşdirin
  • Bir buynuz əlavə edin!
  • "Avtomatik işıqlar" xüsusiyyətini təkmilləşdirin; və ən əsası
  • Bir oyun funksiyası əlavə edin (hətta telefonunuzla Mini -nin işıqlarını yandırıb söndürməyin yenilikinin gec -tez dağılacağını bilirdim)

Oyun funksiyası, ən böyük vəzifə idi, çünki bunun hansı oyunun ola biləcəyi mənə dərhal aydın deyildi. Mini, idarə olunan bir oyunu davam etdirmək üçün çox kövrəkdir (ehtimal ki, Jenqanın depresif variantı istisna olmaqla). Başqa bir maneə, həyatım boyu heç bir oyun proqramlaşdırmamam idi.

Bir il nəticəsiz düşündükdən sonra, 1970 -ci illərdən etibarən Simon adlı bir yaddaş oyunu oyuncağını təqlid etmək üçün bir Arduino Uno istifadə edildiyi Hacksterdəki bir layihəyə rast gəldim. Bir sözlə, Simon cihazı, oyunçunun daha sonra düymələrə basaraq yadda saxlaması və yenidən oynaması lazım olan işıqlar ardıcıllığını oynadı. Hər uğurlu turdan sonra ardıcıllığın uzunluğu artırıldı.

Lazım olan vintage olmasına baxmayaraq, əslində bu oyun haqqında heç eşitməmişdim və deməliyəm ki, günün əvvəlində əylənmək üçün keçənlər inanılmazdır. Daha da təəccüblüsü, Simon oyununun Amazonda hələ də satışda olması və rəy toplamasıdır. Aydındır ki, bu mənim məqsədimə uyğunlaşmaq üçün əsas namizəd olmalı idi. Axı, Mini -də artıq işıqlar var idi, buna görə etməli olduğum şey fiziki düymələri atmaq və bir smartfon vasitəsilə istifadəçi girişini təmin etmək idi. Proqram tərəfində, buna görə də bunun böyük ölçüdə kəsilmiş bir iş olacağı görünürdü.

Ancaq əvvəlcə cihazda kiçik dəyişikliklər etməliydim.

Addım 1: Komponentlər, Alətlər və Resurslar

Komponentlər, Alətlər və Resurslar
Komponentlər, Alətlər və Resurslar

Bu layihəni Lego Mini ilə təkrarlayırsınızsa, əvvəlki təlimatımda sadalanan bütün əşyalara ehtiyacınız olacaq. Ehtiyac duyduğunuz yeganə əlavə şey, buynuz üçün istifadə edilən və oyun əsnasında bir çox cansıxıcı səs çıxarmaq üçün istifadə edilə bilən passiv bir səs siqnalıdır.

Proqramı müzakirə edərkən aydın olacağı kimi, oyun üçün Lego Mini istifadə etməyə heç bir ehtiyac yoxdur. Başqa bir Lego dəsti və ya hər hansı bir ESP8266 inkişaf lövhəsinə bağlanmış bir çörək taxtasında bir dəstə LED istifadə edə bilərsiniz. Bəzi rölelerle, hətta evinizin otaq işıqlandırmasını da istifadə edə bilərsiniz. Uşaqlar, bu barədə əvvəlcə valideynlərinizdən soruşun.

Eynilə, orijinal layihə üçün sadalananlardan əlavə heç bir əlavə vasitəyə və ya mənbəyə ehtiyac yoxdur.

Layihənin orijinal təsvirini oxuyan bir neçə adamdan birisinizsə, Lego Mini-nin əslində demək olar ki, eyni "həqiqi" Mini olan və ya demək olar ki, eyni olan böyüyən qızıma hədiyyə olaraq alındığını biləcəksiniz. Yeni Klassik deyil, Yeni Mini verilə bilər. Heç bir mənalı əlavə komponentin olmaması, bu yeni layihəni daha da cəlbedici etdi, çünki Lego Mini 2.0-ı heç bir qəpik xərcləmədən yeni bir Milad hədiyyəsi olaraq səmərəli şəkildə yenidən hədiyyə etməyə imkan verərdi. Dahi!

Addım 2: Hardware Modifikasiyası

Avadanlıq Modifikasiyası
Avadanlıq Modifikasiyası

Orijinal layihədə fərdi olaraq idarə oluna bilən RGB daxili LEDləri var. İnkişaf lövhəsi olaraq istifadə etdiyim NodeMCU -da üç pin istifadə edildi. Lego Mini sahibi ilə diskret məsləhətləşmələrdən sonra RGB LED -lərinin az istifadə olunan bir xüsusiyyət olduğu müəyyən edildi. Bu vacib bir zəka idi, çünki səs siqnalı/buynuz üçün bir pin açmalıydım.

Yuxarıdakı dövrə diaqramı orijinal layihədəndir. Bu layihə üçün lazım olan yeganə dəyişiklik, RGB LED-lərini çıxarmaq və sərbəst buraxılan üç sancağı aşağıdakı kimi istifadə etmək idi:

  • Siqnal nəzarət siqnalı üçün D1 (birbaşa 5VDC enerji təchizatı ilə əlaqələndirilir)
  • Ağ rəngli daxili LED üçün D7
  • "Disko" işığı adlandırdığım yanıb -sönən rəngli LED -lərdən biri üçün D8

Siqnalın özü mühərrik bölməsinin altına səliqəli şəkildə tökülür, belə ki telləri NodeMCU -ya geri çəkmək bir anlıq idi.

Addım 3: GUI -nin yenilənməsi

GUI yenilənir
GUI yenilənir
GUI yenilənir
GUI yenilənir
GUI yenilənir
GUI yenilənir

GUI -ni yeniləməkdə ilk addım dörd ayrı veb səhifə yaratmaq idi:

  • Smartfonunuzda xüsusi bir işarə ilə açılan və digər səhifələrə keçid edən "açılan ekran"
  • İşıqları (və əlbəttə ki, buynuzu) yaxşı idarə edən "Nəzarət" səhifəsi
  • "Oyun" səhifəsi
  • Aşağıdakı kimi konfiqurasiya seçimlərini ehtiva edən bir Quraşdırma səhifəsi.

    • Səsin açılması və söndürülməsi
    • Saat qurşağının qurulması (Mini internetdən vaxt alır, belə ki, işıqlarını uyğun vaxtda yanıb sönə bilər)
    • "Avtomatik işıqların" ətraf işıq səviyyəsinə görə faraları yandırıb söndürəcəyi zaman tənzimlənməsi
    • Yüksək və Yüksək Qolçu adının sıfırlanması (EEPROM -da saxlanılır)

NodeMCU-nun birdən çox səhifəyə xidmət etməsini əldə etmək bu layihənin çətinliklərindən biri idi. Bir neçə fərqli yanaşma sınadıqdan sonra əsas Arduino eskizinin 232 ilə 236 -cı sətirlərində gördüyünüz kodu gördüm. Bu əla işləyir - sadəcə indeks faylınızı yaradın, sonra sonrakı səhifələrə page1, page2 və s. Ad verin Mən bütün qaynaq fayllarını (CSS və şəkillər) kök məlumat qovluğuna yerləşdirməli olduğumu gördüm amma bu saytlar üçün əslində bir problem deyil. bu ölçü.

Bundan sonra, Lego Mini -yə aid bir şey etmək üçün CSS və Javascript ilə işləməli oldum. Hər iki mövzu ilə bağlı heç bir şey bilmədiyim üçün məmnun olduğum bir şeyi əldə etməzdən əvvəl burada çoxlu Google işi var idi. Burada CodePen-də utanmadan CSS tipli bir lego kərpic kopyalamaqla başladım. Düymələri mətnlə etiketləməkdən və məqsədlərim üçün mükəmməl olan Icons8 -dən sadə qrafiklərdən istifadə etməklə sona çatmaq istədim. Qalan növlər oradan yerə düşdü. Səhifələr sınadığım bütün iPhone'larda olduqca yaxşı görünür. Ümid edirəm eyni şey Android telefonları üçün də keçərlidir (masa üstü Chrome brauzerində tamam görünür).

Addım 4: Oyun Kodu

Oyun Kodu
Oyun Kodu

NodeMCU serveri ilə smartfon brauzeri arasında əlaqə Websockets vasitəsi ilə həyata keçirilir. İstifadəçi tərəfindən bir düyməyə basıldıqdan sonra brauzer NodeMCU -ya bir və ya bir neçə Mini işığına uyğun gələn bir mətn xarakteri göndərir. Əlavə simvol oyun axını nəzarət etmək üçün göndərilir. Arduino kodu sonra alınan xarakterə əsaslanaraq hərəkətə keçir. Websocket ünsiyyəti yalnız ikili və mətn simvollarını idarə edə bilər, buna görə tam ədədlər üçün (məsələn, saat qurşağı) bir qədər çevrilmə lazımdır.

Qeyd etdiyim kimi, əvvəlcə əsas oyun funksiyaları üçün əlaqəli Hackster layihəsinin kodundan istifadə etməyi gözləyirdim. Nə olacağını gözlədiyim budur ki, bir oyunçu bir düyməni basdıqdan sonra müvafiq LED yanar və kod bütün LED -lərdə rəqəmsal oxuyar, doğru olanın yandırılıb yanmadığını öyrənər (Hackster layihəsi fiziki düymə girişlərini yoxlayır, ancaq eyni fikirdir). Bu bir növ işə yaradı, amma mənim üçün hələ də aydın olmayan səbəblərdən mükəmməl deyil. Təxminən 10% Mini, əslində doğru düymə olduğu zaman yanlış bir düyməyə basıldığını söyləyir. Serial monitorda və brauzer konsolunda gördüklərimə əsasən hər şey qaydasındaydı, buna görə niyə işləmədiyini bilmirəm.

Bir az səhv yoxlamasını tətbiq etməyə çalışmaqdan sonra LED vəziyyətlərini oxumaq fikrindən əl çəkdim və alınan Websocket mətninin "ardıcıllıq" serialında saxlanılan düzgün pinlə uyğun olub olmadığını yoxlayan "cavab" silsiləsi yaratdım. xatırlamaq üçün işıq ardıcıllığını oynayır. Həyata keçirdiyim üsul bir az çətin olsa da, bu 100% etibarlı görünür. Bu metodu hazırladıqdan sonra bəzi rəqəmsal qıfılların necə işlədiyini və oyunda istifadə olunan yanaşmaya bənzər bir şəkildə maraqlı bir araşdırma apardıq.

Düymə girişlərinin vaxtı indi brauzer tərəfində Javascript ilə idarə olunur (düymə girişləri arasında çox səxavətli 10 saniyə verirəm) və oyunun axını artıq sərt kodlu deyil, oyunçu tərəfindən tamamilə idarə olunur. Ekranda, sonrakı düyməni basmaq üçün qalan vaxtı və ardıcıllığın oyunçu tərəfindən düzgün təqdim edilməsindən əvvəl qalan girişlərin sayını göstərən pəncərələr var.

Yüksək bal EEPROM-da (və ya ESP8266 dünyasında EEPROM üçün keçər) saxlanılır və bir oyunçu yeni yüksək bal vurarsa, açılan bir qutu EEPROM-də saxlanılan seçdikləri adları daxil etməyə imkan verir. Bu dəyərlər Quraşdırma səhifəsi vasitəsilə sıfırlana bilər (əminəm ki, bunun qanuni səbəbləri ola bilər).

Bütün bunları söyləyərək, işi sürətləndirən Hackster oyun kodunun layiqli bir hissəsini yenidən istifadə etdim.

Addım 5: Kodun qalan hissəsi

Kodun qalan hissəsi
Kodun qalan hissəsi

Hackster layihə kodu ilə müqayisədə, Arduino eskizim, hətta bütün HTML, CSS və Javascript olmadan belə fayl sənədlərində böyük görünür. Eskizin əsas hissəsi server yaratmaq və idarə etmək, NTP vaxtını əldə etmək, mDNS əldə etmək, havadan yeniləməni təmin etmək, WiFi idarəetmə, SPIFFS fayl idarəçiliyi və s.

HTML sənədlərindəki Javascript, ilk növbədə Websocket mesajlarını idarə etmək (qəbul etmək və göndərmək) və GUI -nin interaktivliyini artırmaq üçündür.

Qeyd etdiyim kimi, NodeMCU -nun yeganə analoq pinindəki işığa bağlı bir rezistor istifadə edərək ətrafdakı işığı aşkar etmək və Mini -nin işıqlarını əvvəlcədən təyin edilmiş bir səviyyədə açmaq üçün istifadə olunan "avtomatik işıqlar" funksiyasının funksiyasını yaxşılaşdırmaq istədim (Oyun rejimində olmadıqda)., əlbəttə). Bu, mənasız bir layihədə çox mənasız bir xüsusiyyət olsa da, orijinal layihədə açılma həddini sərt kodlaşdırmağım və bir istifadəçinin üstünlük təşkil edən işıq səviyyəsinin bu eşiklə necə əlaqəli olduğunu görməməsi məni narahat etdi. İndi işıq səviyyəsi oxunuşu hər beş saniyədə bir Quraşdırma səhifəsinə göndərilir və həmin səhifə də açmaq və söndürmək üçün (istifadəçi tərəfindən konfiqurasiya oluna bilər) mövcud hədləri göstərir. Belə ki, bu işlə məşğul oldum.

Oh, demək olar ki, unutdum. Kod burada GitHubdadır. Yüklədikdən sonra bütün paketi yeni bir qovluğa qoyun, Arduino eskizini, sonra isə məlumat qovluğunun məzmununu SPIFFS -ə yükləyin.

Tövsiyə: