Files
baby-mobile/DESIGN.md
T
zyphlar 5a18a689e0 nRF
2026-07-04 03:28:11 -07:00

230 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Baby Mobile Audio Board v2 — Design Document
## Overview
Drop-in replacement for baby crib mobile electronics. Custom audio from
SPI flash, DC motor control, 8 buttons, and long runtime on 2×AA batteries.
No programmer needed — upload audio via USB drag-and-drop or Bluetooth.
## Architecture
```
2×AA (1.8-3.2V) → SW9 → D1(BAT54S) → TPS61220 boost → 3.3V ──┐
├── MDBT50Q
USB-C VBUS (5V) → D3(BAT54S) → MCP1700 LDO → 3.3V ────────────┘ (nRF52840)
┌────────────── SPI ── IS25LP128F (16MB flash, 2.3-3.6V) │
│ ┌───────── PWM ── R+C LPF ── PAM8302A ── 8Ω speaker │
│ │ ┌───── GPIO ── AO3400A MOSFET ── DC motor │
│ │ │ ┌─── GPIO ── 8× buttons (internal pull-ups) │
│ │ │ │ ┌─ USB ── USB-C D+/D- (mass storage) │
│ │ │ │ │ BLE ── phone (wireless upload) │
└────┴───┴─┴─┴──────────────────────────────────────────────────┘
```
## Power Design — Diode OR-ing (Safe for ALL Battery Types)
```
BAT54S TPS61220
2×AA ──SW9──┤►├──────┐ ┌─ VIN VOUT ─── 3.3V rail
├── node ┤
USB VBUS ───┤►├── LDO ┘ └─ EN GND ─── GND
BAT54S MCP1700 L ─── L1(4.7µH)
```
**Why this is safe:** The Schottky diodes only pass current in one direction.
When USB provides 3.3V via the LDO, the boost converter stops switching and
the battery diode is reverse-biased. Zero current flows into the batteries
regardless of chemistry (alkaline, NiMH, lithium).
**Diode drop:** BAT54S drops ~0.25V. TPS61220 accepts inputs down to 0.7V.
Depleted 2×AA = 1.8V → boost sees 1.55V → still operational.
## Pin Mapping — MDBT50Q (nRF52840)
| Module Pin | nRF52840 Port | Function | Connected To |
|------------|---------------|--------------|-------------------------------|
| 4 | P0.02/AIN0 | Button 1 | SW1 → GND (active LOW) |
| 5 | P0.03/AIN1 | Button 2 | SW2 → GND |
| 6 | P0.04/AIN2 | Button 3 | SW3 → GND |
| 7 | P0.05/AIN3 | Button 4 | SW4 → GND |
| 8 | P0.06 | Button 5 | SW5 → GND |
| 9 | P0.07 | Button 6 | SW6 → GND |
| 10 | P0.08 | Button 7 | SW7 → GND |
| 11 | P0.09 | Button 8 | SW8 → GND |
| 12 | P0.10 | Motor PWM | R4(100Ω) → Q1 gate |
| 13 | P0.11 | Audio PWM | R2(4.7K) → C7(10nF) → C6 → U3|
| 14 | P0.12 | Flash ~CS | U2 pin 1 |
| 15 | P0.13 | SPI MOSI | U2 pin 5 |
| 16 | P0.14 | SPI MISO | U2 pin 2 |
| 17 | P0.15 | SPI SCK | U2 pin 6 |
| 18 | P0.16 | LED output | R6(1K) → D2 → GND |
| 19 | P0.17 | Amp ~SD | U3 pin 1, R3(100K) → GND |
| 20 | P0.18/~RESET | Reset | (internal pull-up) |
| 21 | P0.19 | TXD (serial) | J5 pin 2 |
| 22 | P0.20 | RXD (serial) | J5 pin 3 |
| 28 | D- | USB Data - | J6 D- |
| 29 | D+ | USB Data + | J6 D+ |
| 33 | SWDIO | Debug | J4 pin 2 (SWD header) |
| 34 | SWDCLK | Debug | J4 pin 3 (SWD header) |
| 32 | VCC | Power | 3V3 rail |
| 1 | GND | Ground | GND rail |
## SPI Flash: U2 — IS25LP128F (SOIC-8)
| Pin | Name | Connected To |
|-----|-----------|-------------------|
| 1 | ~CS | P0.12 (FLASH_CS) |
| 2 | SO (MISO) | P0.14 (SPI_MISO) |
| 3 | ~WP | 3V3 (tie high) |
| 4 | GND | GND |
| 5 | SI (MOSI) | P0.13 (SPI_MOSI) |
| 6 | SCLK | P0.15 (SPI_SCK) |
| 7 | ~HOLD | 3V3 (tie high) |
| 8 | VCC | 3V3 |
**Operating voltage: 2.3V3.6V** — works across entire boost output range.
## Audio Signal Path
```
P0.11 (PWM) → R2(4.7K) → node → C6(1µF coupling) → PAM8302A A+
C7(10nF) → GND
RC LPF cutoff: 1/(2π × 4700 × 10e-9) ≈ 3.4 kHz
```
## USB-C Wiring
```
USB-C Pin → Board
────────────────────
VBUS (5V) → D3 anode → MCP1700 VIN
GND → GND
D+ → nRF52840 D+ (pin 29)
D- → nRF52840 D- (pin 28)
CC1 → R7(5.1K) → GND
CC2 → R8(5.1K) → GND
```
## Bill of Materials
| Ref | Part | Package | Qty | ~Cost |
|--------|----------------------|---------------|-----|--------|
| U1 | MDBT50Q-P1MV2 | Module | 1 | $6.00 |
| U2 | IS25LP128F-JBLE | SOIC-8 | 1 | $2.00 |
| U3 | PAM8302AASCR | SOIC-8 | 1 | $0.80 |
| U4 | TPS61220DCKR | SC-70-5 | 1 | $0.80 |
| U5 | MCP1700-3302E/TT | SOT-23 | 1 | $0.20 |
| Q1 | AO3400A | SOT-23 | 1 | $0.15 |
| D1 | BAT54S | SOT-23 | 1 | $0.05 |
| D3 | BAT54S | SOT-23 | 1 | $0.05 |
| D4 | SS14 | SMA | 1 | $0.10 |
| D2 | LED green | 0805 | 1 | $0.05 |
| L1 | 4.7µH inductor | 0805 | 1 | $0.15 |
| R2 | 4.7KΩ | 0805 | 1 | $0.01 |
| R3 | 100KΩ | 0805 | 1 | $0.01 |
| R4 | 100Ω | 0805 | 1 | $0.01 |
| R5 | 100KΩ | 0805 | 1 | $0.01 |
| R6 | 1KΩ | 0805 | 1 | $0.01 |
| R7,R8 | 5.1KΩ | 0805 | 2 | $0.02 |
| C1 | 100µF/10V | Radial 5mm | 1 | $0.15 |
| C2 | 100nF | 0805 | 1 | $0.01 |
| C3 | 10µF | 0805 | 1 | $0.05 |
| C5 | 100nF | 0805 | 1 | $0.01 |
| C6 | 1µF | 0805 | 1 | $0.02 |
| C7 | 10nF | 0805 | 1 | $0.01 |
| C8 | 10µF | 0805 | 1 | $0.05 |
| C9,C10 | 10µF | 0805 | 2 | $0.10 |
| C11,C12| 1µF | 0805 | 2 | $0.04 |
| SW1-8 | Tactile switch | 6mm SMD | 8 | $0.80 |
| SW9 | SPDT slide | THT | 1 | $0.20 |
| J1 | JST-PH 2-pin | THT | 1 | $0.15 |
| J2 | JST-PH 2-pin | THT | 1 | $0.15 |
| J3 | JST-PH 2-pin | THT | 1 | $0.15 |
| J4 | 1×4 pin header | 2.54mm | 1 | $0.10 |
| J5 | 1×3 pin header | 2.54mm | 1 | $0.05 |
| J6 | USB-C receptacle | SMD | 1 | $0.30 |
| | **TOTAL** | | |**~$12**|
## Power Analysis
| State | MCU | Flash | Amp | Motor | Boost η | Battery mA |
|--------------------|--------|--------|--------|--------|---------|------------|
| Audio + motor | 4 mA | 8 mA | 10 mA | 80 mA | 90% | ~113 mA |
| Audio only | 4 mA | 8 mA | 10 mA | 0 | 90% | ~24 mA |
| BLE idle | 0.5 mA | 0.001 | 0.001 | 0 | 85% | ~0.7 mA |
| Deep sleep | 0.002 | 0.001 | 0.001 | 0 | — | ~0.01 mA |
**Estimated runtimes on 2×AA alkaline (2500 mAh usable with boost):**
| Mode | Runtime |
|------------------|--------------|
| Audio + Motor | ~22 hours |
| Audio only | ~104 hours |
| BLE standby | ~149 days |
| Deep sleep | ~28 years |
| 30 min/day use | **~44 days** |
## Module Options (Soldering Difficulty)
The schematic is designed around the MDBT50Q module, but the firmware
works on any nRF52840 board. Here are your options from easiest to hardest:
| Module | ~Cost | USB-C | Bootloader | Soldering |
|-----------------------------|-------|-------|------------|------------------|
| **Seeed XIAO nRF52840** | $10 | Yes | UF2 preloaded | **Through-hole headers** — solder like any DIP. Has castellated pads too. |
| **Adafruit Feather nRF52840** | $25 | Yes | UF2 preloaded | Through-hole headers |
| **SparkFun Pro nRF52840** | $20 | Yes | UF2 preloaded | Through-hole headers |
| **Ebyte E73-2G4M08S1C** | $3 | No | None | Castellated edge pads — hand-solderable with regular iron |
| **MDBT50Q-P1MV2 (Raytac)** | $6 | No | None | SMD pads — needs reflow or hot air |
**Recommended for beginners: Seeed XIAO nRF52840.** It plugs into standard
2.54mm headers like an Arduino Nano. USB-C and UF2 bootloader are built in,
so you never need a programmer. Just drag-and-drop firmware and audio files.
**If using a XIAO or Feather:** you can skip the TPS61220 boost converter,
MCP1700 LDO, USB-C connector, and CC resistors from the BOM. The dev board
handles all of that. Feed the boost converter's 3.3V output to the board's
3V3 pin. Total BOM drops to ~$15 including the XIAO.
**If using MDBT50Q or E73:** you need the full schematic as designed. The
E73 is the budget option — castellated pads are solderable with flux, a
fine tip, and patience. Pre-tin both the pads and the board footprint,
then tack one corner and reflow the rest.
## User Experience
### Upload Audio (USB)
1. Plug USB-C cable into board
2. Board appears as USB mass storage drive
3. Drag .wav or .mp3 files onto drive
4. Eject and unplug — music ready to play
### Upload Audio (Bluetooth)
1. Open Web Bluetooth page on phone (no app install)
2. Connect to "BabyMobile" device
3. Select audio files → transfer
4. ~15 min for 30 minutes of audio at BLE speeds
### Update Firmware
1. Double-tap reset button (or hold BTN1+BTN2 on power-on)
2. Board appears as UF2 drive
3. Drag .uf2 firmware file onto drive
4. Board reboots with new firmware
### No-Programmer Setup
The MDBT50Q ships with the nRF52840 bootloader ROM. Flash the Adafruit
nRF52 UF2 bootloader once via SWD (J4 header) using any $3 CMSIS-DAP
probe, J-Link, or even a Raspberry Pi. After that, all future updates
are drag-and-drop over USB. The SWD header is only needed once.