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

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