Backspace Invaders oder wie man ein 64x64 LED-Display an Arduino anschließt


4095 LEDs und alles in allem

Überraschenderweise bewältigt der ATmega328-Controller, der dem Arduino Uno zugrunde liegt, die Bildausgabe auf einem solchen Display. Es stellte sich heraus, dass es sich um eine „Taschen“ -Konsole (mit einem Gewicht von mehreren Kilogramm) handelte, in die ein auf Space Invaders basierendes Spiel eingenäht war. Die Pläne, sich etwas anderes auszudenken, weil noch viel freier Speicher übrig ist.

Unter dem Schnitt können Sie nachlesen, wie eine solche Anzeige angeordnet ist und wie sie gesteuert werden kann.

Anstatt alte Computer in der Sammlung zu finden , mache ich sie manchmal selbst aus improvisierten Materialien .

Dieses Mal wollte ich etwas Kompaktes mit einer Auflösung auf der Ebene von Konsolen und Computern der frühen 80er Jahre machen. Das 64x64-Pixel-Display erreicht zwar nicht den Atari 2600, aber um bis zu 64 Pixel mehr als das Nokia 3310-Display, auf dem es auch Spiele gab. Es hätte also mit einem Vorsprung zumindest für ein angenehmes Tetris- oder Pongspiel ausreichen müssen.


Zusätzlich zum Display bekam ich ein Board, das mit dem Arduino Uno kompatibel war, und begann darüber nachzudenken, wie ich mit all dem Zeug hochfliegen sollte.

Adafruit verkauft solche Displays und Beispiele für deren Verwendung finden Sie auf seiner Website. Es gibt auch einen Link zur Bibliothek , mit der Sie arbeiten können. Die Bibliothek unterstützt Arduino Uno und Arduino Mega.

Diese Bibliothek organisiert den Videospeicher, in dem Pixelfarben gespeichert werden. Das Anwenderprogramm malt diese Pixel neu und das Bild wird im Timer-Interrupt-Handler angezeigt. Bei kleinen Displays funktioniert dies gut, aber in meinem Fall ist diese Methode nicht gut. Selbst wenn jedem Pixel ein halbes Byte zugewiesen ist (ein Bit pro R, G, B und ein zusätzliches), werden für eine 64x64-Matrix 2 Kilobyte Speicher benötigt. Und das ist alles, was der ATmega328P hat. Sie können natürlich einen leistungsstärkeren Prozessor verwenden, aber dies ist nicht der Weg der Jedi.

Wer zwingt uns schließlich, alle Zeilen des Bildschirms auf einmal zu speichern? Sie können jede Zeile neu berechnen, bevor Sie sie anzeigen. Für primitive Grafiken aus mehreren Sprites sollten diese Berechnungen nicht zu lange dauern, damit alles funktioniert.


Es war in den Wäldern einer Sommer-Computerschule, es war zu faul, nach Dokumentation über Mikroschaltungen zu suchen und die Tafel zu verfolgen, um zu verstehen, womit sie verbunden war. Daher habe ich den Algorithmus für die Arbeit mit dem Display aus den zuvor heruntergeladenen Bibliotheken ausgewählt:

  • Wir stellen die Adresse der Ausgangsleitung auf den Anzeigeeingängen ein
  • Füllen Sie das Array mit den Farben der Sprite-Pixel, die sich mit der aktuellen Zeile schneiden.
  • Wir verschieben nacheinander alle Pixel in einem Schieberegister, das die LEDs steuert
  • Wir klicken auf die empfangenen Daten und senden sie an die Ausgänge der Register

Infolgedessen wird ein Array mit einer Größe von nur vier Bildschirmzeilen für den Videospeicher ausgewählt. Warum vier? Das liegt daran, dass wir gleichzeitig die Daten in zwei Zeilen verschieben - weil die Matrix zwei Gruppen von Eingaben hat: R1 / G1 / B1 und R2 / G2 / B2. Sie steuern zwei Zeilen mit einem Abstand von 16 Pixel.

Aber warum dann nicht zwei Zeilen, sondern vier? Es stellt sich heraus, dass die 64x64-Matrix aus zwei unabhängigen 32x64-Matrizen besteht. Es wäre möglich, separate Prozessorausgänge an jeden anzuschließen, aber ATmega328 hat nicht genug. Glücklicherweise sorgte ein fürsorglicher Hersteller für die Kaskadierung dieser Matrizen - der Ausgang des Schieberegisters des einen kann mit dem Eingang des anderen verbunden werden. Dann erhalten wir die logische 32x128-Matrix, die physisch als 64x64 angezeigt wird. Das heißt, in jeder Phase müssen zwei Zeilen mit 128 Pixeln in die Register verschoben werden - und dies sind 4 Zeilen des physischen Bildschirms.



Wir haben während der Sommer-Computerschule einen Prototyp der Konsole erstellt. Das erste Spiel ähnelte etwas Space Invaders .



In Wirklichkeit haben LEDs ihre Augen wirklich ausgebrannt. Es ist unwahrscheinlich, dass Sie die Helligkeit mit PWM anpassen können - ATmega verfügt nicht über genügend Geschwindigkeit. Wir müssen eine Art ARM oder FPGA nehmen.

Die endgültige Version habe ich in einer Holzkiste entworfen. Der Bildschirm ist durch geschliffenes Plexiglas geschützt. Aufgrund der Lichtstreuung sind die Augen nicht mehr ausgebrannt, aber jetzt ist es schwieriger, die Arbeit der Konsole im Video aufzuzeichnen - das gesamte Bild wird unscharf.



Das gesamte Programm verwendet 1101 Byte (53%) RAM und 6432 (19%) Byte ROM. Es ist noch Platz, um mehrere Spiele und Menüs für ihre Auswahl zu erstellen.

Referenzen

  1. Projektquellen : github.com/Dovgalyuk/BackspaceInvaders
  2. Beschreibung der Matrix auf adafruit: learn.adafruit.com/32x16-32x32-rgb-led-matrix
  3. Adafruit-Matrixverwaltungsbibliothek: github.com/adafruit/RGB-matrix-Panel
  4. Adafruit-Bibliothek zum Zeichnen grafischer Grundelemente: github.com/adafruit/Adafruit-GFX-Library
  5. Ein ähnliches Projekt auf einem leistungsstärkeren Prozessor: learn.adafruit.com/ledgames-beaglebone-black-64x64-led-game/overview
  6. In diesem Artikel geht es um die Verwaltung einer kleineren Anzeige: geektimes.ru/post/275548

Source: https://habr.com/ru/post/de403231/


All Articles