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, Lipanj
Anonim
Image
Image
Lego Mini memorijska igra
Lego Mini memorijska igra

Prije otprilike godinu dana napisao sam Instructable o instaliranju hrpe LED dioda u Lego Mini Cooper. Inovacija, kakva je bila, bila je ta što se LED diodama moglo upravljati pametnim telefonom (ili putem bilo kojeg web preglednika).

Kao što sam mukotrpno opisao u tom Instructableu, većina tadašnjeg napora odnosila se na ožičenje Minija, a da se cijela stvar nije raspala. Donekle na moje iznenađenje, Mini je nakon toga preživio putovanje iz Connecticut -a u Toronto i otada je radio, 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. Uostalom, ako Tesla može uvesti ažuriranje softvera u svoje automobile, koliko bi to moglo biti teško?

Imao sam nekoliko ideja:

  • Poboljšajte prilično nespretno korisničko sučelje
  • Dodajte rog!
  • Poboljšajte značajku "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 održao igru u kojoj se njime rukuje (osim vjerojatno 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 koja je igrač tada morao zapamtiti i reproducirati pritiskom na gumbe. Nakon svakog uspješnog kruga niz se povećavao.

Uprkos tome što je bio neophodne berbe, zapravo nikad nisam čuo za ovu igru, i moram reći da je nevjerojatno što je to prošlo za zabavu. Još je nevjerojatnije to što se igra Simon još uvijek nalazi u prodaji, a na Amazonu dobiva oduševljene kritike. Jasno je da je to morao biti glavni kandidat za prilagodbu mojim ciljevima. Uostalom, Mini je već imao svjetla, pa sam samo trebao odbaciti fizičke gumbe i omogućiti korisnički unos putem pametnog telefona. Na softverskoj strani, dakle, činilo se da će to biti samo posao izrezivanja 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 mojoj ranijoj Instructable. Jedino dodatno što će vam trebati je pasivni zvučni signal, koji se koristi za trubu i za stvaranje gomile dosadnih zvukova tijekom igre (što se može onemogućiti).

Kao što će postati jasno prilikom rasprave o softveru, nema stvarne potrebe koristiti Lego Mini za igru. Mogli biste upotrijebiti drugi Lego komplet, ili doista hrpu LED dioda na ploči spojenoj na bilo koju razvojnu ploču ESP8266. S nekim relejima čak biste mogli koristiti i kućnu rasvjetu. Djeco, ipak prvo pitajte svoje roditelje o tome.

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

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

Korak 2: Izmjena hardvera

Modifikacija hardvera
Modifikacija hardvera

Izvorni projekt imao je individualno kontrolirane RGB LED unutarnje LED diode. Oni su potrošili tri pina na NodeMCU -u, koji sam koristio kao razvojnu ploču. Nakon diskretnih konzultacija 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 izvornog projekta. Jedina promjena potrebna za ovaj projekt bila je uklanjanje RGB LED dioda i korištenje tri oslobođena pina na sljedeći način:

  • D1 za upravljački signal zujalice (koji je također spojen izravno na napajanje od 5VDC)
  • D7 za bijelu unutarnju LED diodu
  • D8 za jedan od onih LED -ova u boji koji trepere, a koje sam nazvao "disco"

Zvučni signal sam se uredno uvukao ispod motornog prostora tako da 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 s drugim stranicama
  • 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čivati i isključivati prednja svjetla ovisno o razini svjetla u okolini
    • Poništavanje imena najboljeg i najboljeg bodovanja (pohranjeno u EEPROM -u)

Odvajanje funkcija na ovaj način čini iskustvo puno sličnijim 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 kôd koji vidite u retcima 232 do 236 glavne Arduino skice. Ovo odlično funkcionira - jednostavno stvorite svoju indeksnu datoteku, a zatim imenujte sljedeće stranice page1, page2 itd. Otkrio sam da sam morao staviti sve datoteke resursa (CSS i slike) u mapu korijenskih podataka, ali to zapravo nije problem za web stranice ove veličine.

Zatim sam morao početi raditi s CSS -om i Javascriptom kako bih napravio nešto što je izgledalo kao da pripada Lego Miniju. Budući da ne znam ništa o bilo kojoj od tema, ovdje je bilo puno guglanja prije nego što sam dobio nešto čime sam bio zadovoljan. Počeo sam tako što sam besramno kopirao lego ciglu u CSS stilu na CodePen ovdje. Također sam se želio odmaknuti od označavanja gumba s tekstom i na kraju upotrijebiti jednostavne grafike 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. Nadamo se da isto vrijedi i za Android telefone (izgleda dobro u stolnom pregledniku Chrome).

Korak 4: Kôd igre

Kôd igre
Kôd igre

Komunikacija između poslužitelja NodeMCU i preglednika pametnog telefona odvija se putem Websocketa. Nakon što korisnik pritisne gumb, preglednik šalje tekstualni znak NodeMCU -u koji odgovara jednom ili više lampica Mini -a. Dodatni znakovi se šalju za kontrolu tijeka igre. Arduino kôd tada poduzima radnju na temelju primljenog znaka. Websocket komunikacija može obrađivati samo binarne i tekstualne znakove pa je potrebna neka konverzija za cijele brojeve (npr. Vremensku zonu).

Kao što sam spomenuo, prvotno 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 tipku, zasvijetliti odgovarajuća LED dioda i kôd će izvršiti digitalno čitanje na svim LED diodama da vidi je li svijetlila desna (projekt Hackster provjerava ulaze fizičkih gumba, ali to je ista ideja). To je nekako uspjelo, ali iz razloga koji su mi i dalje nejasni, nije savršeno. Otprilike 10% vremena Mini bi rekao da je pritisnuta pogrešna tipka, a zapravo je bila ispravna. Sve je izgledalo u redu na temelju onoga što sam mogao vidjeti na serijskom monitoru i u konzoli preglednika pa nemam pojma zašto nije radio.

Nakon puno slaganja s pokušajima uvođenja neke provjere pogrešaka, odbacio sam cijelu ideju čitanja LED stanja i stvorio niz "odgovora" koji provjerava odgovara li primljeni tekst Websocketa 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 proveo 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 rade i analogno pristupu koji se koristi u igri.

Vrijeme unosa gumba sada se upravlja pomoću Javascripta na strani preglednika (dopuštam vrlo izdašnih 10 sekundi između unosa gumba), a tijek igre sada u potpunosti kontrolira igrač, a ne strogo kodiran. Zaslon uključuje prozore koji pokazuju preostalo vrijeme do sljedećeg pritiska tipke i broj preostalih unosa prije nego što player pravilno pošalje sekvencu.

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

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

Korak 5: Ostatak koda

Ostatak Kodeksa
Ostatak Kodeksa

U usporedbi s kodom projekta Hackster, moja Arduino skica izgleda ogromno, čak i bez svih HTML -a, CSS -a i Javascripta u datotekama s podacima. No, najveći dio skice je hrpa funkcija koje se odnose na osnovne operacije kao što su stvaranje i upravljanje poslužiteljem, dobivanje NTP vremena, mDNS, omogućavanje bežičnog ažuriranja, upravljanje WiFi-jem, 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 značajke "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 postavljenoj razini (kada nije u načinu igre, naravno). Iako je ovo vrlo neozbiljna značajka u neozbiljnom projektu, zasmetalo mi je što sam u izvornom projektu teško kodirao prag uključivanja i što korisnik nije mogao vidjeti kako se prevladavajuća razina svjetla odnosi na taj prag. 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 može konfigurirati korisnik). Pa posao je obavljen po tom pitanju.

Oh, skoro zaboravio. Kôd se nalazi na GitHubu ovdje. Nakon preuzimanja stavite cijeli paket u novu mapu, prenesite Arduino skicu, a zatim sadržaj mape s podacima u SPIFFS.

Preporučeni: