Änderungen

Aus Hackerspace Ffm
Wechseln zu: Navigation, Suche

SpaceInLasers

2.396 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.
***** 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), steuert Virobi-Motor
*** Targetcontroller für Haupt-Ufo. Steuert Neopixel im Ufo und fragt Lichtsensoren ab, ausserdem UART-Tx zu
**** Bewegungscontroller fürs Haupt-UFO
== 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
* _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
* _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
 
'''Achtung Fehler:''' Bei Space'n'Lasers 2.0 konnten Rückgabewerte ähnlich aussehen wie Befehle und daher von den anderen Nodes als solche interpretiert werden. Da die Arduinos nur das erste Byte interpretieren, werden alle Rückgabewerte nun mit einem "Space" eingeleitet.
Neopixel Animationen aus FastLEDAnim.cpp _aONNAABBCCDD:
|}
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