INHOUDSOPGAWE:

Lego Mini Memory Game: 5 stappe (met foto's)
Lego Mini Memory Game: 5 stappe (met foto's)

Video: Lego Mini Memory Game: 5 stappe (met foto's)

Video: Lego Mini Memory Game: 5 stappe (met foto's)
Video: We Met Hulk in Real Life #Shorts 2024, November
Anonim
Image
Image
Lego Mini geheue spel
Lego Mini geheue spel

'N Jaar of wat gelede het ek 'n Instructable geskryf oor die installering van 'n klomp LED's in 'n Lego Mini Cooper. Die innovasie, soos dit was, was dat die LED's met 'n slimfoon (of in elk geval deur enige webblaaier) beheer kan word.

Soos ek moeisaam in die instruksies beskryf het, het die meeste moeite destyds verband gehou met die bedrading van die Mini sonder dat die hele ding uitmekaar val. Iets tot my verbasing het die Mini 'n rit van Connecticut na Toronto oorleef en sedertdien min of meer gewerk.

'As dit nie stukkend was nie, het hy dit reggemaak totdat dit' was ', sal my gunsteling op sy beste wees, so toe die Mini terugkeer huis toe vir Kersfees, was dit tyd vir Lego Mini 2.0. As Tesla sagteware -opdaterings na sy motors kan stoot, hoe moeilik kan dit dan wees?

Ek het 'n paar idees gehad:

  • Verbeter die taamlik onhandige gebruikerskoppelvlak
  • Voeg 'n horing by!
  • Verbeter die funksie "outomatiese ligte"; en, die belangrikste
  • Voeg 'n speletjie -funksie by (selfs ek het besef dat die nuwigheid om die Mini se ligte aan en af te skakel met jou foon vroeër of later gaan verdwyn)

Die spelfunksie was die grootste taak, veral omdat dit nie onmiddellik vir my duidelik was watter soort spel dit kon wees nie. Die Mini is veels te broos om 'n spel te onderhou wat behels dat dit hanteer word (behalwe moontlik 'n neerdrukkende variant van Jenga). 'N Ander hindernis was dat ek nog nooit 'n wedstryd in my lewe geprogrammeer het nie.

Na 'n jaar van vrugtelose nadenke, het ek 'n projek op Hackster raakgeloop, waarin 'n Arduino Uno gebruik word om 'n geheuespeletjie uit die sewentigerjare met die naam Simon na te boots. In 'n neutedop speel die Simon -toestel 'n reeks ligte wat die speler dan moes onthou en speel deur op die knoppies te druk. Na elke suksesvolle rondte is die volgorde in lengte vergroot.

Ondanks die nodige oesjaar, het ek eintlik nog nooit van hierdie speletjie gehoor nie, en ek moet sê dat dit ongelooflik is wat destyds vermaak was. Nog meer verbasend is dat die Simon -speletjie nog steeds te koop is en goeie resensies op Amazon lewer. Dit was duidelik die belangrikste kandidaat om aan te pas vir my doeleindes. Die Mini het immers al die ligte, so ek hoef net die fisiese knoppies te laat vaar en gebruikersinvoer via 'n slimfoon te verskaf. Aan die sagtewarekant het dit dus gelyk asof dit grootliks 'n sny-en-plak-taak sou wees.

Maar eers moes ek 'n paar klein wysigings aan die hardeware aanbring.

Stap 1: Komponente, gereedskap en hulpbronne

Komponente, gereedskap en hulpbronne
Komponente, gereedskap en hulpbronne

As u hierdie projek met 'n Lego Mini herhaal, benodig u al die dinge wat in my vorige Instructable gelys is. Die enigste ekstra ding wat u nodig het, is 'n passiewe gonser wat vir die horing gebruik word en 'n klomp irriterende geluide maak tydens die spel (wat uitgeskakel kan word).

Soos duidelik sal word wanneer die sagteware bespreek word, hoef u nie 'n Lego Mini vir die spel te gebruik nie. U kan 'n ander Lego -stel gebruik, of 'n klomp LED's op 'n broodbord wat by enige ESP8266 -ontwikkelbord aangesluit is. Met 'n paar relais kan u selfs die kamerbeligting van u huis gebruik. Kinders, vra u ouers eers daaroor.

Op dieselfde manier is geen bykomende gereedskap of hulpbronne nodig behalwe dié wat vir die oorspronklike projek gelys is nie.

As u onder die handjievol mense is wat die oorspronklike projekbeskrywing gelees het, sal u weet dat die Lego Mini oorspronklik as 'n geskenk aan my volwasse dogter gekoop is, wat 'n byna identiese 'regte' Mini het, of amper identies is aan dit kan gegee word dat dit 'n nuwe mini is, nie 'n 'klassieke' nie. Die gebrek aan betekenisvolle bykomende komponente het hierdie nuwe projek nog aantrekliker gemaak, aangesien dit my in staat sou stel om Lego Mini 2.0 effektief as 'n nuwe Kersgeskenk te gee sonder om 'n sent te kos. Genie!

Stap 2: Hardeware -wysiging

Hardeware wysiging
Hardeware wysiging

Die oorspronklike projek het individueel beheerbare RGB -LED's binne. Dit gebruik drie penne op die NodeMCU, wat ek as die ontwikkelingsbord gebruik het. Na diskrete konsultasie met die Lego Mini -eienaar, is vasgestel dat die RGB -LED's 'n onderbenutte funksie is. Dit was belangrike intelligensie, want ek moes 'n speld vir die gonser/horing losmaak.

Bogenoemde stroomdiagram is van die oorspronklike projek. Die enigste verandering wat vir hierdie projek nodig was, was om die RGB-LED's te verwyder en die drie vrygemaakte penne soos volg te gebruik:

  • D1 vir die buzzer control sein (wat ook direk aan die 5VDC kragbron gekoppel is)
  • D7 vir 'n wit LED binne
  • D8 vir een van die flitsende gekleurde LED's, wat ek 'n 'disco' lig genoem het

Die gonser steek netjies onder die enjinkomplek weg, sodat die drade na die NodeMCU teruggekeer kon word.

Stap 3: Werk die GUI op

Die opdatering van die GUI
Die opdatering van die GUI
Die opdatering van die GUI
Die opdatering van die GUI
Die opdatering van die GUI
Die opdatering van die GUI

Die eerste stap in die opdatering van die GUI was om vier aparte webblaaie te skep:

  • 'N' Splash screen 'wat begin met 'n pasgemaakte ikoon op u slimfoon en na die ander bladsye skakel
  • Die bladsy "Beheer" wat die ligte (en nou natuurlik die horing) beheer
  • Die "Game" -bladsy
  • 'N Opstelbladsy wat opsetopsies bevat, soos:

    • Skakel die klank aan en uit
    • Stel die tydsone in (die Mini kry tyd van die internet af sodat dit met die regte tyd op die uur kan flits)
    • Deur aan te pas wanneer die "outomatiese ligte" die kopligte aan en af sal skakel op grond van die omringende ligvlak
    • Herstel van die High Score en High Scorer naam (gestoor in EEPROM)

Om hierdie funksies te skei, sorg vir 'n baie meer app-agtige ervaring. Die NodeMCU was een van die uitdagings vir hierdie projek. Nadat ek 'n paar verskillende benaderings probeer het, het ek die kode gekry wat u in reëls 232 tot 236 van die hoofskets van Arduino sien. Dit werk uitstekend - skep eenvoudig u indekslêer en noem dan die volgende bladsye page1, page2, ens. hierdie grootte.

Vervolgens moes ek met CSS en Javascript werk om iets te maak wat lyk asof dit van 'n Lego Mini behoort. Aangesien ek niks weet van enige van die onderwerpe nie, is daar baie gegoogle voordat ek iets gekry het waarmee ek tevrede was. Ek het begin deur skaamteloos 'n CSS-styl lego baksteen op CodePen hier te kopieer. Ek wou ook weggaan van die etikettering van die knoppies met teks en die gebruik van eenvoudige grafika van Icons8, wat perfek was vir my doeleindes. Die res het van daar af geval. Die bladsye lewer redelik goed op alle iPhones waarop ek dit getoets het. Hopelik geld dieselfde vir Android -fone (dit lyk goed in 'n Chrome -blaaier).

Stap 4: Die spelkode

Die spelkode
Die spelkode

Kommunikasie tussen die NodeMCU -bediener en die slimfoonblaaier geskied via Websockets. Nadat die gebruiker op 'n knoppie gedruk het, stuur die blaaier 'n tekskarakter na die NodeMCU wat ooreenstem met een of meer van die Mini se ligte. Bykomende karakters word gestuur om die spelvloei te beheer. Die Arduino -kode neem dan aksie op grond van die karakter wat hy ontvang het. Websocket -kommunikasie kan slegs binêre en tekskarakters hanteer, sodat 'n bietjie omskakeling nodig is vir heelgetalle (byvoorbeeld die tydsone).

Soos ek genoem het, het ek oorspronklik verwag dat ek die kode van die gekoppelde Hackster -projek vir die kernspelfunksies sou gebruik. Wat ek verwag het sou gebeur, is dat, nadat 'n speler op 'n knoppie gedruk het, die ooreenstemmende LED sou brand en die kode 'n digitale lees op al die LED's sou maak om te sien of die regte een aangesteek is (die Hackster -projek kontroleer die fisiese knoppie -insette, maar dit is dieselfde idee). Dit het wel gewerk, maar om redes wat vir my nog onduidelik is, nie perfek nie. Ongeveer 10% van die tyd sou die Mini sê dat 'n verkeerde knoppie ingedruk is toe dit eintlik die regte was. Alles het goed gelyk op grond van wat ek op die seriële monitor en in die blaaierkonsole kon sien, so ek het geen idee hoekom dit nie werk nie.

Na baie gesukkel met 'n poging om foute na te gaan, het ek die hele idee om die LED -toestande te lees, laat vaar en 'n 'antwoord' -skikking geskep wat kontroleer of die WebSocket -teks wat ontvang is, ooreenstem met die korrekte pen wat in die reeks' reeks 'gestoor is. speel die ligte volgorde om te onthou. Dit blyk 100% betroubaar te wees, selfs al is die manier waarop ek dit geïmplementeer het, 'n bietjie bewerig. Nadat ek met hierdie metode vorendag gekom het, het ek dit teëgekom, wat 'n interessante ondersoek is na die manier waarop sommige digitale slotte werk en analoog is aan die benadering wat in die spel gebruik word.

Die tydsberekening van die knoppie-invoer word nou hanteer met Javascript aan die blaaierkant (ek laat 'n baie ruim 10 sekondes tussen die knoppie-insette toe), en die vloei van die spel word nou heeltemal deur die speler beheer, eerder as met harde kode. Die skerm bevat vensters wat die oorblywende tyd wys om die volgende knoppie te druk, en die aantal insette wat oorbly voordat die volgorde korrek deur die speler ingedien word.

'N Hoë telling word in EEPROM gestoor (of wat geld vir EEPROM in die ESP8266-wêreld) en as 'n speler 'n nuwe hoë telling behaal, kan 'n pop-up-boks hulle 'n eie naam gee, wat ook in EEPROM gestoor word. Hierdie waardes kan herstel word via die opstelbladsy (ek is seker dat daar wettige redes hiervoor kan wees).

Met dit alles gesê, het ek 'n ordentlike deel van die Hackster-spelkode hergebruik, wat dinge baie bespoedig het.

Stap 5: Die res van die kode

Die res van die kode
Die res van die kode

In vergelyking met die Hackster -projekkode, lyk my Arduino -skets enorm, selfs sonder al die HTML, CSS en Javascript in die datalêers. Maar die grootste deel van die skets is 'n klomp funksies wat verband hou met basiese operasies, soos die skep en bestuur van die bediener, die verkryging van NTP-tyd, mDNS, die verskaffing van lugversorging, WiFi-bestuur, SPIFFS-lêerbestuur en dies meer.

Die Javascript in die HTML -lêers is hoofsaaklik bedoel vir die hantering van die Websocket -boodskappe (ontvang en gestuur) en om die interaktiwiteit van die GUI te verhoog.

Soos ek genoem het, wou ek die funksionaliteit van die "outomatiese ligte" -funksie verbeter, wat 'n ligafhanklike weerstand op die enigste analoge pen van die NodeMCU gebruik om omringende lig op te spoor en die Mini se ligte op 'n vooraf ingestelde vlak aan te skakel (as dit nie in die spelmodus is nie), natuurlik). Alhoewel dit baie ligsinnig is in 'n ligsinnige projek, het dit my gepla dat ek in die oorspronklike projek die aanskakeldrempel hard gekodeer het en dat 'n gebruiker nie kon sien hoe die heersende ligvlak met die drempel verband hou nie. Die ligvlaklesing word elke vyf sekondes na die opstelbladsy gestuur, en die bladsy vertoon ook die huidige drempels vir aan- en afskakel (wat deur die gebruiker gekonfigureer kan word). So werk gedoen met die een.

O, amper vergeet. Die kode is hier op GitHub. Na aflaai, plaas die hele pakket in 'n nuwe gids, laai die Arduino -skets op, dan die inhoud van die datamap in SPIFFS.

Aanbeveel: