Inhoudsopgave:

Lego Mini Memory Game: 5 stappen (met afbeeldingen)
Lego Mini Memory Game: 5 stappen (met afbeeldingen)

Video: Lego Mini Memory Game: 5 stappen (met afbeeldingen)

Video: Lego Mini Memory Game: 5 stappen (met afbeeldingen)
Video: VADER BEHANDELT ZIJN KIND SLECHT | BONDGENOTEN 2024, Juli-
Anonim
Image
Image
Lego Mini Geheugenspel
Lego Mini Geheugenspel

Een jaar of zo geleden schreef ik een Instructable over het installeren van een aantal LED's in een Lego Mini Cooper. De innovatie, zoals die was, was dat de LED's konden worden bestuurd met een smartphone (of via welke webbrowser dan ook).

Zoals ik moeizaam beschreef in die Instructable, had de meeste inspanning destijds betrekking op het aansluiten van de Mini zonder dat het hele ding uit elkaar viel. Enigszins tot mijn verbazing overleefde de Mini vervolgens een reis van Connecticut naar Toronto en heeft sindsdien min of meer gewerkt.

"Als het niet kapot was, repareerde hij het totdat het was" zal op zijn best mijn grafschrift zijn, dus toen de Mini voor Kerstmis thuiskwam, was het tijd voor Lego Mini 2.0. Immers, als Tesla software-updates naar zijn auto's kan pushen, hoe moeilijk kan het dan zijn?

Ik had een paar ideeën:

  • Verbeter de nogal onhandige gebruikersinterface
  • Voeg een hoorn toe!
  • Verbeter de functie "automatische verlichting"; en, het belangrijkste:
  • Voeg een spelfunctie toe (zelfs ik herkende dat de nieuwigheid van het in- en uitschakelen van de Mini-verlichting met je telefoon vroeg of laat zou afzwakken)

De gamefunctie was de grootste opgave, niet in de laatste plaats omdat het voor mij niet meteen duidelijk was wat voor soort game het zou kunnen zijn. De Mini is veel te fragiel om een game te ondersteunen waarbij hij wordt gehanteerd (behalve mogelijk een deprimerende variant van Jenga). Een andere hindernis was dat ik nog nooit in mijn leven een spel heb geprogrammeerd.

Na een jaar vruchteloos nadenken, stuitte ik op een project op Hackster, waarin een Arduino Uno wordt gebruikt om een memoryspel-speelgoed uit de jaren 70 na te bootsen, genaamd Simon. In een notendop, het Simon-apparaat speelde een reeks lichten die de speler vervolgens moest onthouden en afspelen door op knoppen te drukken. Na elke succesvolle ronde werd de reeks langer gemaakt.

Ondanks dat het van het vereiste jaartal is, had ik eigenlijk nog nooit van dit spel gehoord, en ik moet zeggen dat het verbazingwekkend is wat er destijds voor amusement doorging. Nog verbazingwekkender is dat de Simon-game nog steeds te koop is en lovende recensies krijgt op Amazon. Het was duidelijk dat dit de belangrijkste kandidaat moest zijn om voor mijn doeleinden aan te passen. De Mini had tenslotte al de lichten, dus ik hoefde alleen maar de fysieke knoppen te verwijderen en gebruikersinvoer via een smartphone te geven. Aan de softwarekant leek het er daarom op dat dit grotendeels een knip-en-plakklus zou zijn.

Maar eerst moest ik wat kleine aanpassingen aan de hardware maken.

Stap 1: Componenten, hulpmiddelen en bronnen

Componenten, gereedschappen en bronnen
Componenten, gereedschappen en bronnen

Als je dit project repliceert met een Lego Mini, heb je alle dingen nodig die in mijn eerdere Instructable staan vermeld. Het enige extra dat je nodig hebt is een passieve zoemer, die wordt gebruikt voor de claxon en om een hoop vervelende geluiden te maken tijdens het spel (die kan worden uitgeschakeld).

Zoals duidelijk zal worden bij het bespreken van de software, is het niet echt nodig om een Lego Mini voor het spel te gebruiken. Je zou een andere Lego-kit kunnen gebruiken, of zelfs een aantal LED's op een breadboard die is aangesloten op een ESP8266-ontwikkelbord. Met sommige relais kunt u zelfs de kamerverlichting van uw huis gebruiken. Kinderen, vraag dat eerst aan je ouders.

Evenzo zijn er geen extra hulpmiddelen of middelen nodig dan die vermeld voor het oorspronkelijke project.

Als je een van de weinige mensen bent die de originele projectbeschrijving hebben gelezen, weet je dat de Lego Mini oorspronkelijk werd gekocht als een geschenk aan mijn volwassen dochter, die een bijna identieke "echte" Mini heeft, of zo bijna identiek als het zou kunnen zijn dat het een New Mini is, geen "Classic". Het ontbreken van zinvolle extra componenten maakte dit nieuwe project des te aantrekkelijker omdat het me in staat zou stellen om Lego Mini 2.0 effectief opnieuw te schenken als een nieuw kerstcadeau zonder nauwelijks een dubbeltje te kosten. Genie!

Stap 2: Hardwarewijziging

Hardwarewijziging
Hardwarewijziging

Het oorspronkelijke project had individueel regelbare RGB-interieur-LED's. Deze verbruikten drie pinnen op de NodeMCU, die ik als ontwikkelbord gebruikte. Na discreet overleg met de Lego Mini-eigenaar werd vastgesteld dat de RGB-leds een onderbenutte functie waren. Dit was belangrijke informatie omdat ik een speld moest vrijmaken voor de zoemer/hoorn.

Het bovenstaande schakelschema is van het oorspronkelijke project. De enige wijziging die voor dit project nodig was, was om de RGB-LED's te verwijderen en de drie vrijgekomen pinnen als volgt te gebruiken:

  • D1 voor het zoemerstuursignaal (dat ook rechtstreeks op de 5VDC-voeding is aangesloten)
  • D7 voor een witte interieur LED
  • D8 voor een van die knipperende gekleurde LED's, die ik een "disco" -licht heb genoemd

De zoemer zelf is netjes weggestopt onder het motorcompartiment, dus het was een fluitje van een cent om de draden terug naar de NodeMCU te leiden.

Stap 3: De GUI bijwerken

De GUI bijwerken
De GUI bijwerken
De GUI bijwerken
De GUI bijwerken
De GUI bijwerken
De GUI bijwerken

De eerste stap bij het bijwerken van de GUI was het maken van vier afzonderlijke webpagina's:

  • Een "splash-scherm" dat wordt gestart via een aangepast pictogram op uw smartphone en linkt naar de andere pagina's
  • De "Controls"-pagina die, nou ja, de lichten bestuurt (en nu natuurlijk de claxon)
  • De "Spel" pagina
  • Een instellingenpagina die configuratie-opties bevat, zoals:

    • Het geluid in- en uitschakelen
    • De tijdzone instellen (de Mini haalt tijd van internet zodat hij elk uur met de juiste tijd kan knipperen)
    • Aanpassen wanneer de "automatische lichten" de koplampen in- en uitschakelen op basis van het omgevingslichtniveau
    • De High Score en High Scorer-naam resetten (opgeslagen in EEPROM)

Het op deze manier scheiden van de functies zorgt voor een veel meer app-achtige ervaring. Het was een van de uitdagingen voor dit project om de NodeMCU meerdere pagina's te laten bedienen. Na een aantal verschillende benaderingen te hebben geprobeerd, kwam ik de code tegen die je ziet in regels 232 tot en met 236 van de Arduino-hoofdschets. Dit werkt prima - maak gewoon uw indexbestand en noem de volgende pagina's pagina1, pagina2 enz. Ik merkte dat ik alle bronbestanden (CSS en afbeeldingen) in de hoofdmap met gegevens moest plaatsen, maar dit is niet echt een probleem voor sites van deze maat.

Vervolgens moest ik aan de slag met CSS en Javascript om iets te maken dat eruitzag alsof het bij een Lego Mini hoorde. Omdat ik bijna niets weet over beide onderwerpen, heb ik hier veel gegoogled voordat ik iets kreeg waar ik blij mee was. Ik begon met het schaamteloos kopiëren van een CSS-achtige legosteen op CodePen hier. Ik wilde ook afstappen van het labelen van de knoppen met tekst en eindigen met het gebruik van eenvoudige afbeeldingen van Icons8, die perfect waren voor mijn doeleinden. De rest viel vanaf daar op zijn plaats. De pagina's worden redelijk goed weergegeven op alle iPhones waarop ik ze heb getest. Hopelijk geldt hetzelfde ook voor Android-telefoons (ziet er goed uit in een desktop-Chrome-browser).

Stap 4: De spelcode

De spelcode
De spelcode

De communicatie tussen de NodeMCU-server en de smartphonebrowser verloopt via Websockets. Nadat de gebruiker op een knop heeft gedrukt, stuurt de browser een tekstteken naar de NodeMCU dat overeenkomt met een of meer lampjes van de Mini. Er worden extra karakters gestuurd om het spelverloop te regelen. De Arduino-code onderneemt vervolgens actie op basis van het ontvangen teken. Websocket-communicatie kan alleen binaire en teksttekens verwerken, dus enige conversie is nodig voor gehele getallen (bijvoorbeeld de tijdzone).

Zoals ik al zei, had ik oorspronkelijk verwacht dat ik de code van het gekoppelde Hackster-project zou gebruiken voor de kernfuncties van het spel. Wat ik verwachtte dat er zou gebeuren, is dat, nadat een speler op een knop heeft gedrukt, de bijbehorende LED zou oplichten en de code een digitale Read op alle LED's zou doen om te zien of de juiste brandde (het Hackster-project controleert de fysieke knopinvoer, maar het is hetzelfde idee). Dit werkte min of meer, maar om redenen die mij nog steeds niet duidelijk zijn, niet perfect. Ongeveer 10% van de tijd zou de Mini zeggen dat er op een verkeerde knop werd gedrukt, terwijl dat in feite de juiste was. Alles leek in orde op basis van wat ik kon zien in de seriële monitor en in de browserconsole, dus ik heb geen idee waarom het niet werkte.

Na veel gedoe met het proberen om wat foutcontrole te introduceren, heb ik het hele idee van het lezen van de LED-statussen gedumpt en een "antwoord" -array gemaakt die controleert of de ontvangen Websocket-tekst overeenkomt met de juiste pin die is opgeslagen in de "reeks" -array die speelt de lichtsequentie af om te onthouden. Dit lijkt 100% betrouwbaar te zijn, zelfs als de manier waarop ik het heb geïmplementeerd een beetje moeizaam is. Nadat ik deze methode had bedacht, kwam ik dit tegen, wat een interessante verkenning is van de manier waarop sommige digitale sloten werken en analoog aan de benadering die in het spel wordt gebruikt.

Timing van knopinvoer wordt nu afgehandeld met Javascript aan de browserzijde (ik laat een zeer royale 10 seconden tussen knopinvoer) en de stroom van het spel wordt nu volledig gecontroleerd door de speler in plaats van hard gecodeerd. Het display bevat vensters die de resterende tijd weergeven om de volgende knop in te drukken en het aantal resterende ingangen voordat de reeks correct door de speler wordt verzonden.

Hoge score wordt opgeslagen in EEPROM (of wat doorgaat voor EEPROM in de ESP8266-wereld) en als een speler een nieuwe hoge score haalt, kan een pop-upvenster een naam naar keuze invoeren, die ook in EEPROM wordt opgeslagen. Deze waarden kunnen worden gereset via de Set-Up-pagina (ik weet zeker dat hier legitieme redenen voor kunnen zijn).

Dat gezegd hebbende, heb ik een behoorlijk stuk van de Hackster-spelcode hergebruikt, wat de zaken aanzienlijk heeft versneld.

Stap 5: De rest van de code

De rest van de code
De rest van de code

Vergeleken met de Hackster-projectcode ziet mijn Arduino-schets er enorm uit, zelfs zonder alle HTML, CSS en Javascript in de gegevensbestanden. Maar het grootste deel van de schets bestaat uit een aantal functies met betrekking tot basisbewerkingen zoals het maken en beheren van de server, NTP-tijd verkrijgen, mDNS, zorgen voor over-the-air updates, WiFi-beheer, SPIFFS-bestandsbeheer en dergelijke.

Het Javascript in de HTML-bestanden is voornamelijk bedoeld voor het afhandelen van de Websocket-berichten (ontvangen en verzonden) en het verhogen van de interactiviteit van de GUI.

Zoals ik al zei, wilde ik de functionaliteit van de "automatische verlichting" -functie verbeteren, die een lichtafhankelijke weerstand op de enige analoge pin van de NodeMCU gebruikt om omgevingslicht te detecteren en de lichten van de Mini op een vooraf ingesteld niveau in te schakelen (wanneer niet in de spelmodus, natuurlijk). Hoewel dit een heel lichtzinnige functie is in een frivool project, stoorde het me dat ik in het oorspronkelijke project de inschakeldrempel had vastgelegd en dat een gebruiker niet kon zien hoe het heersende lichtniveau zich verhield tot die drempel. Nu wordt de uitlezing van het lichtniveau elke vijf seconden naar de instellingenpagina gestuurd en op die pagina worden ook de huidige drempels voor in- en uitschakelen weergegeven (die door de gebruiker kunnen worden geconfigureerd). Dus werk gedaan op die ene.

O, bijna vergeten. De code staat hier op GitHub. Plaats na het downloaden het hele pakket in een nieuwe map, upload de Arduino-schets en vervolgens de inhoud van de gegevensmap in SPIFFS.

Aanbevolen: