====== Spacewavr ====== {{:project:spacewavr:overview.jpg?600|}} ==== Kurzfassung ===== Eine Implementierung von [[https://de.wikipedia.org/wiki/Spacewar!|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 === - Besorge dir ein passendes Oszilloskop (oder frage [[leute:xq]], ob du seines verwenden kannst) - 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. - //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. - Schließe beide Controller an die Platine an - Besorge dir ein Netzteil mit [[project:shack_standard]]-Anschluss, welches zwischen 6.5V und 12V liefert. - Schließe das Netzteil an den SpaceWavr an und drücke die Reset-Taste - Schalte das Oszilloskop an und stelle es so ein, dass ein {{:project:spacewavr:clean-image.jpg?linkonly|klares Bild}} zu sehen ist. - 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 ===== {{:project:spacewavr:board.jpg?600|}} Das Projekt ist mit einem ATmega32 implementiert und benutzt zwei [[https://de.wikipedia.org/wiki/R2R-Netzwerk|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:closeup.jpg?600|}} {{:project:spacewavr:game.jpg?600|}} {{tag>project hardware electronics video UEBLES_GEMURKSE }}