Kazalo:

Lego Mini spominska igra: 5 korakov (s slikami)
Lego Mini spominska igra: 5 korakov (s slikami)

Video: Lego Mini spominska igra: 5 korakov (s slikami)

Video: Lego Mini spominska igra: 5 korakov (s slikami)
Video: Marcus & Martinus - Elektrisk (Official Music Video) ft. Katastrofe 2024, December
Anonim
Image
Image
Lego Mini spominska igra
Lego Mini spominska igra

Pred kakšnim letom sem napisal Instructable o namestitvi kopice LED v Lego Mini Cooper. Inovacija, kakršna je bila, je bila, da je LED mogoče upravljati s pametnim telefonom (ali pa prek katerega koli spletnega brskalnika).

Kot sem v tem Instructableu naporno opisal, se je večina takratnega truda nanašala na ožičenje Minija, ne da bi vse skupaj razpadlo. Na moje presenečenje je Mini kasneje preživel potovanje iz Connecticuta v Toronto in od takrat bolj ali manj dela.

"Če ni bil pokvarjen, ga je popravil, dokler ni bil" bo v najboljšem primeru moj epitaf. Ko se je Mini vrnil domov za božič, je bil čas za Lego Mini 2.0. Konec koncev, če bi lahko Tesla pospeševala posodobitve programske opreme za svoje avtomobile, kako težko bi to lahko bilo?

Imel sem nekaj idej:

  • Izboljšajte precej okoren uporabniški vmesnik
  • Dodajte rog!
  • Izboljšajte funkcijo "samodejne luči"; in kar je najpomembnejše
  • Dodajte funkcijo igre (tudi jaz sem spoznal, da se bo novost vklopa in izklopa luči Mini s telefonom slej ko prej razblinila)

Igralna funkcija je bila največja naloga, nenazadnje zato, ker mi ni bilo takoj očitno, kakšna igra bi lahko bila. Mini je preveč krhek, da bi lahko vzdržal igro, ki bi ga vodila (razen morda depresivne različice Jenga). Druga ovira je bila ta, da v življenju še nisem programiral igre.

Po letu brezplodnega razmišljanja sem naletel na projekt na Hacksterju, v katerem se Arduino Uno posnema igračo spominske igre iz sedemdesetih let, imenovano Simon. Na kratko, naprava Simon je predvajala zaporedje luči, ki si jih je moral igralec zapomniti in jih predvajati s pritiskom na gumbe. Po vsakem uspešnem krogu se je zaporedje podaljšalo.

Kljub temu, da je bil potreben letnik, za to igro pravzaprav še nikoli nisem slišal in moram reči, da je neverjetno, kaj se je v zadnjem času zgodilo za zabavo. Še bolj neverjetno je, da je igra Simon še vedno v prodaji in na Amazon pridobiva navdušene kritike. Jasno je, da je moral biti to glavni kandidat za prilagoditev mojim namenom. Konec koncev je Mini že imel luči, zato sem moral le odstraniti fizične gumbe in uporabniku omogočiti vnos prek pametnega telefona. Na strani programske opreme se je torej zdelo, da bo to v veliki meri le izrezovanje in lepljenje.

Najprej pa sem moral narediti nekaj manjših sprememb v strojni opremi.

Korak: Komponente, orodja in viri

Sestavni deli, orodja in viri
Sestavni deli, orodja in viri

Če ta projekt posnemate z Lego Mini, boste potrebovali vse stvari, navedene v mojem prejšnjem Instructable. Edina dodatna stvar, ki jo potrebujete, je pasivni zvočni signal, ki se uporablja za rog in med igro oddaja kopico nadležnih zvokov (ki jih je mogoče onemogočiti).

Kot bo postalo jasno pri razpravi o programski opremi, za igro ni potrebe po uporabi Lego Mini. Lahko bi uporabili drug komplet Lego ali celo kup LED na plošči, priključeni na katero koli razvojno ploščo ESP8266. Z nekaterimi releji lahko celo uporabite razsvetljavo doma. Otroci, najprej o tem vprašajte svoje starše.

Podobno niso potrebna nobena dodatna orodja ali viri, razen tistih, ki so navedena za prvotni projekt.

Če ste med peščico ljudi, ki so prebrali izvirni opis projekta, boste vedeli, da je bil Lego Mini prvotno kupljen kot darilo moji odrasli hčerki, ki ima skoraj enak "pravi" Mini, ali skoraj enak kot lahko bi rekli, da je to nov Mini, ne pa "Classic". Zaradi pomanjkanja kakršnih koli pomembnih dodatnih komponent je bil ta novi projekt še bolj privlačen, saj bi mi omogočil učinkovito ponovno darilo Lego Mini 2.0 kot novo božično darilo, ne da bi to stalo komaj en cent. Genialno!

2. korak: Sprememba strojne opreme

Modifikacija strojne opreme
Modifikacija strojne opreme

Prvotni projekt je imel individualno upravljane notranje LED diode RGB. Ti so porabili tri zatiče na NodeMCU, ki sem jih uporabljal kot razvojno ploščo. Po diskretnem posvetovanju z lastnikom Lego Mini je bilo ugotovljeno, da so LED diode RGB premalo uporabljene. To je bila pomembna inteligenca, ker sem moral osvoboditi zatič za zvočni signal/rog.

Zgornji diagram vezja je iz prvotnega projekta. Edina sprememba, potrebna za ta projekt, je bila odstranitev LED RGB in uporaba treh sproščenih zatičev na naslednji način:

  • D1 za krmilni signal brenčalnika (ki je priključen tudi neposredno na napajanje 5VDC)
  • D7 za belo notranjo LED
  • D8 za eno od tistih utripajočih barvnih LED, ki sem jih poimenoval "disco" luč

Brenčalnik se je lepo spravil pod motorni prostor, zato je bilo vodenje žic nazaj do NodeMCU preprosto.

3. korak: Posodobitev grafičnega vmesnika

Posodobitev grafičnega vmesnika
Posodobitev grafičnega vmesnika
Posodobitev grafičnega vmesnika
Posodobitev grafičnega vmesnika
Posodobitev grafičnega vmesnika
Posodobitev grafičnega vmesnika

Prvi korak pri posodobitvi grafičnega vmesnika je bil ustvariti štiri ločene spletne strani:

  • "Začetni zaslon", ki se zažene prek ikone po meri na vašem pametnem telefonu in poveže z drugimi stranmi
  • Stran "Controls", ki nadzoruje luči (in zdaj seveda hupo)
  • Stran "Igra"
  • Stran za nastavitev, ki vsebuje konfiguracijske možnosti, kot so:

    • Vklop in izklop zvoka
    • Nastavitev časovnega pasu (Mini dobi čas iz interneta, da lahko ob ustreznem času utripa z uro)
    • Nastavitev, kdaj bodo "samodejne luči" vklopile in izklopile žaromete glede na raven svetlobe v okolici
    • Ponastavitev imena najboljših in najboljših točk (shranjenih v EEPROM -u)

Na ta način ločitev funkcij naredi aplikaciji podobno izkušnjo. Eden od izzivov tega projekta je bil dostop do NodeMCU, ki je namenjen večstranskim stranim. Ko sem preizkusil nekaj različnih pristopov, sem naletel na kodo, ki jo vidite v vrsticah 232 do 236 glavne skice Arduino. To odlično deluje - preprosto ustvarite indeksno datoteko, nato poimenujte naslednje strani page1, page2 itd. Ugotovil sem, da moram vse datoteke virov (CSS in slike) postaviti v korensko mapo s podatki, vendar to v resnici ni problem za spletna mesta z to velikost.

Nato sem moral začeti delati s CSS in Javascript, da bi naredil nekaj, kar je izgledalo kot da pripada Lego Miniju. Ker o nobeni temi ne vem ničesar, je bilo tukaj veliko googlanja, preden sem dobil nekaj, s čimer sem bil zadovoljen. Začel sem z nesramnim kopiranjem lego opeke v slogu CSS na CodePen tukaj. Želel sem se tudi umakniti od označevanja gumbov z besedilom in končati z uporabo preprostih grafik iz Icons8, ki so bile kot nalašč za moje namene. Ostalo je od tam nekako padlo. Strani se na vseh iPhonih, na katerih sem jih preizkusil, precej dobro upodobijo. Upajmo, da enako velja tudi za telefone Android (v brskalniku Chrome za namizne računalnike izgleda v redu).

4. korak: Koda igre

Koda igre
Koda igre

Komunikacija med strežnikom NodeMCU in brskalnikom pametnega telefona poteka prek Websockets. Ko uporabnik pritisne gumb, brskalnik pošlje besedilni znak v NodeMCU, ki ustreza eni ali več lučkam Mini. Za nadzor poteka igre se pošljejo dodatni znaki. Koda Arduino nato ukrepa glede na prejeti znak. Komunikacija Websocket lahko obravnava samo binarne in besedilne znake, zato je potrebna cela pretvorba za celo število (npr. Časovni pas).

Kot sem že omenil, sem prvotno pričakoval uporabo kode iz povezanega projekta Hackster za osnovne funkcije iger. Pričakoval sem, da se bo po tem, ko bo igralec pritisnil gumb, prižgala ustrezna LED in koda bo naredila digitalno branje na vseh LED, da preveri, ali je prižgana desna (projekt Hackster preveri vnose fizičnih gumbov, vendar to je ista ideja). To je nekako delovalo, vendar iz razlogov, ki so mi še vedno nejasni, ne povsem. Približno 10% časa je Mini rekel, da je bil pritisnjen napačen gumb, ko je bil v resnici pravi. Glede na to, kar sem videl na serijskem monitorju in v konzoli brskalnika, se je vse zdelo v redu, zato ne vem, zakaj ni delovalo.

Po dolgem ponarejanju s poskusom uvedbe preverjanja napak sem umaknil celotno idejo o branju stanj LED in ustvaril matriko "odgovor", ki preveri, ali prejeto besedilo Websocket ustreza pravilnemu zatiču, shranjenemu v matriki "zaporedje", ki predvaja zaporedje svetlobe, ki si ga zapomnite. Zdi se, da je to 100% zanesljivo, čeprav je način, kako sem ga izvedel, nekoliko zapleten. Ko sem prišel s to metodo, sem naletel na to, kar je zanimivo raziskovanje delovanja nekaterih digitalnih ključavnic in analogno pristopu, ki se uporablja v igri.

Časovnik vnosov gumbov se zdaj upravlja z Javascriptom na strani brskalnika (med vnosi gumbov dovolim zelo velikodušnih 10 sekund), potek igre pa zdaj v celoti nadzoruje igralec in ne trdo kodiran. Zaslon vsebuje okna, ki prikazujejo preostali čas do naslednjega pritiska gumba in število vnosov, ki ostanejo, preden predvajalnik pravilno predloži zaporedje.

Najvišja ocena je shranjena v EEPROM-u (ali tistemu, kar velja za EEPROM v svetu ESP8266), in če igralec doseže novo visoko oceno, se v pojavnem oknu omogoči vnos imena, ki ga izberejo, ki je shranjeno tudi v EEPROM-u. Te vrednosti je mogoče ponastaviti na strani za nastavitev (prepričan sem, da obstajajo razlogi za to).

Ob vsem tem sem ponovno uporabil spodoben kos kode igre Hackster, ki je stvari zelo pospešil.

5. korak: Preostali del kode

Preostali del kodeksa
Preostali del kodeksa

V primerjavi s kodo projekta Hackster je moja skica Arduino videti ogromna, tudi brez vseh HTML, CSS in Javascript v podatkovnih datotekah. Toda večina skice je kup funkcij, povezanih z osnovnimi operacijami, kot so ustvarjanje in upravljanje strežnika, pridobivanje časa NTP, mDNS, zagotavljanje posodabljanja po zraku, upravljanje WiFi, upravljanje datotek SPIFFS in podobno.

Javascript v datotekah HTML je namenjen predvsem obdelavi (prejetim in poslanim) sporočilom Websocket in povečanju interaktivnosti grafičnega vmesnika.

Kot sem že omenil, sem želel izboljšati funkcionalnost funkcije "samodejne luči", ki uporablja upor, odvisen od svetlobe na edinem analognem zatiču NodeMCU, za zaznavanje zunanje svetlobe in prižiganje luči Mini na prednastavljeni ravni (če ni v načinu igre, seveda). Čeprav je to zelo neresna funkcija v neresnem projektu, me je motilo, da sem v prvotnem projektu trdo kodiral prag vklopa in da uporabnik ni mogel videti, kako je prevladujoča raven svetlobe povezana s tem pragom. Zdaj se odčitki ravni svetlobe vsakih pet sekund pošiljajo na stran za nastavitev in na tej strani so prikazani tudi trenutni pragi za vklop in izklop (ki jih lahko nastavi uporabnik). Torej je delo opravljeno na tem področju.

Oh, skoraj pozabil. Koda je na GitHubu tukaj. Po prenosu vstavite celoten paket v novo mapo, naložite skico Arduino in nato vsebino podatkovne mape v SPIFFS.

Priporočena: