Zuletzt geändert am 25. Februar 2017 um 18:10

SpaceNlasers header.jpg

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)
      • 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

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

Source code git hub [1]

Class reference [2]

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

http://spaceinlasers.guenter-helbig.de

Make Rhein Main 2016 - Location Bilder

Ultimedia

after countless fails ...

Fail.gif

... 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