Arduino-GameShield


Aus Restbeständen kann man an einem verregneten Sonntag aus dem Arduino eine Spielekonsole machen. Hier werden mal endlich alle zur Verfügung stehenden IO Pins verwendet.

Bild "GameShield-Animation.gif"

Wie jedes Arduino-Shield wird auch das Game-Shield auf einen Arduino-Uno gesteckt.
Bild "GameShield-Perspektive.JPG"

Bild "GameShield-Teile.JPG"

Da der Einfachheit halber alles auf Lochraster aufgebaut wurde, musste ein wenig experimentiert werden, um das richtige Steckerraster zu erreichen.

Bild "GameShield-Unten.JPG"

Da der Stecker mit den Pins 8 bis 13 um ein halbes Rastermaß verschoben ist (vermutlich um Verpolung zu vermeiden), habe ich dort die Leiterbahnen der Lochstreifenplatine entfernt. Nur die erste und letzte blieben stehen, um so den Stecker an den Enden anlöten zu können. Alle anderen Pins des Pfostensteckers schweben in der Luft. Die Kuoferlackdrähte sind dort direkt am Pin angelötet. Da ich abgewinkelte Pfostenleisten verwendet habe, ergibt sich trotzdem eine robuste Verbindung.
  

Die Schaltung


Bild "GameShield-Schaltung.png"

Da alle Bauteile aus der Bastelkiste kommen, habe ich einige Kompromisse gemacht, die man bei Kauf von Bauteilen vermeiden könnte. So habe ich z.B. 10 recht große 100Ohm Vorwiderstände für die LEDs verbaut. Hier könnte man wesentlich platzsparender mit einem Widerstandsarray arbeiten. Auch die Transistoren kann man als Array kaufen. Die Transistoren habe ich als Emitterfolger verschaltet, um die Basiswiderstände einzusparen. Das hat zur Folge, dass diese "oben" an der 5V Rail angeschlossen sind und die Vorwiderstände an der negativen Seite liegen. Somit schaltet man eine LED ein, indem man den Arduino-Ausgang für den Transistor auf HIGH programmiert und den Arduino-Ausgang am Widerstand auf LOW. (Siehe unten die Beschreibung der Matrix).

Da man natürlich bei Spielen etwas steuern können muss, gibt es einen Taster und ein Poti für analoge Steuerungen. Damit sind dann alle IOs des Arduino erschöpft.
Da ich aber auch noch gerne Töne erzeugen wollte, habe ich einen Piezo-Signalgeber parallel zum Poti angechlossen. Da der hochohmig ist, beeinflusst er das Poti nicht. Die Library schaltet den Arduino Pin zwischen Ein- und Ausgang hin und her. Es muss dabei berücksichtigt werden, dass man während der Tonausgabe kein Steuersignal bekommt.

The Matrix

Hier noch mal das Funktionsprinzip:

Bild "GameShield-Matrix.png"

Die Dot-Matrix Bausteine haben jeweils Zeilen und Spalten. An den Kreuzungspunkten sitzen die LEDs. Auch wenn man genügend Ausgänge hat, um alle gleichzeitig anzusteuern, kann man nicht jeden beliebigen Punkt unabhängig von allen anderen Punkten ansteuern. Ansonsten bräuchte man so viele Leitungen, wie es Punkte gibt. Also 40 bei einer 5x8 Punktmatrix.
Die Lösung heißt multiplexen. Der Arduino aktiviert jeweils nur eine Zeile indem der entsprechende Transistor mit digitalWrite(x, HIGH) durchgeschaltet wird. Alle Spalten, in denen ein Punkt leuchten soll, (c0...c4) werden dann gleichzeitig aktiviert mit digitalWrite(y, LOW).
Dieser Vorgang wird dann mit der nächsten Zeile wiederholt und so weiter.
Nach jeder Zeile wartet die SW 2ms. Somit widerholt sich das Ganze nach 8 x 2ms = 32ms. Das führt zu einer Wiederholrate vonn etwas mehr als 30 Bildern pro Sekunde.  

Die simple Library


Da es sich um ein Wochenendprojekt handelt, habe ich nur eine sehr elementare Library geschrieben. Man kann lediglich Punkte setzen und löschen, Linien und ASCII Zeichen fehlen.
Dennoch kann man so schon ein einfaches Squasch-Spiel implementieren:

Bild "GameShield-Code.png"

Hier noch der gesamte Code und die Library zum herunterladen.
GameShield.zip

Bei neueren Arduino-SW-Versionene muss die Library in Sketchbook auf gleicher Ebene mit dem Sketchverzeichnis stehen.
Also so:
Sketchbook
      MySketch
      libraries