AnasSarkiz/muse-voice-remote

Muse Voice Remote — bare ESP32-S3R8, 155 TOP JLCPCB parts with real supplier CAD, native 3D assembly and GLB exports. Revised 17 mm case allocation; 0.30 mm via drill /0.45 mm pad. Checked prototype PCB; mechanical, RF and MUSE qualification pending.

Version
1.3.2
License
unset
Stars
0

MuseVoiceRemote.circuit.tsx

PCBPCB preview for MuseVoiceRemote.circuit.tsx
SchematicSchematic preview for MuseVoiceRemote.circuit.tsx
import "@tscircuit/core"
import { Fragment } from "react"
import { assembly } from "./design/assembly"
import fabrication from "./design/fabrication-profile.json"
import { parts, type Part } from "./design/parts"
import { catalogFor, padNetsFor } from "./design/catalog"
import { jlcComponents } from "./imports"

// Every populated device imports its JLCPCB/EasyEDA component on TOP.
// LCD connector wiring follows the exact manufacturer PDF, pages 9–11.
function Device({ part: p }: { part: Part }) {
  const catalog = catalogFor(p)
  const Imported = jlcComponents[catalog.lcsc]
  if (!Imported) throw new Error(`Missing imported JLCPCB component ${catalog.lcsc}`)
  const connections = Object.fromEntries(Object.entries(padNetsFor(p)).map(([id, net]) => [`pin${id}`, `net.${net}`]))
  const labels = Object.fromEntries(Object.entries(catalog.pins).map(([id, name]) => [`pin${id}`, [name]]))
  return <Imported name={p.name} pcbX={p.x} pcbY={p.y} pcbRotation={p.rotation ?? 0}
    schX={p.schX} schY={p.schY} layer="top" connections={connections}
    {...(p.kind ? {} : { pinLabels: labels })}
    noConnect={p.noConnect ?? []}
    {...(["SW_TALK","SW_BOOT","SW_RESET"].includes(p.name) ? { internallyConnectedPins:[["pin1","pin4"],["pin2","pin3"]] } : {})}
    allowOffBoard={p.offBoard} />
}

export default function MuseVoiceRemote() {
  const nets = [...new Set(parts.flatMap(p => Object.values(p.nets)))]
  return <board name="Muse Voice Remote" width={assembly.pcb.width} height={assembly.pcb.height}
    thickness={assembly.pcb.thickness} layers={4} borderRadius={0}
    pcbStyle={{viaHoleDiameter:fabrication.minimumViaHoleDiameter,viaPadDiameter:fabrication.minimumViaPadDiameter}}
    minViaHoleDiameter={fabrication.minimumViaHoleDiameter} minViaPadDiameter={fabrication.minimumViaPadDiameter}
    routingDisabled={process.env.MUSE_ROUTE !== "1"} autorouter="auto-local" solderMaskColor="black" silkscreenColor="white">
    {nets.map(name => <Fragment key={name}><net name={name} isGroundNet={name === "GND"}
      isPowerNet={["V3_3", "RF_3V3", "VDD_SPI_3V3", "LCD_2V8", "SYS", "BAT", "MIC_VDD", "USB_VBUS", "VBUS_FUSED", "BL_INPUT", "BL_ANODE_SUPPLY", "MOTOR_3V0"].includes(name)} /></Fragment>)}
    {parts.map(p => <Device key={p.name} part={p} />)}
    {assembly.mountingHoles.map((hole, i) => <Fragment key={i}><hole name={`H${i+1}`} pcbX={hole.x} pcbY={hole.y} diameter={1.8} /></Fragment>)}
    <silkscreentext pcbX={-32} pcbY={-12} pcbRotation={90} text="Muse Voice Remote" fontSize={0.8} layer="top" />
    <pcbnoterect pcbX={assembly.battery.x} pcbY={assembly.battery.y} width={52.5} height={35} color="#edb85c" strokeWidth={0.15} />
    <pcbnotetext pcbX={-1} pcbY={8} text="BATTERY ABOVE PCB / MAX 5.7 mm" fontSize={0.7} color="#edb85c" />
    <pcbnoterect pcbX={assembly.speaker.x} pcbY={assembly.speaker.y} width={assembly.speaker.width} height={assembly.speaker.height} color="#75b9fa" strokeWidth={0.15} />
    <pcbnotetext pcbX={-12} pcbY={-18.5} text="SPEAKER ABOVE PCB / TBD" fontSize={0.7} color="#75b9fa" />
    <pcbnotetext pcbX={23} pcbY={21} text="LCD / 50-PIN TOP CONTACT" fontSize={0.55} color="#ff947e" />
    <schematictext schX={0} schY={22} text="Muse Voice Remote — electrical / placement review" fontSize={1.2} />
    <schematictext schX={0} schY={20} text="All assembly TOP. MUSE runs on the connected service; integration unverified." fontSize={0.6} />
    <schematictext schX={-25} schY={18} text="MIC PRIVACY: DPDT cuts VDD + disables ALL digital paths" fontSize={0.6} />
    <schematictext schX={50} schY={25} text="ER-TFT028A2-4: real 50-pin FPC / 2.8 V / serial-II IM=1110" fontSize={0.55} />
    <schematictext schX={0} schY={-33} text="Supporting passives — named nets connect to devices above" fontSize={0.7} />
  </board>
}