Programmieren Sie Ihren Arduino 4x4x4 LED-Würfel für noch mehr tolle Sachen

Programmieren Sie Ihren Arduino 4x4x4 LED-Würfel für noch mehr tolle Sachen / Programmierung

Letzte Woche baute ich einen LED-Würfel. So baue ich einen pulsierenden Arduino-LED-Würfel, der so aussieht, als wäre er aus der Zukunft gekommen. Wie man einen pulsierenden Arduino-LED-Würfel herstellt, der so aussieht, als würde er aus der Zukunft kommen? , aber auf der Suche nach etwas etwas Dauerhaftem und auf einer ganz anderen Ebene fantastisch, dann ist der bescheidene 4 x 4 x 4 LED-Würfel… Read More - 64 LEDs dass Sie programmieren können, um fantastische futuristische Lichtshows zu machen - und ich hoffe, Sie haben es auch getan, weil es ein großartiges Projekt ist, um Sie zu motivieren und Ihre Arduino-Fähigkeiten zu erweitern. Ich habe Ihnen ein paar grundlegende Apps hinterlassen, die Sie zum Nachdenken anregen, aber heute werde ich ein paar weitere Software-Teile, die ich für den Cube erstellt habe, zusammen mit Code-Erklärungen vorstellen. Dies dient sowohl dazu, Ihnen ein paar hübschere Lightshows zur Verfügung zu stellen, als auch einige Einschränkungen beim Programmieren des Würfels sowie einige neue Programmierkonzepte kennenzulernen.

Dies ist eine ziemlich fortgeschrittene Codierung. Sie müssen alle meine vorherigen Arduino-Tutorials und unseren Arduino-Einsteiger-Leitfaden gelesen haben, bevor Sie den bereitgestellten Code anpassen können.

App 1: Mini Snake

Anstatt eine festgelegte, schlangenartige Musterfolge auszuführen, wollte ich eine Schlange programmieren - eine künstliche, die ihre eigenen zufälligen Entscheidungen treffen würde und völlig unvorhersehbar wäre. Es ist auf nur zwei Segmente beschränkt, was ich später erklären werde, und Sie können die Demo unten sehen. Laden Sie den vollständigen Code hier herunter.

Wenn Sie mit dem 3D-Raum arbeiten, benötigen Sie drei Koordinaten für einen einzelnen Punkt: X, Y, und Z.

In unserem Würfel werden die X- und Z-Ebenen jedoch durch LED-Pins dargestellt, während das Y direkt auf die Kathodenebenen abgebildet wird. Um die Arbeit mit diesen Koordinaten zu erleichtern und die Bewegung um den Würfel herauszufinden, habe ich einen neuen Datentyp erstellt (using struct) einen einzelnen Punkt auf dem Würfel darstellen - den ich angerufen habe “xyz”. Es besteht nur aus zwei ganzen Zahlen: “xz”, und “y”. Mit dieser Struktur könnte ich dann auch eine Richtung darstellen, die in unserem speziellen Koordinatensystem (xz, y) unten angegeben ist:

Y Bewegung (oben unten): (xz, y + 1), (xz, y-1)
Z Bewegung (vor, zurück): (xz-1, y), (xz + 1, y)
X Bewegung (links rechts): (xz + 4, y), (xz-4, y)

Zum Beispiel, um die LED in Position zu bewegen (0,0) eins nach links, wir bewerben uns (xz + 4, y) und am Ende mit (0,4).

Es gibt bestimmte Grenzen, die der Bewegung gesetzt werden können - nämlich, dass Y-Koordinaten nur möglich sind 0 bis 3 (0 ist die unterste Ebene, 3 ist die oberste Ebene) und XZ-Koordinaten könnten nur sein 0 bis 15. Eine weitere Begrenzung wird der Z-Bewegung gesetzt, um dies zu verhindern “Springen” von hinten nach vorne des Würfels und umgekehrt. In diesem Fall verwenden wir die Modulusfunktion, um auf Vielfache von 4 zu prüfen und diesen Bewegungsversuch abzulehnen. Diese Logik wird im dargestellt gültig() Funktion, die eine wahr zurückgibt, wenn die vorgeschlagene Richtung eine akzeptable Bewegung ist, andernfalls eine falsche. Ich habe eine weitere Funktion hinzugefügt, um nach einer zu suchen umgekehrte Richtung - Das heißt, wenn sich die Schlange in eine Richtung bewegt, möchten wir nicht, dass sie auf sich selbst zurückgeht, selbst wenn sie ansonsten ein gültiger Ort ist, an den sie sich bewegen können - und a Bewegung() Funktion, die eine Koordinate, eine Richtung und die neue Koordinate zurückgibt.

Das XYZ Datentyp, gültig(), Bewegung() und invers () alle Funktionen finden Sie im xyz.h Datei in den Downloads. Wenn Sie sich fragen, warum dies nicht in der Hauptprogrammdatei, sondern in einer separaten Datei abgelegt wurde, liegt dies an einigen komplizierten Arduino-Compiler-Regeln, durch die Funktionen verhindert werden benutzerdefinierte Datentypen zurückgeben; Sie müssen in einer eigenen Datei abgelegt und dann am Anfang der Hauptdatei importiert werden.

Zurück in der Hauptlaufzeitdatei speichert ein Array von Anweisungen alle möglichen Bewegungen, die die Schlange ausführen kann. Wir können einfach ein zufälliges Arraymitglied auswählen, um eine neue Richtung zu erhalten. Variablen werden auch erstellt, um den aktuellen Standort (jetzt), den vorherigen, zu speichern Richtung und vorige Standort. Der Rest des Codes sollte Ihnen ziemlich offensichtlich sein; nur fOr Schleifen und Ein- und Ausschalten der LEDs. In der Hauptschleife prüfen wir, ob die vorgeschlagene Richtung gültig ist. Wenn dies der Fall ist, gehen wir auf diese Weise. Wenn nicht, wählen wir eine neue Richtung.

Das einzige, was in der Hauptschleife hervorgehoben werden muss, sind einige Überprüfungen, um einen Fehler zu korrigieren, den ich beim Multiplexing gefunden habe: Wenn sich der neue Standort auf derselben Kathodenebene oder auf demselben Anodenstift befand, würde das Ausschalten der vorherigen LED dazu führen, dass beide erlöschen. An diesem Punkt wurde mir auch klar, dass es mit meiner aktuellen Implementierung unmöglich war, über eine 2-Segment-Schlange hinauszugehen: Versuchen Sie, 3 LEDs in einer Eckanordnung zu beleuchten. Das geht nicht, denn mit 2 aktivierten Layern und 2 LED-Pins würden 4 LEDs einschalten, nicht 3. Dies ist ein inhärentes Problem mit unserem eingeschränkten Multiplex-Cube-Design, aber keine Sorge: Wir müssen nur die Leistung von verwenden Persistenz der Vision um die draw-Methode neu zu schreiben.

Persistenz des Sehens bedeutet, wenn Licht sequenziell unsere Augen erreicht - schneller als wir es verarbeiten können -, scheint es ein einzelnes Bild zu sein. In unserem Fall sollten wir nicht alle vier Ebenen gleichzeitig zeichnen, sondern die erste zeichnen, deaktivieren, die zweite zeichnen und deaktivieren: schneller, als wir erkennen können, dass eine Änderung überhaupt stattfindet. Nach diesem Prinzip arbeiten Nachrichtenschreiber wie dieser:

Neue Zeichenmethode mit Persistenz des Sehens

Erst dann eine neue Ziehroutine. Ich habe eine erstellt 4 x 16 zweidimensionale Anordnung von Bits (true oder false), um eine wörtliche Darstellung des Status des LED-Cubes zu sein. Die Zeichnungsroutine führt die Persistenz der Sicht durch, indem Sie einfach darüber iterieren und jede Schicht für einen kurzen Moment in den Würfel spülen. Der aktuelle Status wird solange angezeigt, bis die Aktualisierungszeit abgelaufen ist. An diesem Punkt übergeben wir die Kontrolle wieder an die Hauptschleife (). Ich habe diesen Abschnitt des Codes in dieser LED_cube_POV-Datei gespeichert. Wenn Sie also einfach Ihre eigenen Spiele programmieren möchten, können Sie diese als Basis verwenden.

App 2: Spiel des Lebens

Lassen Sie uns dies vorerst in eine Basisversion von Conway's Game Of Life umwandeln. Für die von Ihnen, die nicht vertraut sind (Versuchen Sie es mit Googeln, um eine tolle Ostereier-Animation zu finden.), das Spiel des Lebens ist ein Beispiel für zellulare Automaten, die mit wenigen einfachen Regeln ein faszinierendes Muster aufkommenden Verhaltens erzeugen.

So scheinen Ameisen sich mit Intelligenz und Schwindelgefühl zu bewegen, auch wenn sie biologisch tatsächlich nur sehr einfachen hormonellen Regeln folgen. Hier ist der vollständige Code zum Herunterladen: Drücken Sie die zurücksetzen Taste zum Neustart. Wenn Sie immer wieder das gleiche Muster sehen, halten Sie die Resttaste länger gedrückt.

Hier sind die Regeln des Spiels des Lebens:

  • Jede lebende Zelle mit weniger als zwei lebenden Nachbarn stirbt, als ob sie von einer zu geringen Bevölkerungszahl verursacht wurde.
  • Jede lebende Zelle mit zwei oder drei lebenden Nachbarn lebt bis zur nächsten Generation.
  • Jede lebende Zelle mit mehr als drei lebenden Nachbarn stirbt wie durch Überfüllung.
  • Jede tote Zelle mit genau drei lebenden Nachbarn wird wie durch Reproduktion zu einer lebenden Zelle.

Führen Sie den Code aus. Sie werden innerhalb von 5 bis 10 bemerken “Generationen”, Die Automaten sind wahrscheinlich zum Stillstand gekommen und stabilisieren sich an einer bestimmten Position. Manchmal ändert dieses stabile Muster den Ort und verschiebt sich um die Tafel. In seltenen Fällen sind sie sogar völlig ausgestorben. Dies ist eine Einschränkung, nur mit 4x4x4-LEDs zu arbeiten, aber es ist trotzdem eine gute Lernübung.

Um den Code zu erklären:

  • Sie sind vielleicht nicht vertraut mit memcpy () Funktion. Ich habe dies verwendet, um den vorherigen Spielzustand zu speichern, da Arrays nicht einfach wie normale Variablen einander zugewiesen werden können - Sie müssen tatsächlich über den Speicherplatz kopieren (in diesem Fall 64 Bit)..
  • wieManyNeighbours () Die Funktion sollte selbsterklärend sein. Falls dies nicht der Fall ist, verwendet diese Methode eine einzige Koordinate und durchläuft jeden möglichen Nachbarn (das gleiche Array von Richtungen, das wir zuvor in der Schlangen-App verwendet haben), um zu prüfen, ob sie gültig sind. Dann wird geprüft, ob diese Nachbar-LEDs im vorherigen Spielzustand eingeschaltet waren, und zählt, wie viele vorhanden sind.
  • Die Hauptfunktion dieser Game of Life App ist progressGame (), Dies wendet die Automatenregeln auf den aktuellen Spielzustand an.

Verbesserungen: Ich habe bisher viel zu lange damit verbracht, aber Sie möchten vielleicht einen Check hinzufügen, der das Board nach etwa fünf Generationen desselben Musters automatisch zurücksetzt. dann lass es mich wissen! Ich würde auch vorschlagen, die POV-Methodik in das Schlangenspiel einzufügen, um hoffentlich eine längere Schlange zu ermöglichen.

Das wars heute von mir. Ich werde zu einem späteren Zeitpunkt noch einige weitere Arduino LED-Cube-Apps besuchen, aber hoffentlich sollten Sie in der Lage sein, meinen Code zu ändern und Ihre eigenen Spielregeln zu erstellen: Teilen Sie uns mit, was Sie in den Kommentaren finden, damit wir alle herunterladen können deine Kreationen! Wie immer bin ich hier, um Ihre Fragen zu beantworten und meine entsetzlichen Programmierfähigkeiten zu verteidigen.

Bildnachweis: kartesische Koordinaten - Wikimedia user Sakurambo

Erfahren Sie mehr über: Arduino.