Added device types and vest mini app
All checks were successful
Deploy Docs / build-and-deploy (push) Successful in 22s

This commit is contained in:
2026-01-10 09:07:49 +01:00
parent 978f93ec3d
commit ce4d0d1a44
31 changed files with 621 additions and 273 deletions

View File

@@ -63,27 +63,27 @@ Kompakte passive Power-Up-Geräte mit Druckschalter.
### 2.1 Akkusystem
**Standard:** 2S LiPo (7.4 V nominal, 8.4 V voll geladen, 6.0 V Entladungsschutz).
**Standard:** 2S LiPo (7.4V nominal, 8.4V voll geladen, 6.0V Entladungsschutz).
**Alternative:** 1S nur für Tests oder Low-Power-Prototypen ungeeignet für hohe IR-LED-Ströme (siehe Abschnitt 4.1).
**Schutz & Laden:**
- **Zellenschutz-IC:** HY2120-CB + FS8205A (Dual-FET) schützt vor Über-/Unterspannung, Überstrom, Kurzschluss.
- **Lade-IC:** IP2326 (2S Balancing, USB-C) ermöglicht einfaches Laden ohne externe Balancer.
- **Fuel Gauge:** Spannungsteiler-basierte ADC-Messung (R1=100k, R2=47k) → Software-Mapping auf Ladestand (6.0 V = 0 %, 8.4 V = 100 %).
- **Fuel Gauge:** Spannungsteiler-basierte ADC-Messung (R1=100k, R2=47k) → Software-Mapping auf Ladestand (6.0V = 0 %, 8.4V = 100 %).
!!! info "Warum 2S?"
2S-Systeme bieten ausreichend Headroom für IR-LED-Konstantstromquellen (>4.8 V nötig bei 3A) und stabile Versorgung auch bei hoher Last. 1S-Zellen brechen unter 1A+ schnell auf 3.43.6 V ein.
2S-Systeme bieten ausreichend Headroom für IR-LED-Konstantstromquellen (>4.8V nötig bei 3A) und stabile Versorgung auch bei hoher Last. 1S-Zellen brechen unter 1A+ schnell auf 3.43.6V ein.
### 2.2 Spannungsebenen & Wandler
**Primär-Rail (Batterie, 6.08.4 V):**
**Primär-Rail (Batterie, 6.08.4V):**
Direkt gespeist: IR-LED-Treiber, Muzzle-Flash-LED, Solenoid 6V (Open Frame, taktiles Feedback Rückstoss).
**Sekundär-Rail (5.0 V, ~1.5 A):**
**Sekundär-Rail (5.0V, ~1.5A):**
Buck-Converter (z.B. MP2315, TPS62130) für Audio-IC (MAX98357A), adressierbare LEDs (WS2812B) und nachgeschalteten LDO. Hohe Schaltfrequenz gewünscht (geringe Induktivität, kompakte Bauform).
**Tertiär-Rail (3.3 V, ~30 mA):**
**Tertiär-Rail (3.3V, ~30mA):**
LDO (z.B. MCP1826, AMS1117-3.3) aus 5V Buck-Ausgang für nRF52840 und QSPI Flash. Geringer Dropout (5V → 3.3V = 1.7V) reduziert Wärmeentwicklung; Low-Noise-Design minimiert Störungen auf der RF-Schaltung.
**IR-Empfänger (5V mit Level-Shift):**
@@ -100,23 +100,23 @@ Die Weste hat durch LEDs und Audio den höchsten Verbrauch; hier die Peak-Absch
| Komponente | Zustand | Strom | Leistung |
| :--- | :--- | ---: | ---: |
| Audio (MAX98357A) | Volllast (3W @ 90% η) | ~670 mA | 3.35 W |
| WS2812B LEDs (5×) | 100 % Weiß | 300 mA | 1.50 W |
| IR-Empfänger (5×) | Dauerbetrieb @ 5V | ~50 mA | 0.25 W |
| LDO 3.3V (Durchleitung) | 30 mA @ 3.3V | ~30 mA | 0.15 W |
| **Gesamt 5V (Peak)** | | **~1.05 A** | **5.25 W** |
| Audio (MAX98357A) | Volllast (3W @ 90% η) | ~670mA | 3.35W |
| WS2812B LEDs (5×) | 100 % Weiß | 300mA | 1.50W |
| IR-Empfänger (5×) | Dauerbetrieb @ 5V | ~50mA | 0.25W |
| LDO 3.3V (Durchleitung) | 30mA @ 3.3V | ~30mA | 0.15W |
| **Gesamt 5V (Peak)** | | **~1.05A** | **5.25W** |
**3.3V-Rail (LDO aus 5V Buck):**
| Komponente | Zustand | Strom | Leistung |
| :--- | :--- | ---: | ---: |
| nRF52840 | BLE+Thread aktiv | ~15 mA | 0.05 W |
| QSPI Flash | Read/Write Burst | ~15 mA | 0.05 W |
| **Gesamt 3.3V (Peak)** | | **~30 mA** | **0.10 W** |
| nRF52840 | BLE+Thread aktiv | ~15mA | 0.05W |
| QSPI Flash | Read/Write Burst | ~15mA | 0.05W |
| **Gesamt 3.3V (Peak)** | | **~30mA** | **0.10W** |
**Auslegung:**
- **Buck-Regler:** 1.5 A Nennstrom (30 % Reserve), hohe Schaltfrequenz (>1 MHz) für kompakte Drossel/Kondensatoren.
- **LDO:** 100 mA Nennstrom ausreichend; Verlustleistung bei 30 mA: $P_{loss} = (5V - 3.3V) \cdot 30mA = 51 mW$ (unkritisch). Low-Noise-Design (< 50 µVrms) für sauberen RF-Betrieb.
- **Buck-Regler:** 1.5A Nennstrom (30 % Reserve), hohe Schaltfrequenz (>1MHz) für kompakte Drossel/Kondensatoren.
- **LDO:** 100mA Nennstrom ausreichend; Verlustleistung bei 30mA: $P_{loss} = (5V - 3.3V) \cdot 30mA = 51mW$ (unkritisch). Low-Noise-Design (< 50 µVrms) für sauberen RF-Betrieb.
### 2.4 Blockschaltbild Energieversorgung
@@ -169,7 +169,7 @@ Diese Tabelle gibt einen Überblick über die groben Komponenten pro Einheit. De
#### Funktionsprinzip
Hybride PNP/NPN-Topologie für präzisen, modulierten IR-Puls (38 kHz). Die Stromquelle stellt sicher, dass bei wechselnder Batteriespannung der LED-Strom konstant bleibt (→ reproduzierbare Reichweite).
Hybride PNP/NPN-Topologie für präzisen, modulierten IR-Puls (38kHz). Die Stromquelle stellt sicher, dass bei wechselnder Batteriespannung der LED-Strom konstant bleibt (→ reproduzierbare Reichweite).
![LED DRIVER](../img/concept_hardware_led_driver.svg)
@@ -183,10 +183,10 @@ $$R_{set} = \frac{0,65\,\text{V}}{I_{\text{LED}}}$$
| $I_{\text{LED}}$ | $R_{set}$ | Einsatz |
| :--- | :--- | :--- |
| 0,5 A | 1,30 Ω | Standard/Nahkampf |
| 1,0 A | 0,65 Ω | Hohe Reichweite (SFH 4550) |
| 2,0 A | 0,33 Ω | Pulsbetrieb (extreme Leistung) |
| 3,0 A | 0,22 Ω | Scharfschütze (Oslon Black) |
| 0,5A | 1,30Ω | Standard/Nahkampf |
| 1,0A | 0,65Ω | Hohe Reichweite (SFH 4550) |
| 2,0A | 0,33Ω | Pulsbetrieb (extreme Leistung) |
| 3,0A | 0,22Ω | Scharfschütze (Oslon Black) |
**Thermik:** Bei 38-kHz-Modulation (Duty-Cycle ~30 %) ist $P_{\text{avg}} = R_{set} \cdot I^2_{\text{LED}} \cdot DC$ → deutlich unter Peak. $R_{set}$ muss aber Spitzenstrom verkraften → impulsfeste Typen (Metallschicht, Drahtwiderstand).
@@ -198,22 +198,22 @@ $$V_{\text{CC,min}} = V_{f(\text{LED})} + 0,65\,\text{V} + 1,0\,\text{V}_{\text{
| $I_{\text{LED}}$ | $V_f$ (typ.) | $V_{\text{CC,min}}$ | Akku |
| :--- | :--- | :--- | :--- |
| 0,5 A | 2,0 V | 3,65 V | 1S (nur voll geladen) |
| 1,0 A | 2,4 V | 4,05 V | 2S empfohlen |
| 2,0 A | 2,8 V | 4,45 V | 2S erforderlich |
| 3,0 A | 3,2 V | 4,85 V | 2S erforderlich |
| 0,5A | 2,0V | 3,65V | 1S (nur voll geladen) |
| 1,0A | 2,4V | 4,05V | 2S empfohlen |
| 2,0A | 2,8V | 4,45V | 2S erforderlich |
| 3,0A | 3,2V | 4,85V | 2S erforderlich |
!!! warning "1S ungeeignet für >1A"
1S-Akkus brechen unter Last auf 3,43,6 V ein → Regelung versagt, Reichweite bricht ein. 2S liefert auch bei Teilentladung (7,0 V) genug Headroom.
1S-Akkus brechen unter Last auf 3,43,6V ein → Regelung versagt, Reichweite bricht ein. 2S liefert auch bei Teilentladung (7,0V) genug Headroom.
### 4.2 Adressierbare LEDs (WS2812B)
**Anforderung:** 5V-Versorgung, aber Daten-Pegel kompatibel mit nRF52840 (3.3V Logic).
**Level-Shift:** SN74AHCT1G125 (3.3V → 5V, Single-Gate); schnell genug für WS2812-Timing (800 kHz).
**Serienwiderstand:** ~330 Ω nach dem Shifter → dämpft Reflexionen auf der Data-Leitung, verhindert Überschwinger.
**Level-Shift:** SN74AHCT1G125 (3.3V → 5V, Single-Gate); schnell genug für WS2812-Timing (800kHz).
**Serienwiderstand:** ~330Ω nach dem Shifter → dämpft Reflexionen auf der Data-Leitung, verhindert Überschwinger.
**Layout:** Data-Leitung kurz halten; bei mehreren LEDs in Serie: Bypass-Kondensator (100 nF + 10 µF) pro 35 LEDs.
**Layout:** Data-Leitung kurz halten; bei mehreren LEDs in Serie: Bypass-Kondensator (100nF + 10µF) pro 35 LEDs.
### 4.3 Audio-Verstärker (MAX98357A)
@@ -222,39 +222,39 @@ $$V_{\text{CC,min}} = V_{f(\text{LED})} + 0,65\,\text{V} + 1,0\,\text{V}_{\text{
**Architektur:** I2S Class-D Verstärker DAC + Endstufe integriert, filterlose Topologie (wenige Bauteile).
* **Schnittstelle:** I2S (digital); Audio-Stream per EasyDMA vom nRF52840 → CPU bleibt frei für Game Logic.
* **Leistung:** ~3.2 W @ 4Ω laut genug für Outdoor-Einsatz.
* **Leistung:** ~3.2W @ 4Ω laut genug für Outdoor-Einsatz.
* **Effizienz:** ~90 % → Akku-schonend; geringer Ruhestrom im Idle.
* **Layout:** Kurze, symmetrische Leitungen zu Speaker-Terminals; separate Ground-Plane; Entkopplung (10 µF + 100 nF) nahe VDD-Pin.
* **Layout:** Kurze, symmetrische Leitungen zu Speaker-Terminals; separate Ground-Plane; Entkopplung (10µF + 100nF) nahe VDD-Pin.
### 4.4 Flash-Speicher (QSPI)
**Aufgabe:** Audio-Files (Schuss-FX, Ansagen) und Spiel-Logs (optional Treffer-Historie).
* **Technik:** QSPI-NOR-Flash (z.B. W25Q128JV, GD25Q16C); 1.8 V oder 3.3 V; XIP-fähig (Execute-in-Place für Code möglich).
* **Kapazität:** 816 MB; reicht für ~3 min @ 22 kHz oder ~1.5 min @ 44 kHz (16 bit mono). Empfehlung: 22 kHz höhere Sample-Rate bringt bei Outdoor-Speaker kaum Mehrwert.
* **Technik:** QSPI-NOR-Flash (z.B. W25Q128JV, GD25Q16C); 1.8V oder 3.3V; XIP-fähig (Execute-in-Place für Code möglich).
* **Kapazität:** 816MB; reicht für ~3min @ 22kHz oder ~1.5min @ 44kHz (16bit mono). Empfehlung: 22kHz höhere Sample-Rate bringt bei Outdoor-Speaker kaum Mehrwert.
* **Interface:** QSPI (4-Bit parallel); nRF52840 unterstützt DMA-basierten Zugriff → schnelle Reads ohne CPU-Last.
* **Layout:** Flash nahe am MCU (< 5 cm Leitungslänge); Differenzen in Trace-Längen < 1 mm; saubere Ground-Plane; JEDEC-ID beim Boot prüfen.
* **Layout:** Flash nahe am MCU (< 5cm Leitungslänge); Differenzen in Trace-Längen < 1mm; saubere Ground-Plane; JEDEC-ID beim Boot prüfen.
### 4.5 Akku-Überwachung (Fuel Gauge)
**Prinzip:** Spannungsteiler + ADC für 2S-Akkus (08.4 V) → Software-basierte Ladezustandsschätzung (kein dediziertes Fuel-Gauge-IC nötig).
**Prinzip:** Spannungsteiler + ADC für 2S-Akkus (08.4V) → Software-basierte Ladezustandsschätzung (kein dediziertes Fuel-Gauge-IC nötig).
**Schaltungskomponenten:**
| Bauteil | Wert | Funktion |
| :--- | :--- | :--- |
| $R_1$ | 100 kΩ | Spannungsteiler oberer Zweig |
| $R_2$ | 47 kΩ | Spannungsteiler unterer Zweig (→ ADC) |
| $C_1$ | 100 nF | Tiefpass-Glättung am ADC-Eingang |
| $R_1$ | 100kΩ | Spannungsteiler oberer Zweig |
| $R_2$ | 47kΩ | Spannungsteiler unterer Zweig (→ ADC) |
| $C_1$ | 100nF | Tiefpass-Glättung am ADC-Eingang |
**Softwarelogik:**
1. **ADC-Konvertierung:** 12-bit ADC liest $V_{\text{div}}$ (max. 3.3 V bei VRef = 3.3 V).
1. **ADC-Konvertierung:** 12-bit ADC liest $V_{\text{div}}$ (max. 3.3V bei VRef = 3.3V).
2. **Rückrechnung:** $V_{\text{bat}} = V_{\text{adc}} \cdot \frac{R_1 + R_2}{R_2} = V_{\text{adc}} \cdot 3.13$
3. **Mapping:** Lookup-Table oder linear interpoliert:
- 8.4 V → 100 % (voll geladen)
- 7.4 V → ~50 % (nominal)
- 6.0 V → 0 % (Schutzschaltung aktiv)
- 8.4V → 100 % (voll geladen)
- 7.4V → ~50 % (nominal)
- 6.0V → 0 % (Schutzschaltung aktiv)
**Kalibrierung:** Einmalig bei Produktion: Spannung an bekanntem Referenzpunkt messen, Offset/Gain in NVS speichern.
@@ -267,23 +267,23 @@ Konsolidierte Liste der Schlüsselkomponenten mit konkreten Part-Vorschlägen. D
| Kategorie | Bauteil/Funktion | Vorschlag | Alternativen | Anmerkung |
| :--- | :--- | :--- | :--- | :--- |
| **MCU** | Mikrocontroller | nRF52840 | — | Zephyr-Support, BLE+Thread |
| **Energie** | 2S-Akku | Li-Po 7.4V, 10002000 mAh | — | Kapazität je nach Gerät |
| **Energie** | 2S-Akku | Li-Po 7.4V, 10002000mAh | — | Kapazität je nach Gerät |
| | Zellenschutz | HY2120-CB + FS8205A | DW01A + 8205A | OV/UV/OC-Protection |
| | Lade-IC | IP2326 (2S Balancing) | TP4056 (nur 1S) | USB-C, Balancing integriert |
| | Buck 5V | MP2315, TPS62130 | — | 1.5 A, >1 MHz Schaltfrequenz |
| | Buck 5V | MP2315, TPS62130 | — | 1.5A, >1MHz Schaltfrequenz |
| | LDO 3.3V | MCP1826, AMS1117-3.3 | XC6206P332MR | Low-Noise für RF, < 0.5V Dropout |
| **IR** | IR-LED | SFH 4550, Oslon Black | TSAL6400 | 940 nm, >50 m Reichweite |
| | IR-Empfänger | TSOP4838, TSOP38438 | VS1838B | 38 kHz Demodulator, 5V Supply |
| **IR** | IR-LED | SFH 4550, Oslon Black | TSAL6400 | 940 nm, >50m Reichweite |
| | IR-Empfänger | TSOP4838, TSOP38438 | VS1838B | 38kHz Demodulator, 5V Supply |
| | LED-Treiber | PNP/NPN diskret | IRL530 (Logic-FET) | Konstantstrom, PWM-fähig |
| | Level-Shifter IR | AO4300A (N-Ch MOSFET) | BSS138, 2N7002 | 5V → 3.3V, invertierend |
| **LED** | Adressierbare | WS2812B (5050) | SK6812, APA102 | 5V, ~60 mA/LED @ weiß |
| **LED** | Adressierbare | WS2812B (5050) | SK6812, APA102 | 5V, ~60mA/LED @ weiß |
| | Level-Shift | SN74AHCT1G125 | 74HCT245 (8-Kanal) | 3.3V → 5V, single-gate |
| **Audio** | Class-D Amp | MAX98357A | PAM8302, TPA2005D1 | I2S, 3.2W @ 4Ω |
| | Speaker | 4Ω, 35W | 8Ω (lower SPL) | Outdoor-tauglich |
| **Speicher** | QSPI Flash | W25Q128JV (16 MB) | GD25Q16C (2 MB) | NOR-Flash, 3.3V |
| **Speicher** | QSPI Flash | W25Q128JV (16MB) | GD25Q16C (2MB) | NOR-Flash, 3.3V |
| **Feedback** | Solenoid | 6V Open Frame | — | Rückstoss direkt ab Batterie |
| | Muzzle LED | Weiß/Gelb, 1W+ | Cree XP-E2 | Sichtbar bei Tag |
| **Passiv** | $R_{\text{set}}$ (IR) | 0.221.3 Ω, 3W | Metallschicht, Draht | Impulsfest |
| **Passiv** | $R_{\text{set}}$ (IR) | 0.221.3Ω, 3W | Metallschicht, Draht | Impulsfest |
| | Spannungsteiler | 100k + 47k, 1% | 0.1% für Präzision | Fuel Gauge |
| **Mechanik** | Stecker | JST-XH (2.54mm) | Molex PicoBlade | Verriegelnd, 35 Pole |
| | Taster | Omron B3F, Alps SKQG | Cherry MX (größer) | Trigger, Reload |
@@ -292,7 +292,26 @@ Konsolidierte Liste der Schlüsselkomponenten mit konkreten Part-Vorschlägen. D
- **IR-LED:** Oslon Black für extreme Reichweite (3A-Betrieb), SFH 4550 für Standard (12A).
- **Audio:** MAX98357A ist quasi-Standard; Alternativen (PAM8302) haben höheren THD, aber OK für SFX.
- **Flash:** 16 MB erlauben ~6 min Audio @ 22 kHz gut für zukünftige Erweiterungen (z.B. mehrsprachige Ansagen).
- **Flash:** 16MB erlauben ~6min Audio @ 22kHz gut für zukünftige Erweiterungen (z.B. mehrsprachige Ansagen).
- **Stecker:** JST-XH ist weit verbreitet und günstig; Molex PicoBlade kompakter, aber teurer.
### 5.1 IR-LEDs
| Typ | Leistung |Bemerkungen |
|-----|----------|------------|
| **SFH 4725S** | 3W | Standardmodell für 940nm<br>**Vorteile:** Sehr bewährt, gute Effizienz |
| **SFH 4726S** | 3W | Ähnlich wie die 4725S, aber oft mit einer leicht anderen internen Linsencharakteristik (breiterer Abstrahlwinkel ohne externe Optik). |
| **SFH 4727AS** | 5W | Das 940-nm-Gegenstück zu deiner 4715AS. <br>**Vorteil:** Für deine 3-A-Pulse im Outdoor-Modus die stabilste Wahl. Sie verträgt die hohen Pulsströme thermisch am besten.|
|**SFH 4725AS**| 3W | Eine neuere "A"-Revision mit verbesserter Wärmeableitung.|
Es wird empfohlen, entsprechende "STAR"-Aluplatinen zu verwenden, um die Wärmeableitung zu garantieren.
### IR-Empfänger
| Typ | Bemerkungen |
|-----|------------|
| **TSOP34456 / TSOP38456** | Der Standard für 56kHz.<br>**Charakteristik**: Besitzt eine sehr agressive **AGC (Automatic Gain Controll)**<br>**Problem:** Bei extrem starken Signalen im Nahbereich kann die AGC "zumachen" und die Hüllkurve verzerren. |
| **TSSP4056 / TSSP77056** | **Vorteil:** Er hat eine **feste Verstärkung (Fixed Gain)**. Er regelt also nicht ab, wenn das Signal stark wird.<br>**Nutzen:** Das Signal bleibt viel konstanter als bei bei einem TSOP.|
*Stand: 04.01.2026*

View File

@@ -116,9 +116,9 @@ sequenceDiagram
7. *(Optional)* Weste B sendet UDP-Paket an Leader für Live-Scoreboard (Best Effort).
!!! info "Warum kein MilesTag2?"
MilesTag2 wurde als Basis erwogen, ist aber mit ~40 ms Frame-Zeit und starren 8-Bit-IDs zu langsam und unflexibel. Unser Custom-Protokoll bietet:
MilesTag2 wurde als Basis erwogen, ist aber mit ~40ms Frame-Zeit und starren 8-Bit-IDs zu langsam und unflexibel. Unser Custom-Protokoll bietet:
- **Kürzere Frames:** ~36 ms vs. ~40 ms (weniger anfällig für Zittern/Bewegung)
- **Kürzere Frames:** ~36ms vs. ~40ms (weniger anfällig für Zittern/Bewegung)
- **Flexible Type-Codes:** Hit/Heal/PowerUp/Admin in einem Format
- **CRC8-Prüfung:** >99.5% Fehlerrate-Erkennung bei Sonnenlicht
- **Variable Daten:** 13-Bit-Payload anpassbar pro Type
@@ -219,7 +219,7 @@ Die Logik für die Modi wird primär auf den Westen implementiert (Regelwerk), g
* **Medipacks (Objekte):** Aktiv durch Tastendruck; senden erst nach Button-Press ein Heal-IR mit breiter Streuung.
* **Wirkung:**
* Heal-IR ist als eigene Damage-Class kodiert (negativer Schaden → Heilung).
* Reichweite absichtlich klein (< 23 m) und stark gestreut, damit Heilen ein Positionierungs-Feature bleibt.
* Reichweite absichtlich klein (< 23m) und stark gestreut, damit Heilen ein Positionierungs-Feature bleibt.
* Treffer-Logik auf der Weste interpretiert diese Pakete als Heilung (+HP, begrenzt durch `health_max`).
* **Balancing:**
* Heal pro Tick konfigurierbar; zusätzlich wählbar: max. Anzahl Heilungen, Mindest-Pause zwischen Heilungen oder beides.
@@ -238,7 +238,7 @@ Die Logik für die Modi wird primär auf den Westen implementiert (Regelwerk), g
* `foe`: HP-Delta für andere Teams (-10 Schaden)
* `rssi`: Mindest-RSSI (dBm) für Wirksamkeit (z.B. -70 → nur nahe dran)
* `warn`: Anzahl Aussendungen als Warnung, bevor der Effekt scharf wird
* **Instant-Death Beispiel:** `team: 0, friend: -128, foe: -128, warn: 0, rssi: -60` → Jeder Empfänger mit RSSI besser als -60 dBm fällt sofort auf 0 HP.
* **Instant-Death Beispiel:** `team: 0, friend: -128, foe: -128, warn: 0, rssi: -60` → Jeder Empfänger mit RSSI besser als -60dBm fällt sofort auf 0 HP.
---
@@ -309,7 +309,7 @@ struct zone_effect_packet {
uint8_t team_id; // Besitzer der Zone (0=neutral)
int8_t friend_delta; // HP-Delta für eigenes Team (z.B. +20 Heal)
int8_t foe_delta; // HP-Delta für andere Teams (z.B. -10 Schaden)
int8_t rssi_thresh_dbm; // Mindest-RSSI für Wirksamkeit (z.B. -70 dBm)
int8_t rssi_thresh_dbm; // Mindest-RSSI für Wirksamkeit (z.B. -70dBm)
uint8_t warn_count; // Anzahl Warn-Pakete vor scharfem Effekt
} __packed;
@@ -389,7 +389,7 @@ Payloads von Power-Up-Stationen und Buzzer-Boxen (Protokoll-ID `0xBB`):
| Von | Nach | Auslöser | Aktion | Bedingung |
| :--- | :--- | :--- | :--- | :--- |
| Idle | Lobby | CoAP `GAME_STATE_LOBBY` | LED idle-Animation, warten auf Start | Multicast vom Leader |
| Lobby | Countdown | CoAP `GAME_START_COUNTDOWN` | Audio-Countdown 10→1 sec, Countdown-Timer init | Payload: 10 sek |
| Lobby | Countdown | CoAP `GAME_START_COUNTDOWN` | Audio-Countdown 10→1sec, Countdown-Timer init | Payload: 10 sek |
| Countdown | Running | Countdown = 0 | Health reset, Treffer-Sensor aktivieren, Waffe unlock | Timer lokal abgelaufen |
| Running | Dead | Health <= 0 | LED rot/aus, Dead-Sound, CoAP CMD_DISABLE an Waffe | Nach IR-Hit-Verarbeitung |
| Dead | Running | Respawn-Timer = 0 | Health reset, CoAP CMD_ENABLE an Waffe, Sensor on | Optional; Config-abhängig |

View File

@@ -39,7 +39,7 @@ Diese Roadmap führt vom nRF52840DK bis zum fertigen Produkt.
- [ ] Zephyr Setup: Installation des nRF Connect SDK (NCS) und VS Code.
- [ ] Custom Board Definition: Board-File anlegen, das die Pins des nRF52840DK auf die geplanten Funktionen mappt (PWM für IR, GPIO für Buttons).
- [ ] Thread Mesh: Minimalen OpenThread-Stack aufsetzen. Ein DK als Leader (FTD), einer als Child. UDP/CoAP-Ping bei Knopfdruck.
- [ ] IR-Engine: Custom IR-Protokoll (pulse-distance, 38 kHz) mit nrfx_pwm + PPI implementieren. Signal mit Oszilloskop/Logic Analyzer verifizieren. Sicherstellen, dass Funk die IR-Engine nicht stört. **Hinweis:** MilesTag2 wurde verworfen zugunsten eines eigenen, kürzeren Protokolls mit CRC8 (siehe [Spezifikationen](specifications/ir_protocol.md)).
- [ ] IR-Engine: Custom IR-Protokoll (pulse-distance, 38kHz) mit nrfx_pwm + PPI implementieren. Signal mit Oszilloskop/Logic Analyzer verifizieren. Sicherstellen, dass Funk die IR-Engine nicht stört. **Hinweis:** MilesTag2 wurde verworfen zugunsten eines eigenen, kürzeren Protokolls mit CRC8 (siehe [Spezifikationen](specifications/ir_protocol.md)).
#### Phase 2: Der "Prototyp" (Integration)
**Ziel:** Einbindung von Audio und Solenoid.

View File

@@ -2,78 +2,63 @@
## Übersicht
Das Infrarot-Kommunikationsprotokoll basiert auf Pulse-Distance-Codierung mit 38 kHz Träger und ist ähnlich Sony SIRC, aber optimiert für die Anforderungen des Lasertag-Systems. Das Protokoll bietet robuste Übertragung mit CRC-Fehlerprüfung und kurzen Frame-Zeiten (~36 ms).
Das Infrarot-Kommunikationsprotokoll basiert auf Pulse-Distance-Codierung mit 38kHz Träger und ist ähnlich Sony SIRC, aber optimiert für die Anforderungen des Lasertag-Systems. Das Protokoll bietet robuste Übertragung mit CRC-Fehlerprüfung und kurzen Frame-Zeiten (~36ms).
## Physikalische Schicht
| Parameter | Wert | Anmerkung |
|-----------|------|----------|
| Trägerfrequenz | 38 kHz | Standard für TSOP48xx Empfänger |
| Trägerfrequenz | 38kHz | Standard für TSOP48xx Empfänger |
| Tastgrad (Duty Cycle) | 50 % | Konfigurierbar (2575 %) |
| Modulation | PWM mit Pulse-Distance-Codierung | Hardware-basiert via nRF52 PWM-Peripheral |
| Empfänger | TSOP4838 (kompatibel) | Active-Low Ausgang, 38 kHz Bandpass |
| Empfänger | TSOP4838 (kompatibel) | Active-Low Ausgang, 38kHz Bandpass |
## Timing-Spezifikation
| Symbol | Dauer | Toleranz | Beschreibung |
|--------|-------|----------|-------------|
| **Start Burst** | 2400 µs | ±200 µs | Frame-Synchronisations-Impuls |
| **Mark** | 600 µs | ±100 µs | Träger AN (konstant für alle Bits) |
| **Space 0** | 600 µs | ±100 µs | Träger AUS für logisch 0 |
| **Space 1** | 1200 µs | ±150 µs | Träger AUS für logisch 1 |
| **Start Burst** | 4 × Basistakt (Standard 2400µs) | ±200µs | Träger AN, Frame-Synchronisations-Impuls |
| **Gap** | 1 × Basistakt (Standard 600µs) | ±100µs | Träger AUS nach Start (optional, konfigurierbar) |
| **Mark** | 1 × Basistakt (Standard 600µs) | ±100µs | Träger AN (konstant für alle Bits) |
| **Space 0** | 1 × Basistakt (Standard 600µs) | ±100µs | Träger AUS für logisch 0 |
| **Space 1** | 2 × Basistakt (Standard 1200µs) | ±150µs | Träger AUS für logisch 1 |
**Basistakt:** `CONFIG_IR_PROTO_BASE_US` (Standard 600µs). Alle Zeiten ergeben sich daraus per Multiplikatoren (`IR_PROTO_*_MULT`).
### Bit-Codierung
```
Bit 0: [Mark 600µs] + [Space 600µs] = 1.2 ms
Bit 1: [Mark 600µs] + [Space 1.2ms] = 1.8 ms
Bit 0: [Mark 600µs] + [Space 600µs] = 1.2ms
Bit 1: [Mark 600µs] + [Space 1.2ms] = 1.8ms
```
### Beispiel-Wellenform (3 Bits: `101`)
### Beispiel-Wellenform (3Bits: `101`)
**Träger-Timing für Bits 1-0-1:**
| Segment | Dauer | State | Bit-Wert |
|---------|-------|-------|---------|
| Mark | 600 µs | AN | |
| Space 1 | 1200 µs | AUS | **1** (1.8 ms total) |
| Mark | 600 µs | AN | |
| Space 0| 600 µs | AUS | **0** (1.2 ms total) |
| Mark | 600 µs | AN | |
| Space 1| 1200 µs | AUS | **1** (1.8 ms total) |
```mermaid
block-beta
columns 8
mark1["Mark<br>600 µs"] space1["Space 1<br>1200 µs"]:2 mark2["Mark<br>600 µs"] space2["Space 0<br>600 µs"] mark3["Mark<br>600 µs"] space3["Space 1<br>1200 µs"]:2
bit1["<b>1</b>"]:3 bit2["<b>0</b>"]:2 bit3["<b>1</b>"]:3
style space1 fill:none
style space2 fill:none
style space3 fill:none
```
| Mark | 600µs | AN | |
| Space 1 | 1200µs | AUS | **1** (1.8ms total) |
| Mark | 600µs | AN | |
| Space 0 | 600µs | AUS | **0** (1.2ms total) |
| Mark | 600µs | AN | |
| Space 1 | 1200µs | AUS | **1** (1.8ms total) |
## Frame-Format
Alle Frames bestehen aus 24 Bits, übertragen MSB-first:
Alle Frames bestehen aus 24Bits, übertragen MSB-first:
| Feld | Start Burst | Type | Data | CRC8 |
|------|-------------|------|------|------|
| **Dauer** | 2400 µs | 3 Bits | 13 Bits | 8 Bits |
| **Funktion** | Synchronisation | Frame-Typ | Payload | Fehlerprüfung |
| **Summe** | | | | **24 Bits** |
```mermaid
packet-beta
title Frame
+3: "Typ"
+13: "Payload"
+8: "Fehlerprüfung"
```
| Feld | Start Burst + Gap | Type | Data | CRC8 |
|------|-------------------|------|------|------|
| **Dauer** | (Start: 4× Basis) + (Gap: 1× Basis) | 3Bits | 13Bits | 8Bits |
| **Funktion** | Synchronisation | Frame-Typ | Payload | Fehlerprüfung |
| **Summe** | | | | **24Bits** |
**Gesamte Frame-Zeit:** ~36 ms (Start + 24 × 1.5 ms durchschnittliche Bit-Zeit)
**Gesamte Frame-Zeit:** ~39ms bei Standardwerten (Start 2400µs + Gap 600µs + 24 × 1.5ms Bit-Durchschnitt). Mit angepasstem Basistakt/Multi skaliert alles linear.
### Type-Feld (3 Bits)
### Type-Feld (3Bits)
| Wert | Typ | Beschreibung |
|------|-----|-------------|
@@ -83,7 +68,7 @@ title Frame
| `011` | Admin | System-Steuerbefehle |
| `100``111` | Reserviert | Zukünftige Nutzung |
### Data-Feld (13 Bits) Type-abhängig
### Data-Feld (13Bits) Type-abhängig
#### Hit-Frame (`000`)
@@ -112,12 +97,12 @@ title Frame
|-----------|------|-------------|-------------|
| 012 | Command Data | 08191 | Implementierungsdefinierte Steuerbefehle |
### CRC-Feld (8 Bits)
### CRC-Feld (8Bits)
- **Algorithmus:** CRC-8-CCITT
- **Polynom:** 0x07 (x⁸ + x² + x + 1)
- **Initialwert:** 0x00
- **Eingabe:** Type (3 Bits) + Data (13 Bits) = 16 Bits
- **Eingabe:** Type (3Bits) + Data (13Bits) = 16Bits
- **Zweck:** Fehlererkennung bei Bitfehlern durch Umgebungslicht oder Interferenzen
**Erwartete Fehlererkennungsrate:** >99.5 % für Einfach- oder Doppelbitfehler
@@ -131,7 +116,7 @@ Type: 000 (Hit)
Data: 00101010 01010 (ShooterID=42, Damage=10)
CRC8: [berechnet aus obigen Daten]
Kompletter Frame (24 Bits):
Kompletter Frame (24Bits):
000 00101010 01010 CCCCCCCC
│ │ │ └─ CRC8
│ │ └─ Damage (10)
@@ -141,10 +126,10 @@ Kompletter Frame (24 Bits):
**Übertragungsabfolge:**
1. Start Burst: 2400 µs Träger AN
2. Bit 0 (Type): 600 µs Mark + 600 µs Space
3. Bit 1 (Type): 600 µs Mark + 600 µs Space
4. Bit 2 (Type): 600 µs Mark + 600 µs Space
1. Start Burst: 2400µs Träger AN
2. Bit 0 (Type): 600µs Mark + 600µs Space
3. Bit 1 (Type): 600µs Mark + 600µs Space
4. Bit 2 (Type): 600µs Mark + 600µs Space
5. ... (21 weitere Bits)
6. Ende: Träger AUS
@@ -158,9 +143,9 @@ Kompletter Frame (24 Bits):
### Software-State-Machine
1. **IDLE:** Auf Start Burst warten (20002800 µs)
1. **IDLE:** Auf Start Burst warten (20002800µs)
2. **SYNC:** Start Burst erkannt, Vorbereitung zur Bit-Empfang
3. **DATA:** Space nach jedem Mark messen, 24 Bits dekodieren
3. **DATA:** Space nach jedem Mark messen, 24Bits dekodieren
4. **VALIDATE:** CRC prüfen, Frame bei Gültigkeit verarbeiten
### Timing-Toleranzen
@@ -173,12 +158,14 @@ Kompletter Frame (24 Bits):
Die Protokoll-Timing kann via Kconfig für verschiedene Umgebungen angepasst werden:
- `CONFIG_IR_SEND_CARRIER_HZ`: Trägerfrequenz (3045 kHz)
- `CONFIG_IR_SEND_CARRIER_HZ`: Trägerfrequenz (3045kHz)
- `CONFIG_IR_SEND_DUTY_CYCLE_PERCENT`: PWM Tastgrad (2575 %)
- `CONFIG_IR_SEND_MARK_US`: Mark-Dauer (3001000 µs)
- `CONFIG_IR_SEND_SPACE0_US`: Space für Bit 0 (3001000 µs)
- `CONFIG_IR_SEND_SPACE1_US`: Space für Bit 1 (8002000 µs)
- `CONFIG_IR_SEND_START_BURST_US`: Start Burst (15004000 µs)
- `CONFIG_IR_PROTO_BASE_US`: Basistakt (3001000µs)
- `CONFIG_IR_PROTO_START_MULT`: Startburst-Faktor (28)
- `CONFIG_IR_PROTO_GAP_MULT`: Gap-Faktor (04; 0 = kein Gap)
- `CONFIG_IR_PROTO_MARK_MULT`: Mark-Faktor (12)
- `CONFIG_IR_PROTO_SPACE0_MULT`: Space0-Faktor (13)
- `CONFIG_IR_PROTO_SPACE1_MULT`: Space1-Faktor (14)
Die Standardwerte folgen Sony SIRC Timing-Konventionen für bewährte Zuverlässigkeit.
@@ -186,12 +173,12 @@ Die Standardwerte folgen Sony SIRC Timing-Konventionen für bewährte Zuverläss
| Metrik | Wert |
|--------|------|
| Frame-Zeit | ~36 ms |
| Datenrate | ~670 bit/s |
| Frame-Zeit | ~39ms |
| Datenrate | ~410bit/s |
| Max. Spieler-IDs | 256 |
| Reichweite (Außen) | ~50100 m (abhängig von Sender-Leistung und Umgebungslicht) |
| Reichweite (Außen) | ~50100m (abhängig von Sender-Leistung und Umgebungslicht) |
| Fehler-Erkennung | >99.5 % via CRC-8 |
| Störfestigkeit | Hoch (Hardware-Bandpass 38 kHz) |
| Störfestigkeit | Hoch (Hardware-Bandpass 38kHz) |
---