Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

project:spacewavr

Spacewavr

Kurzfassung

Eine Implementierung von SpaceWar! auf dem AVR. Gehackt an einem Wochenende bietet es einen Spaß für zwei Spieler.

Gameplay-Video: https://mq32.de/public/spacewavr-04.mp4

Benutzung

Um SpaceWavr zu benutzen, benötigt man ein Oszilloskop mit XY-Ableitung und optional einem Z-Eingang sowie zwei Spieler.

Setup

  1. Besorge dir ein passendes Oszilloskop (oder frage xq, ob du seines verwenden kannst)
  2. Schließe zwei Tastköpfe so an, dass der A-Kanal (X-Ableitung) am X-Pin hängt und der B-Kanal (Y-Ableitung) am Y-Pin. Als Massereferenz kann der Ø-Pin verwendet werden.
  3. Optional: Falls das Oszilloskop einen Z-Eingang mit inverser Ansteuerung (High → Aus) hat, kannst du dafür einen Tastkopf an den Z-Pin anschließen.
  4. Schließe beide Controller an die Platine an
  5. Besorge dir ein Netzteil mit shack_standard-Anschluss, welches zwischen 6.5V und 12V liefert.
  6. Schließe das Netzteil an den SpaceWavr an und drücke die Reset-Taste
  7. Schalte das Oszilloskop an und stelle es so ein, dass ein klares Bild zu sehen ist.
  8. Spiele!

Gameplay

Beide Spieler steuern jeweils ihr Raumschiff. Spieler 1 steuert das linke Raumschiff, Spieler 2 das Rechte. Die Controller haben vier Tasten:

  • Links drehen
  • Rechts drehen
  • Beschleunigen
  • Feuern

Die beiden Tasten auf dem Steuerkreuz sind für die Drehung des Raumschiffs zuständig, die runde Taste auf der rechten Seite beschleunigt das Raumschiff, der rechte Trigger feuert einen Schuss ab.

Die Spieler versuchen nun, sich gegenseitig abzuschießen und den Schüssen des Gegners auszuweichen. That's it!

Technik

Das Projekt ist mit einem ATmega32 implementiert und benutzt zwei R2R-Netzwerke als Digital-Analog-Wandler mit jeweils 8 Bit Auflösung.

Die Ausgänge dieser DACs dienen als X- bzw. als Y-Ableitung für den Oszilloskop-Strahl. Dieser wird dann im Programm direkt über die Ports B und D des Atmega32 angesteuert.

Intern rechnet das Programm alle Bildschirm-Koordinaten als vorzeichenbehafteter 16-Bit-Integer und schneidet die niederwertigen 8 Bit bei der Ausgabe ab:

void move_cursor(int16_t x, int16_t y)
{
  PORTB = 128 + x / 256;
  PORTD = 128 + y / 256;
}

Damit ist sowohl ausreichend Rechenpräzision garantiert als auch genug Geschwindigkeit, dass die Bewegung des Strahls schnell genug vonstatten geht.

Die Eingabe erfolgt direkt über den Port C und benutzt hier die internen PullUp-Widerstände. Dies vereinfacht die Schaltung, da keine externen Widerstände benötigt werden.

Den vollen Quellcode findet man auf GitHub:

https://github.com/MasterQ32/SpaceWavr

Schaltplan oder Platinenlayout müsste mal jemand machen hubel hubel.

Weitere Fotos

project/spacewavr.txt · Zuletzt geändert: 2019-12-16 02:32 von xq