diff --git a/docs/hardware-plan.md b/docs/hardware-plan.md index 780369e..f2080a4 100644 --- a/docs/hardware-plan.md +++ b/docs/hardware-plan.md @@ -18,20 +18,16 @@ architecture this hardware serves. ## 1. Block diagram ``` -USB-C 5V ──┬── 3.3 V buck ── RP2040 + W25Q16 flash + RM2 module (CYW43439, BLE/WiFi) - │ │ - │ ├── PIO0 SPI ── RM2 (CYW43439 gSPI, Pico-W pinout) - │ ├── USB DP/DM ── (USB-MIDI composite, CDC+MIDI) - │ ├── UART0 ──── MIDI TRS in (6N138) / out - │ ├── I2C0 ───── Pimoroni RGB Keypad (buttons) - │ ├── SPI0 ───── Pimoroni RGB Keypad (APA102 LEDs) - │ ├── SPI1 ───── 8-ch 16-bit DAC (CV outs) - │ ├── I2C1 ───── 64×32 SSD1306 OLED - │ └── GPIOs ──── 4× tact buttons (UI) - │ - └── ±12 V rails (boost + inverter) ── CV op-amps ── 4× stereo TRS (8 CV/gate) - │ - 4.096 V ref ── DAC (0-4.096 V) ── op-amp gain ×4.88, offset −10 V ── ±10 V ── 1 k + bidir TVS ── TRS tip/ring +USB-C 5V ── BQ24075 (charger + power-path) ── SYS (~3.0-4.2 V) + │ │ + LiPo cell (charge/discharge) ├── 3.3 V buck-boost ── RP2040 + flash + RM2 + │ ├── +12 V boost ──┐ + │ ├── −12 V inverter┤ CV op-amps (±12 V) ── 4× stereo TRS + MAX17048 fuel gauge (I2C) └── 4.096 V/2.048 V refs ── DAC ── diff-amp → ±10 V + │ + RP2040: PIO0 SPI ── RM2 | USB DP/DM ── USB-MIDI composite | UART0 ── MIDI TRS + I2C0 ── keypad | SPI0 ── keypad LEDs | SPI1 ── DAC | I2C1 ── OLED + fuel gauge + GPIOs ── 4× tact + charge-status LED ``` ## 2. RP2040 pin map @@ -56,17 +52,27 @@ driver and our firmware work unchanged) and our existing keypad wiring. No conflicts; GP14/15 (USB) and GP23-25/29 (CYW43) kept clear of everything else. -## 3. Power tree (USB-only, with CV boost) +## 3. Power tree (USB + LiPo battery with power-path) -- USB-C 5 V → polyfuse + ESD → **VBUS_5V**. -- VBUS_5V → **3.3 V buck** (RT6150B-33GQW) → RP2040, RM2, flash, DAC VDD, - OLED, pull-ups. -- VBUS_5V → **+12 V boost** (TPS61088 + LC filter) → +12 V CV op-amp rail. -- VBUS_5V → **−12 V inverter** (TPS63700 + LC filter) → −12 V CV op-amp rail. - Both rails feed the bipolar CV op-amps. Low current (~20 mA each), LC-filtered. -- **4.096 V reference** (REF3040AIDBZ) for the DAC, and a **2.048 V mid-ref** - (buffered divider or REF2040) for the bipolar offset — NOT the 3.3 V rail - (too noisy for 1 V/oct pitch). +- USB-C 5 V → polyfuse + ESD → **VBUS_5V** → **BQ24075** charger/power-path IC. + - VBUS present → device runs from VBUS *and* charges the cell; SYS output + is the system rail. + - VBUS absent → battery powers SYS seamlessly (no glitch). +- **SYS rail (~3.0-4.2 V)** — the battery-voltage domain, the new system input. + - SYS → **3.3 V buck-boost** (RT6150B-33GQW — already a buck-boost, so it + holds 3.3 V through the whole SYS range, including battery sag) → RP2040, + RM2, flash, DAC VDD, OLED, pull-ups. + - SYS → **+12 V boost** (TPS61088) → +12 V CV op-amp rail (input 3.0-4.2 V + when on battery is fine; just draws more current at low voltage). + - SYS → **−12 V inverter** (TPS63700) → −12 V CV op-amp rail. +- **4.096 V reference** (REF3040AIDBZ) and **2.048 V mid-ref** (REF2040) — + powered from +3V3 (post-buck, clean), NOT from SYS (sags with battery) or + the 3.3 V rail directly (too noisy for 1 V/oct pitch). +- **LiPo cell** (single, 3.7 V nominal, ~1500-2000 mAh, integrated protection + PCB) on BAT. Charge rate set by BQ24075 PROG pin (~500 mA to stay within USB + 2.0; raise if using USB-C 1.5/3 A). +- **MAX17048 fuel gauge** (I2C1, shared with OLED) → battery state-of-charge + on the OLED + low-battery warning in firmware. **Power budget (BLE-only):** we use Bluetooth only, never WiFi TX. The cyw43 driver must load the WiFi firmware to bring up BT (BT-only init isn't supported @@ -79,17 +85,20 @@ yet), but WiFi never transmits → power stays at BLE levels, not WiFi-TX levels | DAC8568 | ~2 mA | ~2 mA | | OPA4192 ×2 (quiescent) | ~9 mA @±12 V | ~9 mA | | OLED SSD1306 | ~20 mA | ~40 mA | -| ±12 V rails load (op-amps + DAC out) | ~20 mA @12 V → ~50 mA @5 V (×2 converters, ~85% eff) | ~60 mA @5 V | +| ±12 V rails load | ~20 mA @±12 V → ~60 mA @SYS (×2 converters, ~80% eff) | ~75 mA @SYS | | MIDI out LED (brief) | — | ~15 mA @3.3 V | -| **Total from 5 V** | **~180-230 mA** | **~330-380 mA** | +| **System draw from SYS** | **~200-260 mA** | **~340-400 mA** | -Fits USB 2.0 (500 mA) with headroom; USB-C default (900 mA) is comfortable. -If WiFi TX were ever enabled, RM2 spikes to ~350 mA and the total approaches -~650 mA — stay BLE-only or require a USB-C 1.5 A/3 A source. +Battery life: a 2000 mAh cell at ~250 mA avg → ~7-8 h (peak BLE + display); a +1500 mAh cell → ~5-6 h. SYS sags to ~3.3 V at end of discharge, all converters +stay in regulation. When USB present, SYS = charge voltage (~4.2 V max); charge +current limited to ~500 mA by default to respect USB 2.0 (battery tops up in +~3-4 h for a 1500 mAh cell). -Rationale: USB-only power (single cable, no external PSU) while delivering -bipolar ±10 V CV via two small low-current rails. The LC filters + dedicated -Vref keep pitch clean. +Rationale: USB *or* battery operation via one power-path IC; the existing +converters already accept the SYS voltage range (buck-boost on 3.3 V is the key +— a plain buck would drop out near end-of-discharge). BLE-only keeps the budget +comfortable; WiFi TX would push ~600 mA peak and halve battery life. ## 4. CV analog section (4 stereo = 8 channels, bipolar ±10 V) @@ -161,6 +170,9 @@ Host PCB responsibilities (from the RM2 datasheet): | Mid-ref | REF2040AIDBZ (or buffered divider) | SOT-23 | 2.048 V bipolar offset reference | | Calib | 8× trimpot (e.g. 3296W) | THT/SMD | per-channel gain/offset trim | | MIDI opto | 6N138 | DIP-8 / SMD | MIDI in isolation | +| Charger | BQ24075DRCR | MSOP-10 | single-cell LiPo charger + power-path (SYS pin) | +| Fuel gauge | MAX17048G+T10 | TDFN-8 (or bare module) | LiPo SoC over I2C1 (optional) | +| Battery | LiPo 3.7 V, 1500-2000 mAh | cell w/ protection PCB | integrated DW01/FS8205A protection | | 3.3 V reg | RT6150B-33GQW | QFN | buck-boost, 800 mA, Pico-proven (TPS62A01 alt) | | +12 V boost | TPS61088 | QFN | 5→12 V, low-noise + LC filter | | −12 V inverter | TPS63700 | SOT-23-6 / QFN | 5→−12 V, low-noise + LC filter (LM2611 alt) | @@ -183,10 +195,19 @@ Host PCB responsibilities (from the RM2 datasheet): 3. **Custom RP2040 bring-up** — needs a SWD header + Picoprobe; USB bootloader only works after first flash. 4. **64×32 OLED UI** — tight; menu must be paginated and minimal. -5. **Boost current budget** — RM2 TX spikes + 8 CV op-amps + two converters on - a single USB 5 V/500 mA port is tight; BLE-only keeps it ~330-380 mA peak - (fits), but specify USB-C 5 V/900 mA for headroom. -6. **RM2 antenna keepout** — follow the datasheet keepout; the one layout +5. **Boost current budget** — RM2 TX spikes + 8 CV op-amps + two converters; + BLE-only keeps the system draw ~340-400 mA peak from SYS, plus up to ~500 mA + battery charge from USB → USB-C 5 V/900 mA-1.5 A recommended (USB 2.0 500 mA + only if charging paused or BLE-only/low charge rate). +6. **Battery sag at end-of-discharge** — SYS can sag to ~3.3 V; the 3.3 V path + must be a buck-boost (RT6150B is) or it drops out. Fuel gauge drives a + low-battery warning in firmware; cut off at ~3.3 V to protect the cell. +7. **Charge thermal** — BQ24075 thermal-regulates; keep it away from the CV + references / DAC and away from the LiPo for thermal separation. +8. **LiPo shipping / safety** — LiPo cells have shipping (UN3481) and safety + considerations; use a protected cell, add a charge LED, follow charge-IC + layout guidance. +9. **RM2 antenna keepout** — follow the datasheet keepout; the one layout constraint the radio imposes. ## 10. Build order (hardware) @@ -194,7 +215,8 @@ Host PCB responsibilities (from the RM2 datasheet): 1. Schematic (this doc is the spec). 2. RM2 module footprint + antenna keepout. 3. RP2040 + flash + USB + SWD. -4. Power (3.3 V buck, +12 V boost, −12 V inverter, 4.096 V + 2.048 V refs). +4. Power (BQ24075 power-path + LiPo, 3.3 V buck-boost, +12 V boost, + −12 V inverter, 4.096 V + 2.048 V refs, MAX17048 fuel gauge). 5. CV analog (DAC + difference-amp + offset + trim + bidir protection + TRS). 6. MIDI TRS circuit. 7. OLED + buttons. @@ -222,6 +244,9 @@ at `hardware/netlist.net`. | U8 | DAC8568 | 8-ch 16-bit SPI DAC | | U9, U10 | OPA4192 | quad RRO op-amp ×2 (8 CV channels) | | U11 | 6N138 | MIDI-in optocoupler | +| U12 | BQ24075 | single-cell LiPo charger + power-path | +| U13 | MAX17048 | LiPo fuel gauge (I2C) | +| BAT1 | LiPo cell | ~1500-2000 mAh, integrated protection | | DISP1 | SSD1306 | 64×32 OLED (I2C) | | J1 | USB-C | 5 V + USB data | | J2 | 2×3 header | SWD (Picoprobe) | @@ -234,16 +259,21 @@ at `hardware/netlist.net`. | D1–D8 | bidirectional TVS | CV output protection | | R_cal1–R_cal8 | — | per-channel calibration (see §4) | -### Power nets +### Power nets (with battery power-path) ``` -J1.VBUS ── FB1 ── +5V -+5V ── U3 (RT6150B-33) ── +3V3 -+5V ── U4 (TPS61088) + L1 LC ── +12V -+5V ── U5 (TPS63700) + L2 LC ── −12V -+3V3 ── U6 (REF3040) ── VREF4V096 +J1.VBUS ── FB1 ── VBUS_5V +VBUS_5V ── U12 (BQ24075 VBUS) ; USB input to charger/power-path +BAT1 ── U12 (BAT) ; LiPo cell +U12 (SYS) ── SYS rail (~3.0-4.2 V) ; system supply (USB or battery) +SYS ── U3 (RT6150B-33) ── +3V3 ; buck-boost: holds 3.3 V across SYS range +SYS ── U4 (TPS61088) + L1 LC ── +12V +SYS ── U5 (TPS63700) + L2 LC ── −12V ++3V3 ── U6 (REF3040) ── VREF4V096 ; refs from clean +3V3, not saggy SYS +3V3 ── U7 (REF2040) ── VMID2V048 -GND = J1.GND, all return paths +U13 (MAX17048) SDA/SCL ── I2C1 (shared with OLED) ; fuel gauge +U12 (STAT) ── U1.GPIO16 ; charge status (→ LED + firmware) +GND = J1.GND, BAT1.GND, all return paths ``` ### RM2 radio (Pico-W-compatible gSPI)