Kazalo:
- Korak: Komponente, orodja in viri
- 2. korak: Sprememba strojne opreme
- 3. korak: Posodobitev grafičnega vmesnika
- 4. korak: Koda igre
- 5. korak: Preostali del kode
Video: Lego Mini spominska igra: 5 korakov (s slikami)
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:05
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
Č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
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
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
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
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:
Spominska puzzle igra z uporabo BBC MicroBita: 7 korakov
Memory Puzzle Game z uporabo BBC MicroBit: Če ne veste, kaj je BBC MicroBit, je to v bistvu res majhna naprava, ki jo lahko programirate tako, da ima vhode in izhode. Kindof kot Arduino, vendar bolj izpopolnjen. Pri MicroBitu mi je bilo zelo všeč, da ima dva vgrajena vhoda b
Izdelava lego plošče LEGO: 9 korakov (s slikami)
Izdelava lego plošče: že imamo veliko različnih vrst ploščic! Zakaj narediti drugega? Imam več razlogov:- To je odličen način, da vsakogar naučite, kako deluje načrt in osnove izdelave prototipov, ne da bi jim prikazali dolgočasen diagram.- Zabavno je.- LE
Simon pravi spominska igra: 4 koraki
Simon pravi spominsko igro: To je igra, ki jo imamo mnogi radi in se je spominjamo iz otroštva. Ne samo, da vračamo nostalgične spomine, ampak jih dodajamo v svet računalniškega inženiringa! Ta igra je sestavljena iz različnih stopenj, v katerih so LED -diode s
Spominska igra z dotikom (Simon pravi) - Če je to potem tisto: 6 korakov (s slikami)
Spominska igra z dotikom (Simon pravi) - Če je to potem tisto: Za šolski projekt sem naredil spominsko igro z lastnimi ploščicami na dotik in obročem iz neopikslov. Ta igra je podobna Simon Saysu, le da so različne oblike vnosa in povratnih informacij (zvoki in svetlobni učinki) v igri različne. Programiral sem zvoke iz Su
Spominska ura za škatlo za cigare: 12 korakov
Spominska ura za škatlo za cigare: iz bokse za cigare sem za božič izdelala uro za slike svojih otrok (4), ko so bili zelo majhni, pred 50-60 leti. Škatlo lahko uporabite tudi kot majhno posodo za shranjevanje ključev, drobiža ali česar koli drugega … Unfort