Sadržaj:

Lego mini memorijska igra: 5 koraka (sa slikama)
Lego mini memorijska igra: 5 koraka (sa slikama)

Video: Lego mini memorijska igra: 5 koraka (sa slikama)

Video: Lego mini memorijska igra: 5 koraka (sa slikama)
Video: 🟡 POCO X5 PRO - САМЫЙ ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, Jun
Anonim
Image
Image
Lego Mini memorijska igra
Lego Mini memorijska igra

Prije otprilike godinu dana napisao sam Instructable o instaliranju gomile LED dioda u Lego Mini Cooper. Inovacija, kakva je bila, bila je ta da se LED diodama može upravljati pametnim telefonom (ili putem bilo kojeg web preglednika).

Kao što sam mukotrpno opisao u tom Instructable -u, većina tadašnjeg napora odnosila se na ožičenje Mini -a, a da se cijela stvar nije raspala. Donekle na moje iznenađenje, Mini je kasnije preživio putovanje iz Connecticut -a u Toronto i od tada radi, manje -više.

"Ako nije pokvaren, popravio ga je dok nije bio" bit će moj epitaf, u najboljem slučaju, pa kad se Mini vratio kući za Božić, došlo je vrijeme za Lego Mini 2.0. Na kraju krajeva, ako Tesla može uvesti ažuriranje softvera na svoje automobile, koliko bi to moglo biti teško?

Imao sam nekoliko ideja:

  • Poboljšajte prilično nespretno korisničko sučelje
  • Dodajte trubu!
  • Poboljšajte funkciju "automatskog svjetla"; i, najvažnije
  • Dodajte funkciju igre (čak sam i ja prepoznao da će se novost uključivanja i isključivanja Mini svjetla s vašim telefonom prije ili kasnije raspasti)

Funkcija igre bila je najveći zadatak, ne samo zato što mi nije odmah bilo jasno kakva bi to igra mogla biti. Mini je previše krhak da bi izdržao igru koja uključuje rukovanje (osim moguće depresivne varijante Jenga). Još jedna prepreka bila je ta što nikad u životu nisam programirao igru.

Nakon godinu dana bezuspješnog razmišljanja, naletio sam na projekt na Hacksteru, u kojem se Arduino Uno koristi za oponašanje igračke memorijske igre iz 1970 -ih, pod imenom Simon. Ukratko, Simon uređaj je reproducirao niz svjetla koje je igrač tada morao zapamtiti i reproducirati pritiskom na tipke. Nakon svake uspješne runde sekvenca se povećavala po dužini.

Uprkos tome što je bio neophodne berbe, nikada nisam čuo za ovu igru, i moram reći da je neverovatno šta je prošlo za zabavu. Još je nevjerojatnije da je igra Simon još uvijek u prodaji, te da na Amazonu dobiva oduševljene kritike. Jasno je da je ovo morao biti glavni kandidat za prilagođavanje mojim ciljevima. Na kraju krajeva, Mini je već imao svjetla, tako da je sve što sam trebao učiniti bilo odbaciti fizičke tipke i omogućiti korisnički unos putem pametnog telefona. Na softverskoj strani, dakle, činilo se da će to biti samo posao rezanja i lijepljenja.

Ali prvo sam morao napraviti neke manje izmjene na hardveru.

Korak 1: Komponente, alati i resursi

Komponente, alati i resursi
Komponente, alati i resursi

Ako replicirate ovaj projekt s Lego Minijem, trebat će vam sve stvari navedene u mom ranijem uputstvu. Jedino dodatno što će vam trebati je pasivni zvučni signal, koji se koristi za trubu i za stvaranje gomile dosadnih zvukova tokom igre (koji se mogu onemogućiti).

Kao što će postati jasno prilikom rasprave o softveru, nema stvarne potrebe za upotrebom Lego Mini -a za igru. Mogli biste upotrijebiti drugi Lego komplet, ili zaista gomilu LED dioda na ploči spojenoj na bilo koju razvojnu ploču ESP8266. Uz neke releje, čak biste mogli koristiti i sobnu rasvjetu. Djeco, ipak prvo pitajte svoje roditelje o tome.

Slično, nisu potrebni dodatni alati ili resursi osim onih navedenih za originalni projekt.

Ako ste među šačicom ljudi koji su pročitali originalni opis projekta, znat ćete da je Lego Mini prvobitno kupljen na poklon mojoj odrasloj kćeri koja ima gotovo identičan "pravi" Mini ili gotovo identičan kao moglo bi se reći da je to novi Mini, a ne "klasik". Nedostatak bilo kakvih značajnih dodatnih komponenti učinio je ovaj novi projekt još privlačnijim jer bi mi omogućio da efektivno ponovno poklonim Lego Mini 2.0 kao novi božićni poklon, a da to ne košta ni novčića. Genijalno!

Korak 2: Modifikacija hardvera

Modifikacija hardvera
Modifikacija hardvera

Originalni projekat je imao individualno kontrolisane RGB LED unutrašnje LED diode. Oni su potrošili tri pina na NodeMCU -u, koje sam koristio kao razvojnu ploču. Nakon diskretnih konsultacija s vlasnikom Lego Minija, utvrđeno je da su RGB LED diode nedovoljno korištene. Ovo je bila važna inteligencija jer sam trebao osloboditi iglu za zujalicu/trubu.

Gornji dijagram kola je iz originalnog projekta. Jedina promjena potrebna za ovaj projekt bila je uklanjanje RGB LED dioda i upotreba tri oslobođena pina na sljedeći način:

  • D1 za upravljački signal zujalice (koji je također povezan direktno na napajanje od 5VDC)
  • D7 za bijelu LED unutrašnjost
  • D8 za jedan od onih LED -ova u boji koji trepere, koje sam nazvao "disco"

Zvučni signal sam se uredno uvukao ispod motornog prostora pa je provođenje žica natrag do NodeMCU -a bilo jednostavno.

Korak 3: Ažuriranje grafičkog sučelja

Ažuriranje grafičkog sučelja
Ažuriranje grafičkog sučelja
Ažuriranje grafičkog sučelja
Ažuriranje grafičkog sučelja
Ažuriranje grafičkog sučelja
Ažuriranje grafičkog sučelja

Prvi korak u ažuriranju grafičkog sučelja bio je stvaranje četiri zasebne web stranice:

  • "Splash screen" koji se pokreće putem prilagođene ikone na vašem pametnom telefonu i povezuje na druge stranice
  • Stranica "Kontrole" koja kontrolira svjetla (i sada, naravno, sirenu)
  • Stranica "Igra"
  • Stranica za postavljanje koja sadrži opcije konfiguracije kao što su:

    • Uključivanje i isključivanje zvuka
    • Postavljanje vremenske zone (Mini dobiva vrijeme s interneta kako bi mogao zasvijetliti satima u odgovarajuće vrijeme)
    • Podešavanje vremena kada će "automatska svjetla" uključiti i isključiti prednja svjetla na osnovu nivoa ambijentalnog svjetla
    • Vraćanje imena visokog i najboljeg bodovanja (pohranjeno u EEPROM -u)

Odvajanje funkcija na ovaj način čini iskustvo koje je nalik aplikacijama. Dobivanje NodeMCU-a za posluživanje više stranica bio je jedan od izazova za ovaj projekt. Nakon što sam isprobao nekoliko različitih pristupa, naišao sam na kod koji vidite u redovima 232 do 236 glavne Arduino skice. Ovo odlično funkcionira - jednostavno stvorite indeksnu datoteku, a zatim imenujte sljedeće stranice page1, page2 itd. Otkrio sam da moram staviti sve datoteke resursa (CSS i slike) u mapu root podataka, ali to zapravo nije problem za web lokacije ove veličine.

Zatim sam morao raditi s CSS -om i Javascriptom kako bih napravio nešto što je izgledalo kao da pripada Lego Miniju. Pošto ne znam ništa o bilo kojoj od tema, ovdje je bilo dosta guglanja prije nego što sam dobio nešto čime sam bio zadovoljan. Počeo sam tako što sam besramno kopirao lego kocku u CSS stilu na CodePen ovdje. Takođe sam hteo da se odmaknem od označavanja dugmadi tekstom i da završim korišćenjem jednostavnih grafika iz Icons8, koje su bile savršene za moje potrebe. Ostali su od tamo nekako pali. Stranice se prilično dobro prikazuju na svim iPhone uređajima na kojima sam ih testirao. Nadajmo se da isto važi i za Android telefone (izgleda u redu na desktop pregledaču Chrome).

Korak 4: Kôd igre

Kôd igre
Kôd igre

Komunikacija između NodeMCU servera i pretraživača pametnog telefona odvija se putem Websocketa. Nakon što korisnik pritisne dugme, pretraživač šalje tekstualni znak NodeMCU -u koji odgovara jednom ili više lampica Mini -a. Dodatni znakovi se šalju za kontrolu toka igre. Arduino kôd tada poduzima radnju na temelju primljenog znaka. Websocket komunikacija može rukovati samo binarnim i tekstualnim znakovima pa je potrebna neka konverzija za cijele brojeve (npr. Vremenska zona).

Kao što sam spomenuo, prvobitno sam očekivao korištenje koda iz povezanog Hackster projekta za osnovne funkcije igre. Očekivao sam da će se dogoditi da će, nakon što je igrač pritisnuo dugme, zasvijetliti odgovarajuća LED dioda i kôd će izvršiti digitalno čitanje na svim LED diodama kako bi provjerio je li svijetlila desna (projekt Hackster provjerava ulaze fizičkih gumba, ali to je ista ideja). To je nekako funkcioniralo, ali iz razloga koji su mi i dalje nejasni, nije savršeno. Otprilike 10% vremena Mini bi rekao da je pritisnuto pogrešno dugme, a zapravo je bilo ispravno. Sve je izgledalo u redu na osnovu onoga što sam mogao vidjeti na serijskom monitoru i u konzoli preglednika pa nemam pojma zašto to nije uspjelo.

Nakon puno slaganja sa pokušajima uvođenja neke provjere grešaka, odbacio sam cijelu ideju čitanja LED stanja i stvorio niz "odgovora" koji provjerava odgovara li primljeni tekst Websocket ispravnom pin -u pohranjenom u nizu "slijed" koji pušta svjetlosnu sekvencu za pamćenje. Čini se da je ovo 100% pouzdano čak i ako je način na koji sam to primijenio pomalo mučan. Nakon što sam smislio ovu metodu, naišao sam na ovo, što je zanimljivo istraživanje načina na koji neke digitalne brave funkcioniraju i analogno pristupu koji se koristi u igri.

Vrijeme unosa tipki sada se upravlja pomoću Javascripta na strani preglednika (dopuštam vrlo izdašnih 10 sekundi između unosa dugmadi), a tok igre sada u potpunosti kontrolira igrač, a ne strogo kodiran. Na ekranu se pojavljuju prozori koji pokazuju preostalo vrijeme do sljedećeg pritiskanja dugmeta i broj unosa koji su preostali prije nego što sekvenca pravilno preda sekvencu.

Visoki rezultat pohranjen je u EEPROM-u (ili ono što prolazi za EEPROM u svijetu ESP8266), a ako igrač postigne novu visoku ocjenu, skočni okvir omogućava mu da unese ime po svom izboru, koje je također pohranjeno u EEPROM-u. Ove se vrijednosti mogu vratiti na početnu stranicu (siguran sam da za to postoje opravdani razlozi).

Uz sve navedeno, ponovno sam koristio pristojan komad koda igre Hackster koji je uvelike ubrzao stvari.

Korak 5: Ostatak koda

Ostatak Kodeksa
Ostatak Kodeksa

U poređenju sa kodom projekta Hackster, moja Arduino skica izgleda ogromno, čak i bez svih HTML -a, CSS -a i Javascripta u datotekama podataka. No, najveći dio skice je hrpa funkcija koje se odnose na osnovne operacije, kao što su stvaranje i upravljanje poslužiteljem, dobijanje NTP vremena, mDNS, omogućavanje bežičnog ažuriranja, upravljanje WiFi-om, upravljanje datotekama SPIFFS i slično.

Javascript u HTML datotekama prvenstveno služi za rukovanje Websocket porukama (primljenim i poslanim) i povećanje interaktivnosti grafičkog sučelja.

Kao što sam spomenuo, želio sam poboljšati funkcionalnost funkcije "auto svjetla", koja koristi otpornik ovisan o svjetlu na jedinom analognom pinu NodeMCU -a za otkrivanje ambijentalnog svjetla i uključivanje svjetla Mini na unaprijed postavljenom nivou (kada nije u načinu igre, naravno). Iako je ovo vrlo neozbiljna karakteristika u neozbiljnom projektu, zasmetalo mi je što sam u originalnom projektu teško kodirao prag uključivanja i što korisnik nije mogao vidjeti kako je prevladavajući nivo svjetlosti povezan s tim pragom. Sada se očitanje razine svjetlosti šalje na stranicu za postavljanje svakih pet sekundi, a ta stranica prikazuje i trenutne pragove za uključivanje i isključivanje (koje korisnik može konfigurirati). Pa posao je obavljen po tom pitanju.

Oh, skoro sam zaboravio. Kod se nalazi na GitHub -u ovdje. Nakon preuzimanja, stavite cijeli paket u novu mapu, učitajte Arduino skicu, a zatim sadržaj mape s podacima u SPIFFS.

Preporučuje se: