abse/smartwatch-v1-pcb
Routed bare ESP32-S3 smartwatch with SDR PSRAM, touch AMOLED, Qi receiver and compact/exploded 39 × 50.5 × 14.5 mm provisional assembly.
- Version
- 0.2.0
- License
- unset
- Stars
- 0
historical-module.circuit.tsx
import { LC_OPEN_SF32LB52_MOD_N16R8 } from './imports/LC_OPEN_SF32LB52_MOD_N16R8'
import { BMI270 } from './imports/BMI270'
import { LIS2MDLTR } from './imports/LIS2MDLTR'
import { VEML6030 } from './imports/VEML6030'
import { BQ24074RGTR } from './imports/BQ24074RGTR'
import { TPS63802DLAR } from './imports/TPS63802DLAR'
import { MAX17048G_T10 } from './imports/MAX17048G_T10'
import { DRV2605LDGSR } from './imports/DRV2605LDGSR'
import { TPS7A0233PDBVR } from './imports/TPS7A0233PDBVR'
import { TPS7A0218PDBVR } from './imports/TPS7A0218PDBVR'
import { TPS7A0228PDBVR } from './imports/TPS7A0228PDBVR'
import { TLV75801PDBVR } from './imports/TLV75801PDBVR'
import { TXS0108EPWR } from './imports/TXS0108EPWR'
import { ZSPD4003LG } from './imports/ZSPD4003LG'
import { SH_FPC_05FB_18P_H10 } from './imports/SH_FPC_05FB_18P_H10'
import { LESD5Z5_0CT1G } from './imports/LESD5Z5_0CT1G'
import { AO3400A } from './imports/AO3400A'
import { BSS138 } from './imports/BSS138'
import { TLV7041DCKR } from './imports/TLV7041DCKR'
import { SKRTLBE010 } from './imports/SKRTLBE010'
import { WirePads, DockPads, ProbePad } from './components/BoardPads'
import { SLO201610TR47MTT } from './components/SLO201610TR47MTT'
import placement from './placement.json'
import acceptedRouting from './routing/accepted/cache.json'
import {createSavedAutorouter} from './routing/SavedAutorouter'
import { SM03B_SURS_TF_LF__SN_ } from './imports/SM03B_SURS_TF_LF__SN_'
import { Fragment } from 'react'
import type { AutorouterConfig, FanoutTracePath } from '@tscircuit/props'
import groundPaths from './routing/ground-paths.json'
import groundManifest from './routing/ground-manifest.json'
// Numbered pins are deliberate: connectivity can be audited independently of
// EasyEDA's labels and of generated schematic graphics.
export const pinNets: Record<string, Record<number,string>> = {
M1:{1:'GND',7:'TP_INT',8:'SCL',9:'SDA',11:'TP_SCL',14:'KEY',15:'TP_SDA',25:'IMU_INT',26:'GND',27:'VSYS',28:'HAPTIC_EN',29:'UART_TX',30:'UART_RX',35:'GND',38:'TP_RST',41:'LCD_DC_M',42:'LCD_MOSI_M',43:'LCD_CLK_M',44:'LCD_CS_M',46:'BL_PWM',47:'LCD_RST_M',48:'GND',61:'BAT',10:'DISP_EN',16:'XLATE_DISABLE',4:'CHARGE_INHIBIT',3:'PPG_INT',18:'GAUGE_INT',19:'CHG_STATUS',20:'PGOOD',21:'MAG_INT',22:'ALS_INT'},
U2:{1:'GND',4:'IMU_INT',5:'V3V3',6:'GND',7:'GND',8:'V3V3',12:'V3V3',13:'SCL',14:'SDA'},
U3:{1:'SCL',3:'V3V3',4:'SDA',5:'MAG_CAP',6:'GND',7:'MAG_INT',8:'GND',9:'V3V3',10:'V3V3'},
U4:{1:'GND',2:'SDA',3:'ALS_INT',4:'GND',5:'SCL',6:'V3V3'},
U6:{1:'CHARGER_TS',2:'BAT',3:'BAT',4:'CHARGE_CE',5:'RAW',6:'GND',7:'PGOOD',8:'GND',9:'CHG_STATUS',10:'RAW',11:'RAW',12:'ILIM',13:'DOCK_5V',16:'ISET',17:'GND'},
U7:{1:'RAW',2:'GND',3:'GND',4:'FB_SYS',5:'SYS_PG',6:'VSYS',7:'SW_NODE2',8:'GND',9:'SW_NODE1',10:'RAW'},
U8:{1:'GND',2:'BAT',3:'BAT',4:'GND',5:'GAUGE_INT',6:'GND',7:'SCL',8:'SDA',9:'GND'},
U9:{1:'HAP_REG',2:'SCL',3:'SDA',4:'GND',5:'HAPTIC_EN',6:'V3V3',7:'MOTOR_P',8:'GND',9:'MOTOR_N',10:'V3V3'},
U10:{1:'VSYS',2:'GND',3:'VSYS',5:'V3V3'},
U11:{1:'VSYS',2:'GND',3:'VSYS',5:'V1V8'},
U12:{1:'VSYS',2:'GND',3:'DISP_EN',4:'FB_LCD',5:'LCD_VCC'},
U13:{1:'LCD_DC',2:'V2V8',3:'LCD_CS',4:'LCD_CLK',5:'LCD_MOSI',6:'LCD_RST',10:'XLATE_OE',11:'GND',15:'LCD_RST_M',16:'LCD_MOSI_M',17:'LCD_CLK_M',18:'LCD_CS_M',19:'V3V3',20:'LCD_DC_M'},
U14:{1:'SCL',2:'PPG_INT',3:'GND',4:'V3V3',5:'V1V8',6:'GND',8:'PPG_REF',10:'V1V8',11:'GND',12:'SDA',13:'V3V3'},
U16:{1:'VSYS',2:'GND',3:'DISP_EN',5:'V2V8'},
U17:{1:'TEMP_OK',2:'GND',3:'COLD_REF',4:'NTC',5:'V3V3'},
U18:{1:'TEMP_OK',2:'GND',3:'NTC',4:'HOT_REF',5:'V3V3'},
Q1:{1:'BL_PWM',2:'GND',3:'BL_DRAIN'},
Q2:{1:'XLATE_DISABLE',2:'GND',3:'XLATE_OE'},
Q3:{1:'TEMP_OK',2:'GND',3:'CHARGE_CE'},
Q4:{1:'CHARGE_INHIBIT',2:'GND',3:'TEMP_OK'},
D1:{1:'GND',2:'DOCK_5V'},
J1:{1:'GND',2:'BL_K',3:'LCD_VCC',4:'V2V8',5:'GND',6:'GND',7:'LCD_DC',8:'LCD_CS',9:'LCD_CLK',10:'LCD_MOSI',11:'LCD_RST',12:'GND',13:'TP_SCL',14:'TP_SDA',15:'TP_RST',16:'TP_INT',17:'V3V3',18:'GND',19:'GND',20:'GND'},
J2:{1:'DOCK_5V',2:'GND'}, J3:{1:'BAT',2:'GND'}, J4:{1:'MOTOR_P',2:'MOTOR_N'},
SW1:{1:'KEY',2:'V3V3',3:'KEY',4:'GND',5:'GND'},
L1:{1:'SW_NODE1',2:'SW_NODE2'},
}
for (let p=49;p<=60;p++) pinNets.M1[p]='GND'
type Passive = {name:string,value:string,part:string,x:number,y:number,rot?:number,layer?:'top'|'bottom',a:string,b:string,footprint?:string,mpn?:string}
export const resistors:Passive[] = [
{name:'R1',value:'470k',part:'C25790',x:7,y:-16.1,a:'VSYS',b:'FB_SYS_1'},
{name:'R2',value:'100k',part:'C25741',x:7,y:-15.1,a:'FB_SYS_1',b:'FB_SYS_2'},
{name:'R3',value:'100k',part:'C25741',x:7,y:-14.1,a:'FB_SYS_2',b:'FB_SYS'},
{name:'R4',value:'100k',part:'C25741',x:7,y:-13.1,a:'FB_SYS',b:'GND'},
// 0.5*(1+670k/100k)=3.85 V. EN high, MODE low for PFM.
{name:'R5',value:'10k',part:'C25744',x:-14,y:-15.7,a:'ISET',b:'GND'},
{name:'R6',value:'47k',part:'C25792',x:-14,y:-16.7,a:'ISET',b:'GND'},
// ISET=10k||47k: 108 mA typical, under cell's 390 mA maximum.
{name:'R7',value:'10k',part:'C25744',x:-8,y:-12.3,a:'ILIM',b:'GND'},
{name:'R8',value:'10k',part:'C25744',x:-8,y:-13.3,a:'ILIM',b:'GND'},
{name:'R9',value:'10k',part:'C25744',x:-14,y:-14.7,a:'CHARGER_TS',b:'GND'},
// External window comparators enforce battery temperature; TS is held valid.
{name:'R10',value:'10k',part:'C25744',x:-8,y:-17.8,a:'RAW',b:'CHARGE_CE'},
{name:'R11',value:'100k',part:'C25741',x:-7,y:-16.6,a:'TEMP_OK',b:'GND'},
{name:'R12',value:'10k',part:'C25744',x:-7,y:-15.6,a:'V3V3',b:'TEMP_OK'},
{name:'R13',value:'10k',part:'C25744',x:-11,y:-17.8,a:'V3V3',b:'NTC'},
{name:'R14',value:'10k',part:'C25744',x:-15.3,y:-11.7,a:'V3V3',b:'COLD_REF'},
{name:'R15',value:'10k',part:'C25744',x:-15.3,y:-12.7,a:'COLD_REF',b:'COLD_MID'},
{name:'R16',value:'10k',part:'C25744',x:-15.3,y:-13.7,a:'COLD_MID',b:'GND'},
{name:'R17',value:'10k',part:'C25744',x:-4,y:-12.5,a:'V3V3',b:'HOT_MID'},
{name:'R18',value:'10k',part:'C25744',x:-4,y:-13.5,a:'HOT_MID',b:'HOT_REF'},
{name:'R19',value:'10k',part:'C25744',x:-4,y:-14.5,a:'HOT_REF',b:'HOT_LOW'},
{name:'R20',value:'1k',part:'C11702',x:-4,y:-15.5,a:'HOT_LOW',b:'GND'},
{name:'R21',value:'100k',part:'C25741',x:-4,y:-16.5,a:'CHARGE_INHIBIT',b:'GND'},
{name:'R22',value:'100k',part:'C25741',x:10.5,y:-5.7,a:'DISP_EN',b:'GND'},
{name:'R23',value:'470k',part:'C25790',x:15.2,y:-8.1,a:'LCD_VCC',b:'FB_LCD'},
{name:'R24',value:'100k',part:'C25741',x:15.2,y:-9.1,a:'FB_LCD',b:'FB_LCD_LOW'},
{name:'R25',value:'1k',part:'C11702',x:15.2,y:-10.1,a:'FB_LCD_LOW',b:'GND'},
// 0.55*(1+470k/101k)=3.109 V; below conservative 3.2 V ceiling.
// 0.5 W 0805: LED-short worst case is 3.193^2/(33*0.99)=0.312 W.
{name:'R26',value:'33',part:'C441971',mpn:'ERJP06F33R0V',footprint:'0805',x:8.5,y:-3.1,a:'BL_K',b:'BL_DRAIN'},
{name:'R27',value:'100k',part:'C25741',x:6.5,y:-4.1,a:'BL_PWM',b:'GND'},
{name:'R28',value:'10k',part:'C25744',x:8.5,y:4.8,a:'V2V8',b:'XLATE_OE'},
{name:'R29',value:'100k',part:'C25741',x:8.5,y:5.8,a:'V3V3',b:'XLATE_DISABLE'},
{name:'R30',value:'10k',part:'C25744',x:6.5,y:8.6,a:'V3V3',b:'SCL'},
{name:'R31',value:'10k',part:'C25744',x:6.5,y:9.6,a:'V3V3',b:'SDA'},
{name:'R32',value:'10k',part:'C25744',x:10,y:13.8,a:'V3V3',b:'TP_SCL'},
{name:'R33',value:'10k',part:'C25744',x:10,y:14.8,a:'V3V3',b:'TP_SDA'},
{name:'R34',value:'10k',part:'C25744',x:12.5,y:13.8,a:'V3V3',b:'TP_RST'},
{name:'R35',value:'10k',part:'C25744',x:12.5,y:14.8,a:'V3V3',b:'TP_INT'},
{name:'R36',value:'10k',part:'C25744',x:15.1,y:8.5,a:'GND',b:'KEY'},
{name:'R37',value:'100k',part:'C25741',x:2.5,y:-17.8,a:'HAPTIC_EN',b:'GND'},
{name:'R38',value:'10k',part:'C25744',x:-10,y:-12.3,a:'V3V3',b:'CHG_STATUS'},
{name:'R39',value:'10k',part:'C25744',x:-10,y:-13.3,a:'V3V3',b:'PGOOD'},
{name:'R40',value:'10k',part:'C25744',x:9,y:-11.9,a:'V3V3',b:'GAUGE_INT'},
{name:'R41',value:'10k',part:'C25744',x:14.5,y:5.9,a:'V3V3',b:'PPG_INT'},
{name:'R42',value:'10k',part:'C25744',x:15.1,y:10,a:'V3V3',b:'ALS_INT'},
{name:'R43',value:'10k',part:'C25744',x:15.1,y:11,a:'V3V3',b:'MAG_INT'},
{name:'R44',value:'10k',part:'C25744',x:-14,y:-17.8,a:'V3V3',b:'SYS_PG'},
{name:'TH1',value:'10k',part:'C700819',mpn:'QN0402X103F3435FA',x:12.1,y:-12.5,layer:'bottom',a:'NTC',b:'GND'},
]
// Stocked 0201 pull-ups and charge-temperature network free pad-escape space.
// Keep precision voltage feedback (R1-R4, R23-R25), NTC and 0.5W backlight 0402/0805.
const compactResistors:Record<string,{part:string,mpn:string}>={
'10k':{part:'C473048',mpn:'0201WMF1002TEE'},
'100k':{part:'C270364',mpn:'0201WMF1003TEE'},
'47k':{part:'C270345',mpn:'0201WMF4702TEE'},
'1k':{part:'C270365',mpn:'0201WMF1001TEE'},
}
for(const p of resistors)if(!['R1','R2','R3','R4','R23','R24','R25','R26','TH1'].includes(p.name)){
Object.assign(p,compactResistors[p.value],{footprint:'0201'})
}
const cap=(name:string,value:string,part:string,x:number,y:number,a:string,footprint='0402',rot=0):Passive=>({name,value,part,x,y,a,b:'GND',footprint,rot})
export const capacitors:Passive[] = [
cap('C1','4.7uF','C23733',-.5,-11.8,'VSYS'),cap('C2','100nF','C1525',1,-11.8,'VSYS'),cap('C3','100nF','C1525',-12.3,-10.2,'BAT'),
cap('C4','100nF','C1525',10.2,7.8,'V3V3'),cap('C5','100nF','C1525',10.2,6.8,'V3V3'),
cap('C6','100nF','C1525',12.8,9.3,'V3V3'),cap('C7','100nF','C1525',12.8,10.3,'V3V3'),cap('C8','220nF','C16772',11.5,9.3,'MAG_CAP'),cap('C9','10uF','C19702',11.5,11.3,'V3V3','0603'),
cap('C10','100nF','C1525',15.1,12.3,'V3V3'),
cap('C11','4.7uF','C23733',-11.5,-11.8,'DOCK_5V'),cap('C12','10uF','C19702',-11.5,-16.8,'BAT','0603'),cap('C13','10uF','C19702',-8,-14.6,'RAW','0603'),
cap('C14','10uF','C19702',4,-12.7,'RAW','0603'),cap('C15','10uF','C19702',4,-11.6,'RAW','0603'),
cap('C16','22uF','C45783',4,-17.8,'VSYS','0805'),cap('C17','22uF','C45783',4,-16.2,'VSYS','0805'),
cap('C18','100nF','C1525',10.5,-11.5,'BAT'),cap('C19','1uF','C52923',-.5,-14.2,'HAP_REG'),cap('C20','1uF','C52923',3,-14.2,'V3V3'),
cap('C21','4.7uF','C23733',7.2,-7.8,'VSYS'),cap('C22','4.7uF','C23733',8.5,-9.2,'V3V3'),
cap('C23','4.7uF','C23733',7.2,-10.2,'VSYS'),cap('C24','4.7uF','C23733',8.5,-10.2,'V1V8'),
cap('C25','4.7uF','C23733',10.5,-6.7,'VSYS'),cap('C26','4.7uF','C23733',15.2,-6.7,'LCD_VCC'),
cap('C27','100nF','C1525',7.2,3.5,'V2V8'),cap('C28','100nF','C1525',14.2,3.5,'V3V3'),
cap('C29','100nF','C1525',14.7,-4.8,'V1V8'),cap('C30','100nF','C1525',15.9,-4.8,'V1V8'),cap('C31','100nF','C1525',14.7,4.8,'V3V3'),cap('C32','4.7uF','C23733',15.9,4.8,'V3V3'),cap('C33','1uF','C52923',13.8,-4.8,'PPG_REF'),
cap('C34','4.7uF','C23733',15.2,-14.5,'VSYS'),cap('C35','4.7uF','C23733',10.5,-14.5,'V2V8'),
cap('C36','100nF','C1525',-10,-15.4,'V3V3'),cap('C37','100nF','C1525',-5.5,-11.8,'V3V3'),
]
for (const p of [...resistors,...capacitors]) pinNets[p.name]={1:p.a,2:p.b}
// UART cable series termination, recommended by the module manufacturer.
// Appended after the existing components so saved port identifiers stay stable.
export const uartResistors:Passive[] = [
{name:'R45',value:'100',part:'C25076',mpn:'0402WGF1000TCE',x:-8.7,y:-16,a:'UART_TX',b:'UART_CABLE_TX'},
{name:'R46',value:'100',part:'C25076',mpn:'0402WGF1000TCE',x:-8.7,y:-17,a:'UART_RX',b:'UART_CABLE_RX'},
]
for(const p of uartResistors) pinNets[p.name]={1:p.a,2:p.b}
// Three contacts: ground, watch TX, watch RX. Pins 4/5 are mechanical tabs.
pinNets.J5={1:'GND',2:'UART_CABLE_TX',3:'UART_CABLE_RX',4:'GND',5:'GND'}
const pins=(ref:string)=>Object.fromEntries(Object.entries(pinNets[ref]??{}).map(([p,n])=>[`pin${p}`,`net.${n}`]))
type NumberedPin<N extends number,A extends number[]=[]> = A['length'] extends N ? `pin${Exclude<A[number],0>|N}` : NumberedPin<N,[...A,A['length']]>
const nc=<N extends number>(ref:string,count:N):NumberedPin<N>[]=>Array.from({length:count},(_,i)=>`pin${i+1}`).filter(p=>!pins(ref)[p]) as NumberedPin<N>[]
const symbolPosition=(i:number)=>({schX:(i%5)*12,schY:-Math.floor(i/5)*10})
type PlacementCoordinates={pcbX:number,pcbY:number,layer:'top'|'bottom',pcbRotation?:number}
export default function SmartwatchBoard({groundFanout=false,savedGround=false,routerVersion='beta_pipeline9',cacheFn=async input=>createSavedAutorouter(input,acceptedRouting),repairNets=[],placementOverride}:{groundFanout?:boolean,savedGround?:boolean,routerVersion?:'beta_pipeline7'|'beta_pipeline9',cacheFn?:AutorouterConfig['algorithmFn']|null,repairNets?:string[],placementOverride?:Record<string,PlacementCoordinates>}={}){
if(savedGround&&JSON.stringify(placement)!==JSON.stringify(groundManifest.placement))throw new Error('Ground route cache does not match placement.json. Recompute and recheck the routes before using this cache.')
if(savedGround&&(groundManifest.viaOuterMM!==0.45||groundManifest.viaHoleMM!==0.3))throw new Error('Ground route cache uses obsolete via dimensions. Regenerate it for 0.45 mm copper / 0.30 mm drill.')
const activePlacement:Record<string,PlacementCoordinates>=placementOverride??placement as Record<string,PlacementCoordinates>
const at=(ref:string)=>activePlacement[ref]
const common={pcbStyle:{silkscreenTextVisibility:'hidden' as const}}
return <board width="34mm" height="38mm" borderRadius="3mm" thickness="0.8mm" layers={4}
title="Smartwatch V1 — engineering prototype draft" doubleSidedAssembly
fabricatorPreset="jlcpcb_standard" defaultTraceWidth="0.15mm" minTraceWidth="0.127mm"
minTraceToPadEdgeClearance="0.127mm" minPadEdgeToPadEdgeClearance="0.127mm"
minBoardEdgeClearance="0.3mm" minViaHoleDiameter="0.3mm" minViaPadDiameter="0.45mm"
minViaEdgeToPadEdgeClearance="0.127mm" minTraceToHoleEdgeClearance="0.25mm"
minViaHoleEdgeToViaHoleEdgeClearance="0.2mm" minPlatedHoleDrillEdgeToDrillEdgeClearance="0.2mm"
allowBlindAndBuriedVias={false} isViaInPadAllowed={false} defaultViaTenting="both_sides"
autorouter={{preset:'auto_local',local:true,allowViaInPad:false,traceClearance:'0.127mm'}} autorouterEffortLevel="2x" autorouterVersion={routerVersion}
schAutoLayoutEnabled schTraceAutoLabelEnabled>
{cacheFn&&<autoroutingphase name="Saved routing checkpoint" phaseIndex={0} algorithmFn={cacheFn}/>}
{cacheFn&&repairNets.length>0&&<autoroutingphase name="Reroute failing connections" phaseIndex={1} connections={repairNets.map(n=>`net.${n}`)} reroute/>}
{groundFanout&&<autoroutingphase name="Ground escape to plane" phaseIndex={0} connection="net.GND" autorouter="fanout" fanoutPourNetMap={{inner1:'GND'}} pcbTracePaths={savedGround?groundPaths as FanoutTracePath[]:undefined}/>}
{Object.values(pinNets).flatMap(Object.values).filter((n,i,a)=>a.indexOf(n)===i).map(n=><Fragment key={n}><net name={n} routingPhaseIndex={cacheFn||groundFanout&&n==='GND'?0:undefined} isGroundNet={n==='GND'} isPowerNet={['BAT','RAW','VSYS','V3V3','V1V8','V2V8','LCD_VCC','DOCK_5V'].includes(n)} nominalTraceWidth={['BAT','RAW','VSYS','DOCK_5V','SW_NODE1','SW_NODE2'].includes(n)?'0.35mm':'0.15mm'}/></Fragment>)}
<LC_OPEN_SF32LB52_MOD_N16R8 name="M1" {...symbolPosition(0)} {...common} connections={pins('M1')} {...at('M1')} noConnect={nc('M1',68)}/>
<BMI270 name="U2" {...symbolPosition(1)} {...common} connections={pins('U2')} {...at('U2')} noConnect={nc('U2',14)}/>
<LIS2MDLTR name="U3" {...symbolPosition(2)} {...common} connections={pins('U3')} {...at('U3')} noConnect={nc('U3',12)}/>
<VEML6030 name="U4" {...symbolPosition(3)} {...common} connections={pins('U4')} {...at('U4')}/>
<BQ24074RGTR name="U6" {...symbolPosition(4)} {...common} connections={pins('U6')} {...at('U6')} noConnect={nc('U6',17)}/>
<TPS63802DLAR name="U7" {...symbolPosition(5)} {...common} connections={pins('U7')} {...at('U7')}/>
<SLO201610TR47MTT name="L1" inductance="470nH" {...common} connections={pins('L1')} {...at('L1')}/>
<MAX17048G_T10 name="U8" {...symbolPosition(6)} {...common} connections={pins('U8')} {...at('U8')}/>
<DRV2605LDGSR name="U9" pcbRotation={90} {...symbolPosition(7)} {...common} connections={pins('U9')} {...at('U9')}/>
<TPS7A0233PDBVR name="U10" pcbRotation={90} {...symbolPosition(8)} {...common} connections={pins('U10')} {...at('U10')} noConnect={nc('U10',5)}/>
<TPS7A0218PDBVR name="U11" pcbRotation={90} {...symbolPosition(9)} {...common} connections={pins('U11')} {...at('U11')} noConnect={nc('U11',5)}/>
<TLV75801PDBVR name="U12" {...symbolPosition(10)} {...common} connections={pins('U12')} {...at('U12')}/>
<TXS0108EPWR name="U13" {...symbolPosition(11)} {...common} connections={pins('U13')} {...at('U13')} pcbRotation={0} noConnect={nc('U13',20)}/>
<ZSPD4003LG name="U14" pcbRotation={90} {...symbolPosition(12)} {...common} connections={pins('U14')} {...at('U14')} noConnect={nc('U14',13)}/>
<TPS7A0228PDBVR name="U16" {...symbolPosition(13)} {...common} connections={pins('U16')} {...at('U16')} noConnect={nc('U16',5)}/>
<TLV7041DCKR name="U17" {...symbolPosition(14)} {...common} connections={pins('U17')} {...at('U17')}/>
<TLV7041DCKR name="U18" {...symbolPosition(15)} {...common} connections={pins('U18')} {...at('U18')}/>
<AO3400A name="Q1" {...symbolPosition(16)} {...common} connections={pins('Q1')} {...at('Q1')}/>
<BSS138 name="Q2" {...symbolPosition(17)} {...common} connections={pins('Q2')} {...at('Q2')}/>
<BSS138 name="Q3" {...symbolPosition(18)} {...common} connections={pins('Q3')} {...at('Q3')}/>
<BSS138 name="Q4" {...symbolPosition(19)} {...common} connections={pins('Q4')} {...at('Q4')}/>
<LESD5Z5_0CT1G name="D1" {...symbolPosition(20)} {...common} connections={pins('D1')} {...at('D1')}/>
<SH_FPC_05FB_18P_H10 name="J1" pcbRotation={0} {...symbolPosition(21)} {...common} connections={pins('J1')} {...at('J1')}/>
<SKRTLBE010 name="SW1" pcbRotation={90} {...symbolPosition(22)} {...common} connections={pins('SW1')} {...at('SW1')}/>
<DockPads name="J2" pcbRotation={90} {...symbolPosition(23)} connections={pins('J2')} {...at('J2')}/>
<WirePads name="J3" pinAttributes={{pin1:{},pin2:{requiresGround:true},POS:{},NEG:{requiresGround:true}}} {...symbolPosition(24)} connections={pins('J3')} {...at('J3')}/>
<WirePads name="J4" {...symbolPosition(25)} connections={pins('J4')} {...at('J4')}/>
{resistors.map((p,i)=><resistor key={p.name} name={p.name} resistance={p.value} footprint={p.footprint??'0402'} manufacturerPartNumber={p.mpn??`0402WGF${{'10k':'1002','100k':'1003','470k':'4703','47k':'4702','1k':'1001','33':'330J'}[p.value]}TCE`} supplierPartNumbers={{jlcpcb:[p.part]}} pcbRotation={p.rot??0} {...symbolPosition(i+26)} {...common} connections={pins(p.name)} {...at(p.name)}/>)}
{capacitors.map((p,i)=><capacitor key={p.name} name={p.name} capacitance={p.value} footprint={p.footprint} supplierPartNumbers={{jlcpcb:[p.part]}} pcbRotation={p.rot??0} {...symbolPosition(i+71)} {...common} connections={pins(p.name)} {...at(p.name)}/>)}
{['GND','V3V3','VSYS','UART_TX','UART_RX','KEY'].map((n,i)=><ProbePad key={n} name={`TP${i+1}`} connections={{pin1:`net.${n}`}} {...at(`TP${i+1}`)}/>)}
{uartResistors.map((p,i)=><resistor key={p.name} name={p.name} resistance={p.value} footprint="0402" manufacturerPartNumber={p.mpn} supplierPartNumbers={{jlcpcb:[p.part]}} {...symbolPosition(i+108)} {...common} connections={pins(p.name)} {...at(p.name)}/>)}
<SM03B_SURS_TF_LF__SN_ name="J5" {...symbolPosition(110)} {...common} connections={pins("J5")} {...at("J5")}/>
<keepout shape="rect" pcbX={-6} pcbY={15.5} width={20} height={8} layers={['top','inner1','inner2','bottom']} excludeRefs={['.M1']}/>
<copperpour name="GROUND_TOP" layer="top" connectsTo="net.GND" clearance="0.127mm" boardEdgeMargin="0.32mm"/>
<copperpour name="GROUND_INNER2" layer="inner2" connectsTo="net.GND" clearance="0.127mm" boardEdgeMargin="0.32mm"/>
<copperpour name="GROUND_PLANE" layer="inner1" connectsTo="net.GND" clearance="0.127mm" boardEdgeMargin="0.32mm"/>
<copperpour name="GROUND_BOTTOM" layer="bottom" connectsTo="net.GND" clearance="0.127mm" boardEdgeMargin="0.32mm"/>
</board>
}