LZ Camera Bridge docs/ptz-pult-hardware.md

Eigenes PTZ-Pult — Stueckliste

Ein Bedienpult fuer die LZ Camera Bridge: Joystick in der Art des DigitalBird PTZplus, aber mit einem eingebauten Stream Deck und ohne die Schwaechen, die sich an der DigitalBird-Firmware ablesen lassen.

Was dieses Dokument ist: eine Kaufliste mit Begruendung je Posten und die Verdrahtung dazu. Was es nicht ist: ein geprueftes Design. Nichts davon stand bisher auf einem Tisch. Preise sind Richtwerte (netto, Stand 2026-09) und gehoeren vor der Bestellung nachgesehen; bei den Joysticks sind es Familien-Namen und keine Bestellnummern.

1. Der Befund am Vorbild

Gelesen wurde DB-PTZplusESP32-v7.00.ino und DB3_VISCA_Decoder_v6_02.ino aus digitalbird01/DigitalBird-Camera-Slider. Woertlich aus dem Quelltext:

const int panS_PIN = 34;    // Pan Joy      -> analogRead(), ESP32-ADC, 12 bit
const int tiltS_PIN = 32;   // Tilt Joy
const int slidS_PIN = 35;   // Slider joy
const int focusS_PIN = 39;  // Focus joy
const int zoomS_PIN = 36;   // Zoom joy
const int masterA_PIN = 33; // Master pot

Daraus folgen vier Schwaechen, und die vier sind die ganze Begruendung fuer diese Liste:

  1. Fuenf getrennte Analogachsen am ESP32-ADC. Der ESP32-ADC ist nichtlinear und rauscht; die Firmware mittelt deshalb in Schleifen (temp_pan += analogRead(panS_PIN)). Gemittelt wird Rauschen, nicht behoben. Bei einer langsamen Live-Fahrt ist genau das der Ruckler.
  2. Zoom und Fokus liegen auf eigenen Joysticks, nicht in der Hand, die schwenkt. Jedes echte PTZ-Pult (AW-RP150, PT-JOY) legt Zoom auf den Drehgriff derselben Achse.
  3. Funk als Normalfall (ESP-NOW/WLAN zwischen Pult und Kopf). Im Hallen-WLAN ist das der Ausfall, den keiner nachstellen kann.
  4. Keine Rueckmeldung am Bedienelement. Das Nextion-Display zeigt, was das Pult glaubt; welche Kamera on air ist, weiss es nicht.

Dazu kommt, was das Pult grundsaetzlich nicht kann: es spricht das DigitalBird-eigene Funkprotokoll und damit nur DigitalBird-Koepfe. Die Bridge spricht 15 Wege (Sony CCU, Canon CCAPI, Lumix, Blackmagic, Z CAM, Panasonic AW, VISCA, JVC, BirdDog, DJI …). Ein Pult, das an der Bridge haengt, faehrt sie alle.

2. Architektur

Die Bridge hat den Eingang dafuer bereits: packages/bridge/src/input/ HidControlSurface.ts nimmt ein beliebiges USB-HID-Pult und bildet Report-Bytes datengetrieben auf RCP-Befehle ab. Das Pult muss also kein eigenes Protokoll erfinden — es muss ein HID-Geraet sein.

Das Stream Deck ist ein zweites USB-Geraet und wird nicht von der Bridge getrieben, sondern von Bitfocus Companion, fuer das in diesem Repo bereits ein Modul liegt (packages/companion-module-lz-camera-bridge). Damit sind Tastenbeschriftung, Tally-Rueckmeldung und Preset-Layout Konfiguration statt Firmware.

   [Hall-Joystick 3 Achsen]---[ADS1115 16 bit]--I2C--+
   [Encoder Fokus/Zoom]------------------------------+--[Pico 2]==USB-HID==+
   [Taster, Fader]-----------------------------------+                     |
                                                                           v
   [Stream Deck XL]======================================USB=========>[Pi 5]
   [7" DSI-Touch] <--- Web-RCP http://localhost:3700 -------------------|
                                                                        |
                                            Gigabit-Ethernet (Kabel) ---+
                                                                        v
                                   DB3-Kopf (VISCA/UDP 1259), ATEM, andere Kameras

Variante A (empfohlen): Rechner im Pult. Pi 5 im Gehaeuse, laeuft Bridge + Companion. Ein Netzwerkkabel raus, sonst nichts. Das Pult ist ein Geraet.

Variante B: Pult am Laptop. Nur Pico + Stream Deck im Gehaeuse, beide per USB an den Rechner, auf dem die Desktop-App ohnehin laeuft. Spart rund 200 EUR und den halben Aufbau — kostet aber, dass ohne diesen Laptop nichts geht.

3. Stueckliste Variante A

3.1 Rechner und Bedienflaeche

# Teil Menge ca. EUR Warum genau das
1 Raspberry Pi 5, 4 GB 1 65 Bridge (Node) und Companion laufen beide arm64. 4 GB reichen; 8 GB nur, wenn zusaetzlich OBS o. ae. drauf soll.
2 Aktivkuehler fuer Pi 5 1 6 Pflicht, nicht optional — ein gedrosselter Pi bedient sich zaeh.
3 NVMe-HAT + 256 GB NVMe 1 45 SD-Karten sterben an Dauerbetrieb. Wer spart: A2-SD-Karte 32 GB fuer 10 EUR und alle drei Monate ein Image.
4 Netzteil USB-C PD 27 W (offiziell) 1 14 Nur mit diesem Netzteil gibt der Pi 5 die volle USB-Stromgrenze frei; das Stream Deck XL haengt daran.
5 Elgato Stream Deck XL (32 Tasten) 1 250 4 Kameras × 8 Presets auf einer Ebene, ohne Blaettern. Companion treibt es direkt ueber USB — die Elgato-Software wird nicht gebraucht und laeuft auf dem Pi ohnehin nicht.
6 Raspberry Pi Touch Display 2 (7", DSI) 1 70 Zeigt das Web-RCP der Bridge (:3700) im Kiosk. Damit ist die Pult-Oberflaeche dieselbe wie auf dem Desktop — kein zweites UI wie DigitalBirds Nextion-.tft.

Statt Pos. 5 denkbar: Stream Deck + (Plus) mit 8 Tasten und 4 Drehgebern (~230 EUR). Die Drehgeber koennen Fokus/Iris/Weissabgleich uebernehmen und sparen die Encoder aus 3.3 — dafuer fehlen die Preset-Tasten. Beides zusammen ist die Vollausbau-Variante und kostet ~480 EUR.

3.2 Joystick — die eine Entscheidung, die das Pult ausmacht

Drei Klassen. Der Unterschied ist nicht die Genauigkeit auf dem Papier, sondern ob das Ding nach zwei Jahren Tourbetrieb in der Mitte noch Ruhe gibt.

Klasse Typ ca. EUR Beurteilung
Sparsam 3-Achsen-PTZ-Joystick-Modul aus dem Kamera-Zubehoer (Poti, Zoom per Drehgriff) 40–90 Genau die Bauart, die DigitalBird verwendet, aber wenigstens alle drei Achsen in einer Hand. Potis verschleissen, die Mittelstellung wandert.
Empfohlen Hall-Effekt-Joystick, 3 Achsen mit Drehgriff — APEM HF-Serie oder CH Products HFX 250–450 Kontaktlos, kein Verschleiss, ratiometrisch 0,5–4,5 V. Das ist die Bauart, die in Industriepulten 10 Jahre haelt. Bestellnummer vor dem Kauf pruefen, die Serien haben viele Varianten (Achszahl, Federrate, Griffform).
Kompromiss APEM Ruffy RF (2 Achsen, Hall, Fingertip) + separater Encoder fuer Zoom 60–90 Kontaktlos zum kleinen Preis, aber Zoom wandert wieder aus der Schwenkhand.

Empfehlung: Hall, 3 Achsen, Drehgriff. Der Preisunterschied ist einmalig, das Zittern eines Potis begleitet einen bei jeder Probe.

3.2.1 Der Gamepad-Weg — und warum er trotzdem der erste Schritt ist

Ein Spiele-Controller ist ein USB-HID-Geraet mit zwei Analogsticks und zwei Analogtriggern. Er faellt damit in denselben HidControlSurface-Adapter wie alles andere in diesem Dokument. Der Unterschied zwischen den beiden Lagern ist aber nicht kosmetisch:

PlayStation (DualSense / DualShock 4) Xbox (Series / One)
Am USB Standard-HID. Meldet Achsen und Trigger in einem festen Report, node-hid liest ihn direkt. Kein Standard-HID. Microsoft fuehrt das GIP/XInput-Protokoll; unter Linux nimmt der xpad-Treiber das Geraet weg und gibt es als evdev aus, nicht als brauchbares hidraw.
Ueber Bluetooth HID, anderer Report als am Kabel HID — hier geht es, weil die BT-Firmware einen Gamepad-Descriptor mitbringt
Urteil nimm den nur ueber Bluetooth oder ueber einen zweiten Adapter auf evdev

Praktisch heisst das: ein DualSense am Kabel ist der kuerzeste Weg zu einem fahrenden Kopf. Kosten 0 EUR, wenn einer da ist, sonst rund 70.

Was ein Gamepad kann, und das ist mehr, als man erwartet:

Warum es trotzdem nicht das Endergebnis ist, und diese drei Gruende sind koerperlich und nicht elektrisch:

  1. Der Weg ist zu kurz. Ein Gamepad-Stick hat rund 8 mm Auslenkung, ein PTZ-Joystick gut das Dreifache. Die langsame Fahrt lebt vom Weg, nicht von der Zahl der Stufen.
  2. Die Feder ist falsch. Ein Gamepad zentriert schnell und hart, weil es fuer Zielen gebaut ist. Einen Schwenk ueber acht Sekunden haelt man damit nicht ruhig.
  3. Stick-Drift. Die Sticks sind Potis und das bekannte Verschleissteil der Bauart. Es gibt Hall-Ersatzmodule (GuliKit u. ae., ~25 EUR das Paar), die genau das beheben — ein billiger Test, ob Hall den Unterschied macht, den dieses Dokument behauptet.

Empfohlene Reihenfolge: Gamepad zuerst. Erst wenn Pan/Tilt/Zoom damit sauber fahren, ist die Frage nach dem 400-EUR-Joystick ueberhaupt zu beantworten — und dann beantwortet sie die Hand und nicht das Datenblatt. Der Adapter dafuer steht (Abschnitt 6); was am Geraet noch zu bestaetigen ist, steht in 6.3.

Eines dabei im Blick behalten: Companion sieht ein Gamepad nicht. Es treibt Stream Decks und Satellite-Flaechen, kein HID-Gamepad. Der Controller haengt also am Bridge-Eingang, das Stream Deck an Companion. Zwei Wege, mit Absicht.

3.3 Achsen-Erfassung und Bedienelemente

# Teil Menge ca. EUR Warum
7 Raspberry Pi Pico 2 (RP2350) 1 8 Meldet sich als USB-HID-Geraet. TinyUSB ist ausgereift; ein ESP32 haette hier nichts besser gemacht.
8 ADS1115 Breakout (16 bit, 4 Kanal, I2C) 2 2 × 5 Der Kern des Ganzen. 16 bit statt der 12 des ESP32, echte Referenz, PGA. Acht Kanaele: Pan, Tilt, Zoom-Twist, Master-Speed, Iris-Fader, drei frei.
9 Pegelwandler I2C (TXS0102 o. ae.) 1 3 Der Hall-Joystick will 5 V, der Pico 3,3 V. ADS1115 laeuft an 5 V, I2C wird gewandelt. Alternative ohne Wandler: ADS an 3,3 V und je Achse ein 2:1-Teiler — kostet die halbe Spanne, bei 16 bit verkraftbar.
10 Drehgeber Fokus, optisch/industriell 600 P/U, 5 V 1 20–35 Fokus braucht Aufloesung und Gleichlauf, kein Rasten. DigitalBird nimmt dafuer ein Poti; das ist der Grund, warum man dort nicht sauber nachziehen kann.
11 Drehgeber Bourns PEC11R, 24 Rasten, mit Taster 2 2 × 3 Kamera-Wahl und Menue. Rasten sind hier richtig: man zaehlt Klicks, ohne hinzusehen.
12 Drehknoepfe, 6 mm, Alu 3 3 × 6 Gewicht am Fokusknopf ist kein Luxus, es ist die Feinfuehligkeit.
13 Fader ALPS RSA0N11M9, 100 mm, 10k 1 15 Iris/Master. Optional motorisiert (~30 EUR), dann folgt er dem Rueckkanal der Kamera — sinnvoll erst, wenn der jeweilige Weg wirklich zurueckliest.
14 Taster, beleuchtet, 16 mm, kurzhubig 6 6 × 4 Record, Home, Preset speichern, Not-Halt. Was staendig gebraucht wird, gehoert nicht auf eine Bildschirmtaste.
15 WS2812B-Tally-LEDs 4 5 Eine je Kamera, am Pico. Rueckmeldung am Pult statt nur im Bild.

3.4 Gehaeuse, Netz, Kleinteile

# Teil Menge ca. EUR Warum
16 Pultgehaeuse Alu, geneigt, ca. 300 × 200 × 80 mm (Hammond 1456-Serie o. ae.) 1 60–120 Fertig gekauft spart die Passung. Wer druckt: Unterteil FDM, Frontplatte 3 mm Alu gefraest — eine gedruckte Frontplatte biegt sich unter dem Joystick.
17 Frontplatte gefraest/graviert (Schaeffer o. ae.) 1 80–150 Der Ausschnitt fuer das Stream Deck muss sitzen. Die Aussenmasse am eigenen Geraet nachmessen, nicht dem Datenblatt glauben.
18 USB-Einbaubuchsen + kurze Kabel (A auf C, gewinkelt) 3 15 Stream Deck und Pico werden intern verkabelt; eine Buchse nach aussen fuer Service.
19 RJ45-Einbaukupplung Cat6 + Patchkabel intern 1 12 Kabel, kein WLAN. Das ist der dritte Befund aus Abschnitt 1.
20 Kleinteile: Kabel, Schrumpfschlauch, Abstandsbolzen, Schrauben — 30 —
21 Optional: PoE-HAT fuer Pi 5 1 25 Ein Kabel statt zwei. Mechanik mit Aktivkuehler und NVMe-HAT vorher pruefen — die drei streiten sich um denselben Platz.

3.5 Summe

Ausbau ca. EUR
Erprobung (Gamepad am vorhandenen Rechner, siehe 3.2.1) 0–70
Sparsam (Poti-Joystick, SD statt NVMe, gedrucktes Gehaeuse, Stream Deck MK.2) 550–650
Empfohlen (Hall-Joystick 3 Achsen, NVMe, Alu-Pult, Stream Deck XL) 1.050–1.300
Vollausbau (zusaetzlich Stream Deck +, motorisierter Fader, PoE) 1.400–1.700

Zum Vergleich: ein Panasonic AW-RP60 liegt bei rund 3.000 EUR und spricht nur Panasonic; ein PTZOptics PT-JOY bei rund 500 EUR und spricht nur VISCA.

4. Variante B (Pult am Laptop)

Entfallen: Pos. 1–4, 6, 21. Bleibt: Stream Deck, Pico, ADS1115, Joystick, Bedienelemente, Gehaeuse. Summe ca. 700–900 EUR im empfohlenen Ausbau. Companion und Bridge laufen dann auf dem Rechner, der ohnehin dasteht.

Der Preis dafuer ist nicht das Geld: ein Pult, das ohne einen bestimmten Laptop nichts tut, ist im Aufbau das erste, was fehlt.

5. Verdrahtung in Stichworten

6. Der Stand in der Software

6.1 Erledigt

Die drei Luecken, die hier als offen standen, sind zu. Alle drei lagen in HidControlSurface.ts, und alle drei sind mit Tests belegt (test/gamepadBindungen.test.ts):

  1. Zweiseitige Achsen. Eine Bindung mit centre gibt -span … +span aus statt 0 … span. group buendelt zwei Achsen in EINEN Befehl — ptz bekommt pan und tilt zusammen, statt als zwei Fahrten, von denen die zweite die erste aufhebt.
  2. Totband. deadband gibt die Ruhelage zurueck, step haelt das Zittern eines gehaltenen Sticks von der Leitung fern. Die Ruhelage selbst geht immer durch, sobald die Achse sie ERREICHT: ein verschluckter Stopp liesse den Kopf weiterfahren. Sie geht aber nicht bei jedem Report erneut durch, sonst schickte ein Pult, das niemand anfasst, einen Stopp je Report.
  3. Tasten im Bitfeld. bit waehlt die Taste im Byte, und der Merker haengt jetzt an der Bindung statt am Byte-Offset. Vier Symboltasten in einem Byte loeschen sich nicht mehr gegenseitig aus.

Dazu kam eine vierte Sache, die erst der Test zeigte: zwei Bindungen auf demselben Befehl kaempfen gegeneinander. Die beiden Trigger fahren denselben Zoom in entgegengesetzte Richtungen; als eigene Befehle schickte der eine Fahrt und der andere im selben Report den Stopp, und wer gewann, entschied die Reihenfolge in der Tabelle. Mit sum addieren sie sich zu einem Wert — und beide gedrueckt heisst jetzt Stillstand statt Zufall.

6.2 Die Belegung, die beim Einstecken greift

standardBindungen() waehlt nach Vendor/Product-ID. Ein DualSense oder DualShock 4 bekommt die Fahr-Belegung, alles Uebrige die bisherige Paint-Belegung. Das ist keine Bequemlichkeit, sondern die Sperre aus Anhang A: die alte Vorgabe legte Achse 1 und 2 auf setIris und setMasterGain, und das sind bei VISCA 9-Byte-Pakete, deren Bytes 6/7 der DB3-Decoder als Pan/Tilt-Richtung liest. Ein Stick auf setIris haette den Kopf losfahren lassen — unkontrolliert, und ohne dass am Pult etwas danach ausgesehen haette.

Bedienelement Befehl
Linker Stick ptz (pan/tilt, zusammen, mit Vorzeichen)
R2 / L2 setZoom tele / weit, addiert
Rechter Stick senkrecht setFocus
Quadrat / Kreuz / Kreis / Dreieck recallPreset 1–4
L1 autoFocus

6.3 Was weiterhin von Hand zu pruefen ist

Die Byte-Offsets sind nicht am Geraet nachgemessen. Sie sind das dokumentierte USB-Format; ueber Bluetooth liegt derselbe Controller anders, und ob node-hid die Report-ID mitliefert, haengt an der Plattform. Deshalb gibt es debug: die Bruecke schickt dann jeden Report als Hex ({ type: 'hidReport', hex }), und die Offsets sind in einer Minute ausgezaehlt. Lieber eine Tabelle, die man pruefen kann, als eine, die man glauben muss.

node-hid ist eine optionale Abhaengigkeit und ein natives Modul. Fehlt es, sagt die Bruecke es im Klartext, statt still nichts zu tun.

7. Vor dem Bestellen zu klaeren

Anhang A: Was der DB3-Kopf von unserem ViscaClient versteht

Gelesen wurde DB3/DB3_VISCA_Decoder_v6_02.ino gegen packages/bridge/src/cameras/ViscaClient.ts. Der Decoder laeuft auf einem WT32-ETH01 (PoE), lauscht UDP 1259 auf rohem VISCA ohne Sony-Kopf und gibt per UART 115200 an den Kopf weiter. Das ist genau der Vorgabe-Zweig des ViscaClient (port = 1259, Sony-Kopf erst ab 52381).

Bridge sendet DB3 macht daraus Urteil
ptz → 81 01 06 01 VV WW 0p 0q FF Paketgroesse 9 → Codes 11/12/13/21/22/23/31/32/33, Geschwindigkeit aus Byte 4/5 passt, Richtungscodes decken sich
Pan-Speed max 0x18, Tilt 0x14 Kopf rechnet mit 1…24 (Sonderfall > 20) passt
setZoom 81 01 04 07 2p/3p FF 732…739 Zoom ein, 748…756 Zoom aus, 700 Stopp passt
setFocus 81 01 04 08 2p/3p FF 832…839 / 848…855, 800 Stopp Richtung pruefen — der Decoder beschriftet 2p als Near, VISCA sagt Far
storePreset / recallPreset 04 3F 01/02 pp 41 Save Pose, 42 Move to Pose, Nummern 1…16 passt; 15 und 16 loesen A-B- bzw. Sequencer-Fahrt aus
setIris, setMasterGain (9 Byte) Decoder liest bei Groesse 9 die Bytes 6/7 als Pan/Tilt-Richtung gefaehrlich — Blendenwert 0x11 wird zu „Up Left", der Kopf faehrt los
setCameraPower 04 00 02/03 Fall 2/3 = Record Start/Stopp anders als erwartet, aber brauchbar
autoFocus, autoWhiteBalance kein Fall trifft wird verworfen

Weiteres: die IP des Decoders steht statisch im Sketch (192.168.x oder 10.x, kein DHCP), pro Kopf ein Decoder-Board, und alle Teile des DigitalBird-Systems muessen dieselbe Hauptversion tragen (heute 7.x). Der Decoder beantwortet Pan/Tilt- und Zoom-Abfragen — unser ViscaClient fragt nichts ab.

Lizenz des DigitalBird-Repos: BSD-3-Clause (Colin Henderson).