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
| Bus | Leitungen | Geschwindigkeit in Strido | Topologie | Verwendet für |
|---|---|---|---|---|
| I²C | SDA, SCL (+ 3,3 V, GND) | 400 kHz | gemeinsam, adressiert | Servotreiber, IMU, Power-Monitor |
| USB (CDC-Seriell) | D+, D−, 5 V, GND | USB Full Speed | Punkt-zu-Punkt | Pi ⇄ XIAO Kommandos und Zustand |
| UART (hinter USB-Adapter) | TX, RX, GND | 460 800 Baud | Punkt-zu-Punkt | RPLIDAR-C1-Scandaten |
| Servo-PWM | ein Signal pro Servo | 200-Hz-Rahmen, µs-Puls | eine Leitung pro Servo | Gelenkpositionskommandos |
| SPI | SCK, MOSI, CS, DC | 27 MHz Schreibtakt | hier ein Gerät | LCD-Pixel |
| MIPI CSI-2 | differenzielle Lanes in einem Flachbandkabel | Gbit/s-Klasse | Punkt-zu-Punkt | Kamerabilder |
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
| Adresse | Gerät | Hinweis |
|---|---|---|
| 0x40 | PCA9685 Servotreiber | Firmware kPcaAddress |
| 0x70 | PCA9685 All-Call | der PCA9685 antwortet auch hier; nichts anderes darf sie verwenden |
| 0x6A | LSM6DSOX IMU | kImuAddress |
| 0x41 | INA260 Power-Monitor | kPowerMonitorAddress; 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
I²C misst die Anstiegszeit
Für ein angenommenes
Warum 400 kHz
Die Taktperiode und damit die Zeit für ein Bit ist
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──▶ INA260USB-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:
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 ein0x00als 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, 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
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:
Über I²C mit 400 kHz und 9 Takten pro 8-Bit-Byte würde dasselbe Bild 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
- Was würde schiefgehen, wenn Sie vergessen, den Jumper A0 des INA260 zu brücken?
- Warum brauchen I²C-Leitungen Pull-up-Widerstände, SPI-Leitungen aber nicht?
- Wie lange dauert es ungefähr, alle 12 Servokanäle mit 100 kHz zu schreiben, und warum ist das wichtig?
- Was bewirkt das
0x00-Byte am Ende jedes USB-Rahmens? - Warum verwendet die Kamera CSI statt USB oder SPI?
Antworten
- 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.
- 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.
- Etwa 6,5 ms (das Vierfache der 1,6 ms bei 400 kHz), länger als die Regelperiode von 5 ms.
- 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.
- 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.