Änderungen

Aus Hackerspace Ffm
Wechseln zu: Navigation, Suche

SpaceInLasers

2.007 Byte hinzugefügt, 22:00, 12. Mär. 2017
/* Serielle Kommandos */
** 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ß " - State machine beginnt:**** State 0: Licht-Aus-Phase". Alle schnellen Lichter werden dunkel geschaltet.*** Broadcast* State 0.5: "Schuß - Einmeßphase". Der Dunkelwert der Sensoren wird nun gemessen.*** Broadcast* State 1..8: "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* State 9: "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.
== Hardware ==
* Empfänger: SFH 300-3/4 (Langer Pin: Emitter, kurzer Pin: Collektor, 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
** Problem ggf mit dauer leuchtenden Strahlern
* 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
Broadcast Kommandos:
* sABC scduv 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. a,b = Boden Luft Abwehrtürme, u,b = UFO Schüsse.
* 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.
* fAAAABBBB setzt bitTime = AAAA, bitDelay = BBBB
* Tddddd setzt Threshold auf ddddd, ddddd ausnahmsweise in dezimal hier
* _b fragt Buttons und letzten Barrel-Count ab. Rückgabe AABB: AA Bitfeld für Buttons, 1 gedrückt, BB Barrelcount
* _eONN Energielevel übermitteln, O = Objekt Nummer, NN = Energie level 0-100 (Hex 0-64)
* _d Debug-Ausgaben zu LightRx über Bus
* _TAAAA Threshold auf AAAA setzen, AAAA in hex
|}
Analog Animationen können über den Funktionspointer .pAnalogSet auch an andere Dinge gebunden werden - bei der Waffe wird damit die Laser-Sichtbarkeit gesteuert.
Analog Animationen aus AnalogDAnim.cpp _AONNAABBCCDD:
|| Blink || 21 || On PWM value (Off is 0) || On time in 100ms steps || Off time in 100ms steps || Repeat count (0=forever)
|}
 
* 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]
 
== Funk Nodes mit NRF24L01 ==
Generelles:
* Ein Radiomaster als Sender am Bus: ID: "r"
* Über Radio angeschlossene Nodes haben auch eine serielle ID zwischen "0".."4", diese wird auf die Radio-ID's 0..4 gemappt
* Objekt-Nummern werden wie folgt gemappt:
** 0,4,8,12 -> Radio-Empfänger 0, Objekt-Nummer 0..3
** 1,5,9,13 -> Radio-Empfänger 1, Objekt-Nummer 0..3
** 2,6,10,14 -> Radio-Empfänger 2, Objekt-Nummer 0..3
** 3,7,11,15 -> Radio-Empfänger 3, Objekt-Nummer 0..3
* 'a' und 'A' werden nach Umschreibung der Objekt-Nummer direkt durchgeleitet (ohne "r")
* Radiomaster hat RadioStatus Statemachine:
** State 0: Default, sendet wenn was zu senden ist (RadioTxQueueSendReady), startet StartTargetQuery (State 20)
** State 20: StartTargetQuery: Broadcastet Kommando "S", bei Fehler State 12, sonst State 21
** State 21: Empfängt mit Timeout RXELEM-Data Dinger, diese werden "eingeodert" in TargetData[NodeIdx][]. Ausserdem werden die Empfangenen Blöcke in currQueryNum gezählt - wurden 2 empfangen (recht hart codiert), ist es fertig und geht nach State 0 zurück.
** State 10: Toter Code? Sendet "t" an currQueryNum per writeFast
** State 11: ?
** State 12:
 
 
Schuss-Synchronisation:
* Slaves senden was zurück beim t und S Kommando, Senden wird dabei Zeitversetzt gestartet
** Senden beim S Kommando blockt - falscher Zeitpunkt wäre sehr kontraproduktiv. Per Radio wird das "S" aber erst nach Ablauf der Rx-Sequenz im Radiomaster gesendet.
== Game Code ==
913
Bearbeitungen