{
 "_about": "Tailwhip robot electronics, generated with the drawings by docs/tools/gen_electronics.py. Refs as in docs/schematic.svg. AI-generated and unbuilt: every number is [D] datasheet, [E] estimate or [C] chosen.",
 "parts": {
  "BT1": {
   "description": "2 x 18650 Li-ion in series (2S holder), genuine high-drain cells, 7.4 V nominal / 8.4 V full",
   "value": "2S"
  },
  "U3": {
   "description": "2S BMS with balancing (e.g. HX-2S-JH20): B-, BM, B+, P-, P+. 10 A, cut-off ~2.5 V/cell",
   "value": "BMS"
  },
  "J1": {
   "description": "DC 5.5 x 2.1 mm female pigtail: charge jack (8.4 V 1 A CC/CV charger), on BMS P+ / P-",
   "value": "charge"
  },
  "F1": {
   "description": "PTC resettable fuse, radial, 3 A hold / 6 A trip, >= 16 V (Littelfuse RUEF300 or Bourns MF-R300)",
   "value": "3 A"
  },
  "SW1": {
   "description": "Power switch, >= 3 A DC (Pololu 2810 MOSFET slide switch, or a KCD11 mini rocker)",
   "value": ""
  },
  "U4": {
   "description": "MX1508 dual H-bridge module: VM (+), GND (-), IN1-IN4, MOTOR-A, MOTOR-B",
   "value": ""
  },
  "M1": {
   "description": "TT gearmotor 1:48, left wheel, on MX1508 MOTOR-A via a JST-XH 2-pin plug",
   "value": ""
  },
  "M2": {
   "description": "TT gearmotor 1:48, right wheel, on MX1508 MOTOR-B via a JST-XH 2-pin plug",
   "value": ""
  },
  "U1": {
   "description": "Mini360 buck, set to 5.0 V: logic rail (ESP32, later the ESP32-CAM)",
   "value": "5.0 V"
  },
  "U2": {
   "description": "Mini360 buck, set to 5.0 V: servo rail",
   "value": "5.0 V"
  },
  "C1": {
   "description": "470 uF 16 V low-ESR electrolytic, across the servo rail on the junction board",
   "value": "470u"
  },
  "R1": {
   "description": "100 k 1 % 1/4 W, divider top",
   "value": "100k"
  },
  "R2": {
   "description": "33 k 1 % 1/4 W, divider bottom",
   "value": "33k"
  },
  "C2": {
   "description": "100 nF ceramic across R2",
   "value": "100n"
  },
  "R3": {
   "description": "100 k pull-down on IR_L (reads 0 when the sensor is unplugged)",
   "value": "100k"
  },
  "R4": {
   "description": "100 k pull-down on IR_R",
   "value": "100k"
  },
  "JB": {
   "description": "Junction board: ~15 x 25 mm perfboard, on the spine front beside the MX1508 (+y side)",
   "value": ""
  },
  "U5": {
   "description": "ESP32 DevKit (ESP32-WROOM-32), on the back of the spine, header pins pointing back",
   "value": ""
  },
  "U6": {
   "description": "GY-521 MPU-6050 on the motor web pad, chip facing forward, x axis up the body, address 0x68",
   "value": ""
  },
  "U7": {
   "description": "TCRT5000 IR module (LM393, D0 output), left wheel, on its post 2.5 mm from the encoder ring",
   "value": ""
  },
  "U8": {
   "description": "TCRT5000 IR module, right wheel",
   "value": ""
  },
  "S1": {
   "description": "SG-90 tail servo (MG90S as the fallback)",
   "value": ""
  },
  "S2": {
   "description": "SG-90 head-pan servo",
   "value": ""
  },
  "U9": {
   "description": "ESP32-CAM (stage 4): 5V and GND from the logic rail only; no signal wires to the robot ESP32",
   "value": ""
  }
 },
 "nets": {
  "CELL+": [
   "BT1.+",
   "U3.B+"
  ],
  "CELL_MID": [
   "BT1.mid",
   "U3.BM"
  ],
  "CELL-": [
   "BT1.-",
   "U3.B-"
  ],
  "PACK+": [
   "U3.P+",
   "J1.+",
   "F1.1"
  ],
  "VBAT_F": [
   "F1.2",
   "SW1.IN"
  ],
  "VBAT_SW": [
   "SW1.OUT",
   "U4.VM",
   "U1.IN+",
   "U2.IN+",
   "R1.1"
  ],
  "GND": [
   "U3.P-",
   "J1.-",
   "U4.GND",
   "U1.IN-",
   "U1.OUT-",
   "U2.IN-",
   "U2.OUT-",
   "C1.-",
   "R2.2",
   "C2.2",
   "R3.2",
   "R4.2",
   "U5.GND",
   "U6.GND",
   "U7.GND",
   "U8.GND",
   "S1.GND",
   "S2.GND",
   "U9.GND",
   "SW1.GND"
  ],
  "5V_LOGIC": [
   "U1.OUT+",
   "U5.5V",
   "U9.5V"
  ],
  "5V_SERVO": [
   "U2.OUT+",
   "C1.+",
   "S1.V+",
   "S2.V+"
  ],
  "3V3": [
   "U5.3V3",
   "U6.VCC",
   "U7.VCC",
   "U8.VCC"
  ],
  "SDA": [
   "U5.GPIO21",
   "U6.SDA"
  ],
  "SCL": [
   "U5.GPIO22",
   "U6.SCL"
  ],
  "VSENSE": [
   "R1.2",
   "R2.1",
   "C2.1",
   "U5.GPIO36"
  ],
  "IR_L": [
   "U7.D0",
   "R3.1",
   "U5.GPIO34"
  ],
  "IR_R": [
   "U8.D0",
   "R4.1",
   "U5.GPIO35"
  ],
  "ML_IN1": [
   "U5.GPIO25",
   "U4.IN1"
  ],
  "ML_IN2": [
   "U5.GPIO26",
   "U4.IN2"
  ],
  "MR_IN1": [
   "U5.GPIO27",
   "U4.IN3"
  ],
  "MR_IN2": [
   "U5.GPIO14",
   "U4.IN4"
  ],
  "MOTA+": [
   "U4.MOTA1",
   "M1.+"
  ],
  "MOTA-": [
   "U4.MOTA2",
   "M1.-"
  ],
  "MOTB+": [
   "U4.MOTB1",
   "M2.+"
  ],
  "MOTB-": [
   "U4.MOTB2",
   "M2.-"
  ],
  "SIG_TAIL": [
   "U5.GPIO18",
   "S1.SIG"
  ],
  "SIG_HEAD": [
   "U5.GPIO19",
   "S2.SIG"
  ]
 },
 "pin_map": [
  {
   "gpio": 25,
   "devkit_label": "D25",
   "net": "ML_IN1",
   "direction": "out",
   "notes": "MX1508 IN1 (left motor). LEDC 20 kHz 10-bit. Slow decay: held high when driving forward"
  },
  {
   "gpio": 26,
   "devkit_label": "D26",
   "net": "ML_IN2",
   "direction": "out",
   "notes": "MX1508 IN2 (left motor). PWM (inverted duty) when driving forward"
  },
  {
   "gpio": 27,
   "devkit_label": "D27",
   "net": "MR_IN1",
   "direction": "out",
   "notes": "MX1508 IN3 (right motor)"
  },
  {
   "gpio": 14,
   "devkit_label": "D14",
   "net": "MR_IN2",
   "direction": "out",
   "notes": "MX1508 IN4 (right motor). Fixed by SPEC; may glitch for a few ms at boot (harmless)"
  },
  {
   "gpio": 18,
   "devkit_label": "D18",
   "net": "SIG_TAIL",
   "direction": "out",
   "notes": "Tail SG-90 signal, 50 Hz 16-bit, 500-2500 us = 0-180 deg"
  },
  {
   "gpio": 19,
   "devkit_label": "D19",
   "net": "SIG_HEAD",
   "direction": "out",
   "notes": "Head-pan SG-90 signal"
  },
  {
   "gpio": 21,
   "devkit_label": "D21",
   "net": "SDA",
   "direction": "i/o",
   "notes": "I2C data, 400 kHz, 4.7k pull-up on the GY-521"
  },
  {
   "gpio": 22,
   "devkit_label": "D22",
   "net": "SCL",
   "direction": "out",
   "notes": "I2C clock"
  },
  {
   "gpio": 34,
   "devkit_label": "D34",
   "net": "IR_L",
   "direction": "in",
   "notes": "Left wheel TCRT5000 D0. Input-only, no internal pull: 100k pull-down R3 on the junction board"
  },
  {
   "gpio": 35,
   "devkit_label": "D35",
   "net": "IR_R",
   "direction": "in",
   "notes": "Right wheel TCRT5000 D0. 100k pull-down R4"
  },
  {
   "gpio": 36,
   "devkit_label": "VP",
   "net": "VSENSE",
   "direction": "in",
   "notes": "ADC1_CH0 (works with the radio on). Battery x 33/133 (100k over 33k), 100 nF to GND"
  },
  {
   "gpio": 2,
   "devkit_label": "D2",
   "net": "LED",
   "direction": "out",
   "notes": "On-board LED. Strapping pin, but the LED keeps it low at boot: fine"
  },
  {
   "gpio": null,
   "devkit_label": "VIN / 5V",
   "net": "5V_LOGIC",
   "direction": "pwr",
   "notes": "From buck U1. Feeds the DevKit AMS1117 3.3 V regulator"
  },
  {
   "gpio": null,
   "devkit_label": "3V3",
   "net": "3V3",
   "direction": "pwr",
   "notes": "DevKit regulator out: GY-521 and both IR modules (~35 mA)"
  },
  {
   "gpio": null,
   "devkit_label": "GND",
   "net": "GND",
   "direction": "pwr",
   "notes": "Two GND pins: one to the junction board, one to the GY-521"
  }
 ],
 "unused_pins": "Unused: GPIO 0 5 12 15 (strapping), 6-11 (flash), 1 3 (USB)",
 "i2c": {
  "clock_hz": 400000,
  "devices": {
   "0x68": "U6 MPU-6050 (GY-521, AD0 low)"
  },
  "timeout_ms": 3,
  "imu_config": "+-4 g, +-500 dps, DLPF 2 (94/98 Hz, ~3 ms), read at 400 Hz"
 },
 "battery_sense": {
  "divider": "R1 100k (top) / R2 33k (bottom)",
  "ratio": 0.24812030075187969,
  "pin": "GPIO36 (VP, ADC1_CH0)",
  "v_pin_at_8v4": 2.084,
  "filter": "C2 100 nF + firmware low-pass ~40 ms",
  "drain_uA": 63,
  "note": "on the switched side: no drain with SW1 off"
 },
 "motor_drive": {
  "driver": "MX1508, no enable pins",
  "pwm_hz": 20000,
  "bits": 10,
  "decay": "slow (brake in the PWM off-time): forward = IN1 high, IN2 PWM with duty 1 - d",
  "voltage_model": "average motor voltage = d x VBAT; firmware d = u x 6.0 / VBAT (clipped at 1)",
  "u_zero": "both inputs high = brake (motor shorted); failsafe and idle use coast (both low)"
 },
 "wheel_sensing": {
  "sensor": "TCRT5000 module D0, both edges, 16-window ring = 32 edges/turn",
  "resolution_deg": 11.25,
  "lockout_us": 1000,
  "stop_after_ms": 250,
  "speed": "period method at 100 Hz; sign from the last non-zero command; relative to the body"
 },
 "power": {
  "rails": {
   "logic_5V": [
    {
     "load": "ESP32 radio on, ESP-NOW 100 Hz",
     "typical_A": 0.12,
     "peak_A": 0.35,
     "source": "[D] Espressif datasheet 5-4: RX 95-100 mA, TX 180-240 mA, plus CPU [E]"
    },
    {
     "load": "GY-521 MPU-6050",
     "typical_A": 0.004,
     "peak_A": 0.004,
     "source": "[D] 3.8-3.9 mA"
    },
    {
     "load": "2 x TCRT5000 module at 3.3 V",
     "typical_A": 0.03,
     "peak_A": 0.03,
     "source": "[E] IR LED ~10 mA + LM393 + power LED, each"
    },
    {
     "load": "ESP32-CAM streaming (stage 4)",
     "typical_A": 0.25,
     "peak_A": 0.31,
     "source": "[D] 180 mA flash off, 310 mA flash on; [E] 230-250 mA measured by hobbyists"
    }
   ],
   "servo_5V": [
    {
     "load": "Tail SG-90 holding the robot at rest",
     "typical_A": 0.25,
     "peak_A": 0.65,
     "source": "[E] hold; [D] 550-650 mA stall"
    },
    {
     "load": "Head SG-90 panning",
     "typical_A": 0.1,
     "peak_A": 0.65,
     "source": "[E] moving; [D] stall"
    }
   ],
   "motors_vbat": [
    {
     "load": "Each TT motor, no load at 6 V",
     "typical_A": 0.16,
     "peak_A": 1.5,
     "source": "[D] Adafruit 3777: 160 mA no load, 1.5 A stall at 6 V"
    },
    {
     "load": "Each TT motor, balancing",
     "typical_A": 0.4,
     "peak_A": 1.5,
     "source": "[E] average while balancing; peaks to stall"
    }
   ]
  },
  "bucks": "Mini360 (MP2307): ~1 A continuous in practice, 1.8 A listed, 3 A surge [E listings]",
  "fuse": "PTC 3 A hold / 6 A trip after the BMS",
  "bms": "2S with balancing, 10 A, cut-off ~2.5 V/cell",
  "low_battery": "6.4 V for 2 s -> idle (latched); deep sleep 30 s later"
 },
 "board_positions": {
  "source": "cad/tailwhip.py items()",
  "frame": "body: x forward, y left, z up the body, origin on the axle, mm",
  "boxes": {
   "tt_gearbox_l": [
    -11.2,
    13.5,
    -11.0,
    11.2,
    32.3,
    26.0
   ],
   "tt_can_l": [
    -10.0,
    15.4,
    26.0,
    10.0,
    30.4,
    59.0
   ],
   "ir_pcb_l": [
    15.0,
    24.3,
    -10.0,
    29.0,
    25.9,
    22.0
   ],
   "tt_gearbox_r": [
    -11.2,
    -32.3,
    -11.0,
    11.2,
    -13.5,
    26.0
   ],
   "tt_can_r": [
    -10.0,
    -30.4,
    26.0,
    10.0,
    -15.4,
    59.0
   ],
   "ir_pcb_r": [
    15.0,
    -25.9,
    -10.0,
    29.0,
    -24.3,
    22.0
   ],
   "tail_servo": [
    -40.8,
    -20.0,
    23.9,
    -8.2,
    12.0,
    36.1
   ],
   "pan_servo": [
    -21.8,
    -6.1,
    150.1,
    10.8,
    6.1,
    182.1
   ],
   "holder": [
    -16.5,
    -38.8,
    126.3,
    24.5,
    38.8,
    146.8
   ],
   "esp32": [
    -15.5,
    -14.0,
    67.0,
    -2.3,
    14.0,
    122.0
   ],
   "mx1508": [
    2.3,
    -12.0,
    102.5,
    5.9,
    12.0,
    123.5
   ],
   "mini360_logic": [
    2.3,
    -25.3,
    90.0,
    6.5,
    -8.1,
    101.2
   ],
   "mini360_servo": [
    2.3,
    8.1,
    90.0,
    6.5,
    25.3,
    101.2
   ],
   "bms_2s": [
    2.3,
    -24.8,
    67.4,
    5.8,
    24.8,
    89.4
   ],
   "cap_470u": [
    2.3,
    12.6,
    103.0,
    15.9,
    24.8,
    123.0
   ],
   "switch": [
    26.8,
    -7.6,
    128.5,
    30.8,
    7.6,
    143.7
   ],
   "imu": [
    17.6,
    -10.5,
    19.0,
    20.2,
    10.5,
    35.0
   ]
  }
 },
 "wires": [
  {
   "id": "P1",
   "net": "CELL+",
   "from": "BT1 + (holder red lead)",
   "to": "U3 B+",
   "colour": "red",
   "awg": 22,
   "length_mm": 60,
   "route": "sleeve floor window -> top of spine front",
   "note": "holder lead, shortened"
  },
  {
   "id": "P2",
   "net": "CELL-",
   "from": "BT1 - (holder black lead)",
   "to": "U3 B-",
   "colour": "black",
   "awg": 22,
   "length_mm": 60,
   "route": "same",
   "note": "holder lead, shortened"
  },
  {
   "id": "P3",
   "net": "CELL_MID",
   "from": "BT1 middle (strap joining the cells)",
   "to": "U3 BM",
   "colour": "yellow",
   "awg": 26,
   "length_mm": 70,
   "route": "same",
   "note": "solder to the holder's series strap; balancing and per-cell protection need it"
  },
  {
   "id": "P4",
   "net": "PACK+",
   "from": "U3 P+",
   "to": "F1 lead 1 (in heat-shrink)",
   "colour": "red",
   "awg": 22,
   "length_mm": 30,
   "route": "spine front, -y side",
   "note": ""
  },
  {
   "id": "P5",
   "net": "VBAT_F",
   "from": "F1 lead 2",
   "to": "SW1 IN",
   "colour": "red",
   "awg": 22,
   "length_mm": 40,
   "route": "spine front, up to the switch",
   "note": ""
  },
  {
   "id": "P6",
   "net": "VBAT_SW",
   "from": "SW1 OUT",
   "to": "U4 VM (+)",
   "colour": "red",
   "awg": 22,
   "length_mm": 30,
   "route": "spine front",
   "note": "then daisy-chain on to U1 IN+ (P7)"
  },
  {
   "id": "P7",
   "net": "VBAT_SW",
   "from": "U4 VM (+)",
   "to": "U1 IN+ and U2 IN+",
   "colour": "red",
   "awg": 22,
   "length_mm": 60,
   "route": "spine front, down to the bucks",
   "note": "one wire to each buck, both on the VM screw"
  },
  {
   "id": "P8",
   "net": "GND",
   "from": "U3 P-",
   "to": "U4 GND (-)",
   "colour": "black",
   "awg": 22,
   "length_mm": 50,
   "route": "spine front",
   "note": "main ground; then U1 IN-, U2 IN- (P9)"
  },
  {
   "id": "P9",
   "net": "GND",
   "from": "U4 GND (-)",
   "to": "U1 IN- and U2 IN-",
   "colour": "black",
   "awg": 22,
   "length_mm": 60,
   "route": "spine front",
   "note": ""
  },
  {
   "id": "P10",
   "net": "PACK+",
   "from": "J1 + (charge jack, red)",
   "to": "U3 P+",
   "colour": "red",
   "awg": 22,
   "length_mm": 80,
   "route": "out of the -y side of the spine",
   "note": "jack hangs on a 6 cm tail"
  },
  {
   "id": "P11",
   "net": "GND",
   "from": "J1 - (charge jack, black)",
   "to": "U3 P-",
   "colour": "black",
   "awg": 22,
   "length_mm": 80,
   "route": "same",
   "note": ""
  },
  {
   "id": "P12",
   "net": "GND",
   "from": "SW1 GND (Pololu switch only)",
   "to": "U4 GND (-)",
   "colour": "black",
   "awg": 26,
   "length_mm": 30,
   "route": "spine front",
   "note": "not needed with a mechanical rocker"
  },
  {
   "id": "P13",
   "net": "VBAT_SW",
   "from": "VBAT_SW (U4 VM)",
   "to": "JB R1 top",
   "colour": "red",
   "awg": 26,
   "length_mm": 40,
   "route": "spine front",
   "note": "thin wire: divider only"
  },
  {
   "id": "L1",
   "net": "5V_LOGIC",
   "from": "U1 OUT+",
   "to": "U5 VIN / 5V",
   "colour": "red",
   "awg": 26,
   "length_mm": 90,
   "route": "round the -y edge of the spine to the back",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "L2",
   "net": "GND",
   "from": "U1 OUT-",
   "to": "U5 GND",
   "colour": "black",
   "awg": 26,
   "length_mm": 90,
   "route": "with L1",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "S1",
   "net": "5V_SERVO",
   "from": "U2 OUT+",
   "to": "JB 5V_SERVO (C1 +)",
   "colour": "red",
   "awg": 22,
   "length_mm": 30,
   "route": "spine front, +y side",
   "note": ""
  },
  {
   "id": "S2",
   "net": "GND",
   "from": "U2 OUT-",
   "to": "JB GND (C1 -)",
   "colour": "black",
   "awg": 22,
   "length_mm": 30,
   "route": "with S1",
   "note": ""
  },
  {
   "id": "S3",
   "net": "SIG_TAIL / 5V_SERVO / GND",
   "from": "JB servo header T",
   "to": "S1 tail servo plug",
   "colour": "servo lead",
   "awg": 26,
   "length_mm": 110,
   "route": "down the spine back to the hip block",
   "note": "SG-90 lead is ~250 mm: coil the spare"
  },
  {
   "id": "S4",
   "net": "SIG_HEAD / 5V_SERVO / GND",
   "from": "JB servo header H",
   "to": "S2 head servo plug",
   "colour": "servo lead",
   "awg": 26,
   "length_mm": 80,
   "route": "up the spine, past the sleeve",
   "note": "leave a loop for +-60 deg of pan"
  },
  {
   "id": "J1",
   "net": "SIG_TAIL",
   "from": "U5 GPIO18",
   "to": "JB header T signal pin",
   "colour": "orange",
   "awg": 26,
   "length_mm": 70,
   "route": "+y edge of the spine",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "J2",
   "net": "SIG_HEAD",
   "from": "U5 GPIO19",
   "to": "JB header H signal pin",
   "colour": "yellow",
   "awg": 26,
   "length_mm": 70,
   "route": "+y edge of the spine",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "J3",
   "net": "GND",
   "from": "U5 GND (second pin)",
   "to": "JB GND",
   "colour": "black",
   "awg": 26,
   "length_mm": 70,
   "route": "+y edge of the spine",
   "note": "Dupont female on the ESP32 header pin; the logic and junction grounds must meet"
  },
  {
   "id": "J4",
   "net": "VSENSE",
   "from": "U5 GPIO36 (VP)",
   "to": "JB R1/R2 junction",
   "colour": "violet",
   "awg": 26,
   "length_mm": 70,
   "route": "+y edge",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "J5",
   "net": "IR_L",
   "from": "U5 GPIO34",
   "to": "JB R3 / IR_L in",
   "colour": "green",
   "awg": 26,
   "length_mm": 70,
   "route": "+y edge",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "J6",
   "net": "IR_R",
   "from": "U5 GPIO35",
   "to": "JB R4 / IR_R in",
   "colour": "blue",
   "awg": 26,
   "length_mm": 70,
   "route": "+y edge",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "M1",
   "net": "ML_IN1",
   "from": "U5 GPIO25",
   "to": "U4 IN1",
   "colour": "white",
   "awg": 26,
   "length_mm": 60,
   "route": "over the top of the spine",
   "note": "Dupont female on the ESP32 header pin; Dupont or solder at the MX1508"
  },
  {
   "id": "M2",
   "net": "ML_IN2",
   "from": "U5 GPIO26",
   "to": "U4 IN2",
   "colour": "grey",
   "awg": 26,
   "length_mm": 60,
   "route": "with M1",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "M3",
   "net": "MR_IN1",
   "from": "U5 GPIO27",
   "to": "U4 IN3",
   "colour": "brown",
   "awg": 26,
   "length_mm": 60,
   "route": "with M1",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "M4",
   "net": "MR_IN2",
   "from": "U5 GPIO14",
   "to": "U4 IN4",
   "colour": "violet",
   "awg": 26,
   "length_mm": 60,
   "route": "with M1",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "M5",
   "net": "MOTA+ / MOTA-",
   "from": "U4 MOTOR-A",
   "to": "M1 left motor tabs (JST-XH)",
   "colour": "red/black",
   "awg": 22,
   "length_mm": 110,
   "route": "+y side of the core, along the can",
   "note": "swap the pair if the wheel runs backwards, or \"flip l\""
  },
  {
   "id": "M6",
   "net": "MOTB+ / MOTB-",
   "from": "U4 MOTOR-B",
   "to": "M2 right motor tabs (JST-XH)",
   "colour": "red/black",
   "awg": 22,
   "length_mm": 110,
   "route": "-y side of the core, along the can",
   "note": "or \"flip r\" in firmware"
  },
  {
   "id": "I1",
   "net": "3V3",
   "from": "U5 3V3",
   "to": "U6 VCC",
   "colour": "red",
   "awg": 26,
   "length_mm": 110,
   "route": "down the front of the web",
   "note": "Dupont female on the ESP32 header pin; then on to the IR modules (I5, I6)"
  },
  {
   "id": "I2",
   "net": "GND",
   "from": "U5 GND (third pin) or JB GND",
   "to": "U6 GND",
   "colour": "black",
   "awg": 26,
   "length_mm": 110,
   "route": "with I1",
   "note": ""
  },
  {
   "id": "I3",
   "net": "SDA",
   "from": "U5 GPIO21",
   "to": "U6 SDA",
   "colour": "blue",
   "awg": 26,
   "length_mm": 110,
   "route": "with I1, twisted with I4",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "I4",
   "net": "SCL",
   "from": "U5 GPIO22",
   "to": "U6 SCL",
   "colour": "yellow",
   "awg": 26,
   "length_mm": 110,
   "route": "with I1",
   "note": "Dupont female on the ESP32 header pin"
  },
  {
   "id": "I5",
   "net": "3V3 / GND",
   "from": "U6 VCC / GND (second wires)",
   "to": "U7 VCC / GND (left IR)",
   "colour": "red/black",
   "awg": 26,
   "length_mm": 60,
   "route": "along the web to the left post",
   "note": ""
  },
  {
   "id": "I6",
   "net": "3V3 / GND",
   "from": "U6 VCC / GND (second wires)",
   "to": "U8 VCC / GND (right IR)",
   "colour": "red/black",
   "awg": 26,
   "length_mm": 60,
   "route": "along the web to the right post",
   "note": ""
  },
  {
   "id": "I7",
   "net": "IR_L",
   "from": "U7 D0",
   "to": "JB IR_L",
   "colour": "green",
   "awg": 26,
   "length_mm": 120,
   "route": "up the web and the spine to the junction board",
   "note": ""
  },
  {
   "id": "I8",
   "net": "IR_R",
   "from": "U8 D0",
   "to": "JB IR_R",
   "colour": "blue",
   "awg": 26,
   "length_mm": 120,
   "route": "with I7",
   "note": ""
  },
  {
   "id": "C1",
   "net": "5V_LOGIC / GND",
   "from": "U1 OUT+ / OUT- (second wires)",
   "to": "U9 ESP32-CAM 5V / GND",
   "colour": "red/black",
   "awg": 26,
   "length_mm": 120,
   "route": "up the back of the spine and sleeve to the head",
   "note": "stage 4 only; leave a loop for pan"
  }
 ]
}