Sisällysluettelo:

Lego Mini -muistipeli: 5 vaihetta (kuvilla)
Lego Mini -muistipeli: 5 vaihetta (kuvilla)

Video: Lego Mini -muistipeli: 5 vaihetta (kuvilla)

Video: Lego Mini -muistipeli: 5 vaihetta (kuvilla)
Video: ДЕТИ ЛЕДИБАГ И СУПЕР-КОТА 😱 Сказки на ночь от Маринетт Miraculous Ladybug & Cat Noir in real life 2024, Heinäkuu
Anonim
Image
Image
Lego Mini muistipeli
Lego Mini muistipeli

Noin vuosi sitten kirjoitin Instructable -paketin LED -valon asentamisesta Lego Mini Cooperiin. Innovaatio, kuten se oli, oli, että LED -valoja voidaan ohjata älypuhelimella (tai millä tahansa verkkoselaimella).

Kuten kuvailin työläästi tuossa Instructable -ohjelmassa, suurin osa ponnisteluista liittyi Minin johdotukseen ilman, että koko asia hajosi. Yllätyksekseni Mini selviytyi myöhemmin matkasta Connecticutista Torontoon ja on toiminut enemmän tai vähemmän siitä lähtien.

"Jos se ei ollut rikki, hän korjasi sen, kunnes se oli", se on parhaimmillaan minun epitafiani, joten kun Mini palasi kotiin jouluksi, oli aika Lego Mini 2.0: lle. Loppujen lopuksi, jos Tesla voi lähettää ohjelmistopäivityksiä autoilleen, kuinka vaikeaa se voi olla?

Minulla oli muutama idea:

  • Paranna melko hankalaa käyttöliittymää
  • Lisää torvi!
  • Paranna "automaattisten valojen" ominaisuutta; ja, tärkeintä
  • Lisää pelitoiminto (jopa minä huomasin, että uutuus Minin valojen sytyttämisestä ja sammuttamisesta puhelimella menettää ennemmin tai myöhemmin)

Pelitoiminto oli suurin tehtävä, ei vähiten siksi, että minulle ei ollut heti selvää, millainen peli se voisi olla. Mini on aivan liian herkkä kestämään peliä, jossa sitä käsitellään (paitsi mahdollisesti masentavaa Jengan varianttia). Toinen este oli se, että en ole koskaan ohjelmoinut peliä elämässäni.

Vuoden hedelmättömän pohdinnan jälkeen törmäsin Hackster -projektiin, jossa Arduino Unoa käytetään jäljittelemään 1970 -luvulta peräisin olevaa muistipelilelua nimeltä Simon. Lyhyesti sanottuna Simon -laite toisti valosarjan, jonka pelaajan oli sitten muistettava ja toistettava painikkeita painamalla. Jokaisen onnistuneen kierroksen jälkeen sarjaa kasvatettiin.

Huolimatta vaadittavasta vuosikertaa, en todellakaan ollut koskaan kuullut tästä pelistä, ja minun on sanottava, että on hämmästyttävää, mikä tapahtui ajanvietteeksi. Vielä hämmästyttävämpää on, että Simon -peli on edelleen myynnissä ja kerää ylistäviä arvosteluja Amazonissa. On selvää, että tämän piti olla paras ehdokas sopeutuakseni tarkoituksiini. Loppujen lopuksi Minissä oli jo valot, joten minun tarvitsee vain hylätä fyysiset painikkeet ja antaa käyttäjän syöttö älypuhelimen kautta. Ohjelmistopuolella näin ollen näytti siltä, että tämä olisi vain suurelta osin leikkaus- ja liittämistyö.

Mutta ensin minun piti tehdä pieniä muutoksia laitteistoon.

Vaihe 1: Komponentit, työkalut ja resurssit

Komponentit, työkalut ja resurssit
Komponentit, työkalut ja resurssit

Jos toistat tätä projektia Lego Minillä, tarvitset kaikki aikaisemmassa Instructable -ohjelmassani luetellut tavarat. Ainoa ylimääräinen asia, jota tarvitset, on passiivinen summeri, jota käytetään äänitorveen ja pelin aikana ärsyttävän äänen tuottamiseen (joka voidaan poistaa käytöstä).

Kuten tulee selväksi, kun keskustellaan ohjelmistosta, Lego Minin käyttäminen peliin ei ole todellista tarvetta. Voit käyttää toista Lego -sarjaa tai jopa joukkoa LED -valoja leipälaudalla, joka on kytketty mihin tahansa ESP8266 -kehityskorttiin. Joidenkin releiden avulla voit jopa käyttää kodin huonevaloa. Lapset, kysy kuitenkin ensin vanhemmiltasi.

Samoin ei tarvita muita työkaluja tai resursseja kuin alkuperäisessä projektissa luetellut.

Jos kuulut niiden kourallisten joukkoon, jotka lukevat alkuperäisen projektikuvauksen, tiedät, että Lego Mini ostettiin alun perin lahjaksi aikuiselle tyttärelleni, jolla on lähes identtinen "oikea" Mini tai lähes identtinen sille voidaan antaa uusi mini, ei "klassikko". Merkityksellisten lisäkomponenttien puute teki tästä uudesta projektista entistä houkuttelevamman, koska sen avulla voisin lahjoittaa tehokkaasti Lego Mini 2.0: n uutena joululahjana ilman, että se maksaisi lainkaan. Nero!

Vaihe 2: Laitteiston muokkaus

Laitteiston muokkaus
Laitteiston muokkaus

Alkuperäisessä projektissa oli yksilöllisesti ohjattavat RGB -sisätilojen LEDit. Nämä kuluttivat kolme nastaa NodeMCU: ssa, jota käytin kehityskorttina. Lego Mini -omistajan erillisen kuulemisen jälkeen todettiin, että RGB -LEDit olivat alikäytetty ominaisuus. Tämä oli tärkeää älykkyyttä, koska minun oli vapautettava tappi summerille/äänimerkille.

Yllä oleva piirikaavio on alkuperäisestä projektista. Ainoa muutos tähän projektiin oli RGB-LEDien poistaminen ja kolmen vapautetun nastan käyttö seuraavasti:

  • D1 summerin ohjaussignaalille (joka on myös kytketty suoraan 5VDC -virtalähteeseen)
  • D7 valkoiselle sisä -LEDille
  • D8 yhdelle niistä vilkkuvista värillisistä LED -valoista, jotka olen kutsunut "disko" -valoiksi

Itse summeri piiloutuu siististi moottoritilan alle, joten johtojen johtaminen takaisin NodeMCU: hon oli hetkellinen.

Vaihe 3: Päivitä käyttöliittymä

GUI: n päivittäminen
GUI: n päivittäminen
GUI: n päivittäminen
GUI: n päivittäminen
GUI: n päivittäminen
GUI: n päivittäminen

Ensimmäinen askel GUI: n päivittämisessä oli luoda neljä erillistä verkkosivua:

  • "Aloitusnäyttö", joka avautuu älypuhelimesi mukautetun kuvakkeen kautta ja linkittää muille sivuille
  • "Ohjaimet" -sivu, joka ohjaa hyvin valoja (ja nyt tietysti torvea)
  • "Peli" -sivu
  • Asetussivu, joka sisältää määritysvaihtoehtoja, kuten:

    • Äänen kytkeminen päälle ja pois
    • Aikavyöhykkeen asettaminen (Mini saa aikaa Internetistä, jotta se voi vilkuttaa valojaan kellonaikana sopivalla ajalla)
    • Säätäminen, kun "automaattiset valot" kytkevät ajovalot päälle ja pois päältä ympäristön valon mukaan
    • Huipputuloksen ja huipputuloksen nimen nollaaminen (tallennettu EEPROMiin)

Toimintojen erottaminen tällä tavalla tekee sovelluksista paljon kokemuksellisemman. NodeMCU: n saaminen palvelemaan useita sivuja oli yksi tämän projektin haasteista. Kokeiltuani pari eri lähestymistapaa törmäsin koodiin, jonka näet Arduinon pääluonnoksen riveillä 232 - 236. Tämä toimii loistavasti - luo vain hakemistotiedosto ja nimeä seuraavat sivut sivu1, sivu2 jne. Huomasin, että minun piti laittaa kaikki resurssitiedostot (CSS ja kuvat) juuritietokansioon, mutta tämä ei ole ongelma tämä koko.

Seuraavaksi minun piti työskennellä CSS: n ja Javascriptin kanssa tehdäkseni jotain, joka näytti kuuluvan Lego Minille. Koska tiedän lähes mitään kummastakaan aiheesta, täällä oli paljon googlettamista ennen kuin sain jotain, johon olin tyytyväinen. Aloitin kopioimalla häpeämättömästi CSP-tyylisen lego-palikan CodePeniin täältä. Halusin myös luopua painikkeiden merkitsemisestä tekstillä ja käyttää Icons8: n yksinkertaisia grafiikoita, jotka olivat täydellisiä tarkoituksiini. Loput putosivat paikalleen sieltä. Sivut näyttävät melko hyvin kaikilla iPhonilla, joilla olen testannut niitä. Toivottavasti sama pätee myös Android -puhelimiin (näyttää hyvältä työpöydän Chrome -selaimessa).

Vaihe 4: Pelikoodi

Pelikoodi
Pelikoodi

Viestintä NodeMCU -palvelimen ja älypuhelimen selaimen välillä tapahtuu Websocketsin kautta. Kun käyttäjä on painanut painiketta, selain lähettää NodeMCU: lle tekstimerkin, joka vastaa yhtä tai useampaa Minin valoa. Lisähahmot lähetetään ohjaamaan pelin kulkua. Arduino -koodi toimii sitten vastaanotetun merkin perusteella. Websocket -tiedonsiirto voi käsitellä vain binaarisia ja tekstimerkkejä, joten kokonaislukuja (esim. Aikavyöhyke) on muutettava.

Kuten mainitsin, olin alun perin odottanut, että linkitetyn Hackster -projektin koodia käytetään pelin ydintoimintoihin. Odotin tapahtuvan, että kun pelaaja on painanut painiketta, vastaava LED -valo syttyy ja koodi tekee digitaalisen lukemisen kaikista LED -valoista nähdäkseen, palaako oikea (Hackster -projekti tarkistaa fyysiset painikkeiden tulot, mutta se on sama ajatus). Tämä toimi, tavallaan, mutta minulle vielä epäselvistä syistä, ei täydellisesti. Noin 10% ajasta Mini sanoi, että väärää painiketta painettiin, kun itse asiassa oikea oli painettu. Kaikki näytti ok sen perusteella, mitä sarjamonitorissa ja selainkonsolissa näin, joten en tiedä miksi se ei toiminut.

Pitkän faffingin jälkeen, kun yritin ottaa käyttöön virhetarkistusta, hylkäsin koko ajatuksen LED -tilojen lukemisesta ja loin "vastaus" -matriisin, joka tarkistaa, vastaako vastaanotettu Websocket -teksti oikeaa pinota, joka on tallennettu "sekvenssitaulukkoon" toistaa valosarjan muistettavaksi. Tämä näyttää olevan 100% luotettava, vaikka tapa, jolla olen toteuttanut sen, on hieman hämmentävä. Kun keksin tämän menetelmän, törmäsin tähän, mikä on mielenkiintoinen tutkimus joidenkin digitaalisten lukkojen toiminnasta ja analoginen pelissä käytetylle lähestymistavalle.

Painikkeiden syöttämisen ajoitusta käsitellään nyt Javascriptin avulla selaimen puolella (sallin erittäin anteliaan 10 sekunnin painikkeiden välillä) ja pelin kulkua ohjaa nyt kokonaan pelaaja eikä koodattu. Näyttö sisältää ikkunat, joissa näkyy jäljellä oleva aika seuraavan painikkeen painallukseen ja kuinka monta tuloa on jäljellä ennen kuin soitin on lähettänyt sarjan oikein.

Korkeat pisteet tallennetaan EEPROM-järjestelmään (tai mitä EEPROM-järjestelmään kuuluu ESP8266-maailmassa), ja jos pelaaja osuu uuteen ennätykseen, ponnahdusikkunassa hän voi syöttää valitsemansa nimen, joka myös tallennetaan EEPROMiin. Nämä arvot voidaan nollata Asetukset-sivun kautta (olen varma, että tähän voi olla perusteltuja syitä).

Kaiken tämän jälkeen käytin uudelleen kunnollista osaa Hackster-pelikoodista, joka nopeutti asioita paljon.

Vaihe 5: Loput koodista

Muu koodi
Muu koodi

Hackster -projektikoodiin verrattuna Arduino -luonnokseni näyttää valtavalta, vaikka ilman kaikkia tiedostoja sisältävää HTML-, CSS- ja Javascript -tiedostoa. Suurin osa luonnoksesta on kuitenkin joukko toimintoja, jotka liittyvät perustoimintoihin, kuten palvelimen luomiseen ja hallintaan, NTP-ajan hankkimiseen, mDNS: ään, langattoman päivityksen tarjoamiseen, WiFi-hallintaan, SPIFFS-tiedostonhallintaan ja vastaaviin.

HTML -tiedostojen Javascript on tarkoitettu ensisijaisesti Websocket -viestien (vastaanotettujen ja lähetettyjen) käsittelyyn ja graafisen käyttöliittymän vuorovaikutteisuuden lisäämiseen.

Kuten mainitsin, halusin parantaa "auto lights" -toiminnon toiminnallisuutta, joka käyttää NodeMCU: n ainoan analogisen nastan valosta riippuvaa vastusta havaitakseen ympäristön valon ja kytkeäkseen Minin valot esiasetetulle tasolle (kun ei pelitilassa), tietysti). Vaikka tämä on hyvin kevytmielinen ominaisuus kevytmielisessä projektissa, minua häiritsi se, että olin alkuperäisessä projektissa koodannut käynnistyskynnyksen kovasti ja että käyttäjä ei voinut mitenkään nähdä, kuinka vallitseva valotaso liittyi kyseiseen kynnykseen. Nyt valotason lukema lähetetään asetussivulle viiden sekunnin välein ja tällä sivulla näytetään myös nykyiset käynnistys- ja sammutuskynnykset (jotka käyttäjä voi määrittää). Joten työ on tehty sen suhteen.

Voi, melkein unohtui. Koodi on täällä GitHubissa. Lataamisen jälkeen laita koko paketti uuteen kansioon, lataa Arduino -luonnos ja sitten datakansion sisältö SPIFFS -tiedostoon.

Suositeltava: