Zum Inhalt springen

Busse und Signale ​

Ein Bus ist eine vereinbarte Art, Bits zwischen Chips zu übertragen: welche Leitungen was führen, wie schnell und wer wann sprechen darf. Strido verwendet fünf: I²C für die Sensoren und den Servotreiber, USB-Seriell zwischen dem Pi und dem ESP32 (und zum LiDAR), PWM zu den Servos, SPI zum Gesichtsdisplay und CSI zur Kamera. Jeder wurde aus einem Grund gewählt, den Sie aus den Zahlen herleiten können.

In Strido

  • I²C (400 kHz) an XIAO D4 = SDA, D5 = SCL: PCA9685 0x40 (All-Call 0x70), LSM6DSOX 0x6A, INA260 0x41. Leitungen W17 (22 AWG, am XIAO gelötet, am PCA9685 gecrimpt) und W18, W19 (STEMMA-QT-Kabel, stemma_qt_female × 2).
  • USB-Seriell: Pi → XIAO USB CDC (W14, /dev/strido_mcu) und Pi → RPLIDAR-C1-USB-Adapter (W15, /dev/rplidar).
  • PWM: PCA9685 → 12 Servos, 200 Hz, 500–2500 µs; LCD-Hintergrundbeleuchtung an D2.
  • SPI: XIAO → Waveshare 2" ST7789 LCD (D8 SCK, D10 MOSI, D9 DC, D0 CS, D1 RST), W21.
  • CSI: Pi 5 CAM/DISP 0 → Camera Module 3 Wide, 22→15-Pin-FFC, 300 mm (W16).
  • Maßgebliche Quelle: hardware/electronics.yaml, firmware/strido_esp32s3/src/board_config.h, hardware/wiring.yaml (Kabel und Routen; Zuschnittliste in der Verkabelungsprüfung), docs/electronics.md (Pinbelegungen, Verkabelungsliste).

Überblick ​

BusLeitungenGeschwindigkeit in StridoTopologieVerwendet für
I²CSDA, SCL (+ 3,3 V, GND)400 kHzgemeinsam, adressiertServotreiber, IMU, Power-Monitor
USB (CDC-Seriell)D+, D−, 5 V, GNDUSB Full SpeedPunkt-zu-PunktPi ⇄ XIAO Kommandos und Zustand
UART (hinter USB-Adapter)TX, RX, GND460 800 BaudPunkt-zu-PunktRPLIDAR-C1-Scandaten
Servo-PWMein Signal pro Servo200-Hz-Rahmen, µs-Pulseine Leitung pro ServoGelenkpositionskommandos
SPISCK, MOSI, CS, DC27 MHz Schreibtakthier ein GerätLCD-Pixel
MIPI CSI-2differenzielle Lanes in einem FlachbandkabelGbit/s-KlassePunkt-zu-PunktKamerabilder

I²C: ein Leitungspaar, viele Geräte ​

I²C (Inter-Integrated Circuit) verwendet zwei Leitungen: SCL (Takt, vom Controller getrieben) und SDA (Daten, in beide Richtungen). Jedes Gerät hat eine 7-Bit-Adresse. Der XIAO beginnt jede Transaktion mit dem Senden einer Adresse, und nur das Gerät mit dieser Adresse antwortet.

Adressen in diesem Roboter ​

AdresseGerätHinweis
0x40PCA9685 ServotreiberFirmware kPcaAddress
0x70PCA9685 All-Callder PCA9685 antwortet auch hier; nichts anderes darf sie verwenden
0x6ALSM6DSOX IMUkImuAddress
0x41INA260 Power-MonitorkPowerMonitorAddress; Jumper A0 brücken

Der INA260 wird mit 0x40 ausgeliefert, derselben Adresse wie der PCA9685. Zwei Geräte an einer Adresse antworten gleichzeitig und verfälschen gegenseitig ihre Antworten. Das Brücken des Lötjumpers A0 verschiebt den INA260 auf 0x41. strido_verify.electronics prüft, dass alle Adressen eindeutig sind und die Firmware-Konstanten mit der YAML übereinstimmen.

Open Drain und Pull-ups ​

I²C-Geräte treiben eine Leitung nie auf High. Sie können sie nur auf Low ziehen (Open Drain), und Pull-up-Widerstände bringen sie auf die Versorgungsspannung zurück, wenn niemand zieht. So teilen sich mehrere Geräte eine Leitung, ohne sich gegenseitig kurzzuschließen.

Zwei Folgen:

  • Die Pull-up-Spannung bestimmt den Logikpegel. Bei Strido ist der Bus auf die 3,3 V des XIAO hochgezogen, und jedes Gerät daran wird aus dieser 3,3-V-Schiene versorgt. Die Prüfung bestätigt, dass 3,3 V im Bereich jedes Geräts liegt: PCA9685 2,3–5,5 V, LSM6DSOX-Breakout 3–5 V, INA260 2,7–5,5 V.
  • Die Widerstände und die Verkabelung bestimmen die Geschwindigkeit. Jeder Pull-up lädt die Buskapazität (Leitungen plus Pins) wieder auf High. Zu viel Kapazität oder zu schwache Pull-ups machen die steigenden Flanken langsam, und Fast-Mode-I²C mit 400 kHz hat eine strenge Grenze für die Anstiegszeit. Breakout-Boards haben meist eigene Pull-ups, die an einem gemeinsamen Bus parallel wirken. Kurze Leitungen halten die Kapazität niedrig. W17 ist die längste Strecke, 272 mm verlegt und auf 300 mm zugeschnitten; W18 und W19 sind 150-mm-STEMMA-QT-Kabel (86 mm und 125 mm verlegt).

Der Pull-up-Widerstand Rp und die Buskapazität Cb bilden ein RC-Glied. Wenn das letzte Gerät die Leitung freigibt, steigt die Spannung exponentiell in Richtung der Versorgung VDD:

V(t)=VDD(1−e−t/(RpCb))

I²C misst die Anstiegszeit tr zwischen 30 % und 70 % von VDD. Löst man V(t) für diese beiden Pegel, ergibt sich tr=RpCbln⁡(0.7/0.3)≈0.847RpCb. Die I²C-Spezifikation (NXP UM10204) erlaubt im Fast Mode höchstens 300ns und 400pF Buskapazität, daher ist der größte zulässige Pull-up

Rp,max=tr0.847Cb

Für ein angenommenes Cb=100pF (eine Veranschaulichung, keine Messung dieses Kabelbaums) sind das Rp,max≈3.5kΩ. Die Untergrenze ergibt sich aus den 3mA, die ein Gerät aufnehmen können muss, während es die Leitung unter 0.4V hält: Rp,min=(VDD−0.4V)/3mA≈0.97kΩ bei 3.3V. Pull-ups auf mehreren Breakouts addieren sich wie parallele Widerstände, 1/Rp=∑i1/Ri, weshalb zu viele Boards Rp unter dieses Minimum drücken können.

Warum 400 kHz ​

Die Taktperiode und damit die Zeit für ein Bit ist Tbit=1/fSCL; bei 400kHz sind das 2.5μs. Jedes I²C-Byte benötigt 9 Taktzyklen (8 Datenbits plus ein Acknowledge). Um einen PCA9685-Kanal zu setzen, werden die Adresse, eine Registernummer und vier Datenbytes gesendet:

tch=6×9×Tbit=54×2.5μs≈135μst12=12tch≈1.6ms(plus small overheads)

Das Auslesen der IMU und, alle 100 ms, das Auslesen des INA260 teilen sich dieselbe Regelperiode von 5 ms. Im Standard Mode mit 100 kHz würden allein die Servo-Schreibvorgänge etwa 6,5 ms dauern und die Frist verpassen. Deshalb läuft der Bus im Fast Mode, 400 kHz (kI2cHz). Diese Zahlen sind grobe Schätzungen; die genaue Anzahl hängt von der Bibliothek ab.

STEMMA QT ​

Beide Strecken zur und von der IMU verwenden ein STEMMA-QT-Kabel: den 4-poligen JST-SH-Steckverbinder von Adafruit (1 mm Raster) mit 3,3 V, GND, SDA und SCL. Er ist pinkompatibel mit Qwiic von SparkFun. Das IMU-Breakout hat zwei STEMMA-QT-Buchsen, sodass der Bus weitergeführt werden kann; jedes Kabel aus der Stückliste endet in Buchsen für eine 2,54-mm-Stiftleiste. Die IMU sitzt 2,5 mm unter der Leiterplatte des Pi, daher passen Dupont-Gehäuse nicht auf ihre Stiftleiste; der flache STEMMA-QT-Stecker schon.

Die erste Strecke hat das umgekehrte Problem. Die Pins des XIAO zeigen 9 mm unterhalb des oberen Schulterrahmens nach oben, zu wenig für ein 14 mm hohes Dupont-Gehäuse, daher wird W17 (3V3, GND, SDA, SCL, 22 AWG) an die XIAO-Pins gelötet und am PCA9685 mit Dupont-Kontakten gecrimpt (siehe Kabelmanagement). Die vollständige Kette ist:

XIAO ──W17 22 AWG (soldered / Dupont)──▶ PCA9685 (left header) ──W18 STEMMA QT──▶ LSM6DSOX ──W19 STEMMA QT──▶ INA260

USB-Seriell und UART ​

UART-Grundlagen ​

Ein UART sendet Bytes Bit für Bit über eine TX-Leitung und empfängt über eine RX-Leitung. Es gibt keine Taktleitung: Beide Seiten vereinbaren vorab eine Baudrate. Jedes Byte wird von einem Start- und einem Stoppbit eingerahmt, sodass die 8N1-Rahmung 10 Bitzeiten pro Byte kostet.

Der RPLIDAR C1 spricht 3,3-V-TTL-UART mit 460 800 Baud, 8N1:

460800bit/s10bit/byte≈46kB/s

Das reicht für 5000 Messpunkte pro Sekunde reichlich. Ein kleiner CP210x-USB-Adapter (im LiDAR-Sockel) macht aus diesem UART einen USB-Seriell-Port am Pi. Die udev-Regel benennt ihn /dev/rplidar, sodass sich der Portname zwischen Systemstarts nie ändert.

USB CDC zum XIAO ​

Der ESP32-S3 hat natives USB. Die Firmware meldet sich als serieller CDC-Port (Communications Device Class), den Linux als tty anzeigt und udev /dev/strido_mcu nennt. Über USB ist die „Baudrate“ bedeutungslos: Die Daten werden in USB-Paketen übertragen. kUsbBaud = 2000000 der Firmware wird ignoriert und nur für einen möglichen UART-Rückfall behalten.

Rahmung: COBS und CRC16 ​

Eine serielle Verbindung ist nur ein Bytestrom, daher muss der Empfänger wissen, wo eine Nachricht beginnt und ob sie unversehrt angekommen ist:

  • COBS (Consistent Overhead Byte Stuffing) schreibt jeden Rahmen so um, dass er kein 0x00-Byte enthält, und hängt dann ein 0x00 als Endmarke an. Nach einer Störung synchronisiert sich der Empfänger an der nächsten Null neu.
  • CRC16-CCITT-FALSE ist eine 16-Bit-Prüfsumme über den Rahmen. Ein Rahmen mit falscher CRC wird verworfen, statt ein Bein auf einen unsinnigen Winkel zu bewegen.

Der Datenverkehr ist gering: Eine STATE-Nutzlast umfasst 103 Byte bei 100 Hz, 103B×100Hz≈10kB/s, und ein JOINT_COMMAND trägt 12 × float32 pro Gait-Schritt.

PWM zu den Servos ​

Das Servosignal ist eine pulsweitenmodulierte Leitung: ein 3,3-V-Puls alle 5 ms (200 Hz), dessen Breite, 500–2500 µs, den Winkel codiert. Jedes Servo hat eine eigene Signalleitung von einem PCA9685-Kanal; die Masse wird über den Servo-Versorgungsbus geteilt. Details und Zahlen finden Sie unter Servos.

Die LCD-Hintergrundbeleuchtung ist eine zweite PWM-Anwendung, an XIAO D2. Hier bestimmt das Tastverhältnis D=ton/T, der Zeitanteil, in dem die Leitung High ist, die Helligkeit: Die mittlere Spannung an der LED ist V¯=DVhigh. Sie läuft mit 20 kHz (T=50μs), weit über dem, was das Auge als Flimmern wahrnimmt. D2 ist GPIO 3, ein Strapping-Pin des ESP32-S3, der beim Booten gelesen wird, um den Boot-Modus zu wählen. Die Firmware treibt ihn daher erst nach dem Booten.

SPI zum Gesichtsdisplay ​

SPI (Serial Peripheral Interface) hat einen Takt (SCK), eine Datenleitung vom Controller zum Gerät (MOSI) und einen Chip-Select (CS) pro Gerät. Es gibt keine Adressen: Wird CS auf Low gezogen, ist das Gerät ausgewählt. SPI arbeitet im Gegentakt statt mit Open Drain und läuft daher weit schneller als I²C.

Das Waveshare-2"-LCD verwendet einen ST7789-Controller mit 240 × 320 Pixeln. Ein vollständiges Bild mit 16 Bit pro Pixel umfasst:

N=240×320×16bit=1228800bittframe=NfSCK=1228800bit27×106bit/s≈45ms

Über I²C mit 400 kHz und 9 Takten pro 8-Bit-Byte würde dasselbe Bild N⋅98/400kHz≈3.5s dauern. Die Firmware schreibt mit 27 MHz, in face.cpp vermerkt als „konservativ für ~15 cm Jumperkabel“: Längere, ungeschirmte Leitungen verschleifen schnelle Flanken. Das Display braucht nur eine Richtung, daher bleibt MISO ungenutzt. Die zusätzliche DC-Leitung (Data/Command) teilt dem Controller mit, ob ein Byte ein Kommando oder Pixeldaten ist. RST setzt das Panel zurück.

CSI zur Kamera ​

Die Kamera erzeugt weit mehr Daten als jeder der obigen Busse: 12 Megapixel, 1080p50-Video. Sie verwendet MIPI CSI-2, eine schnelle serielle Schnittstelle mit differenziellen Daten-Lanes, geführt über ein flexibles Flachbandkabel (FFC) direkt zum Bildsignalprozessor des Pi.

  • Der Pi 5 hat 22-polige Kameraanschlüsse mit 0,5 mm Raster; das Camera Module 3 hat einen 15-poligen Anschluss mit 1 mm Raster. Daher das 22 → 15 Pin-Adapterkabel, 300 mm lang, durch den Flachbandschlitz der Frontschale verlegt.
  • FFCs sind empfindlich: Das Flachbandkabel wird mit der Kamera eingesetzt, kurz vor der Frontschale (Montage-Schritt 18). Vermeiden Sie scharfe Knicke, falten Sie die 124 mm Überlänge flach, und stecken Sie es mit den Metallkontakten zu den Kontakten des Steckverbinders ein.

Die Kamera hat außerdem einen eigenen kleinen Steuerbus für Fokus und Einstellungen. Dieser läuft innerhalb des CSI-Kabels zum Pi, nicht über den I²C-Bus des Roboters.

Selbsttest ​

  1. Was würde schiefgehen, wenn Sie vergessen, den Jumper A0 des INA260 zu brücken?
  2. Warum brauchen I²C-Leitungen Pull-up-Widerstände, SPI-Leitungen aber nicht?
  3. Wie lange dauert es ungefähr, alle 12 Servokanäle mit 100 kHz zu schreiben, und warum ist das wichtig?
  4. Was bewirkt das 0x00-Byte am Ende jedes USB-Rahmens?
  5. Warum verwendet die Kamera CSI statt USB oder SPI?
Antworten
  1. Der INA260 läge zusammen mit dem PCA9685 auf 0x40, und beide würden auf dieselben Transaktionen antworten und den Bus stören. Die Firmware würde dann ohne funktionierenden Power-Monitor den Betrieb verweigern.
  2. I²C-Ausgänge sind Open Drain und ziehen nur auf Low, daher muss etwas die Leitung auf High ziehen. SPI-Ausgänge treiben beide Pegel aktiv.
  3. Etwa 6,5 ms (das Vierfache der 1,6 ms bei 400 kHz), länger als die Regelperiode von 5 ms.
  4. Es markiert das Ende eines COBS-codierten Rahmens. COBS garantiert, dass innerhalb keine weitere Null vorkommt, sodass sich der Empfänger immer neu synchronisieren kann.
  5. Ihre Datenrate (12-MP-Standbilder, 1080p50-Video) erfordert eine schnelle differenzielle Verbindung direkt zum Bildprozessor des Pi; SPI ist viel zu langsam, und CSI ist die native Kameraschnittstelle des Pi.

Weiterführende Literatur ​

MIT-Lizenz. Mechanik abgeleitet von Yertle (Jerome Graves). CAD, Simulation und native Tests sind kein Hardware-Nachweis – siehe Verifikation.