shibosoftwaredev/f1c100s-linux-nema17-stepper-controller
A four-layer NEMA 17 motor-controller PCB combining an Allwinner F1C100S Linux computer, USB‑PD/buck power system, W5500 Ethernet, STM32 real-time motion control, DRV8825 stepper driver, protection/temperature/current telemetry, USB interfaces, and local LED/buzzer diagnostics.
- Version
- 0.4.56
- License
- unset
- Stars
- 0
schematic-guide.tsx
import { Fragment } from "react"
import { schematicPages } from "./schematic-pages"
import positions from "./schematic-text-placements.json"
const ink = "#17465b"
function Text({ x, y, text, size = .26 }: { x: number; y: number; text: string; size?: number }) {
const position = (positions as Record<string,{x:number;y:number}>)[text]
return <schematictext schX={position?.x ?? x*.75} schY={position?.y ?? y*.5} text={text} fontSize={size} anchor="left" color={ink} />
}
export function SchematicGuide({ sheet }: { sheet: string }) {
const page = schematicPages[sheet]
if (!page) throw new Error(`Missing schematic page: ${sheet}`)
return <>
<Text x={-16} y={16} text="F1C100S / NEMA 17" size={.45} />
<Text x={-3} y={16} text={page.title} size={.42} />
<Text x={-16} y={14.9} text={page.subtitle} size={.24} />
<schematicline x1={-12.75} y1={7} x2={13.5} y2={7} strokeWidth={.025} color="#aebdc5" />
{page.sections.map(section => <Fragment key={section.title}>
<Text x={section.x} y={section.y} text={section.title} size={.32} />
<Text x={section.x} y={section.y-.65} text={section.note} size={.22} />
</Fragment>)}
{page.notes.map((note,i) => <Text key={note} x={-16} y={-16-i*.6} text={note} size={.23} />)}
<schematicline x1={-12.75} y1={-9} x2={13.5} y2={-9} strokeWidth={.025} color="#aebdc5" />
<Text x={-16} y={-18.8} text="42.3 × 42.3 mm | 4-layer | Hardware qualification pending" size={.22} />
<Text x={10} y={-18.8} text={`Sheet ${String(page.number).padStart(2,"0")} / 12`} size={.22} />
</>
}
export function SchematicOverview() {
const sections = [
{x:-15,y:11,title:"1 | POWER",lines:["USB-C PD: default 15 V / 3 A (12 V option).","Buck and LDOs generate logic/processor rails.","Power: 04 / 05 / 08. Input monitoring: 10."]},
{x:3,y:11,title:"2 | LINUX",lines:["F1C100S runs Linux; W5500 supplies Ethernet.","DATA USB provides ROM FEL and Linux USB data.","Processor/boot: 01–03. Ethernet: 06."]},
{x:-15,y:4,title:"3 | REAL-TIME MOTION",lines:["Linux sends commands over UART to STM32.","STM32 timers generate STEP/DIR; faults stop drive.","Independent controller and interlock: 07."]},
{x:3,y:4,title:"4 | STEPPER DRIVE",lines:["DRV8825 drives two bipolar stepper windings.","Default limit: approximately 0.40 A/phase.","StepperOnline 17HS13-0404S1. Driver: 08."]},
{x:-15,y:-3,title:"5 | FEEDBACK",lines:["RGB LED and buzzer: 09. Board temperature: 08.","PD voltage / gate-valid: 10.","Both signed coil-current channels: 11."]},
{x:3,y:-3,title:"6 | TWO USB ROLES",lines:["POWER: connect the USB-PD source.","DATA: programming / host detection, not power.","Hardware USB attachment/isolation: 12."]},
]
return <>
<SchematicGuide sheet="overview" />
{sections.map(section => <Fragment key={section.title}>
<Text x={section.x} y={section.y} text={section.title} size={.36} />
{section.lines.map((text,i) => <Text key={text} x={section.x} y={section.y-1-i*.7} text={text} size={.25} />)}
</Fragment>)}
<Text x={-15} y={-10} text="BRING-UP | Inspect → program → measure rails → verify coils → test stop paths → calibrate" size={.28} />
<Text x={-15} y={-12} text="Generated checks are not fabrication, thermal, signal-integrity or safety certification." size={.24} />
</>
}