abse/smartwatch-flex-top-only

Three-panel flex smartwatch with two parallel R3.9 bends, all components flat-top, low-profile JST connector harnesses, split heartbeat optical windows and screw-retained PCB mounting. Modeled 39 × 50.5 × 14.5mm prototype; 100% routing, zero native DRC and shorts. Hardware qualification pending.

Version
0.2.20
License
unset
Stars
0

baseline-electrical.ts

// 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'}