03Electronics & wiring
Two custom PCBs tie every actuator onto one local network: CAN for the motor buses, TTL serial for the hands and neck, Ethernet and USB 3 for the bandwidth. One battery powers everything — nothing trails behind the robot. Pinouts and harness drawings: MABEL_Wiring_Guide.pdf.
Bus map
| Bus | Physical | Devices | Owner MCU / link |
|---|---|---|---|
| Base CAN | CAN, 120 Ω both ends | 6 × SPARK (IDs 1–6) | Base Teensy 4.1 → Ethernet |
| Arm left | CAN can0 | 7 × DaMiao (IDs 1–7) | Arms Teensy → Ethernet |
| Arm right | CAN can1 | 7 × DaMiao (IDs 1–7) | |
| Body CAN | CAN | Torso DM-J10422P + neck yaw DaMiao | USB-CAN dongles on the Jetson |
| Hand left | 1 MHz half-duplex TTL | 17 × Feetech (16 finger + wrist) | USB serial adapter (CH340) |
| Hand right | 1 MHz half-duplex TTL | 17 × Feetech | USB serial adapter (CH340) |
| Neck TTL | 1 Mbaud half-duplex TTL | 2 × Dynamixel XC330-T181 (roll, pitch) | U2D2 on the Jetson |
| Lift | USB serial | BTS7960 + encoder | RP2040 Pico |
ls -l /dev/serial/by-id/) and register it left/right in
hardware_bridge/config.py; the software then binds sides
correctly no matter which port they land on.
Install order
- Land both custom PCBs — the base board in the chassis, the body board on its printed mount. Fab files ship with the CAD.
- Fan power out from the single pack. The bus is 24 V with a 24→12 V buck for the low rails, distributed through a blade-fuse box — fuse per the wiring guide. A 6-port 2.5 GbE switch is the onboard network spine.
- Bring up the CAN buses — base (6 SPARK), body (torso + neck yaw), and the two arm buses. Terminate every chain at both ends.
- Bring up the serial buses — one TTL chain per hand, the neck pair through the U2D2, the lift Pico over USB.
- Connect the sensing — head stereo camera (USB 3), wrist cameras, 2D lidar, and (Maximum tier) the base depth camera.
- Wire Ethernet — base Teensy and arms Teensy to the Jetson (directly or through the Ethernet expansion board — see network plan).
Network plan
The robot's internal network is a flat 192.168.124.0/24:
| Node | Address | Notes |
|---|---|---|
| Jetson (host) | 192.168.124.2 | assigned on whichever wired port answers |
| Base Teensy | 192.168.124.10 | swerve + lift relay |
| Arms Teensy | 192.168.124.11 | both arm CAN buses |
The Teensys are port-agnostic: each may plug into the Jetson's direct NIC, a QSFP breakout lane, or the Ethernet expansion board (a small switch that puts several devices behind one port). The bring-up script discovers which port a Teensy actually answers on (ARP probe) and pins a host route to it at runtime — you do not hand-configure interfaces. A 100M link speed means a Teensy is plugged straight in; 10G means it is behind the expansion board.
Service ports (host)
Every client — browser, iPhone, Vision Pro — speaks to these; identical for the simulator and the real robot:
| Port | Service |
|---|---|
| 9090 | teleop WebSocket — the one wire contract (control + state + map) |
| 8080 | camera video (MJPEG per camera, + /cameras.json roster, + web console) |
| 9091 / 9092 | UDP-JPEG / H.264 low-latency video |
| 9600 | telemetry plane — joints/control/status/lidar JSON (read-only) |
| 9601–9605 | pointclouds per camera + SLAM mesh/pose/grid (read-only) |
| 9610 | audio duplex (robot mic up / operator voice down) |
| 9620–9623 | dedicated per-camera video tees |
| 8094 | Control Center web studio |
Audio
A USB sound card (VID:PID 0c76:1203) drives an 8 Ω / 5 W speaker
pair and the microphone. It is identified by USB identity, not port — replug
it anywhere and it reconnects. (Its serial number is hard-coded by the vendor,
which is why identity is VID:PID here, unlike the hands.)
Wiring completion check
- Every CAN chain measures ~60 Ω across H/L (two 120 Ω terminators in parallel)
- Both hand chains and the neck pair answer a servo scan on the bench
- Both Teensys answer ping at their addresses from the Jetson
- All cameras enumerate (
lsusb) on the powered hub, wrist ports noted - One battery, no wall tether; current-limited supply on hand for first power-on