muse/esp32-eink-display

A 55×46 mm two-layer ESP32-S3 e-paper controller board with USB‑C power/programming, buck regulation, FPC display connector, UC8179-style boost/charge-pump circuitry, ESD protection, controls, and routed passive components.

Version
1.3.4
License
unset
Stars
0

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
// Muse e-paper rev D: direct GDEY075T7 FPC and UC8179 reference booster.
// All populated PCB packages imported by tsci import --jlcpcb --use-exact-footprint.
// Power topology: GDEY075T7 specification Rev1.0, page 40.
import { assembly } from "tscircuit"
import { createMuseRouter } from "./routing"
import { fpcFanout } from "./fpc-fanout"
import { ESP32_S3_WROOM_1_N8R8 as Esp32 } from "./imports/ESP32_S3_WROOM_1_N8R8"
import { TYPE_C_31_M_12 as UsbC } from "./imports/TYPE_C_31_M_12"
import { AP63203WU_7 as Buck } from "./imports/AP63203WU_7"
import { USBLC6_2SC6 as UsbEsd } from "./imports/USBLC6_2SC6"
import { SRN6028C_3R9M as BuckInductor } from "./imports/SRN6028C_3R9M"
import { CL31A226KAHNNNE as C22u } from "./imports/CL31A226KAHNNNE"
import { A_0603WAF5101T5E as R5k1 } from "./imports/A_0603WAF5101T5E"
import { A_0603WAF220JT5E as R22 } from "./imports/A_0603WAF220JT5E"
import { AFC07_S24ECA_00 as Fpc } from "./imports/AFC07_S24ECA_00"
import { AO3400A } from "./imports/AO3400A"
import { MWSA0503S_100MT as Inductor } from "./imports/MWSA0503S_100MT"
import { MBR0530T1G as Diode } from "./imports/MBR0530T1G"
import { TS_1088_AR02016 as Button } from "./imports/TS_1088_AR02016"
import { CC0603KRX7R9BB104 as C100n } from "./imports/CC0603KRX7R9BB104"
import { CL21B105KBFNNNE as C1u } from "./imports/CL21B105KBFNNNE"
import { CL31B475KBHNNNE as C4u7 } from "./imports/CL31B475KBHNNNE"
import { CL31A106KBHNNNE as C10u } from "./imports/CL31A106KBHNNNE"
import { A_0603WAF1004T5E as R1M } from "./imports/A_0603WAF1004T5E"
import { A_0603WAF1002T5E as R10k } from "./imports/A_0603WAF1002T5E"
import { RL1206FR_7W0R47L as SenseR } from "./imports/RL1206FR_7W0R47L"
const signals = [
  {pin:9,net:"EPD_BUSY",modulePin:21},
  {pin:10,net:"EPD_RST",modulePin:20},
  {pin:11,net:"EPD_DC",modulePin:19},
  {pin:12,net:"EPD_CS",modulePin:18},
  {pin:13,net:"EPD_SCLK",modulePin:7},
  {pin:14,net:"EPD_MOSI",modulePin:17},
]
const fpcPins = {
  pin1:"NC1",pin2:"GDR",pin3:"RESE",pin4:"NC4",pin5:"VSHR",
  pin6:"TSCL",pin7:"TSDA",pin8:"BS1",pin9:"BUSY",pin10:"RES",
  pin11:"DC",pin12:"CS",pin13:"SCL",pin14:"SDA",pin15:"VDDIO",
  pin16:"VCI",pin17:"VSS",pin18:"VDD",pin19:"VPP",pin20:"VSH1",
  pin21:"VGH",pin22:"VSL",pin23:"VGL",pin24:"VCOM",pin25:"MP1",pin26:"MP2",
}
const unusedPins = (labels: Record<string, string>, used: number[]) =>
  Object.fromEntries(Object.keys(labels).filter(pin => !used.includes(Number(pin.slice(3))))
    .map(pin => [pin, {doNotConnect: true}]))
const power = {schSheetName:"muse",schSectionName:"power"}
const usb = {schSheetName:"muse",schSectionName:"usb"}
const controller = {schSheetName:"muse",schSectionName:"controller"}
const display = {schSheetName:"muse",schSectionName:"display"}
const boost = {schSheetName:"muse",schSectionName:"boost"}
const controls = {schSheetName:"muse",schSectionName:"controls"}
export default function MuseEink() {
  return (
    <board pcbRelative width={55} height={46} thickness={1.6} layers={2}
      autorouter={{preset:"auto_local",traceClearance:0.15,allowViaInPad:false}}
      minTraceToPadEdgeClearance={0.15} minPadEdgeToPadEdgeClearance={0.15}
      minViaEdgeToPadEdgeClearance={0.2} minBoardEdgeClearance={0.3} minTraceToHoleEdgeClearance={0.3}
      minTraceWidth={0.15} minViaHoleDiameter={0.3} minViaPadDiameter={0.5}
      outline={[
        {x:-27.5,y:-23},{x:27.5,y:-23},{x:27.5,y:23},{x:-27.5,y:23},
      ]}>
      <autoroutingphase name="main" algorithmFn={createMuseRouter} />
      <schematicsheet name="muse" displayName="Muse e-paper / rev D" sheetSize="ANSI_B" sheetWidth={800} sheetHeight={550} />
      <schematicsection name="controller" displayName="ESP32-S3-WROOM-1-N8R8 / 8 MB flash + 8 MB PSRAM" />
      <schematicsection name="display" displayName="GDEY075T7 / 24-pin top-contact FPC / 4-wire SPI" />
      <schematicsection name="boost" displayName="UC8179 reference boost and negative charge pump" />
      <schematicsection name="power" displayName="USB 5 V to 3.3 V / AP63203 2 A buck" />
      <schematicsection name="usb" displayName="USB-C / native USB Serial-JTAG / ESD" />
      <schematicsection name="controls" displayName="3.3 V bypass and pairing" />
      <AO3400A name="Q1" pcbX={14} pcbY={9} schX={17} schY={-11} {...boost}
        connections={{pin1:"net.GDR",pin2:"net.RESE",pin3:"net.BOOST_SW"}} />
      <Esp32 name="U1" displayName="ESP32-S3 / N8R8"
        pcbX={-10} pcbY={12.5} schX={-15} schY={12} {...controller}
        pinAttributes={{...Object.fromEntries(Array.from({length:41},(_,i)=>i+1)
          .filter(pin=>![1,2,3,6,7,13,14,17,18,19,20,21,27,40,41].includes(pin))
          .map(pin=>[`pin${pin}`,{doNotConnect:true}])),
          pin1:{requiresGround:true},pin2:{requiresPower:true},pin40:{requiresGround:true},pin41:{requiresGround:true}}}
        connections={{pin1:"net.GND",pin2:"net.V3V3",pin3:"net.ESP_EN",
          pin13:"net.USB_DM_MCU",pin14:"net.USB_DP_MCU",pin27:"net.ESP_BOOT",
          pin40:"net.GND",pin41:"net.GND"}} />
      <UsbC name="J1" displayName="USB-C power / flash"
        pcbX={-23.3} pcbY={6} pcbRotation={-90} schX={-29} schY={12} {...usb}
        pinAttributes={{pin5:{doNotConnect:true},pin11:{doNotConnect:true}}}
        connections={{pin1:"net.GND",pin2:"net.GND",pin3:"net.GND",pin4:"net.GND",
          pin6:"net.CC1",pin12:"net.CC2",pin7:"net.USB_DM",pin9:"net.USB_DM",
          pin8:"net.USB_DP",pin10:"net.USB_DP",pin13:"net.GND",pin14:"net.GND",
          pin15:"net.V5_USB",pin16:"net.V5_USB"}} />
      <UsbEsd name="U3" displayName="USBLC6 ESD" pcbX={-23} pcbY={-2}
        pcbRotation={90} schX={-27} schY={1} {...usb}
        internallyConnectedPins={[[1,6],[3,4]]}
        connections={{pin1:"net.USB_DM",pin6:"net.USB_DM",pin3:"net.USB_DP",
          pin4:"net.USB_DP",pin2:"net.GND",pin5:"net.V5_USB"}} />
      <R22 name="R8" pcbX={-17.5} pcbY={1.5} schX={-23} schY={4} {...usb}
        connections={{pin1:"net.USB_DM",pin2:"net.USB_DM_MCU"}} />
      <R22 name="R9" pcbX={-17.5} pcbY={-0.5} schX={-23} schY={2} {...usb}
        connections={{pin1:"net.USB_DP",pin2:"net.USB_DP_MCU"}} />
      <R5k1 name="R6" pcbX={-23} pcbY={-5} schX={-33} schY={3} {...usb}
        connections={{pin1:"net.CC1",pin2:"net.GND"}} />
      <R5k1 name="R7" pcbX={-23} pcbY={-7} schX={-33} schY={0} {...usb}
        connections={{pin1:"net.CC2",pin2:"net.GND"}} />
      <C100n name="C22" maxVoltageRating={50} pcbX={-23} pcbY={-9}
        schX={-31} schY={-4} {...usb} connections={{pin1:"net.V5_USB",pin2:"net.GND"}} />
      <Buck name="U2" displayName="AP63203 / 3.3 V" pcbX={-16} pcbY={-8}
        schX={-24} schY={-12} {...power}
        connections={{pin1:"net.V3V3",pin2:"net.V5_USB",pin3:"net.V5_USB",
          pin4:"net.GND",pin5:"net.BUCK_SW",pin6:"net.BUCK_BST"}} />
      <BuckInductor name="L2" pcbX={-9} pcbY={-7} schX={-18} schY={-10} {...power}
        connections={{pin1:"net.BUCK_SW",pin2:"net.V3V3"}} />
      <C100n name="C17" maxVoltageRating={50} pcbX={-16} pcbY={-4.5}
        schX={-24} schY={-7} {...power} connections={{pin1:"net.BUCK_BST",pin2:"net.BUCK_SW"}} />
      <C10u name="C16" maxVoltageRating={50} pcbX={-17} pcbY={-12}
        schX={-29} schY={-12} {...power} connections={{pin1:"net.V5_USB",pin2:"net.GND"}} />
      {[{name:"C18",x:-2.5,y:-5.5,sx:-13},{name:"C19",x:-2.5,y:-8.5,sx:-9}].map(c=>
        <C22u key={c.name} name={c.name} maxVoltageRating={25} pcbX={c.x} pcbY={c.y}
          schX={c.sx} schY={-10} {...power} connections={{pin1:"net.V3V3",pin2:"net.GND"}} />)}
      <C10u name="C14" maxVoltageRating={50} pcbX={-23} pcbY={18.5} pcbRotation={180}
        schX={-20} schY={21} {...controller} connections={{pin1:"net.V3V3",pin2:"net.GND"}} />
      <C100n name="C15" maxVoltageRating={50} pcbX={-22.7} pcbY={21} pcbRotation={180}
        schX={-16} schY={21} {...controller} connections={{pin1:"net.V3V3",pin2:"net.GND"}} />
      <R10k name="R4" pcbX={-23} pcbY={16} schX={-9} schY={21} {...controller}
        connections={{pin1:"net.V3V3",pin2:"net.ESP_EN"}} />
      <C1u name="C20" maxVoltageRating={50} pcbX={-23} pcbY={13.5}
        schX={-5} schY={21} {...controller} connections={{pin1:"net.ESP_EN",pin2:"net.GND"}} />
      <Button name="SW2" displayName="RESET" pcbX={-17} pcbY={-19}
        schX={-6} schY={15} {...controller} connections={{pin1:"net.ESP_EN",pin2:"net.GND"}} />
      <R10k name="R5" pcbX={1} pcbY={1.5} schX={-8} schY={8} {...controller}
        connections={{pin1:"net.V3V3",pin2:"net.ESP_BOOT"}} />
      <Button name="SW3" displayName="BOOT" pcbX={-9} pcbY={-19}
        schX={-5} schY={5} {...controller} connections={{pin1:"net.ESP_BOOT",pin2:"net.GND"}} />
      <fanout pcbRelative name="FPC_ESCAPE" pcbX={14} pcbY={-19.5} pcbRotation={180} pcbTracePaths={fpcFanout}>
      <Fpc name="J3" displayName="GDEY075T7 FPC" pinLabels={fpcPins}
        pinAttributes={Object.fromEntries([1,4,6,7,25,26].map(pin=>[`pin${pin}`,{doNotConnect:true}]))}
        pcbX={0} pcbY={0} pcbRotation={180} schX={5} schY={5}
        {...display} />
      </fanout>
      <assembly.screen name="GDEY075T7" connectsTo=".J3" width={170.2} height={111.2} />
      {signals.map(({pin,net,modulePin}) => (
        <group key={net}>
          <trace from={`.U1 > .pin${modulePin}`} to={`net.${net}`} />
          <trace from={`.J3 > .pin${pin}`} to={`net.${net}`} />
        </group>
      ))}
      {[15,16].map(pin=><group key={`fpc-vcc-${pin}`}><trace from={`.J3 > .pin${pin}`} to="net.V3V3" /></group>)}
      {[8,17].map(pin=><group key={`fpc-ground-${pin}`}><trace from={`.J3 > .pin${pin}`} to="net.GND" /></group>)}
      {[[2,"GDR"],[3,"RESE"],[5,"VSHR"],[18,"VDD"],[19,"VPP"],[20,"VSH1"],
        [21,"PREVGH"],[22,"VSL"],[23,"PREVGL"],[24,"VCOM"]].map(([pin,net])=>
        <group key={`rail-${pin}`}><trace from={`.J3 > .pin${pin}`} to={`net.${net}`} /></group>)}

      <Inductor name="L1" pcbX={8} pcbY={9} pcbRotation={180}
        schX={14} schY={-8} {...boost}
        connections={{pin1:"net.V3V3",pin2:"net.BOOST_SW"}} />

      <R1M name="R1" pcbX={18} pcbY={8} schX={13} schY={-12} {...boost}
        connections={{pin1:"net.GDR",pin2:"net.GND"}} />
      <SenseR name="R2" pcbX={14} pcbY={13} schX={17} schY={-15} {...boost}
        connections={{pin1:"net.RESE",pin2:"net.GND"}} />
      <Diode name="D3" pcbX={20} pcbY={12} pcbRotation={180} schX={21} schY={-8} {...boost}
        connections={{anode:"net.BOOST_SW",cathode:"net.PREVGH"}} />
      <C4u7 name="C3" maxVoltageRating={50} pcbX={14} pcbY={4} schX={22} schY={-12} {...boost}
        connections={{pin1:"net.BOOST_SW",pin2:"net.NEG_PUMP"}} />
      <Diode name="D2" pcbX={20} pcbY={4} schX={25} schY={-12} {...boost}
        connections={{anode:"net.NEG_PUMP",cathode:"net.GND"}} />
      <Diode name="D1" pcbX={20} pcbY={0} schX={22} schY={-16} {...boost}
        connections={{anode:"net.PREVGL",cathode:"net.NEG_PUMP"}} />
      <C10u name="C5" maxVoltageRating={50} pcbX={24} pcbY={16} schX={25} schY={-8} {...boost}
        connections={{pin1:"net.PREVGH",pin2:"net.GND"}} />
      <C10u name="C11" maxVoltageRating={50} pcbX={24} pcbY={-3} schX={25} schY={-16} {...boost}
        connections={{pin1:"net.PREVGL",pin2:"net.GND"}} />

      {[
        {name:"C2",net:"VSHR",x:8,y:-9,sx:10,sy:10},
        {name:"C6",net:"VDD",x:13,y:-9,sx:10,sy:8},
        {name:"C7",net:"VPP",x:18,y:-9,sx:10,sy:4},
        {name:"C12",net:"VCOM",x:23,y:-9,sx:10,sy:0},
      ].map(c=><C1u key={c.name} name={c.name} maxVoltageRating={50}
        pcbX={c.x} pcbY={c.y} schX={c.sx} schY={c.sy} {...display}
        connections={{pin1:`net.${c.net}`,pin2:"net.GND"}} />)}
      <C10u name="C9" maxVoltageRating={50} pcbX={14} pcbY={-5.5} schX={14} schY={6} {...display}
        connections={{pin1:"net.VSH1",pin2:"net.GND"}} />
      <C10u name="C10" maxVoltageRating={50} pcbX={8} pcbY={-5.5} schX={14} schY={2} {...display}
        connections={{pin1:"net.VSL",pin2:"net.GND"}} />
      <C4u7 name="C4" maxVoltageRating={50} pcbX={7} pcbY={3} schX={-2} schY={-10} {...controls}
        connections={{pin1:"net.V3V3",pin2:"net.GND"}} />
      <C100n name="C1" maxVoltageRating={50} pcbX={7} pcbY={0} schX={-5} schY={-10} {...controls}
        connections={{pin1:"net.V3V3",pin2:"net.GND"}} />
      <C100n name="C8" maxVoltageRating={50} pcbX={14} pcbY={-12.5} schX={1} schY={-10} {...controls}
        connections={{pin1:"net.V3V3",pin2:"net.GND"}} />
      <Button name="SW1" displayName="PAIR / hold 5s RESET SETUP"
        pcbX={-1} pcbY={-19} schX={4} schY={-16} {...controls}
        connections={{pin1:"net.PAIR_BUTTON",pin2:"net.GND"}} />
      <trace from=".U1 > .pin6" to="net.PAIR_BUTTON" />
      <R10k name="R3" pcbX={-1} pcbY={-13} schX={1} schY={-14} {...controls}
        connections={{pin1:"net.V3V3",pin2:"net.PAIR_BUTTON"}} />
      <C100n name="C13" maxVoltageRating={50} pcbX={-1} pcbY={-15} schX={7} schY={-14} {...controls}
        connections={{pin1:"net.PAIR_BUTTON",pin2:"net.GND"}} />
      {[[24,20],[-24,-19]].map(([x,y])=>
        <group key={`mount-${x}-${y}`}><hole name={`M_${x}_${y}`} diameter={2.7} pcbX={x} pcbY={y} /></group>)}
      <silkscreentext text="MUSE E-PAPER" fontSize={1.3} pcbX={12} pcbY={20.5} />
      <silkscreentext text="REV D / 55 x 46" fontSize={1} pcbX={12} pcbY={18} />
      <silkscreentext text="24P / TOP CONTACT" fontSize={0.8} pcbX={14} pcbY={-14} />
      <silkscreentext text="1" fontSize={1} pcbX={6.5} pcbY={-20.5} />
      <silkscreentext text="PAIR" fontSize={1} pcbX={-1} pcbY={-22} />
      <silkscreentext text="RESET    BOOT" fontSize={1} pcbX={-13} pcbY={-22} />
    </board>
  )
}