AnasSarkiz/magnetic-shutter-remote--01a0f81f

A compact USB‑C rechargeable battery device with BQ25185 charging, 3.3‑V regulation and protection, E73 Bluetooth control, temperature monitoring, status/charge LEDs, shutter/pair/power switches, and a mechanically enclosed Li‑Po battery with docking/antenna provisions.

Version
0.1.9
License
unset
Stars
0

src/remote-circuit.tsx

import { FunctionalMarkings } from "./functional-markings";
import { regulatorEscapePaths } from "./regulator-escape-paths";
import { sensorEscapePaths } from "./sensor-escape-paths";
import { batteryCapEscapePaths } from "./c2-escape-paths";
import { sensorCapEscapePaths } from "./c7-escape-paths";
import { usbEscapePaths } from "./usb-escape-paths";
import { temperatureEscapePaths } from "./temperature-escape-paths";
import { chargerEscapePaths } from "./charger-escape-paths";
import { radioEscapePaths } from "./radio-escape-paths";
import { E73_2G4M08S1C } from "../imports/E73_2G4M08S1C";
import { BQ25185DLHR } from "../imports/BQ25185DLHR";
import { TMP390A2DRLR } from "../imports/TMP390A2DRLR";
import { TPS3839G33DBZR } from "../imports/TPS3839G33DBZR";
import { A_0603WAF1502T5E } from "../imports/A_0603WAF1502T5E";
import { A_0603WAF1303T5E } from "../imports/A_0603WAF1303T5E";
import { A_0603WAF1002T5E } from "../imports/A_0603WAF1002T5E";
import { A_0603WAF1621T5E } from "../imports/A_0603WAF1621T5E";
import { A_0603WAF1872T5E } from "../imports/A_0603WAF1872T5E";
import { CL21A106KAYNNNE } from "../imports/CL21A106KAYNNNE";
import { TCC0603COG470J500CT } from "../imports/TCC0603COG470J500CT";
import { TPS7A0230PDBVR } from "../imports/TPS7A0230PDBVR";
import { USB4215_03_A } from "../imports/USB4215_03_A";
import { S2B_PH_SM4_TB_LF__SN_ } from "../imports/S2B_PH_SM4_TB_LF__SN_";
import { BM06B_SRSS_TB_LF__SN_ } from "../imports/BM06B_SRSS_TB_LF__SN_";
import { MSK12C02 } from "../imports/MSK12C02";
import { TS_1088_AR02016 } from "../imports/TS_1088_AR02016";
import { A_2N7002 } from "../imports/A_2N7002";
import { A_0603WAF5101T5E } from "../imports/A_0603WAF5101T5E";
import { A_0603WAF1001T5E } from "../imports/A_0603WAF1001T5E";
import { A_0603WAF1003T5E } from "../imports/A_0603WAF1003T5E";
import { CL10A475KO8NNNC } from "../imports/CL10A475KO8NNNC";
import { CC0603KRX7R9BB104 } from "../imports/CC0603KRX7R9BB104";
import { KT_0603R } from "../imports/KT_0603R";

// R6: USB4215 migration only; R4 and R5 remain in their preserved directories.
export function RemoteCircuit() {
	return (
		<board
			title="Magnetic shutter remote R6 — engineering prototype"
			width="36mm"
			height="56mm"
			thickness="1mm"
			layers={2}
			material="fr4"
			borderRadius="2mm"
			autorouter="default"
			autorouterVersion="beta_pipeline9"
			minTraceWidth="0.15mm"
			minTraceToPadEdgeClearance="0.15mm"
			minViaEdgeToPadEdgeClearance="0.35mm"
			minPadEdgeToPadEdgeClearance="0.15mm"
			minTraceToHoleEdgeClearance="0.30mm"
			minViaHoleEdgeToViaHoleEdgeClearance="0.50mm"
			minPlatedHoleDrillEdgeToDrillEdgeClearance="0.55mm"
			minViaHoleDiameter="0.25mm"
			minViaPadDiameter="0.6mm"
			pcbStyle={{ viaHoleDiameter: "0.25mm", viaPadDiameter: "0.6mm" }}
			schAutoLayoutEnabled={false}
			schLayout={{ layoutMode: "relative" }}
			fabricatorPreset="jlcpcb_standard_20260912"
			pcbSx={{
				"& footprint silkscreentext": { visibility: "hidden" },
				"& footprint silkscreenpath": { visibility: "hidden" },
			}}
			defaultTraceWidth="0.15mm"
		>
			<FunctionalMarkings />
			<net name="GND" isGroundNet />
			<net name="USB5V" isPowerNet />
			<net name="VBAT" isPowerNet />
			<net name="V3" isPowerNet />
			<net name="CC2" />
			<net name="CC1" />
			{/* Solid connections, not thermal spokes. All outlines stop north of
			    the documented all-layer antenna exclusion at Y=-22.9 mm. */}
			<copperpour
				name="GND_TOP"
				connectsTo="net.GND"
				layer="top"
				clearance="0.3mm"
				boardEdgeMargin="0.3mm"
				outline={[
					{ x: -17, y: -22.6 },
					{ x: 17, y: -22.6 },
					{ x: 17, y: 27 },
					{ x: -17, y: 27 },
				]}
			/>
			<copperpour
				name="GND_BOTTOM"
				connectsTo="net.GND"
				layer="bottom"
				clearance="0.3mm"
				boardEdgeMargin="0.3mm"
				outline={[
					{ x: -17, y: -22.6 },
					{ x: 17, y: -22.6 },
					{ x: 17, y: 27 },
					{ x: -17, y: 27 },
				]}
			/>
			{/* Intentional same-net overlap reserves solid TOP copper at the exposed
			    thermal land; all three native GND planes remain fitted. */}
			<copperpour
				name="CHARGER_GND_PLANE"
				unbroken={false}
				boardEdgeMargin="0mm"
				connectsTo="net.GND"
				layer="top"
				clearance="0.3mm"
				outline={[
					{ x: -0.77, y: 12.53 },
					{ x: 0.77, y: 12.53 },
					{ x: 0.77, y: 13.47 },
					{ x: -0.77, y: 13.47 },
				]}
			/>
			<schematicsheet
				name="Power"
				displayName="USB-C, charge and regulated power"
				sheetIndex={0}
				sheetSize="A4"
			>
				<fanout
					name="USB_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={usbEscapePaths}
				>
					<USB4215_03_A
						name="J1"
						noConnect={["pin19", "pin21", "pin22", "pin23", "pin24", "pin25"]}
						pcbX="0mm"
						pcbY="23.9852mm"
						pcbRotation={180}
						schX={-8}
						schY={3}
						connections={{
							pin13: "net.GND",
							pin14: "net.GND",
							pin15: "net.GND",
							pin16: "net.GND",
							pin17: "net.GND",
							pin18: "net.USB5V",
							pin20: "net.CC1",
							pin26: "net.CC2",
							pin27: "net.USB5V",
							pin28: "net.GND",
						}}
					/>
				</fanout>
				<A_0603WAF5101T5E
					name="R1"
					schRotation={-90}
					pcbX="-4mm"
					pcbY="19mm"
					schX={-4}
					schY={4}
					connections={{ pin1: "net.CC1", pin2: "net.GND" }}
				/>
				<A_0603WAF5101T5E
					name="R2"
					schRotation={-90}
					pcbX="0mm"
					pcbY="19mm"
					schX={-4}
					schY={2}
					connections={{ pin1: "net.CC2", pin2: "net.GND" }}
				/>
				<fanout
					name="CHARGER_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={chargerEscapePaths}
				>
					<BQ25185DLHR
						name="U2"
						pcbSx={{
							"& smtpad": { solderPasteMargin: 0 },
							"& footprint smtpad[portHints='pin11']": {
								solderPasteMargin: "-0.1mm",
							},
						}}
						pinAttributes={{
							pin1: { isOutput: true },
							SYS: { isOutput: true },
							pin2: { isBidirectional: true },
							BAT: { isBidirectional: true },
							pin3: { isOutput: true },
							STAT2: { isOutput: true },
							pin4: { isInput: true },
							N_CE: { isInput: true },
							pin5: { requiresGround: true },
							GND: { requiresGround: true },
							pin6: { isInput: true },
							TS: { isInput: true },
							MR: { isInput: true },
							pin7: { isInput: true },
							ILIM: { isInput: true },
							VSET: { isInput: true },
							pin8: { isInput: true },
							ISET: { isInput: true },
							pin9: { isOutput: true },
							STAT1: { isOutput: true },
							pin10: { requiresPower: true },
							IN: { requiresPower: true },
							pin11: { requiresGround: true },
							EP: { requiresGround: true },
						}}
						pcbX="0mm"
						pcbY="13mm"
						schX={1}
						schY={4}
						connections={{
							pin1: "net.CHARGER_SYS",
							pin2: "net.VBAT",
							pin3: "net.CHARGE_STAT",
							pin4: "net.CHARGE_DISABLE",
							pin5: "net.GND",
							pin6: "net.TS_BIAS",
							pin7: "net.VSET",
							pin8: "net.PROG",
							pin10: "net.USB5V",
							pin11: "net.GND",
						}}
					/>
				</fanout>
				<A_0603WAF1502T5E
					name="R3"
					schRotation={-90}
					pcbX="5.5mm"
					pcbY="9mm"
					schX={1}
					schY={1}
					connections={{ pin1: "net.PROG", pin2: "net.GND" }}
				/>
				<CL10A475KO8NNNC
					name="C1"
					schRotation={-90}
					pcbX="8mm"
					pcbY="20mm"
					schX={-2}
					schY={6}
					connections={{ pin1: "net.USB5V", pin2: "net.GND" }}
				/>
				<fanout
					name="C2_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={batteryCapEscapePaths}
				>
					<CL10A475KO8NNNC
						name="C2"
						schRotation={-90}
						pcbX="4.5mm"
						pcbY="11.5mm"
						schX={4}
						schY={6}
						connections={{ pin1: "net.VBAT", pin2: "net.GND" }}
					/>
				</fanout>
				<A_0603WAF1001T5E
					name="R4"
					schRotation={-90}
					pcbX="8mm"
					pcbY="23mm"
					schX={-2}
					schY={-1}
					connections={{ pin1: "net.VBAT", pin2: "net.CHARGE_LED_A" }}
				/>
				<KT_0603R
					name="LED1"
					pcbX="8mm"
					pcbY="26mm"
					schX={1}
					schY={-1}
					connections={{
						anode: "net.CHARGE_LED_A",
						cathode: "net.CHARGE_STAT",
					}}
				/>
				<S2B_PH_SM4_TB_LF__SN_
					name="J2"
					pcbX="-13.5mm"
					pcbY="12mm"
					schX={8}
					schY={4}
					connections={{
						pin1: "net.VBAT",
						pin2: "net.GND",
						pin3: "net.GND",
						pin4: "net.GND",
					}}
				/>

				<A_0603WAF1303T5E
					name="R8"
					schRotation={-90}
					pcbRotation={180}
					pcbX="-5mm"
					pcbY="16mm"
					schX={5}
					schY={0}
					connections={{ pin1: "net.VSET", pin2: "net.GND" }}
				/>
				<A_0603WAF1002T5E
					name="R9"
					schRotation={-90}
					pcbX="1mm"
					pcbY="17mm"
					schX={5}
					schY={-3}
					connections={{ pin1: "net.TS_BIAS", pin2: "net.GND" }}
				/>
				<CL21A106KAYNNNE
					name="C8"
					schRotation={-90}
					layer="top"
					pcbX="5mm"
					pcbY="17.5mm"
					schX={-3}
					schY={-4}
					connections={{ pin1: "net.CHARGER_SYS", pin2: "net.GND" }}
				/>
				<TCC0603COG470J500CT
					name="C9"
					schRotation={-90}
					pcbRotation={180}
					pcbX="-5mm"
					pcbY="11mm"
					schX={1}
					schY={-3}
					connections={{ pin1: "net.PROG", pin2: "net.GND" }}
				/>
			</schematicsheet>
			<schematicsheet
				name="Radio"
				displayName="Bluetooth HID, user controls and SWD"
				sheetIndex={1}
				sheetSize="A4"
			>
				<fanout
					name="RADIO_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={radioEscapePaths}
				>
					<E73_2G4M08S1C
						name="U1"
						pcbX="0mm"
						pcbY="-16mm"
						schX={0}
						schY={0}
						connections={{
							pin5: "net.GND",
							pin19: "net.V3",
							pin21: "net.GND",
							pin23: "net.V3",
							pin24: "net.GND",
							pin14: "net.SHUTTER",
							pin16: "net.PAIR",
							pin20: "net.STATUS_LED",
							pin26: "net.RESET_N",
							pin37: "net.SWDIO",
							pin39: "net.SWCLK",
						}}
					/>
				</fanout>
				<CC0603KRX7R9BB104
					name="C5"
					schRotation={-90}
					pcbX="0mm"
					pcbY="-4.5mm"
					schX={-6}
					schY={5}
					connections={{ pin1: "net.V3", pin2: "net.GND" }}
				/>
				<TS_1088_AR02016
					name="SW2"
					schRotation={-90}
					pcbX="-13.5mm"
					pcbY="-7mm"
					schX={-7}
					schY={1}
					connections={{ pin1: "net.SHUTTER", pin2: "net.GND" }}
				/>
				<TS_1088_AR02016
					name="SW3"
					schRotation={-90}
					pcbX="13.5mm"
					pcbY="-4mm"
					schX={-7}
					schY={-2}
					connections={{ pin1: "net.PAIR", pin2: "net.GND" }}
				/>
				<A_0603WAF1001T5E
					name="R7"
					pcbX="7mm"
					pcbY="-3mm"
					schX={6}
					schY={2}
					connections={{ pin1: "net.STATUS_LED", pin2: "net.STATUS_LED_A" }}
				/>
				<KT_0603R
					name="LED2"
					schRotation={-90}
					pcbX="10mm"
					pcbY="0mm"
					schX={9}
					schY={2}
					connections={{ anode: "net.STATUS_LED_A", cathode: "net.GND" }}
				/>
				<BM06B_SRSS_TB_LF__SN_
					name="J3"
					pcbX="13.2mm"
					pcbY="16mm"
					schX={7}
					schY={-4}
					connections={{
						pin1: "net.V3",
						pin2: "net.SWDIO",
						pin3: "net.GND",
						pin4: "net.SWCLK",
						pin5: "net.RESET_N",
						pin6: "net.GND",
						pin7: "net.GND",
						pin8: "net.GND",
					}}
				/>
			</schematicsheet>

			<schematicsheet
				name="Protection"
				displayName="Battery cutoff and automatic charge temperature window"
				sheetIndex={2}
				sheetSize="A4"
			>
				<MSK12C02
					name="SW1"
					pcbX="15mm"
					pcbY="5mm"
					pcbRotation={90}
					schX={-7}
					schY={-5}
					connections={{
						pin1: "net.BATTERY_OK",
						pin2: "net.POWER_SWITCH",
						pin3: "net.GND",
						pin4: "net.GND",
					}}
				/>
				<A_0603WAF1003T5E
					name="R5"
					pcbX="4mm"
					pcbY="3mm"
					pcbRotation={180}
					schX={-4}
					schY={-5}
					connections={{ pin1: "net.POWER_SWITCH", pin2: "net.REG_EN" }}
				/>
				<A_2N7002
					name="Q1"
					pinAttributes={{
						pin1: { isInput: true },
						G: { isInput: true },
						pin2: { requiresGround: true },
						S: { requiresGround: true },
						pin3: { isOutput: true },
						D: { isOutput: true },
					}}
					pcbX="-6mm"
					pcbY="3.5mm"
					schX={-1}
					schY={-5}
					connections={{
						pin1: "net.USB5V",
						pin2: "net.GND",
						pin3: "net.REG_EN",
					}}
				/>
				<A_0603WAF1003T5E
					name="R6"
					schRotation={-90}
					pcbX="-6mm"
					pcbY="8mm"
					schX={-1}
					schY={-8}
					connections={{ pin1: "net.USB5V", pin2: "net.GND" }}
				/>
				<fanout
					name="REGULATOR_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={regulatorEscapePaths}
				>
					<TPS7A0230PDBVR
						name="U3"
						pinAttributes={{
							pin1: { requiresPower: true },
							IN: { requiresPower: true },
							pin2: { requiresGround: true },
							GND: { requiresGround: true },
							pin3: { isInput: true },
							EN: { isInput: true },
							pin4: { doNotConnect: true },
							NC: { doNotConnect: true },
							pin5: { providesPower: true },
							OUT: { providesPower: true },
						}}
						pcbX="-5mm"
						pcbY="0mm"
						schX={4}
						schY={-4}
						connections={{
							pin1: "net.VBAT",
							pin2: "net.GND",
							pin3: "net.REG_EN",
							pin5: "net.V3",
						}}
					/>
				</fanout>
				<CL10A475KO8NNNC
					name="C3"
					schRotation={-90}
					pcbX="-0.5mm"
					pcbY="2mm"
					schX={4}
					schY={9}
					connections={{ pin1: "net.VBAT", pin2: "net.GND" }}
				/>
				<CL10A475KO8NNNC
					name="C4"
					schRotation={-90}
					pcbX="-5mm"
					pcbY="-4mm"
					schX={6}
					schY={-8}
					connections={{ pin1: "net.V3", pin2: "net.GND" }}
				/>

				<TPS3839G33DBZR
					name="U4"
					pcbX="-9.5mm"
					pcbY="-1mm"
					schX={-7}
					schY={7}
					connections={{
						pin1: "net.GND",
						pin2: "net.BATTERY_OK",
						pin3: "net.VBAT",
					}}
				/>
				<CC0603KRX7R9BB104
					name="C6"
					schRotation={-90}
					pcbX="-13mm"
					pcbY="2mm"
					schX={2}
					schY={9}
					connections={{ pin1: "net.VBAT", pin2: "net.GND" }}
				/>
				<fanout
					name="SENSOR_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={sensorEscapePaths}
				>
					<TMP390A2DRLR
						name="U5"
						pcbX="0mm"
						pcbY="6mm"
						layer="top"
						schX={0}
						schY={2}
						connections={{
							pin1: "net.TEMP_SET_HOT",
							pin2: "net.TEMP_SET_COLD",
							pin3: "net.GND",
							pin4: "net.TEMP_OK",
							pin5: "net.USB5V",
							pin6: "net.TEMP_OK",
						}}
					/>
				</fanout>
				<fanout
					name="HOT_SET_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={temperatureEscapePaths}
				>
					<A_0603WAF1621T5E
						name="R10"
						schRotation={-90}
						pcbX="-5.5mm"
						pcbY="6mm"
						layer="top"
						schX={-4}
						schY={3}
						connections={{ pin1: "net.TEMP_SET_HOT", pin2: "net.GND" }}
					/>
				</fanout>
				<A_0603WAF1872T5E
					name="R11"
					schRotation={-90}
					pcbX="4.5mm"
					pcbY="5.5mm"
					layer="top"
					schX={-4}
					schY={1}
					connections={{ pin1: "net.TEMP_SET_COLD", pin2: "net.GND" }}
				/>
				<fanout
					name="C7_ESCAPE"
					pcbX={0}
					pcbY={0}
					pcbTracePaths={sensorCapEscapePaths}
				>
					<CC0603KRX7R9BB104
						name="C7"
						schRotation={-90}
						pcbX="1.5mm"
						pcbY="8.5mm"
						layer="top"
						schX={0}
						schY={6}
						connections={{ pin1: "net.USB5V", pin2: "net.GND" }}
					/>
				</fanout>
				<A_0603WAF1003T5E
					name="R12"
					schRotation={-90}
					layer="top"
					pcbX="9.5mm"
					pcbY="10mm"
					schX={4}
					schY={4}
					connections={{ pin1: "net.USB5V", pin2: "net.TEMP_OK" }}
				/>
				<A_0603WAF1003T5E
					name="R13"
					schRotation={-90}
					layer="top"
					pcbRotation={180}
					pcbX="8mm"
					pcbY="12mm"
					schX={8}
					schY={4}
					connections={{ pin1: "net.USB5V", pin2: "net.CHARGE_DISABLE" }}
				/>
				<A_2N7002
					name="Q2"
					pinAttributes={{
						pin1: { isInput: true },
						G: { isInput: true },
						pin2: { requiresGround: true },
						S: { requiresGround: true },
						pin3: { isOutput: true },
						D: { isOutput: true },
					}}
					layer="top"
					pcbX="8mm"
					pcbY="6mm"
					schX={8}
					schY={0}
					connections={{
						pin1: "net.TEMP_OK",
						pin2: "net.GND",
						pin3: "net.CHARGE_DISABLE",
					}}
				/>
			</schematicsheet>
			<hole name="H1" pcbX="-13mm" pcbY="24mm" diameter="2.2mm" />
			<hole name="H2" pcbX="13mm" pcbY="24mm" diameter="2.2mm" />
			{/* The antenna's own body occupies this region; its copper pads do not.
          Every other placement and all board copper remain prohibited. */}
			<keepout
				shape="rect"
				pcbX="0mm"
				pcbY="-25.45mm"
				width="36mm"
				height="5.1mm"
				layers={["top", "bottom"]}
				excludeRefs={[".U1"]}
			/>
		</board>
	);
}