Inhaltsverzeichnis:

Lego Mini Memory-Spiel - Gunook
Lego Mini Memory-Spiel - Gunook

Video: Lego Mini Memory-Spiel - Gunook

Video: Lego Mini Memory-Spiel - Gunook
Video: FORTNITE spelen na 3 jaar... 2024, November
Anonim
Image
Image
Lego Mini Memory-Spiel
Lego Mini Memory-Spiel

Vor einem Jahr oder so schrieb ich ein Instructable über die Installation einer Reihe von LEDs in einem Lego Mini Cooper. Die Innovation bestand darin, dass die LEDs mit einem Smartphone (oder über jeden Webbrowser) gesteuert werden konnten.

Wie ich in diesem Instructable mühsam beschrieben habe, bezog sich der größte Aufwand damals darauf, den Mini zu verkabeln, ohne dass das Ganze auseinanderfiel. Zu meiner Überraschung hat der Mini anschließend eine Reise von Connecticut nach Toronto überstanden und funktioniert seitdem mehr oder weniger.

"Wenn es nicht kaputt war, hat er es repariert, bis es war" wird bestenfalls mein Epitaph sein, also als der Mini zu Weihnachten nach Hause kam, war es Zeit für Lego Mini 2.0. Wenn Tesla Software-Updates für seine Autos bereitstellen kann, wie schwierig könnte das sein?

Ich hatte ein paar Ideen:

  • Verbessere die etwas klobige Benutzeroberfläche
  • Füge ein Horn hinzu!
  • Verbessern Sie die Funktion "automatische Beleuchtung". und vor allem
  • Fügen Sie eine Spielfunktion hinzu (sogar ich habe erkannt, dass die Neuheit, die Lichter des Mini mit Ihrem Telefon ein- und auszuschalten, früher oder später nachlassen würde)

Die Spielfunktion war die größte Aufgabe, nicht zuletzt, weil mir nicht sofort klar war, um was für ein Spiel es sich handeln könnte. Der Mini ist viel zu zerbrechlich, um ein Spiel auszuhalten, in dem er gehandhabt wird (außer möglicherweise einer deprimierenden Variante von Jenga). Eine weitere Hürde war, dass ich noch nie in meinem Leben ein Spiel programmiert habe.

Nach einem Jahr vergeblichen Grübelns bin ich auf ein Hackster-Projekt gestoßen, bei dem ein Arduino Uno verwendet wird, um ein Memory-Spielzeug aus den 1970er Jahren namens Simon zu emulieren. Kurz gesagt spielte das Simon-Gerät eine Sequenz von Lichtern ab, die sich der Spieler dann merken und durch Drücken von Tasten wiedergeben musste. Nach jeder erfolgreichen Runde wurde die Sequenz verlängert.

Obwohl ich vom erforderlichen Jahrgang war, hatte ich noch nie von diesem Spiel gehört, und ich muss sagen, es ist erstaunlich, was damals als Amüsement galt. Noch erstaunlicher ist, dass das Simon-Spiel immer noch auf Amazon verkauft wird und begeisterte Kritiken erhält. Dies musste eindeutig der beste Kandidat für meine Zwecke sein. Schließlich hatte der Mini bereits die Lichter, also musste ich nur die physischen Tasten weglassen und die Benutzereingabe über ein Smartphone vornehmen. Auf der Softwareseite schien dies daher nur ein Ausschneiden-und-Einfügen-Job zu sein.

Aber zuerst musste ich einige kleinere Änderungen an der Hardware vornehmen.

Schritt 1: Komponenten, Tools & Ressourcen

Komponenten, Tools & Ressourcen
Komponenten, Tools & Ressourcen

Wenn Sie dieses Projekt mit einem Lego Mini replizieren, benötigen Sie alle in meinem früheren Instructable aufgeführten Sachen. Das einzige, was Sie zusätzlich benötigen, ist ein passiver Summer, der für die Hupe verwendet wird und während des Spiels eine Menge nerviger Geräusche macht (der deaktiviert werden kann).

Wie bei der Diskussion über die Software deutlich wird, ist es nicht wirklich notwendig, einen Lego Mini für das Spiel zu verwenden. Sie könnten ein anderes Lego-Kit oder tatsächlich eine Reihe von LEDs auf einem Steckbrett verwenden, das an ein beliebiges ESP8266-Entwicklungsboard angeschlossen ist. Mit einigen Relais können Sie sogar die Raumbeleuchtung Ihres Hauses verwenden. Kinder, fragen Sie zuerst Ihre Eltern.

Ebenso werden keine zusätzlichen Tools oder Ressourcen benötigt, die über die für das ursprüngliche Projekt aufgelisteten hinausgehen.

Wenn Sie zu den wenigen Leuten gehören, die die ursprüngliche Projektbeschreibung gelesen haben, wissen Sie, dass der Lego Mini ursprünglich als Geschenk an meine erwachsene Tochter gekauft wurde, die einen fast identischen "echten" Mini hat, oder so ähnlich wie es könnte gegeben sein, dass es ein New Mini ist, kein "Klassiker". Das Fehlen sinnvoller Zusatzkomponenten machte dieses neue Projekt umso attraktiver, als ich Lego Mini 2.0 effektiv als neues Weihnachtsgeschenk neu verschenken konnte, ohne dabei kaum einen Cent zu kosten. Genius!

Schritt 2: Hardware-Modifikation

Hardware-Modifikation
Hardware-Modifikation

Das ursprüngliche Projekt hatte einzeln ansteuerbare RGB-Innenraum-LEDs. Diese verbrauchten drei Pins auf der NodeMCU, die ich als Entwicklungsboard verwendet habe. Nach diskreter Beratung mit dem Lego Mini-Besitzer wurde festgestellt, dass die RGB-LEDs ein zu wenig genutztes Feature waren. Dies war eine wichtige Intelligenz, weil ich einen Stift für den Summer / die Hupe freigeben musste.

Der obige Schaltplan stammt aus dem Originalprojekt. Die einzige Änderung, die für dieses Projekt erforderlich war, bestand darin, die RGB-LEDs zu entfernen und die drei freigewordenen Pins wie folgt zu verwenden:

  • D1 für das Summersteuersignal (das auch direkt an das 5VDC Netzteil angeschlossen ist)
  • D7 für eine weiße Innen-LED
  • D8 für eine dieser blinkenden farbigen LEDs, die ich ein "Disco" -Licht getauft habe

Der Summer selbst lässt sich ordentlich unter dem Motorraum verstauen, so dass das Zurückführen der Kabel zur NodeMCU ein Kinderspiel war.

Schritt 3: Aktualisieren der GUI

Aktualisieren der GUI
Aktualisieren der GUI
Aktualisieren der GUI
Aktualisieren der GUI
Aktualisieren der GUI
Aktualisieren der GUI

Der erste Schritt bei der Aktualisierung der GUI bestand darin, vier separate Webseiten zu erstellen:

  • Ein "Splash-Screen", der über ein benutzerdefiniertes Symbol auf Ihrem Smartphone startet und auf die anderen Seiten verweist
  • Die Seite "Steuerung", die die Lichter steuert (und jetzt natürlich die Hupe)
  • Die Seite "Spiel"
  • Eine Setup-Seite mit Konfigurationsoptionen wie:

    • Ton ein- und ausschalten
    • Einstellen der Zeitzone (der Mini bezieht die Zeit aus dem Internet, damit er seine Lichter zur vollen Stunde mit der entsprechenden Zeit blinken lässt)
    • Einstellen, wann die "automatischen Lichter" die Scheinwerfer basierend auf der Umgebungshelligkeit ein- und ausschalten
    • Zurücksetzen des Highscore- und Highscore-Namens (im EEPROM gespeichert)

Die Trennung der Funktionen auf diese Weise sorgt für eine viel App-ähnlichere Erfahrung. Die NodeMCU dazu zu bringen, mehrere Seiten zu bedienen, war eine der Herausforderungen für dieses Projekt. Nachdem ich ein paar verschiedene Ansätze ausprobiert hatte, stieß ich auf den Code, den Sie in den Zeilen 232 bis 236 der Arduino-Hauptskizze sehen. Das funktioniert großartig - erstellen Sie einfach Ihre Indexdatei und benennen Sie dann die nachfolgenden Seiten page1, page2 usw. Ich habe festgestellt, dass ich alle Ressourcendateien (CSS und Bilder) in den Stammdatenordner legen musste, aber dies ist kein wirkliches Problem für Websites von diese Größe.

Als nächstes musste ich mit CSS und Javascript arbeiten, um etwas zu machen, das aussah, als gehörte es zu einem Lego Mini. Da ich über beide Themen so gut wie nichts weiß, wurde hier viel gegoogelt, bevor ich etwas gefunden habe, mit dem ich zufrieden war. Ich habe damit begonnen, schamlos einen Lego-Stein im CSS-Stil auf CodePen hier zu kopieren. Ich wollte auch weg von der Beschriftung der Schaltflächen mit Text und am Ende auf einfache Grafiken von Icons8 zurückgreifen, die für meine Zwecke perfekt waren. Der Rest hat sich von da an an Ort und Stelle gelegt. Die Seiten werden auf allen iPhones, auf denen ich sie getestet habe, ziemlich gut gerendert. Hoffentlich gilt das gleiche auch für Android-Telefone (sieht in einem Desktop-Chrome-Browser in Ordnung aus).

Schritt 4: Der Spielcode

Der Spielcode
Der Spielcode

Die Kommunikation zwischen dem NodeMCU-Server und dem Smartphone-Browser erfolgt über Websockets. Nachdem der Benutzer eine Taste gedrückt hat, sendet der Browser ein Textzeichen an die NodeMCU, das einer oder mehreren Leuchten des Mini entspricht. Zusätzliche Charaktere werden gesendet, um den Spielfluss zu steuern. Der Arduino-Code führt dann basierend auf dem empfangenen Zeichen eine Aktion aus. Die Websocket-Kommunikation kann nur Binär- und Textzeichen verarbeiten, daher ist für Ganzzahlen (z. B. die Zeitzone) eine Konvertierung erforderlich.

Wie bereits erwähnt, hatte ich ursprünglich erwartet, den Code aus dem verlinkten Hackster-Projekt für die Kernfunktionen des Spiels zu verwenden. Was ich erwartet hatte, ist, dass, nachdem ein Spieler eine Taste gedrückt hat, die entsprechende LED aufleuchtet und der Code einen digitalRead auf allen LEDs durchführt, um zu sehen, ob die richtige leuchtet (das Hackster-Projekt überprüft die physischen Tasteneingänge, aber es ist die gleiche Idee). Das hat irgendwie funktioniert, aber aus Gründen, die mir noch unklar sind, nicht perfekt. Ungefähr 10 % der Zeit würde der Mini sagen, dass eine falsche Taste gedrückt wurde, obwohl tatsächlich die richtige war. Alles schien in Ordnung zu sein, basierend auf dem, was ich im seriellen Monitor und in der Browserkonsole sehen konnte, also habe ich keine Ahnung, warum es nicht funktioniert hat.

Nachdem ich viel versucht hatte, eine Fehlerprüfung einzuführen, habe ich die ganze Idee, die LED-Zustände zu lesen, aufgegeben und ein "Antwort" -Array erstellt, das überprüft, ob der empfangene Websocket-Text dem richtigen Pin entspricht, der im "Sequenz" -Array gespeichert ist spielt die Lichtsequenz ab, um sich zu erinnern. Dies scheint zu 100% zuverlässig zu sein, auch wenn die Art und Weise, wie ich es implementiert habe, etwas mühsam ist. Nachdem ich diese Methode entwickelt hatte, bin ich darauf gestoßen, was eine interessante Untersuchung der Funktionsweise einiger digitaler Sperren ist und analog zu dem im Spiel verwendeten Ansatz ist.

Das Timing der Tasteneingaben wird jetzt browserseitig mit Javascript gehandhabt (ich erlaube sehr großzügige 10 Sekunden zwischen den Tasteneingaben) und der Spielfluss wird jetzt vollständig vom Spieler gesteuert und nicht fest programmiert. Das Display enthält Fenster, die die verbleibende Zeit bis zum nächsten Tastendruck und die Anzahl der verbleibenden Eingaben anzeigen, bevor die Sequenz vom Spieler korrekt gesendet wird.

Der Highscore wird im EEPROM gespeichert (oder was als EEPROM in der ESP8266-Welt gilt) und wenn ein Spieler einen neuen Highscore erreicht, ermöglicht ihm ein Popup-Feld, einen Namen seiner Wahl einzugeben, der auch im EEPROM gespeichert wird. Diese Werte können über die Setup-Seite zurückgesetzt werden (ich bin mir sicher, dass es dafür berechtigte Gründe geben kann).

Trotzdem habe ich einen anständigen Teil des Hackster-Spielcodes wiederverwendet, was die Dinge erheblich beschleunigt hat.

Schritt 5: Der Rest des Codes

Der Rest des Kodex
Der Rest des Kodex

Im Vergleich zum Hackster-Projektcode sieht meine Arduino-Skizze enorm aus, auch ohne das gesamte HTML, CSS und Javascript in den Datendateien. Der Großteil der Skizze besteht jedoch aus einer Reihe von Funktionen, die sich auf grundlegende Operationen beziehen, wie das Erstellen und Verwalten des Servers, das Abrufen von NTP-Zeit, mDNS, die Bereitstellung von Over-the-Air-Aktualisierungen, WLAN-Verwaltung, SPIFFS-Dateiverwaltung und dergleichen.

Das Javascript in den HTML-Dateien dient in erster Linie dazu, die Websocket-Nachrichten (empfangen und gesendet) zu verarbeiten und die Interaktivität der GUI zu erhöhen.

Wie ich bereits erwähnt habe, wollte ich die Funktionalität der "Auto Lights" -Funktion verbessern, die einen lichtabhängigen Widerstand am einzigen analogen Pin der NodeMCU verwendet, um Umgebungslicht zu erkennen und die Lichter des Mini auf einer voreingestellten Stufe einzuschalten (wenn nicht im Spielmodus)., selbstverständlich). Während dies in einem leichtfertigen Projekt eine sehr leichtfertige Funktion ist, störte es mich, dass ich im ursprünglichen Projekt die Einschaltschwelle fest codiert hatte und dass ein Benutzer keine Möglichkeit hatte, zu sehen, wie sich die vorherrschende Lichtstärke auf diese Schwelle bezog. Jetzt wird der Lichtpegelwert alle fünf Sekunden an die Setup-Seite gesendet und diese Seite zeigt auch die aktuellen Schwellenwerte für das Ein- und Ausschalten an (die vom Benutzer konfiguriert werden können). Also Arbeit erledigt.

Oh, fast vergessen. Der Code ist hier auf GitHub. Legen Sie nach dem Download das gesamte Paket in einen neuen Ordner, laden Sie die Arduino-Skizze hoch und dann den Inhalt des Datenordners in SPIFFS.

Empfohlen: