Obsah:

Mini pamäťová hra Lego: 5 krokov (s obrázkami)
Mini pamäťová hra Lego: 5 krokov (s obrázkami)

Video: Mini pamäťová hra Lego: 5 krokov (s obrázkami)

Video: Mini pamäťová hra Lego: 5 krokov (s obrázkami)
Video: LEGO HARRY POTTER - Это уже 100500 Фигурка Гарри Поттера... 2024, Júl
Anonim
Image
Image
Lego mini pamäťová hra
Lego mini pamäťová hra

Asi pred rokom som spísal Návod na inštaláciu veľa LED diód do Lego Mini Cooper. Inováciou, ako to bolo, bolo to, že LED diódy je možné ovládať pomocou smartfónu (alebo prostredníctvom akéhokoľvek webového prehliadača).

Ako som namáhavo popísal v tom Instructable, väčšina úsilia vtedy súvisela s zapojením Mini bez toho, aby sa to celé rozpadlo. Trochu na moje prekvapenie, Mini následne prežilo cestu z Connecticutu do Toronta a odvtedy viac -menej funguje.

„Ak to nebolo pokazené, opravoval to, kým to nebolo“bude mojím epitafom, prinajlepšom, takže keď sa Mini vrátilo domov na Vianoce, prišiel čas na Lego Mini 2.0. Koniec koncov, ak môže Tesla tlačiť aktualizácie softvéru do svojich automobilov, aké ťažké to môže byť?

Mal som niekoľko nápadov:

  • Vylepšite skôr neohrabané používateľské rozhranie
  • Pridajte roh!
  • Vylepšite funkciu „automatických svetiel“; a čo je najdôležitejšie
  • Pridajte hernú funkciu (dokonca som zistil, že novinka zapínania a vypínania svetiel Mini vašim telefónom skôr alebo neskôr zhasne)

Herná funkcia bola najväčšou úlohou, v neposlednom rade preto, že mi nebolo bezprostredne zrejmé, o aký druh hry by mohlo ísť. Mini je príliš krehký na to, aby vydržal hru, v ktorej sa s ním manipuluje (s výnimkou možno depresívneho variantu Jenga). Ďalšou prekážkou bolo, že som v živote neprogramoval hru.

Po roku bezvýsledného premýšľania som narazil na projekt na Hacksteri, v ktorom sa Arduino Uno používa na napodobnenie hračky z pexesa zo 70. rokov minulého storočia s názvom Simon. Stručne povedané, zariadenie Simon prehralo sekvenciu svetiel, ktoré si potom hráč musel zapamätať a prehrať stlačením tlačidiel. Po každom úspešnom kole sa sekvencia predĺžila.

Napriek tomu, že ide o požadovaný ročník, v skutočnosti som o tejto hre nikdy nepočul a musím povedať, že je úžasné, čo sa v tento deň stalo zábavou. Ešte úžasnejšie je, že hra Simon je stále v predaji a na Amazone má obrovské recenzie. Očividne to musel byť hlavný kandidát na prispôsobenie sa mojim účelom. Koniec koncov, Mini už malo svetlá, takže všetko, čo som musel urobiť, bolo zbaviť sa fyzických tlačidiel a poskytnúť používateľský vstup prostredníctvom smartfónu. Po softvérovej stránke sa preto zdalo, že to bude len do značnej miery úloha strihu a vloženia.

Najprv som však potreboval vykonať menšie úpravy hardvéru.

Krok 1: Komponenty, nástroje a zdroje

Komponenty, nástroje a zdroje
Komponenty, nástroje a zdroje

Ak replikujete tento projekt pomocou Lego Mini, budete potrebovať všetko, čo je uvedené v mojom predchádzajúcom návode. Jediná vec, ktorú budete potrebovať, je pasívny bzučiak, ktorý sa používa na klaksón a na vydávanie nepríjemných zvukov počas hry (ktoré je možné deaktivovať).

Ako bude zrejmé pri diskusii o softvéri, nie je v skutočnosti potrebné používať na hru Lego Mini. Môžete použiť inú súpravu Lego alebo skutočne veľa diód LED na doske zapojenej do akejkoľvek vývojovej dosky ESP8266. S niektorými relé môžete dokonca použiť osvetlenie domácej miestnosti. Deti, opýtajte sa na to najskôr svojich rodičov.

Podobne nie sú potrebné žiadne ďalšie nástroje alebo zdroje nad rámec nástrojov uvedených v pôvodnom projekte.

Ak patríte k hŕstke ľudí, ktorí si prečítali pôvodný popis projektu, budete vedieť, že Lego Mini bolo pôvodne kúpené ako darček mojej odrastenej dcére, ktorá má takmer identické „skutočné“Mini alebo takmer identické ako dalo by sa povedať, že je to nové Mini, nie „klasické“. Absencia akýchkoľvek zmysluplných dodatočných komponentov urobila tento nový projekt ešte atraktívnejším, pretože by mi to umožnilo efektívne darovať Lego Mini 2.0 ako nový vianočný darček bez toho, aby to stálo takmer cent. Génius!

Krok 2: Úprava hardvéru

Hardvérová úprava
Hardvérová úprava

Pôvodný projekt mal individuálne ovládateľné vnútorné LED diódy RGB. Tieto spotrebovali tri piny na NodeMCU, ktorý som používal ako vývojovú dosku. Po diskrétnych konzultáciách s majiteľom Lego Mini sme zistili, že LED diódy RGB sú nedostatočne využívanou funkciou. Bola to dôležitá inteligencia, pretože som potreboval uvoľniť špendlík pre bzučiak/klaksón.

Vyššie uvedená schéma zapojenia je z pôvodného projektu. Jedinou zmenou potrebnou pre tento projekt bolo odstránenie RGB LED a použitie troch uvoľnených kolíkov nasledovne:

  • D1 pre signál ovládania bzučiaka (ktorý je tiež zapojený priamo do zdroja 5 VDC)
  • D7 pre bielu vnútornú LED diódu
  • D8 pre jednu z tých blikajúcich farebných LED diód, ktoré som nazval „disko“

Samotný bzučiak sa úhľadne schováva pod motorovým priestorom, takže vedenie drôtov späť k NodeMCU bolo hračkou.

Krok 3: Aktualizácia GUI

Aktualizácia GUI
Aktualizácia GUI
Aktualizácia GUI
Aktualizácia GUI
Aktualizácia GUI
Aktualizácia GUI

Prvým krokom pri aktualizácii GUI bolo vytvorenie štyroch samostatných webových stránok:

  • „Úvodná obrazovka“, ktorá sa spustí pomocou vlastnej ikony vo vašom smartfóne a odkazuje na ostatné stránky
  • Stránka „Ovládacie prvky“, ktorá dobre ovláda svetlá (a teraz, samozrejme, klaksón)
  • Stránka „Hra“
  • Stránka s nastavením, ktorá obsahuje možnosti konfigurácie, ako napríklad:

    • Zapnutie a vypnutie zvuku
    • Nastavenie časového pásma (Mini získava čas z internetu, aby mohlo v príslušný čas blikať hodinu)
    • Nastavenie, kedy „automatické svetlá“zapnú a vypnú svetlomety na základe úrovne okolitého svetla
    • Resetovanie názvu vysokého skóre a vysokého skóre (uložené v pamäti EEPROM)

Oddelenie funkcií týmto spôsobom prináša oveľa väčšiu skúsenosť s aplikáciou. Získať NodeMCU na obsluhu viacerých stránok bola jednou z výziev tohto projektu. Po vyskúšaní niekoľkých rôznych prístupov som narazil na kód, ktorý vidíte v riadkoch 232 až 236 hlavného náčrtu Arduino. Funguje to skvele - jednoducho vytvorte svoj indexový súbor a potom pomenujte nasledujúce stránky page1, page2 atď. Zistil som, že musím všetky súbory zdrojov (CSS a obrázky) vložiť do koreňového priečinka s údajmi, ale to nie je problém pre stránky s táto veľkosť.

Ďalej som sa musel dostať do práce s CSS a Javascriptom, aby som vyrobil niečo, čo vyzeralo, že to patrí Lego Mini. Keďže o oboch predmetoch viem takmer nič, začalo sa tu veľa googliť, kým som dostal niečo, s čím som bol spokojný. Začal som tým, že som tu bez hanby skopíroval lego tehlu v štýle CSS na CodePen. Tiež som sa chcel vzdialiť od označovania tlačidiel textom a skončiť s použitím jednoduchej grafiky z ikon Icons8, ktoré boli na moje účely perfektné. Ostatné odtiaľ padlo na miesto. Stránky sa celkom dobre zobrazujú na všetkých telefónoch iPhone, na ktorých som ich testoval. Našťastie to isté platí aj pre telefóny s Androidom (vyzerá dobre v stolnom prehliadači Chrome).

Krok 4: Herný kód

Herný kód
Herný kód

Komunikácia medzi serverom NodeMCU a prehliadačom smartfónu prebieha prostredníctvom Websockets. Po stlačení tlačidla používateľom prehliadač odošle na NodeMCU textový znak, ktorý zodpovedá jednému alebo viacerým svetlám Mini. Na kontrolu toku hry sa posielajú ďalšie postavy. Kód Arduino potom vykoná akciu na základe prijatého znaku. Komunikácia Websocket zvláda iba binárne a textové znaky, takže je potrebná určitá konverzia pre celé čísla (napr. Časové pásmo).

Ako som už spomenul, pôvodne som očakával použitie kódu z prepojeného projektu Hackster na základné herné funkcie. Očakával som, že sa stane, že po stlačení tlačidla hráča sa rozsvieti zodpovedajúca dióda LED a kód urobí digitálne čítanie na všetkých diódach LED, aby zistil, či svieti tá správna (projekt Hackster kontroluje vstupy fyzických tlačidiel, ale je to ten istý nápad). Fungovalo to, niečo, ale z dôvodov, ktoré sú pre mňa stále nejasné, nie úplne. Asi v 10% prípadov by Mini tvrdilo, že bolo stlačené nesprávne tlačidlo, keď v skutočnosti bolo správne. Všetko sa zdalo v poriadku podľa toho, čo som mohol vidieť na sériovom monitore a v konzole prehliadača, takže nemám potuchy, prečo to nefungovalo.

Po dlhom faffingu so snahou zaviesť nejakú kontrolu chýb som upustil od celej myšlienky čítania stavov LED a vytvoril som pole „odpovedí“, ktoré kontroluje, či prijatý text Websocket zodpovedá správnemu kolíku uloženému v poli „sekvencie“, ktoré hrá svetelnú sekvenciu na zapamätanie. Zdá sa, že je to 100% spoľahlivé, aj keď spôsob, akým som to implementoval, je trochu namáhavý. Potom, čo som prišiel s touto metódou, prišiel som na to, čo je zaujímavé skúmanie spôsobu, akým fungujú niektoré digitálne zámky, a analogické s prístupom používaným v hre.

Načasovanie tlačidlových vstupov je teraz riešené pomocou Javascriptu na strane prehliadača (medzi tlačidlovými vstupmi povoľujem veľmi veľkorysých 10 sekúnd) a priebeh hry je teraz úplne riadený hráčom, nie pevne zakódovaný. Displej obsahuje okná ukazujúce zostávajúci čas do stlačenia ďalšieho tlačidla a počet vstupov zostávajúcich do správneho odoslania sekvencie prehrávačom.

Vysoké skóre je uložené v EEPROM (alebo to, čo vo svete ESP8266 vyhovuje EEPROM) a ak hráč dosiahne nové najvyššie skóre, vyskakovacie pole mu umožní zadať názov podľa vlastného výberu, ktorý je tiež uložený v EEPROM. Tieto hodnoty je možné resetovať prostredníctvom stránky Nastavenie (som si istý, že to môže mať legitímny dôvod).

So všetkým, čo bolo povedané, som znova použil slušný kus kódu hry Hackster, ktorý to veľmi urýchlil.

Krok 5: Zvyšok kódu

Zvyšok kódu
Zvyšok kódu

V porovnaní s kódom projektu Hackster vyzerá môj náčrt Arduina enormne, dokonca aj bez všetkých HTML, CSS a Javascript v údajových súboroch. Ale väčšina náčrtu je veľa funkcií týkajúcich sa základných operácií, ako je vytváranie a správa servera, získavanie času NTP, mDNS, zabezpečenie bezdrôtovej aktualizácie, správa WiFi, správa súborov SPIFFS a podobne.

Javascript v súboroch HTML je primárne na spracovanie správ Websocket (prijatých a odoslaných) a zvýšenie interaktivity grafického rozhrania.

Ako som už spomenul, chcel som zlepšiť funkcionalitu funkcie „automatické svetlá“, ktorá používa na svetle závislom odpore na jedinom analógovom kolíku NodeMCU detekciu okolitého svetla a zapnutie svetiel Mini na prednastavenej úrovni (keď nie je v hernom režime), samozrejme). Aj keď je to veľmi frivolná vlastnosť frivolného projektu, vadilo mi, že v pôvodnom projekte som pevne zakódoval prah zapnutia a že používateľ nemal žiadny spôsob, ako vidieť, ako prevládajúca úroveň svetla súvisí s týmto prahom. Teraz sa hodnoty intenzity svetla odosielajú na stránku Nastavenie každých päť sekúnd a táto stránka tiež zobrazuje aktuálne prahové hodnoty pre zapnutie a vypnutie (ktoré môže nakonfigurovať používateľ). Takže práca na tom.

Ach, skoro som zabudol. Kód je na GitHub tu. Po stiahnutí vložte celý balík do nového priečinka, nahrajte skicu Arduina a potom obsah priečinka s údajmi do SPIFFS.

Odporúča: