d103b2732c
- BOM with LCSC part numbers for PCBWay assembly - Hand-solder module sources (RP2040-Zero, OLED) - Design doc with block diagram, specs, GPIO pinout - Panel layout concept for 6 HP
136 lines
4.1 KiB
Markdown
136 lines
4.1 KiB
Markdown
# SN-L00 Design Document
|
||
|
||
## Overview
|
||
|
||
The SN-L00 is a 6 HP Eurorack module that measures round-trip latency in audio/CV signal chains.
|
||
|
||
## Block Diagram
|
||
|
||
```
|
||
+12V ──┬── LDO ──── 3.3V ──── RP2040-Zero ──── OLED Display
|
||
│ │ │
|
||
│ │ └── I2C (SDA/SCL)
|
||
│ │
|
||
GND ───┴──────────────────────────┤
|
||
│
|
||
┌───────────────────┼───────────────────┐
|
||
│ │ │
|
||
TRIG OUT RETURN IN BUTTON
|
||
│ │ │
|
||
74LVC1G17 MCP6001 Tactile
|
||
(buffer) (buffer) switch
|
||
│ │
|
||
▼ ▼
|
||
3.5mm Jack 3.5mm Jack
|
||
```
|
||
|
||
## Signal Flow
|
||
|
||
### Trigger Output
|
||
1. RP2040 GPIO generates 5ms pulse (configurable)
|
||
2. 74LVC1G17 Schmitt buffer cleans edge, provides drive strength
|
||
3. Output: 0-3.3V trigger compatible with Eurorack gate inputs
|
||
|
||
### Return Input
|
||
1. Eurorack signal (0-5V typical, can be ±5V audio)
|
||
2. Protection diodes clamp to 3.3V rail
|
||
3. MCP6001 op-amp buffers signal
|
||
4. Voltage divider if needed for >3.3V signals
|
||
5. RP2040 GPIO reads with internal Schmitt trigger
|
||
|
||
### Measurement
|
||
1. RP2040 starts timer on trigger output rising edge
|
||
2. Timer stops on return input rising edge
|
||
3. Latency = timer count × timer resolution
|
||
4. Display updates with result in ms
|
||
|
||
## Specifications
|
||
|
||
| Parameter | Value |
|
||
|-----------|-------|
|
||
| Width | 6 HP (30.00mm) |
|
||
| Depth | <25mm (skiff-friendly) |
|
||
| Power +12V | ~20mA |
|
||
| Power -12V | 0mA (not used) |
|
||
| Trigger output | 0-3.3V, 5ms default |
|
||
| Input threshold | ~1.5V (adjustable in firmware) |
|
||
| Resolution | <10μs (RP2040 @ 125MHz) |
|
||
| Range | 0.01ms - 999ms |
|
||
| Display | 128x32 OLED, I2C |
|
||
|
||
## Operating Modes
|
||
|
||
### Mode 1: Single Shot
|
||
- Press button to trigger measurement
|
||
- Display shows result until next measurement
|
||
- LED blinks on trigger
|
||
|
||
### Mode 2: Continuous
|
||
- Hold button 2s to enter continuous mode
|
||
- Triggers every 500ms, displays live reading
|
||
- Shows min/max/average
|
||
- Press button to exit
|
||
|
||
### Mode 3: Statistics
|
||
- After measurements, short press cycles through:
|
||
- Last reading
|
||
- Minimum
|
||
- Maximum
|
||
- Average (last 10)
|
||
|
||
## Panel Layout (6 HP)
|
||
|
||
```
|
||
┌─────────────────────┐
|
||
│ SN-L00 │
|
||
│ │
|
||
│ ┌───────────┐ │
|
||
│ │ OLED │ │
|
||
│ │ 12.4 ms │ │
|
||
│ └───────────┘ │
|
||
│ │
|
||
│ [BTN] │
|
||
│ │
|
||
│ ○ OUT ○ IN │
|
||
│ TRIG RETURN │
|
||
│ │
|
||
│ ● PWR │
|
||
└─────────────────────┘
|
||
```
|
||
|
||
## Firmware Architecture
|
||
|
||
```
|
||
main.c
|
||
├── init_gpio() # Configure pins
|
||
├── init_i2c() # OLED communication
|
||
├── init_timer() # High-resolution timer
|
||
│
|
||
├── trigger_pulse() # Generate output pulse
|
||
├── wait_for_return() # Monitor input with timeout
|
||
├── calculate_latency() # Timer math
|
||
│
|
||
├── display_update() # OLED rendering
|
||
├── button_handler() # Mode switching
|
||
└── main_loop() # State machine
|
||
```
|
||
|
||
## GPIO Assignments (RP2040-Zero)
|
||
|
||
| GPIO | Function | Notes |
|
||
|------|----------|-------|
|
||
| GP0 | I2C SDA | OLED |
|
||
| GP1 | I2C SCL | OLED |
|
||
| GP2 | Trigger Out | Via 74LVC1G17 |
|
||
| GP3 | Return In | Via MCP6001 |
|
||
| GP4 | Button | Internal pullup |
|
||
| GP5 | Power LED | Optional |
|
||
|
||
## Future Expansion Ideas
|
||
|
||
- CV output proportional to latency
|
||
- MIDI output (latency as CC)
|
||
- USB logging to computer
|
||
- Multiple trigger patterns (burst, random)
|
||
- Frequency response mode (sweep test)
|