mohan-bee/rc-link-breakaway-panel
A four-layer RC link panel combining an STM32/E28 2.4‑GHz transmitter with USB-RP2040 socket and an STM32/E28 receiver providing six buffered PWM servo outputs, regulated 3.3‑V power, headers, controls, and protection/decoupling.
- Version
- 0.1.5
- License
- unset
- Stars
- 0
circuits/receiver/index.circuit.tsx
import pourOutline from "./pour-outline.json";
import { reviewedRouting } from "./routing/reviewed-routing";
import { Fragment } from "react";
import { STM32G431KBU6 } from "./imports/STM32G431KBU6";
import { E28_2G4M12SX } from "./imports/E28_2G4M12SX";
import { A_74AHCT125T14_13 } from "./imports/A_74AHCT125T14_13";
import { A_2N7002 } from "./imports/A_2N7002";
import { AP2112K_3_3TRG1 } from "./AP2112K_3_3TRG1";
import { TAXM8M4RDBCCT2T } from "./imports/TAXM8M4RDBCCT2T";
import { TS_1187A_B_A_B } from "./imports/TS_1187A_B_A_B";
const pwmPins = [5, 6, 7, 8, 18, 30]; // PA0–PA3, PA8 and PB7.
const bufferInputs = [2, 5, 9, 12, 2, 5];
const bufferOutputs = [3, 6, 8, 11, 3, 6];
const headerX = [-9.25, -5.55, -1.85, 1.85, 5.55, 9.25];
const pinNets = [
[".U_RX_1 > .pin1", "V3V3"], [".U_RX_1 > .pin17", "V3V3"],
[".U_RX_1 > .pin14", "GND"], [".U_RX_1 > .pin16", "GND"], [".U_RX_1 > .pin32", "GND"], [".U_RX_1 > .pin33", "GND"],
[".U_RX_1 > .pin15", "VDDA"], [".U_RX_1 > .pin2", "HSE_IN"], [".U_RX_1 > .pin3", "HSE_OUT"],
[".U_RX_1 > .pin4", "NRST"], [".U_RX_1 > .pin9", "RF_NSS"], [".U_RX_1 > .pin10", "RF_SCK"],
[".U_RX_1 > .pin11", "RF_MISO"], [".U_RX_1 > .pin12", "RF_MOSI"],
[".U_RX_1 > .pin19", "SER_TX"], [".U_RX_1 > .pin20", "SER_RX"], [".U_RX_1 > .pin21", "BIND"],
[".U_RX_1 > .pin22", "LED"], [".U_RX_1 > .pin23", "SWDIO"], [".U_RX_1 > .pin24", "SWCLK"],
[".U_RX_1 > .pin25", "PWM_ENABLE"], [".U_RX_1 > .pin26", "RC_OUT"],
[".U_RX_1 > .pin27", "RF_DIO1"], [".U_RX_1 > .pin28", "RF_BUSY"], [".U_RX_1 > .pin29", "RF_RESET"],
[".U_RX_1 > .pin31", "BOOT0"],
[".U_RX_2 > .pin1", "V3V3"], [".U_RX_2 > .pin2", "GND"], [".U_RX_2 > .pin7", "GND"],
[".U_RX_2 > .pin8", "GND"], [".U_RX_2 > .pin14", "GND"],
[".U_RX_2 > .pin3", "RF_MISO"], [".U_RX_2 > .pin4", "RF_MOSI"], [".U_RX_2 > .pin5", "RF_SCK"],
[".U_RX_2 > .pin6", "RF_NSS"], [".U_RX_2 > .pin9", "RF_RESET"],
[".U_RX_2 > .pin10", "RF_BUSY"], [".U_RX_2 > .pin11", "RF_DIO1"],
[".U_RX_3 > .pin1", "V5_LOGIC"], [".U_RX_3 > .pin2", "GND"], [".U_RX_3 > .pin3", "V5_LOGIC"], [".U_RX_3 > .pin5", "V3V3"],
[".Q_RX_1 > .pin1", "PWM_ENABLE"], [".Q_RX_1 > .pin2", "GND"], [".Q_RX_1 > .pin3", "PWM_OE_N"],
[".R_RX_ENABLE_PD > .pin1", "PWM_ENABLE"], [".R_RX_ENABLE_PD > .pin2", "GND"],
[".R_RX_OE_PU > .pin1", "PWM_OE_N"], [".R_RX_OE_PU > .pin2", "V5_LOGIC"],
[".R_RX_RESET > .pin1", "NRST"], [".R_RX_RESET > .pin2", "V3V3"],
[".R_RX_BOOT > .pin1", "BOOT0"], [".R_RX_BOOT > .pin2", "GND"],
[".R_RX_NSS > .pin1", "RF_NSS"], [".R_RX_NSS > .pin2", "V3V3"],
[".R_RX_RFRESET > .pin1", "RF_RESET"], [".R_RX_RFRESET > .pin2", "V3V3"],
[".R_RX_VDDA > .pin1", "V3V3"], [".R_RX_VDDA > .pin2", "VDDA"],
[".R_RX_LED > .pin1", "LED"], [".R_RX_LED > .pin2", "LED_A"],
[".D_RX_LED > .pin1", "LED_A"], [".D_RX_LED > .pin2", "GND"],
[".SW_RX_BIND > .pin1", "BIND"], [".SW_RX_BIND > .pin2", "GND"],
[".SW_RX_BIND > .pin3", "BIND"], [".SW_RX_BIND > .pin4", "GND"],
[".X_RX_1 > .pin1", "HSE_IN"], [".X_RX_1 > .pin3", "HSE_OUT"], [".X_RX_1 > .pin2", "GND"], [".X_RX_1 > .pin4", "GND"],
[".C_RX_X1 > .pin1", "HSE_IN"], [".C_RX_X1 > .pin2", "GND"],
[".C_RX_X2 > .pin1", "HSE_OUT"], [".C_RX_X2 > .pin2", "GND"],
[".J_RX_LINK > .pin1", "V5_LOGIC"], [".J_RX_LINK > .pin2", "GND"],
[".J_RX_LINK > .pin3", "RC_OUT"], [".J_RX_LINK > .pin4", "SER_RX"],
[".J_RX_SERIAL > .pin1", "V5_LOGIC"], [".J_RX_SERIAL > .pin2", "GND"],
[".J_RX_SERIAL > .pin3", "SER_TX"], [".J_RX_SERIAL > .pin4", "SER_RX"],
[".J_RX_POWER > .pin1", "V5_LOGIC"], [".J_RX_POWER > .pin2", "GND"],
[".J_RX_SERVO_POWER > .pin1", "V_SERVO"], [".J_RX_SERVO_POWER > .pin2", "GND"],
[".J_RX_SWD > .pin1", "V3V3"], [".J_RX_SWD > .pin2", "GND"],
[".J_RX_SWD > .pin3", "SWDIO"], [".J_RX_SWD > .pin4", "SWCLK"], [".J_RX_SWD > .pin5", "NRST"],
];
const capacitors = [
{ name: "C_RX_IN", x: -15, y: 5.5, value: "4.7uF", footprint: "0603", part: "C19666", net: "V5_LOGIC" },
{ name: "C_RX_OUT", x: -11, y: 4.5, value: "4.7uF", footprint: "0603", part: "C19666", net: "V3V3" },
{ name: "C_RX_MCU1", x: -4.5, y: -8, value: "100nF", footprint: "0402", part: "C1525", net: "V3V3" },
{ name: "C_RX_MCU2", x: 3, y: -1.1, value: "100nF", footprint: "0402", part: "C1525", net: "V3V3" },
{ name: "C_RX_BULK", x: -6, y: -3, value: "4.7uF", footprint: "0603", part: "C19666", net: "V3V3" },
{ name: "C_RX_VDDA", x: 5, y: -3, value: "100nF", footprint: "0402", part: "C1525", net: "VDDA" },
{ name: "C_RX_RF", x: 10.5, y: 7.9, value: "100nF", footprint: "0402", part: "C1525", net: "V3V3" },
{ name: "C_RX_RF_BULK", x: 10.5, y: 5.4, value: "4.7uF", footprint: "0603", part: "C19666", net: "V3V3" },
{ name: "C_RX_BUF1", x: -5.7, y: -5.8, value: "100nF", footprint: "0402", part: "C1525", net: "V5_LOGIC" },
{ name: "C_RX_BUF2", x: 5.7, y: -5.8, value: "100nF", footprint: "0402", part: "C1525", net: "V5_LOGIC" },
{ name: "C_RX_RESET", x: -6, y: -1.5, value: "100nF", footprint: "0402", part: "C1525", net: "NRST" },
];
const resistors = [
{ name: "R_RX_RESET", x: -8, y: -1.5, value: "10k", part: "C25744" },
{ name: "R_RX_BOOT", x: -10, y: 0, value: "10k", part: "C25744" },
{ name: "R_RX_NSS", x: 10.5, y: 14, value: "10k", part: "C25744" },
{ name: "R_RX_RFRESET", x: -10.5, y: 14, value: "10k", part: "C25744" },
{ name: "R_RX_VDDA", x: 6, y: -1.5, value: "10", part: "C25077" },
{ name: "R_RX_LED", x: 15, y: 7, value: "1k", part: "C11702" },
{ name: "R_RX_ENABLE_PD", x: -19, y: -4, value: "1k", part: "C11702" },
{ name: "R_RX_OE_PU", x: -19.5, y: -2.7, value: "47k", part: "C25792" },
];
export default function Receiver({ routingDisabled = false, pcbX = 0, pcbY = 0 }: { routingDisabled?: boolean; pcbX?: number; pcbY?: number } = {}) {
return <group subcircuit pcbX={pcbX} pcbY={pcbY} name="RX" width="44mm" height="54mm" routingDisabled={routingDisabled} schTraceAutoLabelEnabled autorouter={{preset:"auto",traceClearance:"0.2mm",allowViaInPad:false}}>
<autoroutingphase name="receiver" phaseIndex={0} algorithmFn={reviewedRouting} autorouter={{ preset: "auto", traceClearance: "0.3mm", allowViaInPad: false }} />
<schematicsheet sheetSize="A4" name="RX_radio" displayName="01 - MCU and radio" sheetIndex={3} />
<schematicsheet sheetSize="A4" name="RX_power" displayName="02 - Power and reset" sheetIndex={4} />
<schematicsheet sheetSize="A4" name="RX_outputs" displayName="03 - RC, serial and servo outputs" sheetIndex={5} />
<schematicsection name="Radio" schSheetName="RX_radio" />
<schematicsection name="Power" schSheetName="RX_power" />
<schematicsection name="Outputs" schSheetName="RX_outputs" />
{["GND", "V5_LOGIC", "V3V3", "VDDA", "V_SERVO", "HSE_IN", "HSE_OUT", "NRST", "BOOT0",
"RF_NSS", "RF_SCK", "RF_MISO", "RF_MOSI", "RF_RESET", "RF_BUSY", "RF_DIO1", "SER_TX", "SER_RX",
"RC_OUT", "BIND", "LED", "LED_A", "SWDIO", "SWCLK", "PWM_ENABLE", "PWM_OE_N",
...pwmPins.map((_, i) => `PWM_RAW${i + 1}`), ...pwmPins.map((_, i) => `PWM_BUF${i + 1}`),
...pwmPins.map((_, i) => `PWM${i + 1}`)].map(name =>
<net key={name} name={`RX_${name}`} isGroundNet={name === "GND"} routingPhaseIndex={0} nominalTraceWidth={name === "V_SERVO" ? 1 : name === "V5_LOGIC" ? 0.4 : name === "V3V3" ? 0.3 : name === "GND" ? 0.2 : 0.15} />)}
<STM32G431KBU6 pcbStyle={{silkscreenTextVisibility: "hidden"}} name="U_RX_1" pcbX={0} pcbY={-5} schX={0} schY={0} schWidth={3.1} schHeight={3.6} schSheetName="RX_radio" schSectionName="Radio" />
<E28_2G4M12SX pcbStyle={{silkscreenTextVisibility: "hidden"}} name="U_RX_2" pcbX={0} pcbY={11.5} pcbRotation={180} schX={12} schY={0} schWidth={2.5} schHeight={1.6} schSheetName="RX_radio" schSectionName="Radio" />
<AP2112K_3_3TRG1 pcbStyle={{silkscreenTextVisibility: "hidden"}} name="U_RX_3" pcbX={-15} pcbY={2} schX={0} schY={5} schSheetName="RX_power" schSectionName="Power" />
<A_74AHCT125T14_13 pcbStyle={{silkscreenTextVisibility: "hidden"}} name="U_RX_4" pcbX={-9.5} pcbY={-8} schX={0} schY={5} schWidth={2.1} schHeight={1.6} schSheetName="RX_outputs" schSectionName="Outputs" />
<A_74AHCT125T14_13 pcbStyle={{silkscreenTextVisibility: "hidden"}} name="U_RX_5" pcbX={9.5} pcbY={-8} schX={7} schY={5} schWidth={2.1} schHeight={1.6} schSheetName="RX_outputs" schSectionName="Outputs" />
<A_2N7002 pcbStyle={{silkscreenTextVisibility: "hidden"}} name="Q_RX_1" channelType="n" mosfetMode="enhancement" pcbX={-15.5} pcbY={-3.5} schX={0} schY={-4} schSheetName="RX_outputs" schSectionName="Outputs" />
<TAXM8M4RDBCCT2T pcbStyle={{silkscreenTextVisibility: "hidden"}} name="X_RX_1" loadCapacitance="8pF" pcbX={-2.6} pcbY={-10.4} schX={5} schY={-7} schSheetName="RX_radio" schSectionName="Radio" />
<capacitor pcbStyle={{silkscreenTextVisibility: "hidden"}} name="C_RX_X1" pcbX={-5.75} pcbY={-11.3} pcbRotation={180} schX={3.5} schY={-9} schRotation={270} schSheetName="RX_radio" schSectionName="Radio" capacitance="12pF" footprint="0402_nosilkscreen" cadModel={{glbUrl:"https://modelcdn.tscircuit.com/jscad_models/0402.glb"}} maxVoltageRating="25V" supplierPartNumbers={{ jlcpcb: ["C1547"] }} />
<capacitor pcbStyle={{silkscreenTextVisibility: "hidden"}} name="C_RX_X2" pcbX={2.7} pcbY={-10.8} schX={6.5} schY={-9} schRotation={270} schSheetName="RX_radio" schSectionName="Radio" capacitance="12pF" footprint="0402_nosilkscreen" cadModel={{glbUrl:"https://modelcdn.tscircuit.com/jscad_models/0402.glb"}} maxVoltageRating="25V" supplierPartNumbers={{ jlcpcb: ["C1547"] }} />
{capacitors.map((p, i) => <capacitor pcbStyle={{silkscreenTextVisibility: "hidden"}} key={p.name} name={p.name} pcbX={p.x} pcbY={p.y}
pcbRotation={p.name === "C_RX_OUT" ? 180 : 0} schX={p.net === "V5_LOGIC" ? -8 + ["C_RX_IN", "C_RX_BUF1", "C_RX_BUF2"].indexOf(p.name) * 1.5 : p.net === "V3V3" ? -8 + ["C_RX_OUT", "C_RX_MCU1", "C_RX_MCU2", "C_RX_BULK", "C_RX_RF", "C_RX_RF_BULK"].indexOf(p.name) * 1.5 : p.name === "C_RX_VDDA" ? 3 : 6} schY={p.net === "V5_LOGIC" ? -5 : -9} schRotation={270} schSheetName="RX_power" schSectionName="Power"
capacitance={p.value} footprint={`${p.footprint}_nosilkscreen`} cadModel={{glbUrl:`https://modelcdn.tscircuit.com/jscad_models/${p.footprint}.glb`}} maxVoltageRating="16V" supplierPartNumbers={{ jlcpcb: [p.part] }} />)}
{resistors.map((p, i) => <resistor pcbStyle={{silkscreenTextVisibility: "hidden"}} key={p.name} name={p.name} pcbX={p.x} pcbY={p.y}
pcbRotation={p.name === "R_RX_RFRESET" ? 180 : 0} schRotation={["R_RX_RESET", "R_RX_NSS", "R_RX_RFRESET", "R_RX_OE_PU"].includes(p.name) ? 90 : 270} schX={-8 + (i % 4) * 4} schY={0 + Math.floor(i / 4) * 3} schSheetName="RX_power" schSectionName="Power"
resistance={p.value} footprint="0402_nosilkscreen" cadModel={{glbUrl:"https://modelcdn.tscircuit.com/jscad_models/0402.glb"}} supplierPartNumbers={{ jlcpcb: [p.part] }} />)}
<led pcbStyle={{silkscreenTextVisibility: "hidden"}} name="D_RX_LED" pcbX={15} pcbY={5} schX={11} schY={-7} schRotation={270} schSheetName="RX_radio" schSectionName="Radio" color="green" footprint="0603_nosilkscreen" cadModel={{glbUrl:"https://modelcdn.tscircuit.com/jscad_models/0603.glb"}} supplierPartNumbers={{ jlcpcb: ["C2899882"] }} />
<TS_1187A_B_A_B pcbStyle={{silkscreenTextVisibility: "hidden"}} name="SW_RX_BIND" pcbX={-16} pcbY={-9.3} schX={-8} schY={-9} schSheetName="RX_radio" schSectionName="Radio" />
<pinheader pcbStyle={{silkscreenTextVisibility: "hidden"}} name="J_RX_LINK" pinCount={4} pitch="2.54mm" platedDiameter="1.8mm" holeDiameter="1mm" gender="male" doNotPlace
pcbX={18.5} pcbY={1} pcbRotation={90} pinLabels={["5V", "GND", "RC_OUT", "AUX_RX"]}
schX={15} schY={5} schWidth={0.77} schSheetName="RX_outputs" schSectionName="Outputs" />
<pinheader pcbStyle={{silkscreenTextVisibility: "hidden"}} name="J_RX_SERIAL" pinCount={4} pitch="2.54mm" platedDiameter="1.8mm" holeDiameter="1mm" gender="male" doNotPlace
pcbX={-18.5} pcbY={7.4} pcbRotation={90} pinLabels={["5V", "GND", "TX", "RX"]}
schX={15} schY={-2} schWidth={0.48} schSheetName="RX_outputs" schSectionName="Outputs" />
<pinheader pcbStyle={{silkscreenTextVisibility: "hidden"}} name="J_RX_POWER" pinCount={2} pitch="2.54mm" platedDiameter="1.8mm" holeDiameter="1mm" gender="male" doNotPlace
pcbX={-20} pcbY={-18} pcbRotation={90} pinLabels={["5V", "GND"]}
schX={-8} schY={5} schSheetName="RX_power" schSectionName="Power" />
<pinheader pcbStyle={{silkscreenTextVisibility: "hidden"}} name="J_RX_SERVO_POWER" pinCount={2} pitch="2.54mm" platedDiameter="1.8mm" holeDiameter="1mm" gender="male" doNotPlace
pcbX={18.5} pcbY={-9} pcbRotation={90} pinLabels={["V_SERVO", "GND"]}
schX={15} schY={-7} schSheetName="RX_outputs" schSectionName="Outputs" />
<pinheader pcbStyle={{silkscreenTextVisibility: "hidden"}} name="J_RX_SWD" pinCount={5} pitch="2.54mm" platedDiameter="1.8mm" holeDiameter="1mm" gender="male" doNotPlace
pcbX={-20.25} pcbY={20} pcbRotation={90} pinLabels={["3V3", "GND", "DIO", "CLK", "RST"]}
schX={-5} schY={-4} schWidth={0.48} schSheetName="RX_radio" schSectionName="Radio" />
{pwmPins.map((pin, i) => <Fragment key={`pwm${i + 1}`}>
<pinheader pcbStyle={{silkscreenTextVisibility: "hidden"}} name={`J_RX_PWM${i + 1}`} pinCount={3} pitch="2.54mm" platedDiameter="1.8mm" holeDiameter="1mm" gender="male" doNotPlace
pcbX={headerX[i]} pcbY={-20} pcbRotation={90} pinLabels={[`S${i + 1}`, "V_SERVO", "GND"]}
schX={-10 + i * 4} schY={-9} schSheetName="RX_outputs" schSectionName="Outputs" />
<resistor pcbStyle={{silkscreenTextVisibility: "hidden"}} name={`R_RX_PWM${i + 1}`} pcbX={headerX[i]} pcbY={-12.8} schX={-10 + i * 4} schY={-6} schSheetName="RX_outputs" schSectionName="Outputs"
resistance="100" footprint="0402_nosilkscreen" cadModel={{glbUrl:"https://modelcdn.tscircuit.com/jscad_models/0402.glb"}} supplierPartNumbers={{ jlcpcb: ["C25076"] }} />
<resistor pcbStyle={{silkscreenTextVisibility: "hidden"}} name={`R_RX_PWM_PD${i + 1}`} pcbX={headerX[i]} pcbY={-25.1} schX={-10 + i * 4} schY={-12} schRotation={270} schSheetName="RX_outputs" schSectionName="Outputs"
resistance="100k" footprint="0402_nosilkscreen" cadModel={{glbUrl:"https://modelcdn.tscircuit.com/jscad_models/0402.glb"}} supplierPartNumbers={{ jlcpcb: ["C25741"] }} />
<trace from={`.U_RX_1 > .pin${pin}`} to={`net.RX_PWM_RAW${i + 1}`} />
<trace from={`.${i < 4 ? "U_RX_4" : "U_RX_5"} > .pin${bufferInputs[i]}`} to={`net.RX_PWM_RAW${i + 1}`} />
<trace from={`.${i < 4 ? "U_RX_4" : "U_RX_5"} > .pin${bufferOutputs[i]}`} to={`net.RX_PWM_BUF${i + 1}`} />
<trace from={`.R_RX_PWM${i + 1} > .pin1`} to={`net.RX_PWM_BUF${i + 1}`} />
<trace from={`.R_RX_PWM${i + 1} > .pin2`} to={`net.RX_PWM${i + 1}`} />
<trace from={`.J_RX_PWM${i + 1} > .pin1`} to={`net.RX_PWM${i + 1}`} />
<trace from={`.R_RX_PWM_PD${i + 1} > .pin1`} to={`net.RX_PWM${i + 1}`} />
<trace from={`.R_RX_PWM_PD${i + 1} > .pin2`} to="net.RX_GND" />
<trace from={`.J_RX_PWM${i + 1} > .pin2`} to="net.RX_V_SERVO" />
<trace from={`.J_RX_PWM${i + 1} > .pin3`} to="net.RX_GND" />
</Fragment>)}
{["U_RX_4", "U_RX_5"].map(name => <Fragment key={name}>
<trace from={`.${name} > .pin7`} to="net.RX_GND" />
<trace from={`.${name} > .pin14`} to="net.RX_V5_LOGIC" />
<trace from={`.${name} > .pin1`} to="net.RX_PWM_OE_N" />
<trace from={`.${name} > .pin4`} to="net.RX_PWM_OE_N" />
</Fragment>)}
<trace from=".U_RX_4 > .pin10" to="net.RX_PWM_OE_N" /><trace from=".U_RX_4 > .pin13" to="net.RX_PWM_OE_N" />
<trace from=".U_RX_5 > .pin10" to="net.RX_V5_LOGIC" /><trace from=".U_RX_5 > .pin13" to="net.RX_V5_LOGIC" />
<trace from=".U_RX_5 > .pin9" to="net.RX_GND" /><trace from=".U_RX_5 > .pin12" to="net.RX_GND" />
{pinNets.map(([port, net]) => <trace key={port} from={port} to={`net.RX_${net}`} schDisplayLabel={net} />)}
{capacitors.map(p => <Fragment key={`connections_${p.name}`}>
<trace from={`.${p.name} > .pin1`} to={`net.RX_${p.net}`} schDisplayLabel={p.net} />
<trace from={`.${p.name} > .pin2`} to="net.RX_GND" schDisplayLabel="GND" />
</Fragment>)}
{[-15.25, 15.25].flatMap(x => [-15.25, 15.25].map(y => <Fragment key={`${x}_${y}`}>
<hole pcbX={x} pcbY={y} diameter="3.2mm" />
<keepout shape="circle" pcbX={x} pcbY={y} radius="3mm" layers={["top"]} />
</Fragment>))}
<keepout shape="rect" pcbX={0} pcbY={19.5} width="15.6mm" height="6.9mm"
layers={["top", "inner1", "inner2", "bottom"]} excludeRefs={[".U_RX_2"]} />
<copperpour outline={pourOutline} name="GND_PLANE" layer="inner2" connectsTo="net.RX_GND" clearance="0.25mm" boardEdgeMargin="0.6mm" useThermalReliefs={false} />
<copperpour outline={pourOutline} name="GND_BOTTOM" layer="bottom" connectsTo="net.RX_GND" clearance="0.25mm" boardEdgeMargin="0.6mm" useThermalReliefs={false} />
{[[-10.5,24],[20,20],[-20,0]].map(([x,y],i) => <Fragment key={`fid-${i}`}>
<fiducial name={`FID${i+1}`} pcbX={x} pcbY={y} padDiameter="1mm" layer="top" />
<pcbsoldermaskopening pcbX={x} pcbY={y} shape="circle" radius="1mm" layer="top" />
</Fragment>)}
<silkscreentext text="RX V1" pcbX={12} pcbY={24.5} fontSize="1.8mm" />
<silkscreentext text="5V ONLY" pcbX={-15} pcbY={-21} fontSize="1.8mm" />
<silkscreentext text="G" pcbX={12} pcbY={-17.46} fontSize="1.8mm" />
<silkscreentext text="+" pcbX={12} pcbY={-20} fontSize="1.8mm" />
<silkscreentext text="S" pcbX={12} pcbY={-22.54} fontSize="1.8mm" />
{headerX.map((x,i) => <silkscreentext key={`channel-${i}`} text={String(i+1)} pcbX={x} pcbY={-15.2} fontSize="1.8mm" />)}
{["5","G","O","I"].map((text,i) => <silkscreentext key={`link-label-${i}`} text={text} pcbX={21} pcbY={-2.81+i*2.54} fontSize="1.8mm" />)}
{["5","G","T","R"].map((text,i) => <silkscreentext key={`serial-label-${i}`} text={text} pcbX={-20.7} pcbY={3.59+i*2.54} fontSize="1.8mm" />)}
{["V","G","D","C","R"].map((text,i) => <silkscreentext key={`swd-label-${i}`} text={text} pcbX={-17.85} pcbY={14.92+i*2.54} fontSize="1.8mm" />)}
{["V","G"].map((text,i) => <silkscreentext key={`servo-power-label-${i}`} text={text} pcbX={21} pcbY={-10.27+i*2.54} fontSize="1.8mm" />)}
<silkscreentext text="2A" pcbX={17} pcbY={-12.3} fontSize="1.8mm" />
<silkscreentext text="FC" pcbX={16} pcbY={0} fontSize="1.8mm" />
<silkscreentext text="SERVO" pcbX={16} pcbY={-5.3} fontSize="1.8mm" />
<silkscreentext text="SWD 3V3" pcbX={-12.1} pcbY={20} fontSize="1.8mm" />
<silkscreentext text="BIND" pcbX={-20.5} pcbY={-9.3} pcbRotation={90} fontSize="1.8mm" />
<trace name="CLOCK_IN" routingPhaseIndex={0} from=".U_RX_1 > .pin2" to=".X_RX_1 > .pin1" width={0.15}
pcbPath={[{ x: -1.250061, y: -3.65 }, { x: -4.95, y: -3.65 }, { x: -4.95, y: -6.25 }, ".X_RX_1 > .pin1"]} />
<trace name="CLOCK_OUT" routingPhaseIndex={0} from=".U_RX_1 > .pin3" to=".X_RX_1 > .pin3" width={0.15}
pcbPath={[{ x: -0.750062, y: -3.2 }, { x: -0.750062, y: -5.05 }, { x: -1.499926, y: -5.05 }, ".X_RX_1 > .pin3"]} />
<trace name="CLOCK_LOAD_IN" routingPhaseIndex={0} from=".X_RX_1 > .pin1" to=".C_RX_X1 > .pin1" width={0.15}
pcbPath={[".C_RX_X1 > .pin1"]} />
<trace name="CLOCK_LOAD_OUT" routingPhaseIndex={0} from=".X_RX_1 > .pin3" to=".C_RX_X2 > .pin1" width={0.15}
pcbPath={[".C_RX_X2 > .pin1"]} />
{headerX.slice(0, -1).map((_, i) => <Fragment key={`servo-bus-${i}`}>
<trace name={`SERVO_V_BUS${i + 1}`} routingPhaseIndex={0} from={`.J_RX_PWM${i + 1} > .pin2`} to={`.J_RX_PWM${i + 2} > .pin2`}
width={1.5} pcbPath={[`.J_RX_PWM${i + 2} > .pin2`]} />
<trace name={`SERVO_G_BUS${i + 1}`} routingPhaseIndex={0} from={`.J_RX_PWM${i + 1} > .pin3`} to={`.J_RX_PWM${i + 2} > .pin3`}
width={1.5} pcbPath={[`.J_RX_PWM${i + 2} > .pin3`]} />
</Fragment>)}
<trace name="SERVO_V_FEED" routingPhaseIndex={0} from=".J_RX_SERVO_POWER > .pin1" to=".J_RX_PWM6 > .pin2" width={1.5}
pcbPath={[{ x: -1.27, y: -1.8 }, { x: -14.5, y: -1.8 }, { x: -14.5, y: 7.25 }, { x: -11, y: 7.25 }, ".J_RX_PWM6 > .pin2"]} />
<trace name="SERVO_G_FEED" routingPhaseIndex={0} from=".J_RX_SERVO_POWER > .pin2" to=".J_RX_PWM6 > .pin3" width={1.5} />
</group>;
}