gokul/macro-six-usbc
USB-powered ATmega32U4 controller board with protected/switched 5 V power, six tactile keys, rotary encoder, reset/boot/ISP interfaces, power LED, and six daisy-chained SK6812 RGB LEDs driven through MOSFETs.
- Version
- 0.1.6
- License
- MIT
- Stars
- 0
lib/macro-keyboard.tsx
import reviewedRoutes from "./reviewed-routes.json"
import type { FanoutTracePath } from "@tscircuit/props"
import { Fragment } from "react"
import { Power } from "./power"
import { Controller } from "./controller"
import { Controls, keyPositions } from "./controls"
import { Enclosure } from "./enclosure"
const outline = [
{x:-52,y:34},{x:52,y:34},{x:55,y:31},{x:55,y:-31},{x:52,y:-34},{x:-52,y:-34},{x:-55,y:-31},
{x:-55,y:-7},{x:-51,y:-7},{x:-51,y:7},{x:-55,y:7},{x:-55,y:31},
]
export const MacroKeyboard = ({ includeEnclosure = true }: { includeEnclosure?: boolean } = {}) => (
<board pcbStyle={{silkscreenTextVisibility:"hidden"}} pcbRelative width={110} height={68} thickness={1.6} layers={2} outline={outline}
autorouter={{local:true,preset:"auto_local",allowViaInPad:false,traceClearance:0.2}} autorouterVersion="beta_pipeline9" autorouterEffortLevel="2x" schRelative schTraceAutoLabelEnabled
minTraceWidth={0.2} minTraceToPadEdgeClearance={0.1} minPadEdgeToPadEdgeClearance={0.15} minBoardEdgeClearance={0.3} minTraceToHoleEdgeClearance={0.2} minViaEdgeToPadEdgeClearance={0.15} minViaHoleDiameter={0.3} minViaPadDiameter={0.6}>
{/* Generated by the local tscircuit router, then corrected and frozen for repeatable fabrication checks. */}
<autoroutingphase name="Reviewed local routes" phaseIndex={0} pcbTracePaths={reviewedRoutes as FanoutTracePath[]} />
{["AREF", "CC1", "CC2", "DM", "DP", "ENC_A", "ENC_B", "ENC_PUSH", "FUSED_5V", "GND", "HWB", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "LED_5V", "LED_IN", "LED_LINK1", "LED_LINK2", "LED_LINK3", "LED_LINK4", "LED_LINK5", "MAIN_GATE", "MISO", "MOSI", "PWR_ANODE", "RESET", "RGB_DATA", "RGB_GATE", "SCK", "UCAP", "USB_DM", "USB_DP", "VBUS", "VCC", "XTAL1", "XTAL2"].map((name)=>(<Fragment key={name}><net name={name} routingPhaseIndex={0} /></Fragment>))}
<schematicsheet name="Power" displayName="USB, Power and Controller" sheetIndex={0} />
<schematicsheet name="Controls" displayName="Keys, Encoder and RGB" sheetIndex={1} />
<group pcbRelative pcbX={0} pcbY={0} name="powerSheet" schSheetName="Power" schGrid gridCols={6} gridGap={1}>
<Power />
<Controller />
</group>
<Controls />
<copperpour name="GND_TOP" layer="top" connectsTo="net.GND" clearance={0.35} boardEdgeMargin={0.4} useThermalReliefs />
<copperpour name="GND_BOTTOM" layer="bottom" connectsTo="net.GND" clearance={0.35} boardEdgeMargin={0.4} useThermalReliefs />
<hole name="H1" pcbX={-50} pcbY={28} diameter={3.2} solderMaskMargin={0.1} coveredWithSolderMask={false} />
{[[50,29],[-50,-28],[50,-28]].map(([x,y],i)=>(<Fragment key={i}><hole name={`H${i+2}`} pcbX={x} pcbY={y} diameter={3.2} /></Fragment>))}
{/* Economic PCBA tooling: NPTH, with 0.148 mm radial mask expansion on both faces. */}
{[[-46,30],[-46,-24],[46.5,-24]].map(([x,y],i)=>(
<Fragment key={`tooling-${i}`}><hole name={`TOOL${i+1}`} pcbX={x} pcbY={y}
diameter={1.152} solderMaskMargin={0.148} coveredWithSolderMask={false} /></Fragment>
))}
{keyPositions.map((key,i)=>(<Fragment key={i}><silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text={`K${i+1}`} pcbX={key.x} pcbY={key.y-10} fontSize={2} /></Fragment>))}
<silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text="MACRO 6" pcbX={-17} pcbY={-29} fontSize={2} />
<silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text="USB-C" pcbX={15} pcbY={22.5} fontSize={2} />
<silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text="PWR" pcbX={-47} pcbY={-12.5} fontSize={2} />
<silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text="VOL / MUTE" pcbX={43} pcbY={-13} fontSize={2} />
<silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text="RESET" pcbX={36} pcbY={-22.3} fontSize={2} />
<silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text="BOOT" pcbX={45} pcbY={-22.3} fontSize={2} />
<silkscreentext pcbStyle={{silkscreenTextVisibility:"visible"}} text="ISP - 1:MISO" pcbX={38} pcbY={-31.6} fontSize={2} />
{includeEnclosure && <Enclosure />}
</board>
)