diff --git a/README.md b/README.md index 4f8a2e8..0bc9954 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,117 @@ -# SN-L00 +# SN-L00 Latency Tester -Eurorack latency testing module by SubModular. +Eurorack module for measuring round-trip latency in audio/CV signal chains. -## Overview +**Organization**: [SubModular](https://git.sub-net.at/submodular) / Sub-Net e.U. -SN-L00 measures round-trip latency in Eurorack signal chains. Useful for testing delay through effects, digital modules, audio interfaces, and DAW processing. +## Features + +- Measures latency from 0.01ms to 999ms +- 128×32 OLED display showing milliseconds +- Three modes: Single shot, Continuous, Statistics +- Skiff-friendly depth (<25mm) +- USB serial output for logging + +## Specifications + +| Parameter | Value | +|-----------|-------| +| Width | 6 HP (30mm) | +| Depth | <25mm | +| Power +12V | ~25mA | +| Power -12V | 0mA | +| Resolution | 0.01ms | +| Output | 0-3.3V trigger | +| Input | 0-10V tolerant | ## Project Structure ``` -hardware/ - kicad/ # Schematics and PCB - panel/ # Front panel design -firmware/ # Microcontroller code (if applicable) -docs/ # Documentation and user manual +SN-L00/ +├── hardware/ +│ ├── BOM.md # Bill of materials with LCSC part numbers +│ ├── kicad/ # KiCad schematic and PCB +│ │ ├── SN-L00.kicad_pro +│ │ ├── SN-L00.kicad_sch +│ │ ├── SN-L00.kicad_pcb +│ │ ├── README.md # ASCII schematic reference +│ │ └── PCB_LAYOUT.md # Placement guide +│ └── panel/ +│ ├── PANEL_SPEC.md # Dimensions and specifications +│ └── SN-L00_panel.svg # Panel design +├── firmware/ +│ ├── CMakeLists.txt # Pico SDK build +│ ├── README.md # Build instructions +│ ├── include/ # Header files +│ └── src/ # Source files +└── docs/ + └── DESIGN.md # Technical design document ``` -## Specifications +## Hardware -- Width: TBD HP -- Power: TBD mA (+12V), TBD mA (-12V) -- Depth: TBD mm +### Components -## Status +| Part | Description | +|------|-------------| +| MCU | RP2040-Zero (Waveshare) | +| Display | 0.91" OLED 128×32 I2C | +| Output buffer | 74LVC1G17 Schmitt trigger | +| Input buffer | MCP6001 op-amp | +| Regulator | AMS1117-3.3 LDO | -Early development - concept phase. +Full BOM with LCSC part numbers in [hardware/BOM.md](hardware/BOM.md). + +### Manufacturing + +- PCB: 2-layer, 28×100mm +- Assembly: PCBWay or similar (SMD parts) +- Hand-solder: RP2040-Zero module, OLED module +- Panel: Aluminum or PCB (6HP) + +## Firmware + +Built with Raspberry Pi Pico SDK. + +```bash +export PICO_SDK_PATH=/path/to/pico-sdk +cd firmware +mkdir build && cd build +cmake .. && make +``` + +Flash `sn_l00.uf2` via USB bootloader. + +See [firmware/README.md](firmware/README.md) for details. + +## Usage + +1. Connect **TRIG OUT** to your signal chain input +2. Connect your signal chain output to **RETURN IN** +3. Press button to measure latency +4. Long press to toggle continuous mode + +### Modes + +- **SINGLE**: Press to measure once +- **CONT**: Auto-measures every 500ms, shows live reading +- **STATS**: Shows min/max/average after continuous mode + +## Typical Latency Values + +| Source | Expected Latency | +|--------|------------------| +| Analog modules | <0.1ms | +| Digital Eurorack (DSP) | 1-5ms | +| Audio interface round-trip | 3-20ms | +| DAW + plugins | 5-50ms+ | ## License TBD ---- +## Links -*SubModular - Eurorack hardware by Sub-Net e.U.* +- Repository: https://git.sub-net.at/submodular/SN-L00 +- Organization: https://git.sub-net.at/submodular +- Parent: [Sub-Net e.U.](https://sub-net.at) diff --git a/docs/.gitkeep b/docs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/hardware/kicad/PCB_LAYOUT.md b/hardware/kicad/PCB_LAYOUT.md new file mode 100644 index 0000000..2d30b86 --- /dev/null +++ b/hardware/kicad/PCB_LAYOUT.md @@ -0,0 +1,216 @@ +# SN-L00 PCB Layout Guide + +## Board Dimensions + +| Parameter | Value | Notes | +|-----------|-------|-------| +| Width | 28.0mm | 6HP panel = 30mm, PCB 1mm clearance each side | +| Height | 100.0mm | Fits standard 3U with clearance | +| Thickness | 1.6mm | Standard PCB | +| Layers | 2 | Front + Back copper | +| Depth (mounted) | ~22mm | Skiff-friendly (<25mm) | + +## Mounting Holes + +| Hole | Position | Size | +|------|----------|------| +| MH1 (top) | 14.0, 5.0 | 3.2mm (M3) | +| MH2 (bottom) | 14.0, 95.0 | 3.2mm (M3) | + +## Component Placement (Top to Bottom) + +``` + 0mm 28mm + │←────── 28mm ───────→│ + ┌────────────────────┐ ─┬─ 0mm + │ ○ MH1 (M3) │ │ + │ │ │ 5mm + ├────────────────────┤ ─┤ + │ │ │ + │ ┌──────────────┐ │ │ + │ │ OLED │ │ │ 10-25mm + │ │ MOD2 │ │ │ + │ │ (128x32) │ │ │ + │ └──────────────┘ │ │ + │ │ │ + ├────────────────────┤ ─┤ + │ [BTN] │ │ 28-35mm + │ SW1 │ │ + ├────────────────────┤ ─┤ + │ │ │ + │ ┌──────────────┐ │ │ + │ │ RP2040-Zero │ │ │ 38-55mm + │ │ MOD1 │ │ │ + │ │ (18x23mm) │ │ │ + │ └──────────────┘ │ │ + │ │ │ + ├────────────────────┤ ─┤ + │ SMD Components │ │ + │ U1 U2 U3 │ │ 58-75mm + │ C1-C5 R1-R6 │ │ + │ D1-D4 D2(LED) │ │ + ├────────────────────┤ ─┤ + │ │ │ + │ ○ J2 ○ J3 │ │ 78-88mm + │ TRIG RETURN │ │ + │ │ │ + ├────────────────────┤ ─┤ + │ ═══════════════ │ │ 88-95mm + │ J1 │ │ + │ (Eurorack 2x5) │ │ + ├────────────────────┤ ─┤ + │ ○ MH2 (M3) │ │ 95mm + └────────────────────┘ ─┴─ 100mm +``` + +## Detailed Placement Coordinates + +### Modules (Hand-solder) + +| Ref | Component | Center X | Center Y | Rotation | +|-----|-----------|----------|----------|----------| +| MOD2 | OLED 128x32 | 14.0 | 17.5 | 0° | +| MOD1 | RP2040-Zero | 14.0 | 46.5 | 0° | + +### User Interface + +| Ref | Component | Center X | Center Y | Rotation | +|-----|-----------|----------|----------|----------| +| SW1 | Tactile 6x6mm | 14.0 | 31.5 | 0° | +| D2 | Power LED | 24.0 | 31.5 | 0° | +| R2 | LED resistor 1K | 24.0 | 36.0 | 90° | + +### Connectors + +| Ref | Component | Center X | Center Y | Rotation | +|-----|-----------|----------|----------|----------| +| J2 | Thonkiconn TRIG | 7.0 | 83.0 | 0° | +| J3 | Thonkiconn RETURN | 21.0 | 83.0 | 0° | +| J1 | 2x5 Eurorack | 14.0 | 92.0 | 0° | + +### Power Section (Back side recommended) + +| Ref | Component | Center X | Center Y | Rotation | Side | +|-----|-----------|----------|----------|----------|------| +| D1 | SS14 Schottky | 7.0 | 65.0 | 0° | Back | +| U1 | AMS1117-3.3 | 14.0 | 65.0 | 0° | Back | +| C1 | 10uF input | 10.0 | 60.0 | 0° | Back | +| C2 | 10uF output | 18.0 | 60.0 | 0° | Back | +| C3 | 100nF output | 21.0 | 60.0 | 0° | Back | + +### Signal Conditioning + +| Ref | Component | Center X | Center Y | Rotation | Side | +|-----|-----------|----------|----------|----------|------| +| U2 | 74LVC1G17 | 7.0 | 72.0 | 0° | Front | +| C4 | 100nF (U2) | 7.0 | 68.0 | 0° | Front | +| R3 | 100R trig | 7.0 | 76.0 | 90° | Front | +| U3 | MCP6001 | 21.0 | 72.0 | 0° | Front | +| C5 | 100nF (U3) | 21.0 | 68.0 | 0° | Front | +| R4 | 10K input | 21.0 | 76.0 | 90° | Front | +| R5 | 10K divider | 18.0 | 76.0 | 90° | Front | +| R6 | 22K divider | 18.0 | 72.0 | 90° | Front | +| D3 | BAT54 clamp | 24.0 | 70.0 | 90° | Front | +| D4 | BAT54 clamp | 24.0 | 74.0 | 90° | Front | + +### Button + +| Ref | Component | Center X | Center Y | Rotation | +|-----|-----------|----------|----------|----------| +| R1 | 10K pullup | 10.0 | 35.0 | 0° | + +## Routing Guidelines + +### Net Classes + +| Class | Width | Clearance | Via Drill | +|-------|-------|-----------|-----------| +| Default | 0.25mm | 0.2mm | 0.3mm | +| Power | 0.5mm | 0.3mm | 0.4mm | +| Signal | 0.2mm | 0.2mm | 0.3mm | + +### Power Routing + +1. **+12V** path: J1 pin 4 → D1 → C1 → U1 VIN +2. **+3.3V** path: U1 VOUT → C2/C3 → distribute to all ICs +3. **GND**: Use ground pour on back layer, via stitch near decoupling caps + +### Signal Routing Priority + +1. I2C (SDA/SCL): Keep short, parallel, 0.5mm spacing +2. TRIG_OUT: Direct from RP2040 GP2 → U2 → R3 → J2 +3. RETURN_IN: J3 → R4 → divider → U3 → RP2040 GP3 +4. BTN: RP2040 GP4 → R1 → SW1 → GND + +### Ground Plane + +- Fill back copper with GND zone +- Via stitch every 5-10mm +- Keep clear around power input for thermal relief +- Connect GND pins of J2/J3 directly to plane + +## Design Rules (PCBWay Compatible) + +| Parameter | Value | +|-----------|-------| +| Min trace width | 0.15mm (0.2mm preferred) | +| Min clearance | 0.15mm (0.2mm preferred) | +| Min via drill | 0.3mm | +| Min via diameter | 0.6mm | +| Min hole size | 0.3mm | +| Min annular ring | 0.15mm | + +## Silkscreen + +### Front + +- Component references (small, 0.8mm text) +- Jack labels: "TRIG" and "RETURN" +- "SN-L00 v0.1" at bottom +- "SubModular" at top + +### Back + +- "SN-L00" centered +- Pin 1 indicators for ICs +- Polarity markers for D1, power header +- "git.sub-net.at/submodular/SN-L00" + +## Gerber Output + +When exporting for PCBWay: + +``` +Required files: +- F.Cu (Front copper) +- B.Cu (Back copper) +- F.SilkS (Front silkscreen) +- B.SilkS (Back silkscreen) +- F.Mask (Front soldermask) +- B.Mask (Back soldermask) +- Edge.Cuts (Board outline) +- *.drl (Drill file) + +Settings: +- Format: Gerber X2 +- Drill: Excellon +- Units: mm +- Coordinate format: 4.6 +``` + +## Assembly Notes + +1. PCBWay can assemble all SMD parts on both sides +2. Hand-solder: MOD1 (RP2040-Zero), MOD2 (OLED) +3. Jacks (J2, J3) can be assembled or hand-soldered +4. Power header (J1) usually hand-soldered for alignment + +## Checking Before Order + +- [ ] DRC passes with no errors +- [ ] All nets connected (no airwires) +- [ ] Mounting holes align with panel +- [ ] Jacks align with panel holes +- [ ] Power header polarity marked +- [ ] Silkscreen readable and not over pads +- [ ] Ground plane connected properly diff --git a/hardware/kicad/SN-L00.kicad_pcb b/hardware/kicad/SN-L00.kicad_pcb new file mode 100644 index 0000000..aa52ce8 --- /dev/null +++ b/hardware/kicad/SN-L00.kicad_pcb @@ -0,0 +1,191 @@ +(kicad_pcb + (version 20240108) + (generator "pcbnew") + (generator_version "8.0") + (general + (thickness 1.6) + (legacy_teardrops no) + ) + (paper "A4") + (title_block + (title "SN-L00 Latency Tester") + (date "2026-01-23") + (rev "0.1") + (company "SubModular") + ) + (layers + (0 "F.Cu" signal) + (31 "B.Cu" signal) + (32 "B.Adhes" user "B.Adhesive") + (33 "F.Adhes" user "F.Adhesive") + (34 "B.Paste" user) + (35 "F.Paste" user) + (36 "B.SilkS" user "B.Silkscreen") + (37 "F.SilkS" user "F.Silkscreen") + (38 "B.Mask" user) + (39 "F.Mask" user) + (40 "Dwgs.User" user "User.Drawings") + (41 "Cmts.User" user "User.Comments") + (42 "Eco1.User" user "User.Eco1") + (43 "Eco2.User" user "User.Eco2") + (44 "Edge.Cuts" user) + (45 "Margin" user) + (46 "B.CrtYd" user "B.Courtyard") + (47 "F.CrtYd" user "F.Courtyard") + (48 "B.Fab" user) + (49 "F.Fab" user) + (50 "User.1" user) + (51 "User.2" user) + (52 "User.3" user) + (53 "User.4" user) + (54 "User.5" user) + (55 "User.6" user) + (56 "User.7" user) + (57 "User.8" user) + (58 "User.9" user) + ) + (setup + (pad_to_mask_clearance 0) + (allow_soldermask_bridges_in_footprints no) + (pcbplotparams + (layerselection 0x00010fc_ffffffff) + (plot_on_all_layers_selection 0x0000000_00000000) + (disableapertmacros no) + (usegerberextensions no) + (usegerberattributes yes) + (usegerberadvancedattributes yes) + (creategerberjobfile yes) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 4) + (plotframeref no) + (viasonmask no) + (mode 1) + (useauxorigin no) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (pdf_front_fp_property_popups yes) + (pdf_back_fp_property_popups yes) + (dxfpolygonmode yes) + (dxfimperialunits yes) + (dxfusepcbnewfont yes) + (psnegative no) + (psa4output no) + (plotreference yes) + (plotvalue yes) + (plotfptext yes) + (plotinvisibletext no) + (sketchpadsonfab no) + (subtractmaskfromsilk no) + (outputformat 1) + (mirror no) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + (net 0 "") + (net 1 "GND") + (net 2 "+12V") + (net 3 "+3.3V") + (net 4 "SDA") + (net 5 "SCL") + (net 6 "TRIG_OUT") + (net 7 "RETURN_IN") + (net 8 "BTN") + + ;; Board outline - 6HP Eurorack PCB + ;; Width: 28mm (6HP = 30mm panel, PCB slightly narrower) + ;; Height: 100mm (fits behind panel with clearance) + (gr_rect + (start 0 0) + (end 28 100) + (stroke + (width 0.15) + (type solid) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "board-outline") + ) + + ;; Mounting holes (M3, 3.2mm) + ;; Top mounting hole + (footprint "MountingHole:MountingHole_3.2mm_M3" + (layer "F.Cu") + (uuid "mh1") + (at 14 5) + (property "Reference" "MH1" + (at 0 -3 0) + (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + ) + (property "Value" "MountingHole" + (at 0 3 0) + (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask") + ) + ) + + ;; Bottom mounting hole + (footprint "MountingHole:MountingHole_3.2mm_M3" + (layer "F.Cu") + (uuid "mh2") + (at 14 95) + (property "Reference" "MH2" + (at 0 -3 0) + (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + ) + (property "Value" "MountingHole" + (at 0 3 0) + (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask") + ) + ) + + ;; Component placement guide (active from top to bottom): + ;; Y=10-25: OLED module (MOD2) + ;; Y=28-35: Button (SW1) + ;; Y=38-55: RP2040-Zero (MOD1) + ;; Y=58-75: SMD components (LDO, buffers, passives) + ;; Y=78-90: Jacks (J2, J3) and Power header (J1) + + ;; Text annotations for assembly + (gr_text "SN-L00 v0.1" + (at 14 98 0) + (layer "F.SilkS") + (uuid "title-text") + (effects + (font (size 1.2 1.2) (thickness 0.2)) + (justify center) + ) + ) + + (gr_text "SubModular" + (at 14 2 0) + (layer "F.SilkS") + (uuid "company-text") + (effects + (font (size 0.8 0.8) (thickness 0.15)) + (justify center) + ) + ) + + ;; Ground plane zones would be added here + ;; (zone ...) + +) diff --git a/hardware/panel/.gitkeep b/hardware/panel/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/hardware/panel/PANEL_SPEC.md b/hardware/panel/PANEL_SPEC.md new file mode 100644 index 0000000..37412a2 --- /dev/null +++ b/hardware/panel/PANEL_SPEC.md @@ -0,0 +1,161 @@ +# SN-L00 Panel Specification + +## Eurorack 6HP Panel Dimensions + +| Parameter | Value | Notes | +|-----------|-------|-------| +| Width | 30.00mm | 6 × 5.08mm (6HP) | +| Height | 128.50mm | 3U standard | +| Thickness | 1.5-2.0mm | Aluminum or PCB | +| Corner radius | 0mm | Square corners | + +## Mounting Holes + +Eurorack standard mounting rail positions: + +| Hole | X | Y | Diameter | Notes | +|------|---|---|----------|-------| +| Top Left | 7.5mm | 3.0mm | 3.2mm | Horizontal slot optional | +| Top Right | 22.5mm | 3.0mm | 3.2mm | Horizontal slot optional | +| Bottom Left | 7.5mm | 125.5mm | 3.2mm | Horizontal slot optional | +| Bottom Right | 22.5mm | 125.5mm | 3.2mm | Horizontal slot optional | + +**Note**: Slots (elongated holes) of 3.2mm × 4mm allow for rail tolerance. + +## Component Holes + +| Component | X | Y | Diameter | Notes | +|-----------|---|---|----------|-------| +| OLED cutout | 15.0mm | 25.0mm | 28×12mm rect | Rectangular window | +| Button | 15.0mm | 45.0mm | 7.0mm | For 6mm tactile + cap | +| LED (power) | 24.0mm | 45.0mm | 3.0mm | For 3mm LED or light pipe | +| Jack TRIG | 7.5mm | 95.0mm | 6.0mm | Thonkiconn PJ398SM | +| Jack RETURN | 22.5mm | 95.0mm | 6.0mm | Thonkiconn PJ398SM | + +## Panel Layout Drawing + +``` + ←───── 30.00mm ─────→ + + ┌─────────────────────┐ ─┬─ 0.00mm + │ ○ ○ │ │ 3.00mm (mounting holes) + │ │ │ + │ SubModular │ │ 12.00mm + │ │ │ + │ ┌───────────────┐ │ │ + │ │ │ │ │ + │ │ OLED │ │ │ 19-31mm (display window) + │ │ DISPLAY │ │ │ + │ │ │ │ │ + │ └───────────────┘ │ │ + │ │ │ + │ SN-L00 │ │ 38.00mm + │ │ │ + │ ◯ • │ │ 45.00mm (button + LED) + │ BTN PWR │ │ + │ │ │ + │ │ │ + │ │ │ + │ ┌───┐ ┌───┐ │ │ + │ │ │ │ │ │ │ + │ │ ○ │ │ ○ │ │ │ 95.00mm (jacks) + │ │ │ │ │ │ │ + │ └───┘ └───┘ │ │ + │ TRIG RETURN │ │ 105.00mm (labels) + │ │ │ + │ LATENCY TESTER │ │ 115.00mm + │ │ │ + │ ○ ○ │ │ 125.50mm (mounting holes) + └─────────────────────┘ ─┴─ 128.50mm +``` + +## OLED Display Window + +The 0.91" 128×32 OLED module dimensions: + +| Parameter | Value | +|-----------|-------| +| Module size | ~38 × 12mm | +| Active area | ~22 × 6mm | +| Mounting | Pin header on edge | + +**Panel cutout**: 28mm × 10mm rectangle, centered at (15.0, 25.0) + +Alternatively, a slightly larger window (30 × 12mm) gives tolerance for module alignment. + +## Material Options + +### Option A: Aluminum (Professional) + +- Material: 1.5mm aluminum 5052-H32 +- Finish: Brushed, anodized black +- Printing: Laser engraved or UV printed +- Cost: ~€10-15/panel (qty 5) + +### Option B: PCB Panel (DIY-friendly) + +- Material: 1.6mm FR4 +- Finish: Black soldermask, ENIG +- Printing: Silkscreen white +- Cost: ~€2-5/panel (qty 5 from PCBWay) + +### Option C: Acrylic (Budget) + +- Material: 3mm black acrylic +- Finish: Laser cut +- Printing: Engraved or adhesive labels +- Cost: ~€3-5/panel + +## PCB Panel Design + +If using a PCB as the panel: + +``` +Front copper: None (for clean look) or decorative pattern +Back copper: Optional ground plane +Silkscreen: All text and graphics +Soldermask: Black (or custom color) +``` + +## Graphics & Text + +### Suggested Layout + +| Element | Position | Size | Font | +|---------|----------|------|------| +| "SubModular" | Top center, Y=12mm | 2.5mm | Bold sans-serif | +| "SN-L00" | Above button, Y=38mm | 3.0mm | Bold | +| "TRIG" | Below left jack, Y=105mm | 2.0mm | Regular | +| "RETURN" | Below right jack, Y=105mm | 2.0mm | Regular | +| "LATENCY TESTER" | Bottom, Y=115mm | 1.5mm | Light | + +### Icon Ideas + +- Small waveform graphic near jacks +- Clock/timer icon +- Sub-Net logo (if available) + +## Hole Tolerances + +| Hole Type | Nominal | Tolerance | +|-----------|---------|-----------| +| Mounting | 3.2mm | +0.1/-0.0 | +| Jack | 6.0mm | +0.1/-0.0 | +| Button | 7.0mm | +0.2/-0.0 | +| LED | 3.0mm | +0.1/-0.0 | + +## Files to Create + +For manufacturing: + +1. **DXF/DWG** - For laser cutting (aluminum/acrylic) +2. **KiCad PCB** - For PCB panel +3. **SVG** - For graphics reference +4. **PDF** - Dimensional drawing + +## Assembly + +1. Mount OLED module with M2 standoffs or double-sided tape +2. Jacks mount through panel, secured with nut +3. Button may need extension shaft or cap +4. LED can use light pipe for front visibility diff --git a/hardware/panel/SN-L00_panel.svg b/hardware/panel/SN-L00_panel.svg new file mode 100644 index 0000000..8fb8455 --- /dev/null +++ b/hardware/panel/SN-L00_panel.svg @@ -0,0 +1,72 @@ + + + + SN-L00 Eurorack Panel + 6HP Eurorack panel for SN-L00 Latency Tester + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SubModular + + SN-L00 + + BTN + PWR + + TRIG + RETURN + + LATENCY TESTER + + + + + + + + + + + + + + +