Sommario:

Lego Mini Memory Game: 5 passaggi (con immagini)
Lego Mini Memory Game: 5 passaggi (con immagini)

Video: Lego Mini Memory Game: 5 passaggi (con immagini)

Video: Lego Mini Memory Game: 5 passaggi (con immagini)
Video: Playstation 5 | Astro's Playroom | Augmented reality controller 2024, Luglio
Anonim
Image
Image
Mini gioco di memoria Lego
Mini gioco di memoria Lego

Circa un anno fa, ho scritto un Instructable sull'installazione di un gruppo di LED in una Lego Mini Cooper. L'innovazione, così com'era, era che i LED potevano essere controllati con uno smartphone (o tramite qualsiasi browser web, se è per questo).

Come ho laboriosamente descritto in quell'Instructable, la maggior parte dello sforzo di allora riguardava il cablaggio della Mini senza che l'intera cosa cadesse a pezzi. Con mia grande sorpresa, la Mini in seguito è sopravvissuta a un viaggio dal Connecticut a Toronto e ha funzionato, più o meno, da allora.

"Se non si era rotto, l'ha aggiustato finché non è stato" sarà il mio epitaffio, nella migliore delle ipotesi, quindi quando la Mini è tornata a casa per Natale, è stata l'ora dei Lego Mini 2.0. Dopotutto, se Tesla può inviare aggiornamenti software alle sue auto, quanto potrebbe essere difficile?

Ho avuto alcune idee:

  • Migliora l'interfaccia utente piuttosto goffa
  • Aggiungi un corno!
  • Migliora la funzione "luci automatiche"; e, cosa più importante
  • Aggiungi una funzione di gioco (anche io ho riconosciuto che la novità di accendere e spegnere le luci della Mini con il telefono prima o poi sarebbe venuta meno)

La funzione di gioco era il compito più grande, anche perché non mi era immediatamente ovvio che tipo di gioco potesse essere. La Mini è troppo fragile per sostenere un gioco in cui viene gestita (tranne forse una variante deprimente di Jenga). Un altro ostacolo era che non ho mai programmato un gioco in vita mia.

Dopo un anno di infruttuose riflessioni, mi sono imbattuto in un progetto su Hackster, in cui un Arduino Uno viene utilizzato per emulare un gioco di memoria risalente agli anni '70 chiamato Simon. In poche parole, il dispositivo Simon riproduceva una sequenza di luci che il giocatore doveva poi ricordare e riprodurre premendo i pulsanti. Dopo ogni round di successo la sequenza è stata aumentata in lunghezza.

Nonostante sia dell'annata richiesta, in realtà non avevo mai sentito parlare di questo gioco, e devo dire che è incredibile quello che all'epoca passava per divertimento. Ancora più sorprendente è che il gioco di Simon è ancora in vendita e sta ottenendo ottime recensioni su Amazon. Chiaramente, questo doveva essere il candidato principale da adattare ai miei scopi. Dopotutto, la Mini aveva già le luci, quindi tutto ciò che avrei dovuto fare era abbandonare i pulsanti fisici e avere l'input dell'utente fornito tramite uno smartphone. Dal punto di vista del software, quindi, sembrava che questo sarebbe stato in gran parte un lavoro di taglia e incolla.

Ma prima, avevo bisogno di apportare alcune modifiche minori all'hardware.

Passaggio 1: componenti, strumenti e risorse

Componenti, strumenti e risorse
Componenti, strumenti e risorse

Se stai replicando questo progetto con un Lego Mini, avrai bisogno di tutte le cose elencate nel mio precedente Instructable. L'unica cosa extra di cui avrai bisogno è un cicalino passivo, che viene utilizzato per il clacson e per emettere un sacco di rumori fastidiosi durante il gioco (che può essere disabilitato).

Come risulterà chiaro quando si discuterà del software, non è necessario utilizzare un Lego Mini per il gioco. Potresti usare un altro kit Lego, o addirittura un gruppo di LED su una breadboard collegata a qualsiasi scheda di sviluppo ESP8266. Con alcuni relè, potresti persino utilizzare l'illuminazione della stanza di casa. Ragazzi, chiedete prima ai vostri genitori su quello però.

Allo stesso modo, non sono necessari strumenti o risorse aggiuntivi oltre a quelli elencati per il progetto originale.

Se sei tra le poche persone che hanno letto la descrizione originale del progetto, saprai che il Lego Mini è stato originariamente acquistato come regalo per mia figlia adulta, che ha una Mini "vera" quasi identica, o quasi identica come si potrebbe dire che è una Nuova Mini, non una "Classica". La mancanza di componenti aggiuntivi significativi ha reso questo nuovo progetto ancora più attraente poiché mi avrebbe permesso di ri-regalare efficacemente Lego Mini 2.0 come nuovo regalo di Natale senza costare nemmeno un centesimo. Genio!

Passaggio 2: modifica dell'hardware

Modifica hardware
Modifica hardware

Il progetto originale aveva LED interni RGB controllabili individualmente. Questi consumavano tre pin sul NodeMCU, che stavo usando come scheda di sviluppo. Dopo una discreta consultazione con il proprietario di Lego Mini, è stato stabilito che i LED RGB erano una caratteristica sottoutilizzata. Questa era un'intelligenza importante perché avevo bisogno di liberare un pin per il cicalino/clacson.

Lo schema del circuito sopra è dal progetto originale. L'unica modifica necessaria per questo progetto era rimuovere i LED RGB e utilizzare i tre pin liberati come segue:

  • D1 per il segnale di comando del buzzer (anch'esso cablato direttamente all'alimentatore 5VDC)
  • D7 per un LED interno bianco
  • D8 per uno di quei LED colorati lampeggianti, che ho soprannominato una luce "da discoteca"

Il cicalino stesso si nasconde ordinatamente sotto il vano motore, quindi riportare i cavi al NodeMCU è stato un gioco da ragazzi.

Passaggio 3: aggiornamento della GUI

Aggiornamento della GUI
Aggiornamento della GUI
Aggiornamento della GUI
Aggiornamento della GUI
Aggiornamento della GUI
Aggiornamento della GUI

Il primo passo nell'aggiornamento della GUI è stato creare quattro pagine Web separate:

  • Una "schermata iniziale" che si avvia tramite un'icona personalizzata sul tuo smartphone e si collega alle altre pagine
  • La pagina "Controlli" che, beh, controlla le luci (e ora, ovviamente, il clacson)
  • La pagina "Gioco"
  • Una pagina di configurazione che contiene opzioni di configurazione come:

    • Attivazione e disattivazione dell'audio
    • Impostazione del fuso orario (il Mini ottiene l'ora da Internet in modo che possa far lampeggiare le sue luci all'ora con l'ora appropriata)
    • Regolazione quando le "luci automatiche" accendono e spengono i fari in base al livello di luce ambientale
    • Reimpostazione del punteggio più alto e del nome del punteggio più alto (memorizzati in EEPROM)

Separare le funzioni in questo modo rende l'esperienza molto più simile a un'app. Ottenere il NodeMCU per servire più pagine è stata una delle sfide per questo progetto. Dopo aver provato un paio di approcci diversi, mi sono imbattuto nel codice che vedi nelle righe dalla 232 alla 236 dello sketch principale di Arduino. Funziona alla grande: crea semplicemente il tuo file indice, quindi nomina le pagine successive page1, page2 ecc. Ho scoperto che dovevo inserire tutti i file di risorse (CSS e immagini) nella cartella dei dati radice, ma questo non è davvero un problema per i siti di questa dimensione.

Successivamente, ho dovuto lavorare con CSS e Javascript per creare qualcosa che sembrava appartenere a un Lego Mini. Dato che non so quasi nulla di entrambi gli argomenti, ho cercato molto su Google prima di ottenere qualcosa di cui ero felice. Ho iniziato copiando spudoratamente un mattoncino lego in stile CSS su CodePen qui. Volevo anche evitare di etichettare i pulsanti con il testo e finire per utilizzare la semplice grafica di Icons8, che era perfetta per i miei scopi. Il resto è caduto a posto da lì. Le pagine vengono visualizzate abbastanza bene su tutti gli iPhone su cui le ho testate. Si spera che lo stesso valga anche per i telefoni Android (sembra OK su un browser Chrome desktop).

Passaggio 4: il codice di gioco

Il codice del gioco
Il codice del gioco

La comunicazione tra il server NodeMCU e il browser dello smartphone avviene tramite Websocket. Dopo che l'utente ha premuto un pulsante, il browser invia un carattere di testo al NodeMCU che corrisponde a una o più luci del Mini. Vengono inviati personaggi aggiuntivi per controllare il flusso di gioco. Il codice Arduino quindi agisce in base al carattere ricevuto. La comunicazione Websocket può gestire solo caratteri binari e di testo, quindi è necessaria una conversione per i numeri interi (ad esempio il fuso orario).

Come ho detto, inizialmente avevo previsto di utilizzare il codice del progetto Hackster collegato per le funzioni principali del gioco. Quello che avevo previsto sarebbe successo che, dopo che un giocatore avesse premuto un pulsante, il LED corrispondente si sarebbe acceso e il codice avrebbe fatto un digitalRead su tutti i LED per vedere se quello giusto era acceso (il progetto Hackster controlla gli ingressi del pulsante fisico ma è la stessa idea). Questo ha funzionato, in qualche modo, ma per ragioni che non mi sono ancora chiare, non perfettamente. Circa il 10% delle volte la Mini diceva che era stato premuto un pulsante sbagliato quando, in realtà, era stato quello corretto. Tutto sembrava OK in base a ciò che potevo vedere nel monitor seriale e nella console del browser, quindi non ho idea del perché non abbia funzionato.

Dopo un sacco di tentativi di introdurre un controllo degli errori, ho abbandonato l'idea di leggere gli stati dei LED e ho creato un array "risposta" che controlla se il testo Websocket ricevuto corrisponde al pin corretto memorizzato nell'array "sequenza" che riproduce la sequenza di luci da ricordare. Questo sembra essere affidabile al 100% anche se il modo in cui l'ho implementato è un po' faticoso. Dopo aver ideato questo metodo, mi sono imbattuto in questo, che è un'interessante esplorazione del modo in cui funzionano alcune serrature digitali e analoga all'approccio utilizzato nel gioco.

La tempistica degli input dei pulsanti è ora gestita con Javascript sul lato browser (permetto 10 secondi molto generosi tra gli input dei pulsanti) e il flusso del gioco è ora interamente controllato dal giocatore anziché codificato. Il display include finestre che mostrano il tempo rimanente per effettuare la successiva pressione del pulsante e il numero di input rimanenti prima che la sequenza venga inviata correttamente dal giocatore.

Il punteggio più alto è memorizzato in EEPROM (o ciò che passa per EEPROM nel mondo ESP8266) e se un giocatore ottiene un nuovo punteggio più alto, una finestra pop-up consente loro di inserire un nome a loro scelta, che è anche memorizzato in EEPROM. Questi valori possono essere ripristinati tramite la pagina di configurazione (sono sicuro che potrebbero esserci ragioni legittime per questo).

Detto questo, ho riutilizzato una buona parte del codice di gioco Hackster che ha velocizzato molto le cose.

Passaggio 5: il resto del codice

Il resto del codice
Il resto del codice

Rispetto al codice del progetto Hackster, il mio schizzo Arduino sembra enorme, anche senza tutto HTML, CSS e Javascript nei file di dati. Ma la maggior parte dello sketch è un insieme di funzioni relative alle operazioni di base come la creazione e la gestione del server, l'acquisizione del tempo NTP, l'mDNS, l'aggiornamento via etere, la gestione del WiFi, la gestione dei file SPIFFS e simili.

Il Javascript nei file HTML serve principalmente a gestire i messaggi Websocket (ricevuti e inviati) e ad aumentare l'interattività della GUI.

Come ho detto, volevo migliorare la funzionalità della funzione "luci automatiche", che utilizza un resistore dipendente dalla luce sull'unico pin analogico del NodeMCU per rilevare la luce ambientale e accendere le luci del Mini a un livello preimpostato (quando non è in modalità gioco, Certo). Sebbene questa sia una caratteristica molto frivola in un progetto frivolo, mi ha infastidito il fatto che nel progetto originale avessi codificato la soglia di accensione e che un utente non avesse modo di vedere come il livello di luce prevalente fosse correlato a quella soglia. Ora la lettura del livello di luce viene inviata ogni cinque secondi alla pagina di Set-Up e quella pagina visualizza anche le soglie correnti di accensione e spegnimento (configurabili dall'utente). Quindi lavoro fatto su quello.

Oh, quasi dimenticavo. Il codice è su GitHub qui. Dopo il download, metti l'intero pacchetto in una nuova cartella, carica lo sketch Arduino, quindi il contenuto della cartella dati in SPIFFS.

Consigliato: