Obsah:

Lego Mini Memory Game: 5 kroků (s obrázky)
Lego Mini Memory Game: 5 kroků (s obrázky)

Video: Lego Mini Memory Game: 5 kroků (s obrázky)

Video: Lego Mini Memory Game: 5 kroků (s obrázky)
Video: 4 Fun Pokemon DIYs & Crafts 2024, Červenec
Anonim
Image
Image
Lego mini paměťová hra
Lego mini paměťová hra

Asi před rokem jsem sepsal Návod k instalaci spousty LED do Lego Mini Cooper. Inovace, jako to bylo, bylo, že LED diody lze ovládat pomocí smartphonu (nebo prostřednictvím jakéhokoli webového prohlížeče, pokud jde o to).

Jak jsem pracně popsal v tom Instructable, většina úsilí se tehdy týkala zapojení Mini, aniž by se celá věc rozpadla. Poněkud k mému překvapení Mini následně přežilo cestu z Connecticutu do Toronta a od té doby víceméně funguje.

„Pokud to nebylo rozbité, opravoval to, dokud to nebylo“bude v nejlepším případě můj epitaf, takže když se Mini vrátilo domů na Vánoce, bylo na čase Lego Mini 2.0. Koneckonců, pokud Tesla může tlačit aktualizace softwaru do svých vozů, jak obtížné by to mohlo být?

Měl jsem pár nápadů:

  • Vylepšete poměrně neohrabané uživatelské rozhraní
  • Přidejte roh!
  • Vylepšit funkci „automatická světla“; a hlavně
  • Přidejte herní funkci (dokonce jsem poznal, že novinka zapínání a vypínání světel Mini pomocí telefonu se dříve nebo později ztlumí)

Herní funkce byla největším úkolem, v neposlední řadě proto, že mi nebylo hned zřejmé, o jaký druh hry se může jednat. Mini je příliš křehké na to, aby udrželo hru zahrnující manipulaci s ním (s výjimkou možná depresivní varianty Jenga). Další překážkou bylo, že jsem v životě neprogramoval hru.

Po roce bezvýsledného přemýšlení jsem narazil na projekt na Hacksteru, ve kterém se Arduino Uno používá k emulaci hračky pro pexeso ze 70. let minulého století s názvem Simon. Stručně řečeno, zařízení Simon přehrálo sled světel, které si pak hráč musel zapamatovat a přehrát stisknutím tlačítek. Po každém úspěšném kole byla sekvence prodloužena.

Přestože jde o požadovaný ročník, ve skutečnosti jsem o této hře nikdy neslyšel a musím říci, že je úžasné, co se v ten den stalo zábavou. Ještě úžasnější je, že hra Simon je stále v prodeji a sbírá nadšené recenze na Amazonu. Očividně to musel být hlavní kandidát, který se přizpůsobil mým účelům. Koneckonců, Mini už měla světla, takže vše, co jsem musel udělat, bylo zbavit se fyzických tlačítek a mít vstup uživatele zajištěný prostřednictvím smartphonu. Po softwarové stránce to tedy vypadalo, že to bude do značné míry jen práce typu cut-and-paste-job.

Nejprve jsem ale potřeboval provést drobné úpravy hardwaru.

Krok 1: Komponenty, nástroje a zdroje

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

Pokud tento projekt replikujete pomocí Lego Mini, budete potřebovat všechny věci uvedené v mém dřívějším Instructable. Jedinou další věcí, kterou budete potřebovat, je pasivní bzučák, který se používá pro klakson a pro vydávání spousty nepříjemných zvuků během hry (které lze deaktivovat).

Jak bude zřejmé při diskusi o softwaru, není pro hru ve skutečnosti nutné používat Lego Mini. Můžete použít další stavebnici Lego nebo spoustu LED diod na prkénku připojeném k jakékoli vývojové desce ESP8266. U některých relé můžete dokonce použít osvětlení místnosti vašeho domova. Děti, zeptejte se toho nejprve svých rodičů.

Podobně nejsou potřeba žádné další nástroje nebo zdroje nad rámec těch, které jsou uvedeny pro původní projekt.

Pokud patříte mezi hrstku lidí, kteří si přečetli původní popis projektu, budete vědět, že Lego Mini bylo původně zakoupeno jako dárek mé dospělé dceři, která má téměř identické „skutečné“Mini, nebo téměř identické jako dalo by se říct, že je to nové Mini, ne „klasické“. Absence jakýchkoli smysluplných dalších komponent učinila tento nový projekt ještě atraktivnějším, protože mi to umožnilo efektivně znovu darovat Lego Mini 2.0 jako nový vánoční dárek, aniž by to stálo téměř desetník. Génius!

Krok 2: Úpravy hardwaru

Úpravy hardwaru
Úpravy hardwaru

Původní projekt měl individuálně ovladatelné vnitřní LED diody RGB. Ty spotřebovaly tři piny na NodeMCU, který jsem používal jako vývojovou desku. Po diskrétní konzultaci s majitelem Lego Mini bylo zjištěno, že RGB LED diody jsou nedostatečně využívanou funkcí. To byla důležitá inteligence, protože jsem potřeboval uvolnit špendlík pro bzučák/houkačku.

Výše uvedené schéma zapojení je z původního projektu. Jedinou potřebnou změnou pro tento projekt bylo odstranění RGB LED a použití tří uvolněných kolíků následujícím způsobem:

  • D1 pro řídicí signál bzučáku (který je také připojen přímo k napájení 5 V DC)
  • D7 pro bílou interiérovou LED
  • D8 pro jednu z těch blikajících barevných LED, které jsem nazval „disko“

Samotný bzučák se úhledně schovává pod motorovým prostorem, takže vedení vodičů zpět k NodeMCU bylo hračkou.

Krok 3: Aktualizace GUI

Aktualizace GUI
Aktualizace GUI
Aktualizace GUI
Aktualizace GUI
Aktualizace GUI
Aktualizace GUI

Prvním krokem při aktualizaci GUI bylo vytvoření čtyř samostatných webových stránek:

  • „Úvodní obrazovka“, která se spouští pomocí vlastní ikony na vašem smartphonu a odkazuje na další stránky
  • Stránka "Ovládání", která dobře ovládá světla (a nyní samozřejmě klakson)
  • Stránka „Hra“
  • Stránka nastavení, která obsahuje možnosti konfigurace, jako například:

    • Zapnutí a vypnutí zvuku
    • Nastavení časového pásma (Mini získává čas z internetu, aby mohl v příslušném čase blikat hodinu)
    • Nastavení, kdy „automatická světla“zapnou a vypnou světlomety na základě úrovně okolního osvětlení
    • Resetování jména High Score a High Scorer (uloženo v EEPROM)

Oddělením funkcí tímto způsobem získáte mnohem více zkušeností s aplikacemi. Jednou z výzev tohoto projektu bylo získat NodeMCU, aby obsluhoval více stránek. Po vyzkoušení několika různých přístupů jsem narazil na kód, který vidíte v řádcích 232 až 236 hlavního náčrtu Arduina. Funguje to skvěle - jednoduše vytvořte svůj indexový soubor a pojmenujte následující stránky page1, page2 atd. Zjistil jsem, že musím všechny soubory zdrojů (CSS a obrázky) vložit do kořenové datové složky, ale pro weby tuto velikost.

Dále jsem se musel dostat do práce s CSS a Javascriptem, abych vytvořil něco, co vypadalo, že to patří Lego Mini. Vzhledem k tomu, že o obou předmětech vím téměř nic, bylo tu hodně googlení, než jsem dostal něco, s čím jsem byl spokojený. Začal jsem bezostyšným kopírováním lego cihel ve stylu CSS na CodePen zde. Také jsem se chtěl přestat označovat tlačítka textem a skončit s jednoduchou grafikou od Icons8, která byla pro mé účely dokonalá. Zbytek odtamtud spadl na místo. Stránky se docela dobře vykreslují na všech iPhonech, na kterých jsem je testoval. Naštěstí to samé platí i pro telefony Android (v prohlížeči Chrome pro stolní počítače vypadá dobře).

Krok 4: Herní kód

Herní kód
Herní kód

Komunikace mezi serverem NodeMCU a prohlížečem smartphonu probíhá prostřednictvím Websockets. Poté, co uživatel stiskne tlačítko, prohlížeč odešle na NodeMCU textový znak, který odpovídá jednomu nebo více kontrolkám Mini. Další postavy jsou posílány k ovládání toku hry. Kód Arduino poté provede akci na základě přijaté postavy. Komunikace Websocket zvládá pouze binární a textové znaky, takže je třeba provést určitý převod pro celá čísla (např. Časové pásmo).

Jak jsem zmínil, původně jsem očekával použití kódu z propojeného projektu Hackster pro základní funkce hry. Předpokládal jsem, že se stane, že poté, co hráč stiskne tlačítko, rozsvítí se odpovídající LED a kód provede digitální čtení na všech LED diodách, aby zjistil, zda svítí ta správná (projekt Hackster kontroluje vstupy fyzických tlačítek, ale je to stejný nápad). Něco takového fungovalo, ale z důvodů, které jsou pro mě stále nejasné, ne úplně. Asi 10% času, kdy Mini řeklo, že bylo stisknuto nesprávné tlačítko, když ve skutečnosti bylo správné. Všechno se zdálo být v pořádku na základě toho, co jsem viděl na sériovém monitoru a v konzole prohlížeče, takže nemám tušení, proč to nefungovalo.

Po velkém faffingu se snahou zavést nějakou kontrolu chyb jsem se zřekl celé myšlenky čtení stavů LED a vytvořil jsem pole „odpovědí“, které kontroluje, zda přijatý text Websocket odpovídá správnému pinu uloženému v poli „posloupnosti“, které hraje světelnou sekvenci k zapamatování. Zdá se, že je to 100% spolehlivé, i když způsob, jakým jsem to implementoval, je trochu plodný. Poté, co jsem přišel s touto metodou, jsem narazil na toto, což je zajímavé zkoumání způsobu, jakým fungují některé digitální zámky, a analogické s přístupem používaným ve hře.

Načasování vstupů tlačítek je nyní řešeno pomocí Javascriptu na straně prohlížeče (mezi tlačítkovými vstupy nechávám velmi velkorysých 10 sekund) a tok hry je nyní zcela řízen hráčem, nikoli pevně zakódován. Displej obsahuje okna ukazující zbývající čas do dalšího stisknutí tlačítka a počet vstupů zbývajících do správného odeslání sekvence hráčem.

Vysoké skóre je uloženo do EEPROM (nebo toho, co pro EEPROM ve světě ESP8266 vyhovuje) a pokud hráč dosáhne nového vysokého skóre, vyskakovací pole mu umožní zadat název podle svého výběru, který je také uložen v EEPROM. Tyto hodnoty lze resetovat prostřednictvím stránky Nastavení (jsem si jistý, že k tomu mohou existovat oprávněné důvody).

Se vším, co bylo řečeno, jsem znovu použil slušný kus herního kódu Hackster, který to hodně urychlil.

Krok 5: Zbytek kódu

Zbytek kódu
Zbytek kódu

Ve srovnání s kódem projektu Hackster vypadá moje skica Arduino obrovsky, a to i bez veškerého HTML, CSS a Javascriptu v datových souborech. Převážná část náčrtu je však řada funkcí souvisejících se základními operacemi, jako je vytváření a správa serveru, získávání času NTP, mDNS, zajišťování bezdrátových aktualizací, správa WiFi, správa souborů SPIFFS a podobně.

Javascript v souborech HTML je primárně určen pro zpracování zpráv Websocket (přijatých a odeslaných) a zvýšení interaktivity grafického uživatelského rozhraní.

Jak jsem již zmínil, chtěl jsem zlepšit funkčnost funkce „automatická světla“, která pomocí světelně závislého rezistoru na jediném analogovém pinu NodeMCU detekuje okolní světlo a zapíná světla Mini na přednastavené úrovni (když není v herním režimu), samozřejmě). I když je to v frivolním projektu dosti frivolní funkce, vadilo mi, že v původním projektu jsem pevně zakódoval práh zapnutí a že uživatel neměl žádný způsob, jak vidět, jak převládající úroveň světla souvisí s touto prahovou hodnotou. Nyní je každých pět sekund odesílána hodnota úrovně osvětlení na stránku Set-Up a tato stránka také zobrazuje aktuální prahové hodnoty pro zapnutí a vypnutí (které může nakonfigurovat uživatel). Takže práce na tom.

Oh, málem jsem zapomněl. Kód je na GitHub zde. Po stažení vložte celý balíček do nové složky, nahrajte skicu Arduina a poté obsah datové složky do SPIFFS.

Doporučuje: