Laser Shooting Gallery
- Von einer festen Position müssen Ziele mit dem Laser getroffen werden
- Typisch bis zu zwei Spieler gleichzeitig = zwei Pistolen
- Ziele bestehen aus einem Fototransistor und werden von einem Neopixel beleuchtet
- Bis zu 8 Ziele werden von einem Arduino verwaltet
- Bussystem mit RS485 zwischen den Ziel-Arduinos, den Pistolen-Arduinos und einem Spielmaster
- Spielmaster ist auch Busmaster, steuert das gesammte Spielgeschehen
- Aktiviert Leuchtziele
- Fragt Pistolentrigger ab
- Startet Schußsequenz
- Broadcast: "Bereit machen für Schuß". Die Nodes bringen Zeitintensive Aufgaben noch zu Ende, pausieren. Ggf. werden DMX-Lichter und andere langsame Störer abgeschaltet.
- Broadcast: "Schuß - Licht-Aus-Phase". Alle schnellen Lichter werden dunkel geschaltet.
- Broadcast: "Schuß - Einmeßphase". Der Dunkelwert der Sensoren wird nun gemessen.
- Broadcast: "Schuß - Bit0 - Bit7". Die Pistolen aktivieren den Laser mit bestimmten Code für jedes Bit. Pro Bit fragen die Zielcontroller mit etwas Verzögerung analog alle Kanäle ab und entscheiden ob das Bit 0 oder 1 ist.
- Broadcast: "Schuß beendet". Lichter wieder an, Zeitintensive Aufgaben werden weitergeführt.
- Unicast: Die Zielcontroller werden reihum abgefragt.
- Unicast: Ggf. werden Aktionen in den Zielcontrollern und den Pistolen getriggert, die einen Treffer anzeigen.
- Unklar ist noch, ob ggf. der gesammte Broadcast-Teil einfach Zeitgesteuert ablaufen wird.
Architektur (reverse engeneered...)
- Lokales Netzwerk (LAN)
- Master: Raspberry Pi mit Python - Gamemaster, RS485-Bussystem:
- 2 Laserpistolen
- Mehrere Targetcontroller
- 4 Buchsen für jeweils 2 Targets mit jeweils 1 Lichtsensor und 1 Neopixelsteuerleitung
- 3 3er Pinne mit D3, D9 und D10 für Extras wie Nebelmaschinen-Trigger etc.
- Targetcontroller NRF24L01 (Master) - funkt zu
- 2 Virobi-Ufos: Darin Targetcontroller auch mit NRF24L01 (Slave)
- Emfängt asyncron 3-4 Lichtsensoren
- Sendet per freiem Tx Kommandos zu
- Sekundär-Arduino: Steuert Lichtanimationen fürs UFO (Ufo-Steuerpult, 3 Tischtennisbälle, Plexistablicht)
- 2 Virobi-Ufos: Darin Targetcontroller auch mit NRF24L01 (Slave)
- Targetcontroller für Haupt-Ufo. Steuert Neopixel im Ufo und fragt Lichtsensoren ab, ausserdem UART-Tx zu
- Bewegungscontroller fürs Haupt-UFO
- Slave: PC mit Processing: Per TCP-Empfang: Zeigt Punktestand auf Beamer an
- Slave: PC mit Licht-Software: Aktiviert Lichtszenen, Ansteuerung der Lampen per DMX-Bux
- 2x RGB Wascher
- Pinspot für Mondbeleuchtung
- Punkt-LED Effektlampe an Decke
- Farb-LED-Effekt am Spielfeldrand
- Master: Raspberry Pi mit Python - Gamemaster, RS485-Bussystem:
Hardware
- Empfänger: SFH 300-3/4 (geht direkt mit dem internen Pull-Up am Analog-Eingang)
Empfang des Schusses ohne Startreferenz
- Empfänger liefern analoges Signal, das wird auch analog eingelesen. Je mehr Licht empfangen wird, desto geringer wird der gelesene Analog-Wert
- Bei Umgebungslicht den Wert für Sensor-Dunkel langsam nachführen
- Ab unterschreiten eines Thresholds kann vom ersten Bit ausgegangen werden (das ist immer 1 = Licht an)
- Irgendwie (TM) die Länge dieses Bits bestimmen - wenn lang genug, bei Flankenwechsel auf Bit-Empfangsmodus gehen
Serielle Kommandos
Unicast Kommandos ist ein ASCII-Zeichen für die ID, diese ist 0-9 für die Targets und A-C für die Waffen-Controller. Alles andere sind Broadcast-Kommandos. Kommandos nur ASCII, terminiert Retrurn).
Broadcast Kommandos:
- sABC Bereit machen für Schuß, Licht-Aus + Schusswaffenselektion, Parameter wählt Waffen aus die schießen werden. Bei Empfang dieses Befehls werden Zeitintensive Tasks angehalten und ggf. Lichter aus gemacht.
- S Schuss abfeuern. Die Waffen senden den Schuss, die Empfänger empfangen den Schuss. Nach 9 Bitzeiten ist alles vorbei, Zeitintensive Tasks dürfen weiterlaufen und Lichter wieder aktiviert werden.
- I fragt ID des Arduinos ab, an dem Pin 13 mit A0 gebrückt war nach Reset
- I? fragt ID des Arduinos ab, kann bei mehreren zur Bus-Kollision führen
- Ixx schreibt ID des Arduinos, an dem Pin 13 mit A0 gebrückt war nach Reset. x steht für das ASCII-Zeichen der ID und muss zweimal hintereinander stehen.
Unicast Kommandos: _ ersetzen durch Target-Controller-ID
- _aONNAABBCCDD Neopixel Animation starten, O = Objekt Nummer, NN = Animation number (Hex), AABBCCDD (Hex, optionale Argumente)
- _AONNAABBCCDD Analog Animation starten, O = Objekt Nummer, NN = Animation number (Hex), AABBCCDD (Hex, optionale Argumente)
- _tr Targets am Block abrufen, Rückgabe: AABBCCDDEEFFGGHH = data value
- _tO Target mit Objekt Nummer O detailiert abfragen
- _b fragt Buttons und letzten Barrel-Count ab. Rückgabe AABB: AA Bitfeld für Buttons, 1 gedrückt, BB Barrelcount
Neopixel Animationen aus FastLEDAnim.cpp _aONNAABBCCDD:
Effekt | NN = Animation number | AA | BB | CC | DD |
---|---|---|---|---|---|
Do nothing | 00 | - | - | - | - |
Blank all (set to Black) | 01 | - | - | - | - |
Set to color RGB | 02 | red | green | blue | - |
Shot like effect: White, flickering dim down 255 steps | 07 | Speed in 0.1ms per step, 0 switch to fire effect | - | - | - |
Fire like effect: Lava-Palette flickering | 08 | - | - | - | - |
wave animation parallel, (destroy animation) | 09 | red | green | blue | speed factor as two digit hex, min = 1 higher is faster |
wave animation seriel sequence RGB | 0A | red | green | blue | speed factor as two digit hex, min = 1 higher is faster |
UFO animation: useless with one led... | 10 | red | green | blue | - |
Analog Animationen aus AnalogDAnim.cpp _AONNAABBCCDD:
Effekt | NN = Animation number | AA | BB | CC | DD |
---|---|---|---|---|---|
Do nothing | 00 | - | - | - | - |
Blank all (set to PWM 0) | 01 | - | - | - | - |
Set PWM directly | 02 | PWM value | - | - | - |
Fade PWM up | 10 | Start value | Stop value | Speed in 0.1ms steps | Repeat count (0=forever) |
Fade PWM down | 11 | Start value | Stop value | Speed in 0.1ms steps | Repeat count (0=forever) |
Flash | 20 | On PWM value (Off is 0) | On time in 10ms steps | Off time in 10ms steps | Repeat count (0=forever) |
Blink | 21 | On PWM value (Off is 0) | On time in 100ms steps | Off time in 100ms steps | Repeat count (0=forever) |
Animationen:
- Gun Shot: Aa00710 (Für Barrel)
- Rumble Shot: AA011FF000401
- Blitz 8x: 4A120FF040408
Virobi UFO Animationen:
- Off: A60000000000
- Motor konfiguration: A500BBCC
BB = Motor speed normal mode 00-FF CC = Motor speed panic mode 00-FF
- Normal Mode: A601RRGGBB00
RR = red [00-FF] GG = green [00-FF] BB = blue [00-FF]
- Panic Mode: A60ARRGGBB00
RR = red [00-FF] GG = green [00-FF] BB = blue [00-FF]
Schuß IDs (1 = Laser On):
- Waffe A Hauptschuß: 0x91 [0 1001 0001], Sekundärschuß: 0x95 [0 1001 0101]
- Waffe B Hauptschuß: 0xA2 [0 1010 0010], Sekundärschuß: 0xA6 [0 1010 0110]
Game Code
Spielprinzip
Shooting-Gallery
- Einzeln oder optional zu zweit auf maximale Punktzahl
- Feste Zeitdauer, evtl. Bonus-Zeit schießbar
- Nur leuchtende Ziele können getroffen werden
- Je länger Ziel leuchtet, desto weniger Punkte, Ziel geht erst bei Treffer aus (Option)
- Shotgun nach Barrel-Laden
- Limitierte Feuerrate, ggf. erhöhbar durch drehen am Barrel
Optionitis
- Video aus Gangansicht
- galvoscanner [3]
Space'n'Lasers 2.0 Make Rhein Main 2016
Make Rhein Main 2016 - Location Bilder
Ultimedia
after countless fails ...
... we installed all the cool stuff in the "tunnel"
Files
Most can be found in our Github: https://github.com/hackffm/SpaceNLasers
PCB for Target Controller: Datei:SpaceInLasers Target Controller V1.0.zip