merge panels

This commit is contained in:
zyphlar
2026-07-04 03:28:12 -07:00
parent 5a18a689e0
commit f770479fc4
11 changed files with 1758 additions and 1638 deletions
+264
View File
@@ -0,0 +1,264 @@
# Toy PCB Brain Transplant Guide
## Overview
Instead of building a whole new board, desolder the original MCU from the
toy's PCB and replace it with a breakout connector wired to the XIAO
nRF52840. The original PCB keeps doing everything it's good at (power,
buttons, motor, speaker routing) — you just swap the brain.
## What You Need
| Item | ~Cost | Notes |
|------|-------|-------|
| SOP-16 solder-down DIP adapter | $2 | Logical Systems PA-SOF-D420-16, or generic SOIC-16→DIP breakout |
| Seeed XIAO nRF52840 | $10 | The new brain |
| IS25LP128F (SPI flash) | $2 | Audio storage (solder to a small perfboard with the XIAO) |
| 16-pin ribbon cable or Dupont jumpers | $1 | Connect adapter to XIAO |
| Solder, flux, solder wick | — | For desoldering and rework |
| Multimeter | — | For reverse-engineering the pinout |
**Total added cost: ~$15** (and you reuse 90% of the original toy)
## Step 1: Document the Original Board
Before desoldering anything:
1. **Photograph both sides** of the PCB in good light
2. **Identify the MCU** — look for markings like TRSF1602A, chip-on-board
(black blob), or other SOP-8/SOP-16 packages
3. **Note the pin 1 indicator** — dot, notch, or beveled corner
4. **Count pins** — this guide assumes SOP-16, but adapt for SOP-8
5. **Trace visible connections** by eye:
- Which pins have fat traces? → probably power (VCC/GND)
- Which pins connect to the speaker? → audio output
- Which pins go to the motor area? → motor drive
- Which pins go to buttons? → GPIO inputs
## Step 2: Desolder the Original MCU
**Hot air method (recommended):**
1. Apply flux to all pins
2. Set hot air to ~350°C, low airflow
3. Heat evenly around the chip until solder reflows
4. Lift chip with tweezers
5. Clean pads with wick and flux
**Soldering iron method:**
1. Apply flux generously
2. Add fresh leaded solder to all pins (lower melting point helps)
3. Drag iron back and forth across pins on each side
4. Use solder wick to remove excess
5. Gently pry chip up while heating one side, then the other
6. Clean pads with wick
**If it's a chip-on-board (black blob):**
Unfortunately, these can't be desoldered. You'll need to cut the traces
instead and jumper to the XIAO. Identify the traces leading to the blob
and cut them with an X-acto knife, then solder wires directly to the
button/speaker/motor pads on the board.
## Step 3: Solder the SOP-16 Breakout Adapter
1. Place the SOP-16 → DIP adapter on the now-empty pads
2. Align pin 1 with the original pin 1 marking
3. Tack-solder two corner pins
4. Check alignment under magnification
5. Solder remaining pins
6. Now you have 16 through-hole pins you can plug jumper wires into
## Step 4: Reverse-Engineer the Pinout
This is the detective work. You need to figure out what the original
MCU was connected to on each pin.
### 4a: Power pins (multimeter, board OFF)
Set multimeter to continuity/beep mode.
1. Touch one probe to the battery negative terminal (GND)
2. Touch the other probe to each of the 16 breakout pins
3. **Mark any pins that beep as GND**
4. Now touch one probe to battery positive (after the power switch)
5. Touch other probe to each remaining pin
6. **Mark any pins that beep as VCC**
Typical SOP-16 MCUs have 1-2 GND pins and 1-2 VCC pins.
### 4b: Speaker pins (visual trace + multimeter)
Follow the traces from the speaker solder pads back to the breakout.
Often the speaker connects through a small capacitor or resistor, then
to one or two MCU pins.
- **One speaker pin** = single-ended PWM audio (most common)
- **Two speaker pins** = bridge-tied-load (BTL) direct drive (no amp chip)
### 4c: Motor pin (visual trace)
Follow the motor wires. In cheap toys, the motor often connects to a
single transistor (TO-92 or SOT-23 package near the motor area). The
transistor's base connects (through a resistor) to an MCU pin.
If there's no transistor and the motor connects directly to an MCU pin
(rare but possible on very cheap toys), you'll need to add a MOSFET —
MCU pins can't drive motors directly.
### 4d: Button pins (multimeter, board OFF)
For each physical button on the toy:
1. Press the button while testing continuity between its pads
2. Trace one pad to GND (common) and the other to an MCU pin
3. Label that breakout pin as a button input
Most cheap toys wire buttons between the MCU pin and GND, relying on
the MCU's internal pull-up resistor — same as our design.
### 4e: Automated pin discovery (firmware)
Upload the pin_discovery sketch (included below) to the XIAO. Connect
each breakout pin one at a time to a XIAO GPIO and the sketch will
tell you what it sees:
- High/low/floating state
- Whether pressing a button changes it
- Whether it shows PWM activity when the toy was running
- Approximate voltage level
## Step 5: Create the Pin Map
Fill out a table like this for your specific toy:
| SOP-16 Pin | Connects To | XIAO Pin | Notes |
|------------|-------------|----------|-------|
| 1 | VCC | 3V3 | Power supply |
| 2 | GND | GND | Ground |
| 3 | Button 1 | D0 | Play/Pause (active LOW) |
| 4 | Button 2 | D1 | Next track |
| 5 | Button 3 | D2 | Motor on/off |
| 6 | Button 4 | D3 | Volume/speed |
| 7 | Speaker + | D10 | PWM audio output |
| 8 | Speaker - | GND | Or second PWM for BTL |
| 9 | Motor ctrl | D6 | Through transistor on board |
| 10 | NC | — | Not connected |
| 11-16 | ... | ... | (varies by toy) |
## Step 6: Wire It Up
1. Solder header pins to the XIAO if not already done
2. Solder the IS25LP128F flash chip to a small piece of perfboard
next to the XIAO (VCC, GND, and 4 SPI wires)
3. Run jumper wires from each SOP-16 breakout pin to the
corresponding XIAO pin per your pin map
4. Connect VCC breakout pin → XIAO 3V3 (to power the XIAO from toy batteries)
5. Connect GND breakout pin → XIAO GND
**IMPORTANT voltage check:** Before connecting power, measure the toy's
VCC with batteries installed. If it's 2×AA (3V) or 3×AA (4.5V), you
can connect directly to the XIAO's 3V3 pin (which accepts 1.7-3.6V on
the nRF52840). If the toy uses more than 3 batteries (>5V), you MUST
use the XIAO's 5V pin or add a regulator.
For 2×AA: Connect through the TPS61220 boost to get stable 3.3V,
then feed that to XIAO 3V3. Or if you're fine with the limited voltage
range, connect the battery VCC directly to XIAO 3V3 — the nRF52840
runs down to 1.7V, but the IS25LP128F needs 2.3V minimum, so you'll
lose the bottom of the battery capacity.
## Step 7: Update the Firmware Pin Mapping
In baby_mobile_v2.ino, update the pin definitions to match your wiring:
```cpp
// Adjust these to match YOUR toy's pin map
#define PIN_AUDIO_PWM D10 // connected to speaker trace
#define PIN_AMP_SD -1 // set to -1 if toy has no separate amp
#define PIN_MOTOR_PWM D6 // connected to motor transistor base
#define PIN_BTN1 D0 // play/pause button
#define PIN_BTN2 D1 // next
#define PIN_BTN3 D2 // motor toggle
#define PIN_BTN4 D3 // fourth button
// ... set unused buttons to -1
```
If the toy's original circuit drives the speaker directly from the MCU
(no amp chip), the XIAO's PWM output through the RC filter should work
similarly. The original PWM was likely at a higher carrier frequency
(the TRSF1602A runs at up to 13MHz), but 8kHz audio content will
sound the same.
## Common Toy PCB Patterns
### Pattern A: Direct-drive speaker (most common in cheap toys)
```
MCU pin → small cap (100nF-1µF) → Speaker+
Speaker- → GND
```
The MCU generates PWM, the cap blocks DC. No amplifier. Maximum volume
is limited by the MCU's output current (~20mA). This works fine with
the XIAO — just set the PWM pin and skip the PAM8302A entirely.
### Pattern B: Transistor amplifier
```
MCU pin → resistor (1K-10K) → transistor base
collector → Speaker+
emitter → GND
Speaker- → VCC
```
Again, the XIAO's PWM drives this directly. The transistor provides
current amplification.
### Pattern C: Dedicated amp IC (higher-end toys)
```
MCU pin → coupling cap → amp IC input
amp IC output → Speaker ±
```
Here you're feeding the amp's input from the XIAO PWM through the
existing coupling cap. Should work as-is. If there's a shutdown pin
on the amp, trace it back to the MCU and control it from the XIAO.
### Motor drive patterns:
```
Common: MCU pin → resistor → NPN base → motor → VCC
emitter → GND
diode across motor
Simple: MCU pin → motor → VCC (tiny motors only, <20mA)
```
## Troubleshooting
**No sound:** Check speaker connections. Measure voltage on the audio pin
with a multimeter while playing — you should see ~1.5V average. If 0V,
wrong pin. If VCC, the pin is driving high but not PWMing.
**Distorted sound:** The RC filter values may need adjustment. Try
increasing R2 or C7 to lower the cutoff frequency. Also check that
analogWriteResolution(8) is set in setup().
**Motor doesn't spin:** The XIAO pin may not source enough current to
drive the transistor. Check if the base resistor is reasonable (1K-10K).
If the original design was a darlington or MOSFET, the XIAO should
drive it fine.
**Buttons don't work:** Verify the button wires go to GND when pressed.
Some toys use a resistor ladder (all buttons on one ADC pin with
different resistor values) — this requires reading analogRead() instead
of digitalRead(). The pin_discovery sketch will detect this.
**Board doesn't power up:** The original MCU may have been pulling
certain pins to specific states that other components depend on. Check
if any traces from the MCU footprint go to enable pins on regulators
or other ICs on the board.
-229
View File
@@ -1,229 +0,0 @@
# 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.
+112
View File
@@ -0,0 +1,112 @@
# Ordering & Assembly Guide
## JLCPCB Order Settings
Upload `baby-mobile-panel.kicad_pcb` gerbers with these options:
| Setting | Value |
|---|---|
| Layers | 2 |
| PCB Thickness | 1.6mm (carrier) / 0.8mm works too |
| Surface Finish | LeadFree HASL (cheapest) or ENIG |
| **Castellated Holes** | **Yes** (required for adapters) |
| **V-Score** | **Yes** (break between carrier and adapters) |
| Quantity | 5 (minimum) |
| **Estimated Cost** | **~$8 for 5 panels** |
If ordering JLC assembly (SMT), upload `carrier_bom_jlc.csv`.
Otherwise, hand-solder the carrier components yourself — everything
is 0805 or larger except the TPS61220 (SC-70-5, fine-pitch but doable
with flux and a fine tip).
## Carrier Board BOM
| Ref | Part | Package | LCSC | ~Cost | Notes |
|---|---|---|---|---|---|
| U1 | TPS61220DCKR | SC-70-5 | C83951 | $0.80 | **Pin 1 dot on silk** |
| U2 | IS25LP128F-JBLE | SOIC-8 | C194872 | $1.80 | **Pin 1 dot on silk** |
| L1 | 4.7µH inductor | 0805 | C408336 | $0.15 | |
| C1 | 10µF ceramic | 0805 | C15850 | $0.05 | Boost input |
| C2 | 10µF ceramic | 0805 | C15850 | $0.05 | Boost output |
| C3 | 100nF ceramic | 0805 | C49678 | $0.01 | Flash decoupling |
| C4 | 100nF ceramic | 0805 | C49678 | $0.01 | (optional XIAO decoupling) |
| C5 | 10nF ceramic | 0805 | C1710 | $0.01 | Audio LPF |
| R1 | 4.7KΩ | 0805 | C17673 | $0.01 | Audio LPF |
| R2 | 10KΩ | 0805 | C17414 | $0.01 | Flash CS pullup |
| J1 | JST SH 10-pin SMD | 1.0mm | C160404 | $0.30 | Right-angle |
| J2,J3 | Female header 1×7 | 2.54mm | C124378 | $0.20 | XIAO socket (×2) |
| — | Seeed XIAO nRF52840 | module | — | $9.90 | From Seeed/Amazon |
| | **Carrier subtotal** | | | **~$13.30** | |
### Not on PCB (buy separately)
| Item | Source | ~Cost |
|---|---|---|
| JST SH 10-pin cable (both ends female) | Amazon/AliExpress | $1.50 |
| 30AWG wire (for adapter-to-JST) | Amazon | $5/spool |
| 2×AA battery holder | Reuse from toy | $0 |
## Breakaway Adapter BOM
The adapters are **passive PCBs** — no components except one JST SH
connector each. Buy the connector that matches your adapter:
| Adapter | JST SH Pins | LCSC | ~Cost |
|---|---|---|---|
| SOP-8 | 8-pin | C160402 | $0.25 |
| SOP-16 narrow | 10-pin | C160404 | $0.30 |
| SOP-16 wide | 10-pin | C160404 | $0.30 |
You only need one adapter per toy — snap off the right one.
## Assembly Order
### 1. Carrier board (do this first, test before connecting to toy)
1. **Solder U1 (TPS61220)** — align pin 1 dot. Tin one pad, place
chip, reflow that pad, then solder remaining 4 pins.
2. **Solder L1, C1, C2** — boost converter circuit. Apply 2×AA
battery voltage to VBAT/GND test points. Measure 3V3 output —
should read 3.30V ±0.1V.
3. **Solder U2 (IS25LP128F)** — align pin 1 dot. Same technique as U1.
4. **Solder C3, R2** — flash decoupling and CS pullup.
5. **Solder R1, C5** — audio RC filter.
6. **Solder J1 (JST SH)** — align pin 1 mark.
7. **Solder J2, J3** — XIAO female headers.
8. **Plug in XIAO** — USB-C faces the left edge marked on silk.
9. **Test** — upload pin_discovery.ino, verify serial output.
### 2. Adapter board
1. **Snap off** the adapter matching your toy's MCU package.
2. **Solder JST connector** to adapter's top surface.
3. **Desolder** original MCU from toy PCB (hot air or iron + flux).
4. **Place adapter** in empty footprint, pin 1 aligned.
5. **Solder castellated edges** — the half-holes sit on the SOP pads.
Apply flux, touch with iron, solder wicks into the half-hole.
6. **Plug JST cable** from adapter into carrier J1.
### 3. Map and wire
1. Upload **pin_discovery.ino** to XIAO.
2. Use multimeter + the serial tool to identify each SOP pin's function.
3. Create your pin map (see BRAIN_TRANSPLANT.md).
4. Update **baby_mobile_v2.ino** pin definitions.
5. Upload final firmware.
6. Upload audio via USB mass storage.
## Silkscreen Guide
All polarized components have pin 1 dots (●) on the silkscreen:
- **U1 (TPS61220):** dot near pin 1 (VIN)
- **U2 (IS25LP128F):** dot near pin 1 (~CS)
- **J1 (JST SH):** dot near pin 1 (VBAT)
- **Each adapter:** dot near SOP pin 1
The XIAO outline shows the board rectangle with a USB-C bump
on the left edge. Pin labels (D0-D10, 3V3, GND, 5V) are printed
next to each header hole.
+445
View File
@@ -0,0 +1,445 @@
(kicad_pcb (version 20221018) (generator "panel_gen_v3")
(general (thickness 1.6))
(paper "A4")
(title_block
(title "Baby Mobile — Combined Panel")
(date "2026-03-11")
(rev "3.0")
(comment 1 "Carrier: XIAO nRF52840 + IS25LP128F + TPS61220")
(comment 2 "Breakaway: SOP-8, SOP-16N, SOP-16W castellated adapters")
(comment 3 "Order as one panel from JLCPCB with castellated holes + v-score")
)
(layers
(0 "F.Cu" signal) (31 "B.Cu" signal)
(34 "B.Paste" user) (35 "F.Paste" user)
(36 "B.SilkS" user "B.Silkscreen") (37 "F.SilkS" user "F.Silkscreen")
(38 "B.Mask" user "B.Mask") (39 "F.Mask" user "F.Mask")
(44 "Edge.Cuts" user) (49 "F.Fab" user "F.Fab") (48 "B.Fab" user "B.Fab")
)
(setup (pad_to_mask_clearance 0.05))
(net 0 "")
(net 1 "GND") (net 2 "VBAT") (net 3 "3V3")
(net 4 "SPI_MOSI") (net 5 "SPI_MISO") (net 6 "SPI_SCK") (net 7 "FLASH_CS")
(net 8 "BOOST_SW")
(net 9 "SIG_1") (net 10 "SIG_2") (net 11 "SIG_3") (net 12 "SIG_4")
(net 13 "SIG_5") (net 14 "SIG_6") (net 15 "SIG_7") (net 16 "SIG_8")
(gr_line (start 100 100) (end 148.0 100) (layer "Edge.Cuts") (width 0.1) (uuid "7b1700cb-2e02-4e2e-9378-f797465d2604"))
(gr_line (start 148.0 100) (end 148.0 136.0) (layer "Edge.Cuts") (width 0.1) (uuid "74de5cee-1470-42ab-ae12-5d13adf0da95"))
(gr_line (start 148.0 136.0) (end 100 136.0) (layer "Edge.Cuts") (width 0.1) (uuid "7673667b-18a1-446c-aa5c-fe52e4354265"))
(gr_line (start 100 136.0) (end 100 100) (layer "Edge.Cuts") (width 0.1) (uuid "918f360a-2692-439d-a5c9-ac14740cb644"))
(gr_line (start 100 125.0) (end 148.0 125.0) (layer "Edge.Cuts") (width 0.1) (uuid "783f22f9-02f5-42c4-a763-c768f7fc670f"))
(gr_text "— SNAP HERE —" (at 124.0 125.0) (layer "F.SilkS") (uuid "b18cbfec-4605-45b0-b128-89ced7badd2b") (effects (font (size 0.6 0.6) (thickness 0.09))))
(gr_line (start 111.5 126.0) (end 111.5 136.0) (layer "Edge.Cuts") (width 0.1) (uuid "a783dca9-0c36-4d1f-8397-d0c443740d11"))
(gr_line (start 126.5 126.0) (end 126.5 136.0) (layer "Edge.Cuts") (width 0.1) (uuid "ebef14ed-7814-4b0b-a462-71d18131efff"))
(gr_rect (start 105.5 104.25) (end 126.5 121.75) (layer "F.SilkS") (width 0.15) (uuid "df1a4a4b-4fe2-47f9-8823-a6a873b671d3"))
(gr_rect (start 104.5 111.25) (end 105.5 114.75) (layer "F.SilkS") (width 0.15) (uuid "751bafa2-2bb5-45ab-a9d5-a4633e786a63"))
(gr_text "USB-C" (at 102.5 113.0) (layer "F.SilkS") (uuid "4da04b1c-4fcd-42b3-b4d6-46a9c04dfe43") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "XIAO nRF52840" (at 116 113.0) (layer "F.SilkS") (uuid "c5647cc5-4310-45d9-9aee-757ce667d5f0") (effects (font (size 0.7 0.7) (thickness 0.105) bold)))
(footprint "panel:XIAO_L" (layer "F.Cu")
(at 107.11 113.0)
(uuid "424b9417-5f41-43c3-8293-a8e6cb933576")
(fp_text reference "XIAO_L" (at 0 0) (layer "F.Fab") (uuid "1a192681-0423-4f3e-891c-0eab3ca39c22")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "720cd57c-edcc-4b50-ad35-7338533983cd")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "D0" thru_hole circle (at 0.000 -7.620) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 9 "SIG_1") (uuid "13d7148a-50c1-4a94-8c11-e9dcb6a754c6"))
(pad "D1" thru_hole circle (at 0.000 -5.080) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 10 "SIG_2") (uuid "7ca7a9e0-026d-402d-ab32-548113b484a6"))
(pad "D2" thru_hole circle (at 0.000 -2.540) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 11 "SIG_3") (uuid "2d34971b-f0cc-450a-b01f-c96eef28ae65"))
(pad "D3" thru_hole circle (at 0.000 0.000) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 12 "SIG_4") (uuid "fbb508a4-080e-4393-b007-24b8441ed40c"))
(pad "D4" thru_hole circle (at 0.000 2.540) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 13 "SIG_5") (uuid "057c4634-92da-473b-bd74-636c3b5da05a"))
(pad "D5" thru_hole circle (at 0.000 5.080) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 14 "SIG_6") (uuid "e996f8e8-cba1-4124-adea-6e6a55822cf2"))
(pad "D6" thru_hole circle (at 0.000 7.620) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 15 "SIG_7") (uuid "c1ecb403-d181-4f94-8a3f-f0d904a321af"))
)
(gr_text "D0" (at 104.11 105.38) (layer "F.SilkS") (uuid "8ccee08b-7714-4ea7-a015-9ac7c7007746") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D1" (at 104.11 107.92) (layer "F.SilkS") (uuid "b369c277-cc9e-477d-aa9c-3cbfea32fea2") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D2" (at 104.11 110.46) (layer "F.SilkS") (uuid "aeb4b4c5-29de-460e-820d-bc8d6b3af6d1") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D3" (at 104.11 113.0) (layer "F.SilkS") (uuid "8548eb5a-87f5-4282-9d87-f43ad4cc7c3e") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D4" (at 104.11 115.53999999999999) (layer "F.SilkS") (uuid "fecb2fc5-5665-4cb4-a0f0-96b5f4e7b60b") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D5" (at 104.11 118.08) (layer "F.SilkS") (uuid "fd67dc0f-1c74-4a8f-8058-5237b0164175") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D6" (at 104.11 120.61999999999999) (layer "F.SilkS") (uuid "ada138f6-8731-4fc5-ae8d-e392f03f1f5e") (effects (font (size 0.5 0.5) (thickness 0.075))))
(footprint "panel:XIAO_R" (layer "F.Cu")
(at 124.89 113.0)
(uuid "3cd83d54-c4bd-49db-8108-1fea4f7216d3")
(fp_text reference "XIAO_R" (at 0 0) (layer "F.Fab") (uuid "757c0392-628e-4915-bd7c-e069da6da9e3")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "4c8ac95c-7732-46f0-bf26-80e8ae16043a")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "D10" thru_hole circle (at 0.000 -7.620) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 16 "SIG_8") (uuid "f264cff2-da9c-43e9-963b-b94769bdfcb1"))
(pad "D9" thru_hole circle (at 0.000 -5.080) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 6 "SPI_SCK") (uuid "308ce269-69a0-432d-905a-673545bacbe6"))
(pad "D8" thru_hole circle (at 0.000 -2.540) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 4 "SPI_MOSI") (uuid "ad23c509-4739-4079-a75c-e5e315d806b5"))
(pad "D7" thru_hole circle (at 0.000 0.000) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 5 "SPI_MISO") (uuid "da735dbd-fa9b-43d3-b598-21925b5096d2"))
(pad "3V3" thru_hole circle (at 0.000 2.540) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 3 "3V3") (uuid "b903209b-71fb-41d3-a113-1733752b5319"))
(pad "GND" thru_hole circle (at 0.000 5.080) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (net 1 "GND") (uuid "2960e5f3-39de-410d-8c2e-1efa6f5d6d41"))
(pad "5V" thru_hole circle (at 0 7.62) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (uuid "ebbd6673-2b72-4e71-bdb3-9884752f82ec"))
)
(gr_text "D10" (at 127.89 105.38) (layer "F.SilkS") (uuid "5203eb0b-f267-4c9a-8362-5d4ad5b4b82e") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D9" (at 127.89 107.92) (layer "F.SilkS") (uuid "c6ce93ba-42a5-4a0e-97c8-5c5cbb22a23f") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D8" (at 127.89 110.46) (layer "F.SilkS") (uuid "3847168c-3ec1-4ab3-8c8c-1a387e691cd9") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "D7" (at 127.89 113.0) (layer "F.SilkS") (uuid "d5d839c4-a0fb-4936-9647-afd65ec22baf") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "3V3" (at 127.89 115.53999999999999) (layer "F.SilkS") (uuid "7f208461-157c-4f2e-9ba8-9ff7a92e2592") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "GND" (at 127.89 118.08) (layer "F.SilkS") (uuid "0d7bb0f3-d447-40c0-8c0d-852c0888bd95") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "5V" (at 127.89 120.61999999999999) (layer "F.SilkS") (uuid "41673efe-250c-4f9d-b726-a4a3323f0a55") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_circle (center 131.5 110.0) (end 131.8 110.0) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "13a16cf6-f659-4a1b-a214-eaa0051e312f"))
(gr_rect (start 131.5 104.5) (end 136.5 108.5) (layer "F.SilkS") (width 0.15) (uuid "e3237dd4-989a-4291-8a2d-4dc17b1b3a49"))
(gr_text "U2 IS25LP128F" (at 134 103.0) (layer "F.SilkS") (uuid "0f957ce0-a31e-4bdc-ab4e-cfa38072838b") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "●1" (at 131.5 110.7) (layer "F.SilkS") (uuid "d38fce73-c8ac-41f6-a19f-8c9bf104fcb0") (effects (font (size 0.4 0.4) (thickness 0.06))))
(footprint "panel:IS25LP128F" (layer "F.Cu")
(at 134 106.5)
(uuid "035c717e-5224-4dae-b80e-c5ad937661b4")
(fp_text reference "IS25LP128F" (at 0 0) (layer "F.Fab") (uuid "a831eb77-f12b-4f9c-a65a-1ea2a8eecb84")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "80984351-2ea3-4c2d-8c81-2146ab830536")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.905 2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 7 "FLASH_CS") (uuid "a9a47098-819e-4532-ac33-07c50281d653"))
(pad "2" smd rect (at -0.635 2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 5 "SPI_MISO") (uuid "2351be0b-b569-4b8c-8140-aaac92581886"))
(pad "3" smd rect (at 0.635 2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 3 "3V3") (uuid "bac05db0-0409-4c26-a620-50caf6c4cca8"))
(pad "4" smd rect (at 1.905 2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 1 "GND") (uuid "edcc2bd9-c8ae-403f-bbf2-f4626fdcdb9e"))
(pad "5" smd rect (at 1.905 -2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 4 "SPI_MOSI") (uuid "219218ea-ebfb-487d-a51e-c42592053dbe"))
(pad "6" smd rect (at 0.635 -2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 6 "SPI_SCK") (uuid "c81ade0d-58ae-4354-95f3-c81c0bdef5e8"))
(pad "7" smd rect (at -0.635 -2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 3 "3V3") (uuid "4c34d938-b3ee-470b-8f42-ccb75644e447"))
(pad "8" smd rect (at -1.905 -2.700) (size 0.6 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (net 3 "3V3") (uuid "8b9ebe9d-3c52-4bda-9d1f-7dcc2a6431e5"))
)
(footprint "panel:C3" (layer "F.Cu")
(at 139 106.5)
(uuid "6c849ca5-09fb-49a3-9c51-234d3277ff4c")
(fp_text reference "C3" (at 0 0) (layer "F.Fab") (uuid "64dfb9e1-c603-44f5-9695-85e9febe5068")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "d71421ef-b387-4165-9478-3494261bb3eb")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 3 "3V3") (uuid "75dbbfeb-def5-4b8b-9cb1-935bbd23f5ac"))
(pad "2" smd rect (at 1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 1 "GND") (uuid "754aa1fe-fa86-4f71-ae83-8a549899f4ca"))
)
(gr_text "C3 100n" (at 139 105.3) (layer "F.SilkS") (uuid "63cd6760-d68d-4280-b7ab-b1bec1a5435b") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_text "+" (at 137.8 106.5) (layer "F.SilkS") (uuid "5df09abb-4d82-48fa-b277-3d8e5c8c9ff0") (effects (font (size 0.4 0.4) (thickness 0.06))))
(footprint "panel:R2" (layer "F.Cu")
(at 139 109.5)
(uuid "f285b94d-6fb7-4652-94cc-c59818678108")
(fp_text reference "R2" (at 0 0) (layer "F.Fab") (uuid "7eff1e64-ff06-429f-8417-782c8082dd8c")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "edbb8ed0-6a3c-4b9a-af54-f1496efc2bff")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 7 "FLASH_CS") (uuid "b945b811-e8b4-45d6-b1ab-1a67524b65bc"))
(pad "2" smd rect (at 1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 3 "3V3") (uuid "822ffa6c-5cfc-465e-a985-4ce3593ff60a"))
)
(gr_text "R2 10K" (at 139 108.3) (layer "F.SilkS") (uuid "ada14ace-3cd5-44e2-9165-76e0941f655b") (effects (font (size 0.4 0.4) (thickness 0.06))))
(footprint "panel:R1" (layer "F.Cu")
(at 134 113)
(uuid "31b61a4c-cb67-41fe-abde-6237a02672e7")
(fp_text reference "R1" (at 0 0) (layer "F.Fab") (uuid "f8c37308-786e-400d-81b0-fb29dc6121b0")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "6554f611-3d96-4bd4-9be6-ff4f31f8e0f9")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 16 "SIG_8") (uuid "664bc9f2-d270-4113-9d41-1649df5b63e0"))
(pad "2" smd rect (at 1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "AUDIO_FILT") (uuid "9c4ec3bf-1942-4b3b-a0bc-d2270af990a1"))
)
(gr_text "R1 4.7K" (at 134 111.8) (layer "F.SilkS") (uuid "c302f0de-3645-4a12-bfb6-d6e0acc191bb") (effects (font (size 0.4 0.4) (thickness 0.06))))
(footprint "panel:C5" (layer "F.Cu")
(at 134 115.5)
(uuid "c70ac8eb-9f06-48c7-a731-46c4ce383b29")
(fp_text reference "C5" (at 0 0) (layer "F.Fab") (uuid "6dfa0d66-c59f-4fd3-8df3-928ab755c88b")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "c931a903-19ee-46b1-9846-5939fc8aa326")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "AUDIO_FILT") (uuid "3fa692ca-1d5a-4a89-b1a2-f01428dc22f4"))
(pad "2" smd rect (at 1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 1 "GND") (uuid "6b0bca98-110f-45d1-aed4-e862f8a1202e"))
)
(gr_text "C5 10n" (at 134 114.3) (layer "F.SilkS") (uuid "5e2e8cd8-6382-4870-a049-816dd507fa2d") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_circle (center 132.8 121.5) (end 133.10000000000002 121.5) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "a9e16b85-e4af-4e84-94a7-f47d0120bcb1"))
(gr_text "U1 TPS61220" (at 134 117.5) (layer "F.SilkS") (uuid "b124be9f-a3a8-4149-946d-a031307b61a4") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "●1" (at 132.8 122.2) (layer "F.SilkS") (uuid "33ea581f-e2cb-4990-94a7-1983dac9d167") (effects (font (size 0.4 0.4) (thickness 0.06))))
(footprint "panel:TPS61220" (layer "F.Cu")
(at 134 120)
(uuid "1f475038-a4b5-4175-91c9-7d26e3766a1e")
(fp_text reference "TPS61220" (at 0 0) (layer "F.Fab") (uuid "40582112-b236-436a-afdc-dbcb9ca5417b")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "1acbc7e6-9df7-4224-b91b-20582215db1d")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -0.650 0.700) (size 0.4 0.55) (layers "F.Cu" "F.Paste" "F.Mask") (net 2 "VBAT") (uuid "8b9f424f-e807-4bf0-ac6e-68a45cefae72"))
(pad "2" smd rect (at 0.000 0.700) (size 0.4 0.55) (layers "F.Cu" "F.Paste" "F.Mask") (net 1 "GND") (uuid "8aab62be-1aaf-44e0-bc10-877fc0c5cef0"))
(pad "3" smd rect (at 0.650 0.700) (size 0.4 0.55) (layers "F.Cu" "F.Paste" "F.Mask") (net 2 "VBAT") (uuid "dcc4a5fd-3515-412c-bc9a-04d98d276173"))
(pad "4" smd rect (at 0.650 -0.700) (size 0.4 0.55) (layers "F.Cu" "F.Paste" "F.Mask") (net 3 "3V3") (uuid "b4de3046-f675-425b-ba3b-b91d0a31f6a0"))
(pad "5" smd rect (at -0.650 -0.700) (size 0.4 0.55) (layers "F.Cu" "F.Paste" "F.Mask") (net 8 "BOOST_SW") (uuid "1296667a-5140-4529-b8c0-e3e5c52ffe73"))
)
(footprint "panel:L1" (layer "F.Cu")
(at 130 120)
(uuid "31c56158-ebf0-488e-9c27-a7b32fcbf6c4")
(fp_text reference "L1" (at 0 0) (layer "F.Fab") (uuid "e44c635a-7a50-48bd-8af2-1c65a923068a")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "201cfb60-ce63-47dd-bb3f-2377cfdd3367")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 8 "BOOST_SW") (uuid "db0d1c42-7f1c-4fc8-bbc2-50d413f665fc"))
(pad "2" smd rect (at 1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 2 "VBAT") (uuid "07b425f3-ebae-4c23-bdbe-3f3ae544a11f"))
)
(gr_text "L1 4.7u" (at 130 118.8) (layer "F.SilkS") (uuid "6a6d0334-20cc-4df5-b4a8-d678450ff424") (effects (font (size 0.4 0.4) (thickness 0.06))))
(footprint "panel:C1" (layer "F.Cu")
(at 130 123)
(uuid "388f4ff3-38e6-4b57-ade2-7879dd444e34")
(fp_text reference "C1" (at 0 0) (layer "F.Fab") (uuid "86f3204f-e9bc-4f25-a3a9-238b9ef0f036")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "862f86fc-3311-4743-904b-b0a7d0a1d8b4")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 2 "VBAT") (uuid "3f9ec573-2045-4f59-8aa1-61f1e6c044d6"))
(pad "2" smd rect (at 1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 1 "GND") (uuid "4098d85d-3560-4bfe-88d1-62fdca17533f"))
)
(gr_text "C1 10u" (at 130 121.8) (layer "F.SilkS") (uuid "e13ad2f1-be9f-4c11-b453-5b3056c504dc") (effects (font (size 0.4 0.4) (thickness 0.06))))
(footprint "panel:C2" (layer "F.Cu")
(at 138 120)
(uuid "71039fd9-95ff-4065-9c59-60105470ff55")
(fp_text reference "C2" (at 0 0) (layer "F.Fab") (uuid "4507f636-6ecc-4887-b582-643579401f00")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "dbc71da1-b782-46b4-88c6-c69d9b4fed69")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 3 "3V3") (uuid "a0201b14-401e-4afb-b31f-fe5fcb82fdd6"))
(pad "2" smd rect (at 1.000 0.000) (size 1.0 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 1 "GND") (uuid "cc269e12-18cf-4357-b7bb-a725b6e8a234"))
)
(gr_text "C2 10u" (at 138 118.8) (layer "F.SilkS") (uuid "6b0a22cf-83cb-4569-8a04-62d5d0dfec82") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_text "J1 TO TOY →" (at 136 107) (layer "F.SilkS") (uuid "c569cf60-f111-4dff-83db-fafbd8197660") (effects (font (size 0.5 0.5) (thickness 0.075))))
(gr_text "1=VBAT 2=GND 3-10=SIG" (at 136 116) (layer "F.SilkS") (uuid "3a1c1424-149b-42dd-9647-76ba66d15e60") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_circle (center 135.7 111) (end 136.0 111) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "937dca26-8795-40b6-aa11-cd91fa320aec"))
(footprint "panel:J1_JST_SH10" (layer "F.Cu")
(at 141 111)
(uuid "1bf0b2d9-7ef1-4f6f-aa3a-336ad20f828f")
(fp_text reference "J1_JST_SH10" (at 0 0) (layer "F.Fab") (uuid "4a61bb05-8474-4184-a42c-e0f0eb360403")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "96812a3b-b2ef-44d8-b9b0-b38e2233d654")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" smd rect (at -4.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 2 "VBAT") (uuid "c5100258-7976-444f-aa98-b9e4d45bace7"))
(pad "2" smd rect (at -3.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 1 "GND") (uuid "65697aea-87a9-40cf-9a90-60397ae8e81d"))
(pad "3" smd rect (at -2.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 9 "SIG_1") (uuid "b415ff5e-b50e-4f91-a350-43f232c23ab3"))
(pad "4" smd rect (at -1.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 10 "SIG_2") (uuid "9bf989cb-344e-43ab-bc5e-1ca8a620a89b"))
(pad "5" smd rect (at -0.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 11 "SIG_3") (uuid "c81114ae-ab4a-4351-9aef-979bd5776fc5"))
(pad "6" smd rect (at 0.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 12 "SIG_4") (uuid "d2de3994-f605-4758-89d3-32dbf3b28812"))
(pad "7" smd rect (at 1.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 13 "SIG_5") (uuid "f29d020f-6822-424e-b2a0-22e7d1669a86"))
(pad "8" smd rect (at 2.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 14 "SIG_6") (uuid "f88f3dcc-efde-4594-ae2b-410f3ca1a074"))
(pad "9" smd rect (at 3.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 15 "SIG_7") (uuid "2fb195c4-5246-46f4-a2a1-7718847f4819"))
(pad "10" smd rect (at 4.500 0.000) (size 0.6 1.2) (layers "F.Cu" "F.Paste" "F.Mask") (net 16 "SIG_8") (uuid "7933cf14-f6ed-4f06-b736-87fe37541f89"))
(pad "S1" smd rect (at -6.000 2.150) (size 1.2 1.8) (layers "F.Cu") (net 0 "") (uuid "77da10bc-5247-4236-90c2-afbb80680c20"))
(pad "S2" smd rect (at 6.000 2.150) (size 1.2 1.8) (layers "F.Cu") (net 0 "") (uuid "a31546da-deff-4b09-a1bb-bb654a1e05c4"))
)
(footprint "panel:MH" (layer "F.Cu")
(at 104.5 102.5)
(uuid "3d6c895f-0a9b-464e-8536-a32c4457a246")
(fp_text reference "MH" (at 0 0) (layer "F.Fab") (uuid "5d96b049-f10c-447b-9bac-97113e1219ec")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "4b13c3b7-8e4f-472a-9fd7-8dbbc87151ca")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "" thru_hole circle (at 0 0) (size 3.5 3.5) (drill 2.2) (layers "*.Cu" "*.Mask") (uuid "6909aca5-a5b1-46df-bfbd-d664ad4f9dd8"))
)
(footprint "panel:MH" (layer "F.Cu")
(at 141.0 123.0)
(uuid "993bf336-b07f-4cf2-99b9-4b6f1dd8c0fc")
(fp_text reference "MH" (at 0 0) (layer "F.Fab") (uuid "0e7ad9bf-ded2-4dac-8aed-3b81f17dd8b6")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "6fbeac64-dc35-4fbc-9311-d5e822009ffb")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "" thru_hole circle (at 0 0) (size 3.5 3.5) (drill 2.2) (layers "*.Cu" "*.Mask") (uuid "f384efc5-884c-4fc7-be90-6214a76d9363"))
)
(gr_text "Baby Mobile Carrier v3.0" (at 124.0 100.5) (layer "F.SilkS") (uuid "536313ba-aa0f-43ca-ad0d-46a9123ce61d") (effects (font (size 0.7 0.7) (thickness 0.105) bold)))
(gr_text "3V3" (at 132.0 125.3) (layer "F.SilkS") (uuid "45d2ab75-759c-4f37-8618-87f620e2d745") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_text "XIAO D0-D6 = SIG_1-7 (buttons/speaker/motor)" (at 124.0 106) (layer "B.SilkS") (uuid "30f97b1f-9a2e-424f-8178-488ab913f73c") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_text "XIAO D7=MISO D8=MOSI D9=SCK D10=AUDIO" (at 124.0 108) (layer "B.SilkS") (uuid "fd1a9361-d67c-4b32-ae97-80ae719e4cf5") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_text "JST: 1=VBAT 2=GND 3-10=SIG_1-8" (at 124.0 110) (layer "B.SilkS") (uuid "adb6bbb5-5687-41b9-b2df-cef2d9088d0e") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_line (start 103.095 127.55) (end 108.905 127.55) (layer "Edge.Cuts") (width 0.1) (uuid "c6351db3-0d63-4b19-b879-1096a1ebb7cc"))
(gr_line (start 108.905 127.55) (end 108.905 134.45) (layer "Edge.Cuts") (width 0.1) (uuid "4ecacc87-37c8-48d7-a1ef-e7991a4153f9"))
(gr_line (start 108.905 134.45) (end 103.095 134.45) (layer "Edge.Cuts") (width 0.1) (uuid "4ce6f3f0-4e32-4c24-a6d9-84ec04c0c836"))
(gr_line (start 103.095 134.45) (end 103.095 127.55) (layer "Edge.Cuts") (width 0.1) (uuid "997589ec-4d8b-4593-b35f-180de9f3fc82"))
(gr_text "SOP-8" (at 106 126.55) (layer "F.SilkS") (uuid "1b597be2-2a34-4900-98bf-1f2517842d20") (effects (font (size 0.6 0.6) (thickness 0.09) bold)))
(footprint "panel:SOP-8_pads" (layer "B.Cu")
(at 106 132.5)
(uuid "0eca431f-4ee4-44a9-afdf-51d718534b5c")
(fp_text reference "SOP-8_pads" (at 0 0) (layer "B.Fab") (uuid "afa5c0fb-39e0-4941-8a90-6419f4300c8d")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "B.Fab") (uuid "b5533d64-7952-40ea-beb6-a2586cf440e5")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" thru_hole circle (at -1.905 1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "361b27a3-f477-4c94-879b-4e123751cf63"))
(pad "8" thru_hole circle (at -1.905 -1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "e38495d5-30b3-4bc4-893d-c51c476300f1"))
(pad "2" thru_hole circle (at -0.635 1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "050516cc-4844-453e-a4c8-92cc0ef936d1"))
(pad "7" thru_hole circle (at -0.635 -1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "5d2afb12-8ea1-4d80-9e8a-22d4e3620ed3"))
(pad "3" thru_hole circle (at 0.635 1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "14975a05-c721-4062-afb2-9f336a44c385"))
(pad "6" thru_hole circle (at 0.635 -1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "5de5a38d-5292-44a0-b866-5a5d6b86edef"))
(pad "4" thru_hole circle (at 1.905 1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "7cdb28e0-15e0-45ae-a7e0-88e0cce8f6b9"))
(pad "5" thru_hole circle (at 1.905 -1.950) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "d4f5b25e-b4aa-4dae-9928-7e05078eb636"))
)
(gr_text "1" (at 104.095 135.25) (layer "F.SilkS") (uuid "f5c9593e-7259-4d40-9547-c3fa917499db") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "8" (at 104.095 129.75) (layer "F.SilkS") (uuid "9c12d426-d109-4879-8f62-fa55ac473f6c") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "2" (at 105.365 135.25) (layer "F.SilkS") (uuid "80f87ae1-198d-4372-9e7f-94238f2ca0b8") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "7" (at 105.365 129.75) (layer "F.SilkS") (uuid "b567e07a-b5a7-4b34-83a4-5875666ab5a1") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "3" (at 106.635 135.25) (layer "F.SilkS") (uuid "1c61d6e3-ba47-4305-89c9-436eef9a9b54") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "6" (at 106.635 129.75) (layer "F.SilkS") (uuid "c1fcc1ba-1bd8-4e73-8262-9251a35ffc5c") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "4" (at 107.905 135.25) (layer "F.SilkS") (uuid "81633807-bc28-4f41-a567-02907c6e5656") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "5" (at 107.905 129.75) (layer "F.SilkS") (uuid "55462181-2c84-4bfa-8ca2-613eedb69ac4") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_circle (center 103.495 134.95) (end 103.745 134.95) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "4b74368f-179f-40bd-b0c4-1c6a2e65a838"))
(footprint "panel:SOP-8_JST" (layer "F.Cu")
(at 106 129.05)
(uuid "e98f9c1d-98b1-4684-8a3b-8ded8d0454b1")
(fp_text reference "SOP-8_JST" (at 0 0) (layer "F.Fab") (uuid "1024358b-e61c-4657-b5f9-482448a2a8cc")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "b482a232-0071-4793-a66b-b8244ac0dfd7")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "J1" smd rect (at -3.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "7f4a8271-2243-4f28-a589-efa81177ed32"))
(pad "J2" smd rect (at -2.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "671447e7-c863-49e3-880d-4153c11d9ed4"))
(pad "J3" smd rect (at -1.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "f7d739a7-0996-49df-accc-1e980e86064a"))
(pad "J4" smd rect (at -0.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "5b438e3d-d561-44da-a542-434a7cb7e986"))
(pad "J5" smd rect (at 0.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "379acc48-9b28-4dcf-880b-ea34cbdbc194"))
(pad "J6" smd rect (at 1.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "eac7ffe5-08d0-4880-a0bf-9a65086e63d9"))
(pad "J7" smd rect (at 2.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "0414d2bc-e60a-49e3-a499-16dc1f3287c8"))
(pad "J8" smd rect (at 3.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "acb37cf8-1c43-4d18-9ab7-bf5dbef4393c"))
)
(gr_text "JST" (at 106 127.55000000000001) (layer "F.SilkS") (uuid "7fa426dc-36e1-4889-8e8c-927910eeb31a") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_circle (center 101.7 129.05) (end 101.9 129.05) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "fece2278-867a-421f-a49d-78a23eca6b39"))
(gr_line (start 114.555 126.5) (end 125.44500000000001 126.5) (layer "Edge.Cuts") (width 0.1) (uuid "2fc6e446-43a3-405a-a030-10f6e05f5310"))
(gr_line (start 125.44500000000001 126.5) (end 125.44500000000001 135.5) (layer "Edge.Cuts") (width 0.1) (uuid "b924be81-09cb-4afa-b7cd-ba218190706f"))
(gr_line (start 125.44500000000001 135.5) (end 114.555 135.5) (layer "Edge.Cuts") (width 0.1) (uuid "36c5db66-cf81-4c2f-b7c4-0c0a89a59d87"))
(gr_line (start 114.555 135.5) (end 114.555 126.5) (layer "Edge.Cuts") (width 0.1) (uuid "b47949f9-1b7f-430b-bfb0-f9f4a17a28ec"))
(gr_text "SOP-16N" (at 120 125.5) (layer "F.SilkS") (uuid "fe5e0f87-c3ec-44c3-9bdb-2943579813c4") (effects (font (size 0.6 0.6) (thickness 0.09) bold)))
(footprint "panel:SOP-16N_pads" (layer "B.Cu")
(at 120 132.5)
(uuid "3701fa1b-825b-4648-bb67-5661713c49b3")
(fp_text reference "SOP-16N_pads" (at 0 0) (layer "B.Fab") (uuid "fa9d17ce-47e3-4163-8bbb-ef21c48e8a5b")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "B.Fab") (uuid "31bd2f24-ffb9-4929-8e62-b567ca5fa457")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" thru_hole circle (at -4.445 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "96894655-c1fd-4926-95e1-720467b1d1db"))
(pad "16" thru_hole circle (at -4.445 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "f24a95ec-fb94-441c-af60-354b16c413b4"))
(pad "2" thru_hole circle (at -3.175 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "f617f3fe-ed62-4736-b8b7-ffc7e30e4c77"))
(pad "15" thru_hole circle (at -3.175 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "ffb8c150-9b59-44d2-8de6-ea9761fab4a1"))
(pad "3" thru_hole circle (at -1.905 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "eca590f6-c2d0-4081-8a03-b9732a4cde1c"))
(pad "14" thru_hole circle (at -1.905 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "2bb228b2-3315-41bb-8a55-7f1a67adac95"))
(pad "4" thru_hole circle (at -0.635 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "ac0baa4b-7af9-4749-88dc-ab7009d200b2"))
(pad "13" thru_hole circle (at -0.635 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "b8e3c538-e5bc-4a47-822c-1f8333c82a28"))
(pad "5" thru_hole circle (at 0.635 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "0e3a6f08-8df6-4b07-b647-b5c2ac8ff96e"))
(pad "12" thru_hole circle (at 0.635 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "61698711-bd67-4626-9590-ddd735effbd7"))
(pad "6" thru_hole circle (at 1.905 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "38d4335c-662f-4be5-9fbf-53ee1084c374"))
(pad "11" thru_hole circle (at 1.905 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "b8e01f00-14d1-4280-bb10-1682af9b6a1b"))
(pad "7" thru_hole circle (at 3.175 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "9fa33513-28db-41b0-b412-d76ce27b9e18"))
(pad "10" thru_hole circle (at 3.175 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "4a533dd2-9097-4ef2-afad-921cfb7e3983"))
(pad "8" thru_hole circle (at 4.445 3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "85330de0-c53d-4800-9578-0cc3dafb2e3f"))
(pad "9" thru_hole circle (at 4.445 -3.000) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "93c0d157-1a13-4732-997c-4469b9eb4ffa"))
)
(gr_text "1" (at 115.555 136.3) (layer "F.SilkS") (uuid "5875da56-cd75-453c-99b1-d99292331ce7") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "16" (at 115.555 128.7) (layer "F.SilkS") (uuid "05383887-6c29-421f-b812-5af47aeb8af4") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "2" (at 116.825 136.3) (layer "F.SilkS") (uuid "58407aeb-0041-4ff3-bc69-3d05922b6680") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "15" (at 116.825 128.7) (layer "F.SilkS") (uuid "2cec8f90-d7fb-497e-80fa-0528ae2e7f4c") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "3" (at 118.09500000000001 136.3) (layer "F.SilkS") (uuid "3c345293-b744-436e-baca-e390c07ec531") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "14" (at 118.09500000000001 128.7) (layer "F.SilkS") (uuid "ddf9ffdf-da47-44a8-96e8-016d1b8e39d0") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "4" (at 119.36500000000001 136.3) (layer "F.SilkS") (uuid "1ba584bd-a85f-436e-93c0-f14382e4f112") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "13" (at 119.36500000000001 128.7) (layer "F.SilkS") (uuid "b43e5efc-f5cd-4fa0-975b-3a5c455bf433") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "5" (at 120.635 136.3) (layer "F.SilkS") (uuid "638812b1-cf4a-43d5-882c-65ebf45d50a8") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "12" (at 120.635 128.7) (layer "F.SilkS") (uuid "5ed17165-92a2-4292-924b-4a996778b40e") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "6" (at 121.905 136.3) (layer "F.SilkS") (uuid "c61c18a6-703d-442b-b5b1-6b2cc330178d") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "11" (at 121.905 128.7) (layer "F.SilkS") (uuid "612d5b34-c3aa-43d7-b5c6-bc3bcd5edf85") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "7" (at 123.17500000000001 136.3) (layer "F.SilkS") (uuid "8c73cee8-e49b-4516-b1b2-d5b458c65ed3") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "10" (at 123.17500000000001 128.7) (layer "F.SilkS") (uuid "81415c0e-b422-417b-891c-9b265f3a9490") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "8" (at 124.44500000000001 136.3) (layer "F.SilkS") (uuid "4643670c-3e2e-4898-93fa-f94089b8bc70") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "9" (at 124.44500000000001 128.7) (layer "F.SilkS") (uuid "3f211df8-900b-4182-9056-dafbab78e44c") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_circle (center 114.95500000000001 136.0) (end 115.20500000000001 136.0) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "ae452f51-64f3-492c-800f-0a92aae3f25a"))
(footprint "panel:SOP-16N_JST" (layer "F.Cu")
(at 120 128.0)
(uuid "2b8602d1-de42-4302-8ea1-29bc923063a5")
(fp_text reference "SOP-16N_JST" (at 0 0) (layer "F.Fab") (uuid "2f071088-2901-4294-850e-43ec54f05465")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "cfe264e6-6db0-4df7-b0ee-fd08effe36a3")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "J1" smd rect (at -4.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "2fc2338d-5959-41d5-9e87-4249c11d83b0"))
(pad "J2" smd rect (at -3.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "174d4da3-c824-49a7-9289-2a4bafb40c61"))
(pad "J3" smd rect (at -2.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "08f931bf-579d-4e3d-bb8a-a6098144ae7f"))
(pad "J4" smd rect (at -1.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "68b1fdc4-e36c-4465-8f13-0607f1033394"))
(pad "J5" smd rect (at -0.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "2e06c2a5-df6d-4454-bf8a-fa56768057da"))
(pad "J6" smd rect (at 0.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "2a0a15c9-cafb-43cc-be75-43a66b0addd0"))
(pad "J7" smd rect (at 1.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "f8733fb3-787d-4024-8852-abe90145d2e2"))
(pad "J8" smd rect (at 2.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "cd9cac1b-2505-4223-ba93-11ace821e5ad"))
(pad "J9" smd rect (at 3.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "248f8301-96c2-4e99-9d41-86b8ba211321"))
(pad "J10" smd rect (at 4.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "556be4a5-a310-44b4-88c4-a8a0729e0d1f"))
)
(gr_text "JST" (at 120 126.5) (layer "F.SilkS") (uuid "2c02c675-43b7-4b85-86c0-a10cc14fcc7a") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_circle (center 114.7 128.0) (end 114.9 128.0) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "f09b75e7-7351-43cd-8a0e-b9e9d795466a"))
(gr_line (start 131.555 124.35) (end 142.445 124.35) (layer "Edge.Cuts") (width 0.1) (uuid "4c7738b5-0870-478d-9fa0-2f96294e88d7"))
(gr_line (start 142.445 124.35) (end 142.445 137.65) (layer "Edge.Cuts") (width 0.1) (uuid "378b3434-232b-4372-899d-ec56bb14c57a"))
(gr_line (start 142.445 137.65) (end 131.555 137.65) (layer "Edge.Cuts") (width 0.1) (uuid "60769822-3a55-41ba-af35-1c3058e26ba6"))
(gr_line (start 131.555 137.65) (end 131.555 124.35) (layer "Edge.Cuts") (width 0.1) (uuid "6284e709-5244-43f8-a2f5-660046cfbd85"))
(gr_text "SOP-16W" (at 137 123.35) (layer "F.SilkS") (uuid "b3ed8f8b-4c73-41b1-99a1-da1b41dd4dd5") (effects (font (size 0.6 0.6) (thickness 0.09) bold)))
(footprint "panel:SOP-16W_pads" (layer "B.Cu")
(at 137 132.5)
(uuid "9c71ac82-8fc0-478d-9d35-73f765bda15d")
(fp_text reference "SOP-16W_pads" (at 0 0) (layer "B.Fab") (uuid "8cea900b-c79a-43fe-844a-148f69cb95b6")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "B.Fab") (uuid "ae30beaa-083f-4fb7-bdec-79c9dc2cc012")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "1" thru_hole circle (at -4.445 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "d0432d6f-61ac-448a-85c6-181ddbd1aa33"))
(pad "16" thru_hole circle (at -4.445 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "22a1e7eb-27d6-4233-b5b8-f36767df33e9"))
(pad "2" thru_hole circle (at -3.175 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "5bfa1d99-38b6-4ab7-a56b-61b1a2a3db1d"))
(pad "15" thru_hole circle (at -3.175 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "b934db02-c5d7-497f-bc1f-2486399da781"))
(pad "3" thru_hole circle (at -1.905 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "a700b37c-bc69-41b5-9de2-fbc9e8dc036b"))
(pad "14" thru_hole circle (at -1.905 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "b30fe8b5-1352-435a-85dc-749e62f01ebb"))
(pad "4" thru_hole circle (at -0.635 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "bd6026e4-be88-4e7d-b235-9808417d9423"))
(pad "13" thru_hole circle (at -0.635 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "e3c51d8e-b93e-4342-a5a1-2d09b8b808ab"))
(pad "5" thru_hole circle (at 0.635 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "bc05b28d-1c31-4589-b8fb-1d60035d7232"))
(pad "12" thru_hole circle (at 0.635 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "77ceab5c-f996-4bb3-97e8-a590fc7a88ae"))
(pad "6" thru_hole circle (at 1.905 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "6ae748a9-ab27-400b-ae2d-80637c92e869"))
(pad "11" thru_hole circle (at 1.905 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "afb69667-cf85-4248-88bf-bd9764348c2e"))
(pad "7" thru_hole circle (at 3.175 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "7f3f8b8a-0c4e-4bdd-abb4-0ce85369336f"))
(pad "10" thru_hole circle (at 3.175 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "bca205a0-edf1-4a22-b9c5-3dc5b2876199"))
(pad "8" thru_hole circle (at 4.445 5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "3cb40bf6-e26f-4ede-9c6f-1d92a4cbca15"))
(pad "9" thru_hole circle (at 4.445 -5.150) (size 1.0 1.0) (drill 0.6) (layers "*.Cu" "*.Mask") (net 0 "") (uuid "4fbaa12e-f2bf-4e17-99fd-1da6892472bb"))
)
(gr_text "1" (at 132.555 138.45000000000002) (layer "F.SilkS") (uuid "67ae8809-6189-4d62-b63d-803a1ebc7814") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "16" (at 132.555 126.55) (layer "F.SilkS") (uuid "622f424c-467e-421c-8185-b39ea5ae0bdf") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "2" (at 133.82500000000002 138.45000000000002) (layer "F.SilkS") (uuid "0cd9df21-e290-4ee6-903d-cf3c63deac08") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "15" (at 133.82500000000002 126.55) (layer "F.SilkS") (uuid "40292e2a-5cb6-4a2a-9ed0-22db669f357d") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "3" (at 135.095 138.45000000000002) (layer "F.SilkS") (uuid "12e4979e-2a43-45f2-b74a-391e6a055358") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "14" (at 135.095 126.55) (layer "F.SilkS") (uuid "da1908e3-ab44-4984-9043-1b1aa520e82f") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "4" (at 136.365 138.45000000000002) (layer "F.SilkS") (uuid "a75049c3-ea78-4cd6-a54f-87776bf27ee9") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "13" (at 136.365 126.55) (layer "F.SilkS") (uuid "8e30096f-00c5-40c7-b944-51f8150dfa61") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "5" (at 137.63500000000002 138.45000000000002) (layer "F.SilkS") (uuid "d6d623cc-8f41-430b-b77d-e20779841d1f") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "12" (at 137.63500000000002 126.55) (layer "F.SilkS") (uuid "47fd108a-17c2-4c89-966b-b517d9e672a9") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "6" (at 138.905 138.45000000000002) (layer "F.SilkS") (uuid "0de8b8ae-d871-45cf-ab0f-5ae66919b156") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "11" (at 138.905 126.55) (layer "F.SilkS") (uuid "699f7121-2403-4879-99d8-231f07b64ab6") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "7" (at 140.175 138.45000000000002) (layer "F.SilkS") (uuid "7d6d6327-5063-4d9f-b917-295688569b83") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "10" (at 140.175 126.55) (layer "F.SilkS") (uuid "814b9dfc-3c9a-4780-a49d-859adbf1ec8f") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "8" (at 141.445 138.45000000000002) (layer "F.SilkS") (uuid "e6b7e389-6169-4f6c-b8cc-28f43917672e") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_text "9" (at 141.445 126.55) (layer "F.SilkS") (uuid "c9db7018-eb0b-4187-b0b1-a5f271ecc5a8") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_circle (center 131.955 138.15) (end 132.205 138.15) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "906e42c9-101a-4cb8-a69d-e5abb20041b7"))
(footprint "panel:SOP-16W_JST" (layer "F.Cu")
(at 137 125.85)
(uuid "2b5d7da6-43b0-4993-a157-1ea204151ee4")
(fp_text reference "SOP-16W_JST" (at 0 0) (layer "F.Fab") (uuid "9be5d86d-f26d-41db-b3d5-96aa9ffdc96b")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "F.Fab") (uuid "61ef7135-26fc-4a16-b06c-1053aa39fbe3")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(pad "J1" smd rect (at -4.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "be81bea1-903d-41cf-b073-ceca5dc11f48"))
(pad "J2" smd rect (at -3.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "24e8d037-1b4b-4fa5-8c6c-8ae2af43cae8"))
(pad "J3" smd rect (at -2.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "93959318-9fd0-4326-9d33-1f4193cf2727"))
(pad "J4" smd rect (at -1.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "ef1e10ae-c8eb-4b8e-a528-b2dc4a061704"))
(pad "J5" smd rect (at -0.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "5f83f573-7a00-49f9-b631-c93ab0c829a0"))
(pad "J6" smd rect (at 0.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "27ec44ef-d97a-4997-81fc-b7e4957caa76"))
(pad "J7" smd rect (at 1.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "c0cd43f0-19ef-4813-935c-1dd41339f027"))
(pad "J8" smd rect (at 2.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "a4360e04-4d1a-466c-b637-3b5738c34df4"))
(pad "J9" smd rect (at 3.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "ce94402f-7c99-45e6-9b2f-04a9a8e1103e"))
(pad "J10" smd rect (at 4.500 0.000) (size 0.6 1.0) (layers "F.Cu" "F.Paste" "F.Mask") (net 0 "") (uuid "6535b20a-7bf1-4cf8-9d59-9f4228e74d47"))
)
(gr_text "JST" (at 137 124.35) (layer "F.SilkS") (uuid "3ebcdaf3-af81-4207-8b30-06bce9658c7b") (effects (font (size 0.35 0.35) (thickness 0.0525))))
(gr_circle (center 131.7 125.85) (end 131.89999999999998 125.85) (layer "F.SilkS") (width 0.15) (fill solid) (uuid "41121629-2cd5-4e5c-928d-2e259710e93a"))
(gr_text "Snap off adapter matching your toy's MCU. Castellations solder into SOP footprint." (at 124.0 136.0) (layer "B.SilkS") (uuid "8a35efdd-15ba-4ffe-82f7-1ca8fb1d6665") (effects (font (size 0.4 0.4) (thickness 0.06))))
(gr_text "JST cable connects adapter to carrier board J1." (at 124.0 137.0) (layer "B.SilkS") (uuid "03798201-3787-40a2-a031-6838215cea81") (effects (font (size 0.4 0.4) (thickness 0.06))))
)
+28
View File
@@ -0,0 +1,28 @@
{
"meta": {
"filename": "baby-mobile-panel.kicad_pro",
"version": 1
},
"board": {
"design_settings": {
"rules": {
"min_track_width": 0.15,
"min_via_diameter": 0.4
}
}
},
"net_settings": {
"classes": [
{
"name": "Default",
"clearance": 0.15,
"track_width": 0.25
},
{
"name": "Power",
"clearance": 0.2,
"track_width": 0.5
}
]
}
}
-41
View File
@@ -1,41 +0,0 @@
{
"meta": {
"filename": "baby-mobile-v2.kicad_pro",
"version": 1
},
"board": {
"design_settings": {
"defaults": {
"board_outline_line_width": 0.1,
"copper_line_width": 0.2
},
"rules": {
"min_copper_edge_clearance": 0.3,
"min_track_width": 0.2,
"min_via_diameter": 0.6,
"min_via_annular_width": 0.13
}
}
},
"net_settings": {
"classes": [
{
"name": "Default",
"clearance": 0.2,
"track_width": 0.3,
"via_diameter": 0.6,
"via_drill": 0.3
}
]
},
"schematic": {
"legacy_lib_dir": "",
"legacy_lib_list": []
},
"sheets": [
[
"",
""
]
]
}
-815
View File
@@ -1,815 +0,0 @@
(kicad_sch (version 20230121) (generator "baby_mobile_gen_v2")
(uuid "bcbf6700-9330-4856-9326-a804adb9eec3")
(paper "A3")
(title_block
(title "Baby Mobile Audio Board v2")
(date "2026-03-09")
(rev "2.0")
(comment 1 "MDBT50Q (nRF52840) + IS25LP128F + PAM8302A")
(comment 2 "2xAA Battery + USB-C, Diode OR, TPS61220 Boost")
(comment 3 "BLE + USB mass storage for audio upload")
(comment 4 "8-ohm 0.25W Speaker, DC Motor, 8 Buttons")
)
(lib_symbols
(symbol "baby_mobile:MDBT50Q" (in_bom yes) (on_board yes)
(property "Reference" "U" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "MDBT50Q-P1MV2" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "RF_Module:Raytac_MDBT50Q" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "MDBT50Q_0_1"
(rectangle (start -20 30) (end 20 -30) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "MDBT50Q_1_1"
(pin power_in line (at -5 -33 90) (length 3) (name "GND" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at -5 33 270) (length 3) (name "VCC" (effects (font (size 1 1)))) (number "32" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 20 0) (length 3) (name "P0.00/XL1" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 17.5 0) (length 3) (name "P0.01/XL2" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 15 0) (length 3) (name "P0.02/AIN0" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 12.5 0) (length 3) (name "P0.03/AIN1" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 10 0) (length 3) (name "P0.04/AIN2" (effects (font (size 1 1)))) (number "6" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 7.5 0) (length 3) (name "P0.05/AIN3" (effects (font (size 1 1)))) (number "7" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 5 0) (length 3) (name "P0.06" (effects (font (size 1 1)))) (number "8" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 2.5 0) (length 3) (name "P0.07" (effects (font (size 1 1)))) (number "9" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 0 0) (length 3) (name "P0.08" (effects (font (size 1 1)))) (number "10" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -2.5 0) (length 3) (name "P0.09/NFC1" (effects (font (size 1 1)))) (number "11" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -5 0) (length 3) (name "P0.10/NFC2" (effects (font (size 1 1)))) (number "12" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -7.5 0) (length 3) (name "P0.11" (effects (font (size 1 1)))) (number "13" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -10 0) (length 3) (name "P0.12" (effects (font (size 1 1)))) (number "14" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -12.5 0) (length 3) (name "P0.13" (effects (font (size 1 1)))) (number "15" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -15 0) (length 3) (name "P0.14" (effects (font (size 1 1)))) (number "16" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -17.5 0) (length 3) (name "P0.15" (effects (font (size 1 1)))) (number "17" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 20 180) (length 3) (name "P0.16" (effects (font (size 1 1)))) (number "18" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 17.5 180) (length 3) (name "P0.17" (effects (font (size 1 1)))) (number "19" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 15 180) (length 3) (name "P0.18/~{RESET}" (effects (font (size 1 1)))) (number "20" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 12.5 180) (length 3) (name "P0.19" (effects (font (size 1 1)))) (number "21" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 10 180) (length 3) (name "P0.20" (effects (font (size 1 1)))) (number "22" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 7.5 180) (length 3) (name "P0.21" (effects (font (size 1 1)))) (number "23" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 5 180) (length 3) (name "P0.22" (effects (font (size 1 1)))) (number "24" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 2.5 180) (length 3) (name "P0.23" (effects (font (size 1 1)))) (number "25" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 0 180) (length 3) (name "P0.24" (effects (font (size 1 1)))) (number "26" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -2.5 180) (length 3) (name "P1.00" (effects (font (size 1 1)))) (number "27" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -5 180) (length 3) (name "D-" (effects (font (size 1 1)))) (number "28" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -7.5 180) (length 3) (name "D+" (effects (font (size 1 1)))) (number "29" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -10 180) (length 3) (name "P0.25" (effects (font (size 1 1)))) (number "30" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -12.5 180) (length 3) (name "P0.26" (effects (font (size 1 1)))) (number "31" (effects (font (size 1 1)))))
(pin input line (at 23 -17.5 180) (length 3) (name "SWDIO" (effects (font (size 1 1)))) (number "33" (effects (font (size 1 1)))))
(pin input line (at 23 -20 180) (length 3) (name "SWDCLK" (effects (font (size 1 1)))) (number "34" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:IS25LP128F" (in_bom yes) (on_board yes)
(property "Reference" "U" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "IS25LP128F" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "IS25LP128F_0_1"
(rectangle (start -7 6) (end 7 -6) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "IS25LP128F_1_1"
(pin input line (at -10 4 0) (length 3) (name "~{CS}" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin output line (at -10 1.5 0) (length 3) (name "SO/IO1" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin input line (at -10 -1.5 0) (length 3) (name "~{WP}/IO2" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin power_in line (at -10 -4 0) (length 3) (name "GND" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin input line (at 10 -4 180) (length 3) (name "SI/IO0" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
(pin input line (at 10 -1.5 180) (length 3) (name "SCLK" (effects (font (size 1 1)))) (number "6" (effects (font (size 1 1)))))
(pin input line (at 10 1.5 180) (length 3) (name "~{HOLD}/IO3" (effects (font (size 1 1)))) (number "7" (effects (font (size 1 1)))))
(pin power_in line (at 10 4 180) (length 3) (name "VCC" (effects (font (size 1 1)))) (number "8" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:PAM8302A" (in_bom yes) (on_board yes)
(property "Reference" "U" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "PAM8302A" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "PAM8302A_0_1"
(rectangle (start -8 8) (end 8 -8) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "PAM8302A_1_1"
(pin input line (at -11 5 0) (length 3) (name "~{SD}" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at -11 2 0) (length 3) (name "VDD" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin power_in line (at -11 -1 0) (length 3) (name "GND" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin input line (at -11 -4 0) (length 3) (name "A+" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin input line (at -11 -7 0) (length 3) (name "A-" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
(pin output line (at 11 2 180) (length 3) (name "VO+" (effects (font (size 1 1)))) (number "8" (effects (font (size 1 1)))))
(pin output line (at 11 -1 180) (length 3) (name "VO-" (effects (font (size 1 1)))) (number "7" (effects (font (size 1 1)))))
(pin power_in line (at 11 -4 180) (length 3) (name "PAD" (effects (font (size 1 1)))) (number "6" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:TPS61220" (in_bom yes) (on_board yes)
(property "Reference" "U" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "TPS61220DCK" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_TO_SOT_SMD:SOT-353_SC-70-5" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "TPS61220_0_1"
(rectangle (start -7 5) (end 7 -5) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "TPS61220_1_1"
(pin power_in line (at -10 3 0) (length 3) (name "VIN" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at -10 -3 0) (length 3) (name "GND" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin input line (at 10 -3 180) (length 3) (name "EN" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin power_out line (at 10 3 180) (length 3) (name "VOUT" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin passive line (at 0 8 270) (length 3) (name "L" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:MCP1700" (in_bom yes) (on_board yes)
(property "Reference" "U" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "MCP1700-3302E" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_TO_SOT_SMD:SOT-23" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "MCP1700_0_1"
(rectangle (start -6 4) (end 6 -4) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "MCP1700_1_1"
(pin power_in line (at -9 2 0) (length 3) (name "VIN" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at 0 -7 90) (length 3) (name "GND" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin power_out line (at 9 2 180) (length 3) (name "VOUT" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:Capacitor" (in_bom yes) (on_board yes)
(property "Reference" "C" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "C" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "Capacitor_0_1"
(polyline (pts (xy -1.5 1) (xy 1.5 1)) (stroke (width 0.4) (type default)) (fill (type none)))
(polyline (pts (xy -1.5 -1) (xy 1.5 -1)) (stroke (width 0.4) (type default)) (fill (type none)))
)
(symbol "Capacitor_1_1"
(pin passive line (at 0 3.5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -3.5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:Resistor" (in_bom yes) (on_board yes)
(property "Reference" "R" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "R" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "Resistor_0_1"
(polyline (pts (xy -1.5 1) (xy 1.5 1)) (stroke (width 0.4) (type default)) (fill (type none)))
(polyline (pts (xy -1.5 -1) (xy 1.5 -1)) (stroke (width 0.4) (type default)) (fill (type none)))
)
(symbol "Resistor_1_1"
(pin passive line (at 0 3.5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -3.5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:Diode_Schottky" (in_bom yes) (on_board yes)
(property "Reference" "D" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "BAT54S" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Diode_SMD:D_SOT-23_ANK" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "Diode_Schottky_0_1"
(polyline (pts (xy -1.5 1) (xy 1.5 1)) (stroke (width 0.4) (type default)) (fill (type none)))
(polyline (pts (xy -1.5 -1) (xy 1.5 -1)) (stroke (width 0.4) (type default)) (fill (type none)))
)
(symbol "Diode_Schottky_1_1"
(pin passive line (at 0 3.5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -3.5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:LED" (in_bom yes) (on_board yes)
(property "Reference" "D" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "LED" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "LED_SMD:LED_0805_2012Metric" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "LED_0_1"
(polyline (pts (xy -1.5 1) (xy 1.5 1)) (stroke (width 0.4) (type default)) (fill (type none)))
(polyline (pts (xy -1.5 -1) (xy 1.5 -1)) (stroke (width 0.4) (type default)) (fill (type none)))
)
(symbol "LED_1_1"
(pin passive line (at 0 3.5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -3.5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:Conn_2Pin" (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "Conn_2" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "Conn_2Pin_0_1"
(polyline (pts (xy -1.5 1) (xy 1.5 1)) (stroke (width 0.4) (type default)) (fill (type none)))
(polyline (pts (xy -1.5 -1) (xy 1.5 -1)) (stroke (width 0.4) (type default)) (fill (type none)))
)
(symbol "Conn_2Pin_1_1"
(pin passive line (at 0 3.5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -3.5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:Switch" (in_bom yes) (on_board yes)
(property "Reference" "SW" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "SW" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "Switch_0_1"
(circle (center -2 0) (radius 0.4) (stroke (width 0) (type default)) (fill (type none)))
(circle (center 2 0) (radius 0.4) (stroke (width 0) (type default)) (fill (type none)))
(polyline (pts (xy -1.6 0) (xy 1.6 1)) (stroke (width 0.254) (type default)) (fill (type none)))
)
(symbol "Switch_1_1"
(pin passive line (at -5 0 0) (length 3) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 5 0 180) (length 3) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:NMOS" (in_bom yes) (on_board yes)
(property "Reference" "Q" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "AO3400A" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_TO_SOT_SMD:SOT-23" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "NMOS_0_1"
(polyline (pts (xy -0.5 2) (xy -0.5 -2)) (stroke (width 0.254) (type default)) (fill (type none)))
)
(symbol "NMOS_1_1"
(pin passive line (at 0 5 270) (length 2.5) (name "D" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin input line (at -4 0 0) (length 2.5) (name "G" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -5 90) (length 2.5) (name "S" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:Inductor" (in_bom yes) (on_board yes)
(property "Reference" "L" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "4.7uH" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Inductor_SMD:L_0805_2012Metric" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "Inductor_0_1"
(arc (start 0 2.5) (mid 0.75 1.875) (end 0 1.25) (stroke (width 0.254) (type default)) (fill (type none)))
(arc (start 0 1.25) (mid 0.75 0.625) (end 0 0) (stroke (width 0.254) (type default)) (fill (type none)))
(arc (start 0 0) (mid 0.75 -0.625) (end 0 -1.25) (stroke (width 0.254) (type default)) (fill (type none)))
(arc (start 0 -1.25) (mid 0.75 -1.875) (end 0 -2.5) (stroke (width 0.254) (type default)) (fill (type none)))
)
(symbol "Inductor_1_1"
(pin passive line (at 0 5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:USB_C" (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "USB_C_Receptacle" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_USB:USB_C_Receptacle_GCT_USB4085" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "USB_C_0_1"
(rectangle (start -6 8) (end 6 -8) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "USB_C_1_1"
(pin power_in line (at -9 6 0) (length 3) (name "VBUS" (effects (font (size 1 1)))) (number "A4" (effects (font (size 1 1)))))
(pin passive line (at -9 3 0) (length 3) (name "CC1" (effects (font (size 1 1)))) (number "A5" (effects (font (size 1 1)))))
(pin passive line (at -9 0 0) (length 3) (name "CC2" (effects (font (size 1 1)))) (number "B5" (effects (font (size 1 1)))))
(pin bidirectional line (at -9 -3 0) (length 3) (name "D+" (effects (font (size 1 1)))) (number "A6" (effects (font (size 1 1)))))
(pin bidirectional line (at -9 -6 0) (length 3) (name "D-" (effects (font (size 1 1)))) (number "A7" (effects (font (size 1 1)))))
(pin power_in line (at 9 -6 180) (length 3) (name "GND" (effects (font (size 1 1)))) (number "A1" (effects (font (size 1 1)))))
(pin passive line (at 9 0 180) (length 3) (name "SHIELD" (effects (font (size 1 1)))) (number "S1" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:SWD_Header" (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "SWD_Header" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "SWD_Header_0_1"
(rectangle (start -3 11.0) (end 3 -11.0) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "SWD_Header_1_1"
(pin passive line (at -6 9.0 0) (length 3) (name "P1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at -6 6.5 0) (length 3) (name "P2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin passive line (at -6 4.0 0) (length 3) (name "P3" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin passive line (at -6 1.5 0) (length 3) (name "P4" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
)
)
(symbol "baby_mobile:Serial_Header" (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "Serial_Header" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(symbol "Serial_Header_0_1"
(rectangle (start -3 8.5) (end 3 -8.5) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "Serial_Header_1_1"
(pin passive line (at -6 6.5 0) (length 3) (name "P1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at -6 4.0 0) (length 3) (name "P2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin passive line (at -6 1.5 0) (length 3) (name "P3" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
)
)
)
(symbol (lib_id "baby_mobile:Conn_2Pin") (at 20 40 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "70d7070b-9b9d-48ab-8f07-7e955ee95852")
(property "Reference" "J1" (at 23 37 0) (effects (font (size 1.27 1.27))))
(property "Value" "BATTERY" (at 23 43 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal" (at 20 40 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 20 40 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 38 35 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "fa74c532-0744-4aea-a2d6-1086b3906684")
(property "Reference" "SW9" (at 41 32 0) (effects (font (size 1.27 1.27))))
(property "Value" "PWR" (at 41 38 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_THT:SW_SPDT_CK-JS102011SAQN" (at 38 35 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 38 35 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Diode_Schottky") (at 55 35 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "6625ba09-9a7b-45e4-bb05-f5be950fe70a")
(property "Reference" "D1" (at 58 32 0) (effects (font (size 1.27 1.27))))
(property "Value" "BAT54S" (at 58 38 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Diode_SMD:D_SOT-23_ANK" (at 55 35 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 55 35 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 48 45 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "5b7c8b52-73ae-48f5-92a3-ae01dce193f9")
(property "Reference" "C1" (at 51 42 0) (effects (font (size 1.27 1.27))))
(property "Value" "100uF" (at 51 48 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_THT:CP_Radial_D5.0mm_P2.00mm" (at 48 45 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 48 45 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:TPS61220") (at 80 40 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "a1d374e7-7486-4f8a-8b32-2683679e26a9")
(property "Reference" "U4" (at 83 37 0) (effects (font (size 1.27 1.27))))
(property "Value" "TPS61220DCK" (at 83 43 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_TO_SOT_SMD:SOT-353_SC-70-5" (at 80 40 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 80 40 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Inductor") (at 80 28 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "71a98694-95de-44d2-9449-ea2e75c2d031")
(property "Reference" "L1" (at 83 25 0) (effects (font (size 1.27 1.27))))
(property "Value" "4.7uH" (at 83 31 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Inductor_SMD:L_0805_2012Metric" (at 80 28 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 80 28 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 68 45 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "0594c449-f95c-4a95-9e38-2d39cd72fe7f")
(property "Reference" "C9" (at 71 42 0) (effects (font (size 1.27 1.27))))
(property "Value" "10uF" (at 71 48 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 68 45 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 68 45 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 95 45 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "21938427-01a0-4ec2-8e51-946b91b75873")
(property "Reference" "C10" (at 98 42 0) (effects (font (size 1.27 1.27))))
(property "Value" "10uF" (at 98 48 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 95 45 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 95 45 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:USB_C") (at 20 80 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "8d3dfb8b-38a7-4c72-b926-a3cfa199b606")
(property "Reference" "J6" (at 23 77 0) (effects (font (size 1.27 1.27))))
(property "Value" "USB_C" (at 23 83 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_USB:USB_C_Receptacle_GCT_USB4085" (at 20 80 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 20 80 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Resistor") (at 38 83 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "aad7b37e-5135-48f8-85a7-d10c2ae025f8")
(property "Reference" "R7" (at 41 80 0) (effects (font (size 1.27 1.27))))
(property "Value" "5.1K" (at 41 86 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 38 83 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 38 83 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Resistor") (at 38 88 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "acbcde11-54d1-4f44-908e-220214c79f0b")
(property "Reference" "R8" (at 41 85 0) (effects (font (size 1.27 1.27))))
(property "Value" "5.1K" (at 41 91 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 38 88 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 38 88 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Diode_Schottky") (at 55 74 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "e8998fe7-93f1-44bb-b19b-4464f77b6dd9")
(property "Reference" "D3" (at 58 71 0) (effects (font (size 1.27 1.27))))
(property "Value" "BAT54S" (at 58 77 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Diode_SMD:D_SOT-23_ANK" (at 55 74 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 55 74 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:MCP1700") (at 72 74 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "d32653e5-c0d2-451f-a9d5-d1daf1bc082d")
(property "Reference" "U5" (at 75 71 0) (effects (font (size 1.27 1.27))))
(property "Value" "MCP1700-3302E" (at 75 77 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_TO_SOT_SMD:SOT-23" (at 72 74 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 72 74 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 62 82 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "a931807e-4c4b-44a1-8d60-5d98aad60b7f")
(property "Reference" "C11" (at 65 79 0) (effects (font (size 1.27 1.27))))
(property "Value" "1uF" (at 65 85 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 62 82 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 62 82 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 82 82 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "d3de9a69-ceee-485c-a6c4-1c67c1b603d8")
(property "Reference" "C12" (at 85 79 0) (effects (font (size 1.27 1.27))))
(property "Value" "1uF" (at 85 85 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 82 82 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 82 82 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:MDBT50Q") (at 160 100 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "594bd8ce-6f7f-41a5-9e1a-d3960d0a099a")
(property "Reference" "U1" (at 163 97 0) (effects (font (size 1.27 1.27))))
(property "Value" "MDBT50Q-P1MV2" (at 163 103 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "RF_Module:Raytac_MDBT50Q" (at 160 100 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 160 100 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 135 60 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "8d2f0126-6582-4abb-bb02-b468a2a7e303")
(property "Reference" "C2" (at 138 57 0) (effects (font (size 1.27 1.27))))
(property "Value" "100nF" (at 138 63 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 135 60 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 135 60 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 128 60 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "49fb3b95-d44a-4ad8-a22e-a44e0bb59f88")
(property "Reference" "C3" (at 131 57 0) (effects (font (size 1.27 1.27))))
(property "Value" "10uF" (at 131 63 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 128 60 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 128 60 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:IS25LP128F") (at 260 60 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "66c0d38b-8b39-4ca4-a5c2-ca6166c01990")
(property "Reference" "U2" (at 263 57 0) (effects (font (size 1.27 1.27))))
(property "Value" "IS25LP128F" (at 263 63 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (at 260 60 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 260 60 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 285 50 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "70abbd58-d545-4aa6-907a-dc51d3e39b40")
(property "Reference" "C5" (at 288 47 0) (effects (font (size 1.27 1.27))))
(property "Value" "100nF" (at 288 53 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 285 50 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 285 50 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:PAM8302A") (at 260 140 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "36bdb273-1745-4ae6-a0c5-8ee5ce247b24")
(property "Reference" "U3" (at 263 137 0) (effects (font (size 1.27 1.27))))
(property "Value" "PAM8302A" (at 263 143 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (at 260 140 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 260 140 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Resistor") (at 220 135 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "43e10163-561a-41ef-a818-083eb46dadbb")
(property "Reference" "R2" (at 223 132 0) (effects (font (size 1.27 1.27))))
(property "Value" "4.7K" (at 223 138 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 220 135 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 220 135 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 230 145 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "294f675b-caf9-46fb-a7e3-4f2b3f1e6278")
(property "Reference" "C7" (at 233 142 0) (effects (font (size 1.27 1.27))))
(property "Value" "10nF" (at 233 148 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 230 145 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 230 145 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 240 135 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "195a432e-ee1e-4cd3-8448-97b1efccd434")
(property "Reference" "C6" (at 243 132 0) (effects (font (size 1.27 1.27))))
(property "Value" "1uF" (at 243 138 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 240 135 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 240 135 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Capacitor") (at 285 130 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "a374fa1d-d300-401e-a298-17204d120f0b")
(property "Reference" "C8" (at 288 127 0) (effects (font (size 1.27 1.27))))
(property "Value" "10uF" (at 288 133 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 285 130 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 285 130 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Resistor") (at 240 155 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "26431bf8-ccbf-4a0d-9b17-4cf5a0660df2")
(property "Reference" "R3" (at 243 152 0) (effects (font (size 1.27 1.27))))
(property "Value" "100K" (at 243 158 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 240 155 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 240 155 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Conn_2Pin") (at 290 145 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "63c284ab-b058-480d-884f-ea0e5a23be78")
(property "Reference" "J2" (at 293 142 0) (effects (font (size 1.27 1.27))))
(property "Value" "SPEAKER" (at 293 148 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal" (at 290 145 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 290 145 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:NMOS") (at 160 200 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "8361bf44-050a-467e-a525-5cc39ff3aa0e")
(property "Reference" "Q1" (at 163 197 0) (effects (font (size 1.27 1.27))))
(property "Value" "AO3400A" (at 163 203 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Package_TO_SOT_SMD:SOT-23" (at 160 200 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 160 200 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Resistor") (at 140 200 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "de5de389-8023-498e-a92c-82ae00e9e811")
(property "Reference" "R4" (at 143 197 0) (effects (font (size 1.27 1.27))))
(property "Value" "100R" (at 143 203 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 140 200 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 140 200 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Resistor") (at 150 212 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "91f0e3bf-5e2f-42b4-8da6-8a77e2ef1ad8")
(property "Reference" "R5" (at 153 209 0) (effects (font (size 1.27 1.27))))
(property "Value" "100K" (at 153 215 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 150 212 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 150 212 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Diode_Schottky") (at 175 190 90) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "d21b4325-c08a-4cf7-9598-f2eead5a0427")
(property "Reference" "D4" (at 178 187 0) (effects (font (size 1.27 1.27))))
(property "Value" "SS14" (at 178 193 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Diode_SMD:D_SMA" (at 175 190 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 175 190 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Conn_2Pin") (at 180 180 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "d9fb0352-f82e-4858-bc84-824cdfd66411")
(property "Reference" "J3" (at 183 177 0) (effects (font (size 1.27 1.27))))
(property "Value" "MOTOR" (at 183 183 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal" (at 180 180 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 180 180 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 80 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "57360837-e551-42fd-92c4-90b47e3af1d7")
(property "Reference" "SW1" (at 303 77 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN1" (at 303 83 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 80 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 80 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 94 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "25df26f9-6b89-45c0-8247-d0fca36ce61d")
(property "Reference" "SW2" (at 303 91 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN2" (at 303 97 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 94 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 94 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 108 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "d10f35e2-3a88-464c-bad3-32d1b7dc37e7")
(property "Reference" "SW3" (at 303 105 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN3" (at 303 111 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 108 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 108 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 122 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "7422ffd7-92cd-4290-a5ef-a9725f9ce828")
(property "Reference" "SW4" (at 303 119 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN4" (at 303 125 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 122 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 122 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 136 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "72136978-3095-41af-9a20-710af6a51233")
(property "Reference" "SW5" (at 303 133 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN5" (at 303 139 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 136 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 136 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 150 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "eb1956dd-8fc8-428e-8a8a-732832b3046a")
(property "Reference" "SW6" (at 303 147 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN6" (at 303 153 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 150 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 150 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 164 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "838098eb-6069-4a93-803d-71f7bcc015ed")
(property "Reference" "SW7" (at 303 161 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN7" (at 303 167 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 164 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 164 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Switch") (at 300 178 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "4c7b5735-d245-4a22-b39e-da02d205dd6f")
(property "Reference" "SW8" (at 303 175 0) (effects (font (size 1.27 1.27))))
(property "Value" "BTN8" (at 303 181 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Button_Switch_SMD:SW_SPST_TL3342" (at 300 178 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 300 178 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:LED") (at 115 200 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "381a075f-afed-41fe-8bee-e87a0c979fb5")
(property "Reference" "D2" (at 118 197 0) (effects (font (size 1.27 1.27))))
(property "Value" "LED_GRN" (at 118 203 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "LED_SMD:LED_0805_2012Metric" (at 115 200 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 115 200 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Resistor") (at 105 200 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "29ff321d-9917-491b-aa90-e6857486d032")
(property "Reference" "R6" (at 108 197 0) (effects (font (size 1.27 1.27))))
(property "Value" "1K" (at 108 203 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (at 105 200 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 105 200 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:SWD_Header") (at 200 60 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "e9f21ce7-386a-49f0-b58a-baa3c2c214fd")
(property "Reference" "J4" (at 203 57 0) (effects (font (size 1.27 1.27))))
(property "Value" "SWD" (at 203 63 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical" (at 200 60 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 200 60 0) (effects (font (size 1.27 1.27)) hide))
)
(symbol (lib_id "baby_mobile:Serial_Header") (at 200 30 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "430fc64d-7b88-4340-93e7-7f62c2e6e768")
(property "Reference" "J5" (at 203 27 0) (effects (font (size 1.27 1.27))))
(property "Value" "SERIAL" (at 203 33 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" (at 200 30 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 200 30 0) (effects (font (size 1.27 1.27)) hide))
)
(label "3V3" (at 95 37 0) (effects (font (size 1.27 1.27))) (uuid "8ed071e2-ba5f-47a3-94d1-f6573f0fc9e6"))
(label "3V3" (at 135 55 0) (effects (font (size 1.27 1.27))) (uuid "82c68cf0-245b-4579-9abd-df6a25942f65"))
(label "3V3" (at 128 55 0) (effects (font (size 1.27 1.27))) (uuid "b759afce-3d7a-43ae-a815-920f94039f06"))
(label "3V3" (at 285 45 0) (effects (font (size 1.27 1.27))) (uuid "14313904-f45a-4f5c-8e82-3e71fb09a66a"))
(label "3V3" (at 285 125 0) (effects (font (size 1.27 1.27))) (uuid "5fc1cdc3-7530-4122-ab28-2954b8f56786"))
(label "3V3" (at 155 67 0) (effects (font (size 1.27 1.27))) (uuid "e84c183d-2287-4a07-bd7f-2427b2373c61"))
(label "3V3" (at 82 72 0) (effects (font (size 1.27 1.27))) (uuid "a3c425cd-d49b-47ff-8ef2-a0796ad2421f"))
(label "3V3" (at 180 175 0) (effects (font (size 1.27 1.27))) (uuid "9eb533dd-82ed-459c-bddc-5394f3d00809"))
(label "VBAT" (at 48 35 0) (effects (font (size 1.27 1.27))) (uuid "e7d3519e-53fd-4369-9e31-d5f75ead4298"))
(label "VBAT" (at 55 30 0) (effects (font (size 1.27 1.27))) (uuid "ae7b918c-7601-447a-8523-7c71e3ff5acf"))
(label "VBAT" (at 68 37 0) (effects (font (size 1.27 1.27))) (uuid "26a13740-da13-42a7-b4e9-218732d83e0d"))
(label "VBOOST_IN" (at 65 37 0) (effects (font (size 1.27 1.27))) (uuid "ad461d02-0622-4db7-a37a-33ffedce49f1"))
(label "VBOOST_IN" (at 70 37 0) (effects (font (size 1.27 1.27))) (uuid "eff048a1-c542-479d-a2da-4b1574cc7645"))
(label "3V3" (at 90 37 0) (effects (font (size 1.27 1.27))) (uuid "77b6f1d8-570a-4483-ae22-d2f30387bec8"))
(label "USB_VBUS" (at 29 74 0) (effects (font (size 1.27 1.27))) (uuid "1c439b3b-db55-4ff6-81df-7b615e8e6c39"))
(label "USB_VBUS" (at 55 69 0) (effects (font (size 1.27 1.27))) (uuid "6126f227-20fc-4552-8088-543092d7d2c9"))
(label "USB_LDO_OUT" (at 81 72 0) (effects (font (size 1.27 1.27))) (uuid "22bc2b82-1cd3-4fbf-b722-7aec2e3e7ac6"))
(label "GND" (at 48 55 0) (effects (font (size 1.27 1.27))) (uuid "1d89d47f-e5cc-47c8-96ef-875a47dd3d7d"))
(label "GND" (at 68 55 0) (effects (font (size 1.27 1.27))) (uuid "d070d4a1-832d-4144-a8e7-62c665cb7c19"))
(label "GND" (at 95 55 0) (effects (font (size 1.27 1.27))) (uuid "19863f8b-aa0c-4a5b-a8ad-4c10e0df834c"))
(label "GND" (at 80 50 0) (effects (font (size 1.27 1.27))) (uuid "31dcf8fa-9fe5-49f7-898c-eb9bb164aecc"))
(label "GND" (at 155 133 0) (effects (font (size 1.27 1.27))) (uuid "3389eb1b-db83-4210-bb6a-73265aeaa3e8"))
(label "GND" (at 260 70 0) (effects (font (size 1.27 1.27))) (uuid "4454cdab-2b40-43cc-ad3a-593113577789"))
(label "GND" (at 285 55 0) (effects (font (size 1.27 1.27))) (uuid "39014c1d-a110-4de1-8340-ac91b0cf2cd8"))
(label "GND" (at 285 155 0) (effects (font (size 1.27 1.27))) (uuid "955fabd2-0a64-46fb-899b-880b837da381"))
(label "GND" (at 160 215 0) (effects (font (size 1.27 1.27))) (uuid "da5dcfa8-d9b3-4750-b5e8-e0249eb1aca7"))
(label "GND" (at 150 218 0) (effects (font (size 1.27 1.27))) (uuid "6ff8e8df-1e76-4220-9afb-0e8e64c0ed7b"))
(label "GND" (at 230 155 0) (effects (font (size 1.27 1.27))) (uuid "5837c09d-c9c6-4753-b127-65cf1fd82b7a"))
(label "GND" (at 240 165 0) (effects (font (size 1.27 1.27))) (uuid "95a99a98-2c30-42a6-a07e-0aa4f2b48488"))
(label "GND" (at 62 92 0) (effects (font (size 1.27 1.27))) (uuid "76e18ea2-8285-426f-9ef8-9fa76e7111eb"))
(label "GND" (at 82 92 0) (effects (font (size 1.27 1.27))) (uuid "8ea4dfaf-0d35-489a-80b6-78f27b959ae4"))
(label "GND" (at 72 81 0) (effects (font (size 1.27 1.27))) (uuid "b7470fc2-e399-46eb-9fd3-bd74e283e117"))
(label "GND" (at 38 93 0) (effects (font (size 1.27 1.27))) (uuid "e5aa3e17-1915-485d-88f2-e4c97b203429"))
(label "GND" (at 38 98 0) (effects (font (size 1.27 1.27))) (uuid "9e79744e-5eed-4812-84be-ac90ad982c39"))
(label "GND" (at 135 65 0) (effects (font (size 1.27 1.27))) (uuid "b3762e1f-492b-4a17-93bc-c59442290780"))
(label "GND" (at 128 65 0) (effects (font (size 1.27 1.27))) (uuid "1de86c1d-deef-4198-a7ad-b33d2084bbe4"))
(label "USB_D+" (at 29 77 0) (effects (font (size 1.27 1.27))) (uuid "cafef546-ab22-40e8-bf8e-5a1b4a866c7b"))
(label "USB_D+" (at 183 92.5 0) (effects (font (size 1.27 1.27))) (uuid "02cbe821-47c0-4b39-ab87-c0017f8610d0"))
(label "USB_D-" (at 29 80 0) (effects (font (size 1.27 1.27))) (uuid "12b0e3d5-044c-4e34-b046-c90d3a2eb5a6"))
(label "USB_D-" (at 183 95 0) (effects (font (size 1.27 1.27))) (uuid "148c349c-b923-4ee5-9770-8b45ca65230e"))
(label "USB_CC1" (at 29 83 0) (effects (font (size 1.27 1.27))) (uuid "03410510-b26c-408e-818a-067a7db0f5b8"))
(label "USB_CC1" (at 38 78 0) (effects (font (size 1.27 1.27))) (uuid "218b088a-8395-4491-9a0e-6d5db11ca7a4"))
(label "USB_CC2" (at 29 86 0) (effects (font (size 1.27 1.27))) (uuid "c3131644-9adc-40f6-b7ce-2206504a9a27"))
(label "USB_CC2" (at 38 83 0) (effects (font (size 1.27 1.27))) (uuid "4825f804-a15c-4194-b1ec-fa57f3d85eff"))
(label "SPI_MOSI" (at 183 87.5 0) (effects (font (size 1.27 1.27))) (uuid "da1257b0-9158-4049-bdfc-ac6750ac975a"))
(label "SPI_MOSI" (at 250 56 0) (effects (font (size 1.27 1.27))) (uuid "1b17c2f2-8313-4f5d-b7cc-b863d00796bb"))
(label "SPI_MISO" (at 183 85 0) (effects (font (size 1.27 1.27))) (uuid "0860088c-74d8-43fb-860e-15349a699593"))
(label "SPI_MISO" (at 250 61.5 0) (effects (font (size 1.27 1.27))) (uuid "3b2dc367-6d21-4735-8410-d30a500e74a5"))
(label "SPI_SCK" (at 183 82.5 0) (effects (font (size 1.27 1.27))) (uuid "53e5a5c7-e20f-4482-a55d-2688efc6f7ba"))
(label "SPI_SCK" (at 270 58.5 0) (effects (font (size 1.27 1.27))) (uuid "26492f79-696e-4aea-b80d-03bfd63c2c3f"))
(label "FLASH_CS" (at 183 80 0) (effects (font (size 1.27 1.27))) (uuid "3a5652cc-c614-4368-9c13-111744980544"))
(label "FLASH_CS" (at 250 64 0) (effects (font (size 1.27 1.27))) (uuid "6e5a8087-754e-481b-a1bb-3c7f3f3f5232"))
(label "AUDIO_PWM" (at 183 100 0) (effects (font (size 1.27 1.27))) (uuid "57c2b713-56f7-42e2-bd58-5b5d04bebd30"))
(label "AUDIO_PWM" (at 210 135 0) (effects (font (size 1.27 1.27))) (uuid "4631b763-c906-4580-8fd8-1a93edd729d3"))
(label "AMP_SD" (at 183 102.5 0) (effects (font (size 1.27 1.27))) (uuid "deb32a13-e972-41aa-8d41-d20a062e3cba"))
(label "AMP_SD" (at 240 150 0) (effects (font (size 1.27 1.27))) (uuid "9bdd3963-b925-4327-92c0-1c3679ea2ebe"))
(label "MOTOR_PWM" (at 137 112.5 0) (effects (font (size 1.27 1.27))) (uuid "5b5f8fba-9659-4dee-9aad-e4ff3779e804"))
(label "MOTOR_PWM" (at 130 200 0) (effects (font (size 1.27 1.27))) (uuid "73d245e9-56a0-4ce1-9410-9cc9522893b0"))
(label "BTN1" (at 295 80 0) (effects (font (size 1.27 1.27))) (uuid "32e72139-ab6e-48c9-a0cf-65e931a41274"))
(label "BTN1" (at 137 120 0) (effects (font (size 1.27 1.27))) (uuid "b4d8683f-1cd7-4f33-9eda-8398e1098d6a"))
(label "BTN2" (at 295 94 0) (effects (font (size 1.27 1.27))) (uuid "17aea161-ddd2-4d17-ba4a-feedd256f98b"))
(label "BTN2" (at 137 117.5 0) (effects (font (size 1.27 1.27))) (uuid "808daa01-07c4-4622-9bca-032aaa095ffe"))
(label "BTN3" (at 295 108 0) (effects (font (size 1.27 1.27))) (uuid "39886739-7865-48a6-88b3-40ce4caf35b8"))
(label "BTN3" (at 137 115 0) (effects (font (size 1.27 1.27))) (uuid "ff98c423-d019-4c3e-8ba8-b7fcda8c6d3b"))
(label "BTN4" (at 295 122 0) (effects (font (size 1.27 1.27))) (uuid "7be84ac2-a319-4e89-8912-a48308157a57"))
(label "BTN4" (at 137 112.5 0) (effects (font (size 1.27 1.27))) (uuid "2c5a6c32-a6d7-4a20-a777-f8e4bf9caf99"))
(label "BTN5" (at 295 136 0) (effects (font (size 1.27 1.27))) (uuid "d0569adf-df84-42ea-8fa4-9b19b8f5266a"))
(label "BTN5" (at 137 110 0) (effects (font (size 1.27 1.27))) (uuid "aee28d6b-be5d-4a1c-a2ee-17bc73d031bb"))
(label "BTN6" (at 295 150 0) (effects (font (size 1.27 1.27))) (uuid "dbe9e702-77e0-48af-8818-9f2154f62514"))
(label "BTN6" (at 137 107.5 0) (effects (font (size 1.27 1.27))) (uuid "ee40d98c-46b9-45f2-a122-471375cc3a26"))
(label "BTN7" (at 295 164 0) (effects (font (size 1.27 1.27))) (uuid "dbe03385-adea-4e6f-87f0-fda692538d54"))
(label "BTN7" (at 137 105 0) (effects (font (size 1.27 1.27))) (uuid "404ba48f-c3f9-4bd9-9e7c-7e4662f61fa5"))
(label "BTN8" (at 295 178 0) (effects (font (size 1.27 1.27))) (uuid "160da6ab-3b24-4688-9c7b-67d82a3d897b"))
(label "BTN8" (at 137 102.5 0) (effects (font (size 1.27 1.27))) (uuid "a53bf467-04c2-45bd-9b30-b0f3446d8c9f"))
(label "GND" (at 305 80 0) (effects (font (size 1.27 1.27))) (uuid "f6f4b71d-c1f2-45bb-b1eb-07c33f60c27f"))
(label "GND" (at 305 94 0) (effects (font (size 1.27 1.27))) (uuid "4a9f4779-5345-41a1-a039-727291be615e"))
(label "GND" (at 305 108 0) (effects (font (size 1.27 1.27))) (uuid "a396ef9e-6be6-4b73-9829-12db9b3e07b3"))
(label "GND" (at 305 122 0) (effects (font (size 1.27 1.27))) (uuid "0cf7df09-6c2d-40cf-815f-e080021dce6d"))
(label "GND" (at 305 136 0) (effects (font (size 1.27 1.27))) (uuid "016e1cf1-b3f5-4ad5-a212-3ffcefeed34f"))
(label "GND" (at 305 150 0) (effects (font (size 1.27 1.27))) (uuid "a2c17108-4c26-4ae7-ab8c-2def7d9478a7"))
(label "GND" (at 305 164 0) (effects (font (size 1.27 1.27))) (uuid "41c52008-b330-4723-8b7c-d4e6be680b6a"))
(label "GND" (at 305 178 0) (effects (font (size 1.27 1.27))) (uuid "1087b54a-297b-4224-b9e2-48695ff85b8d"))
(label "LED_OUT" (at 95 200 0) (effects (font (size 1.27 1.27))) (uuid "cc999662-caea-48b8-9222-78cab879fcdc"))
(label "LED_OUT" (at 137 100 0) (effects (font (size 1.27 1.27))) (uuid "013e7457-91fe-4fbd-a0ee-7ee89c54199d"))
(label "SWDIO" (at 194 55.5 0) (effects (font (size 1.27 1.27))) (uuid "25823cf8-69a9-41c6-9b9c-a5c49404406c"))
(label "SWDIO" (at 183 82.5 0) (effects (font (size 1.27 1.27))) (uuid "00074155-1634-4876-8d45-3fe907bf2db3"))
(label "SWDCLK" (at 194 58 0) (effects (font (size 1.27 1.27))) (uuid "ff3a7eec-2bb9-4f1e-967f-5cadd8e240dc"))
(label "SWDCLK" (at 183 80 0) (effects (font (size 1.27 1.27))) (uuid "a30d2c78-19ef-46c2-a458-36c2c5876254"))
(label "3V3" (at 194 53 0) (effects (font (size 1.27 1.27))) (uuid "f99c5f81-ea9a-41f5-960e-d2fae7d0a181"))
(label "GND" (at 194 60.5 0) (effects (font (size 1.27 1.27))) (uuid "e26ea204-b9ea-4447-8197-4e162160fd9d"))
(label "TXD" (at 194 25.5 0) (effects (font (size 1.27 1.27))) (uuid "301ed6e2-a2bd-4b45-9f9a-392d72600933"))
(label "TXD" (at 137 80 0) (effects (font (size 1.27 1.27))) (uuid "5ebc2fb5-79e1-41fc-94e0-ae66b9cfe1f5"))
(label "RXD" (at 194 28 0) (effects (font (size 1.27 1.27))) (uuid "8dbda22c-6ed0-427c-a7a2-3cb9994d6b43"))
(label "RXD" (at 137 82.5 0) (effects (font (size 1.27 1.27))) (uuid "cd81992e-9202-48d6-b995-d0f86e69f52e"))
(label "GND" (at 194 30.5 0) (effects (font (size 1.27 1.27))) (uuid "6fb29d8b-c74b-4471-b93c-4751e770957b"))
(label "3V3" (at 250 58.5 0) (effects (font (size 1.27 1.27))) (uuid "76f5880c-4436-4818-94bb-c78a7ee6fe4e"))
(label "3V3" (at 270 61.5 0) (effects (font (size 1.27 1.27))) (uuid "a4e298f8-b82b-4d58-8e1f-b0f80af8cc9e"))
(label "VBAT" (at 90 43 0) (effects (font (size 1.27 1.27))) (uuid "4e07ee15-a453-4fe9-805e-d131f584d1a8"))
(text "POWER: 2xAA → BAT54S → TPS61220 boost → 3.3V (1.8-3.2V input)" (at 10 12 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "10cfdea1-8a29-4bde-88d4-c91935a5e9ac")
)
(text "USB: VBUS → BAT54S → MCP1700 LDO → 3.3V (safe with any battery chemistry)" (at 10 15 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "27e25aeb-a530-42a6-9e45-b196b84a0721")
)
(text "MCU: MDBT50Q (nRF52840) — BLE 5.0, USB 2.0, 1.7-5.5V, UF2 bootloader" (at 10 18 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "5ec8a803-c645-49fb-936d-707f1a426ea0")
)
(text "FLASH: IS25LP128F 16MB (2.3-3.6V) = ~33 min @ 8kHz 8-bit PCM" (at 10 21 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "3540a598-29a4-42b0-955e-10cfb84fcec3")
)
(text "AMP: PAM8302A Class-D, 90% eff, Vmin=2.0V, shutdown pin for power save" (at 10 24 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "5b07f1c0-2adc-42e6-9792-d4d4c22a5559")
)
(text "MOTOR: AO3400A logic-level N-MOSFET, PWM speed control" (at 10 27 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "f259ebac-06b9-4b51-84fd-855ca64743c6")
)
(text "USB-C: Drag-and-drop audio as mass storage device" (at 10 230 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "9bb11b21-6fca-415e-9aa1-383cbc0bf675")
)
(text "BLE: Wireless audio upload from phone (Web Bluetooth compatible)" (at 10 233 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "e3624e20-88ff-405d-99a6-634170b921f6")
)
(text "FIRMWARE: UF2 bootloader — update by drag-and-drop, no programmer needed" (at 10 236 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "f25d994c-c32d-4858-a3ed-12707aea679c")
)
(text "RUNTIME: Audio+Motor ~25h, Audio only ~167h, Sleep ~years on 2xAA" (at 10 239 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "9fdf6591-0f6e-4339-b052-f5593d9b3690")
)
)
+14
View File
@@ -0,0 +1,14 @@
Comment,Designator,Footprint,LCSC Part Number,Qty,Value,Description
"Boost Converter","U1","SOT-353_SC-70-5","C83951",1,"TPS61220DCKR","3.3V fixed output boost converter 0.7-5.5V in"
"SPI Flash 16MB","U2","SOIC-8_3.9x4.9mm_P1.27mm","C194872",1,"IS25LP128F-JBLE","128Mbit SPI NOR Flash 2.3-3.6V"
"Boost Inductor","L1","L_0805_2012Metric","C408336",1,"4.7uH","Inductor 4.7µH 1.2A saturation"
"Boost Input Cap","C1","C_0805_2012Metric","C15850",1,"10uF","Ceramic capacitor 10µF 10V X5R"
"Boost Output Cap","C2","C_0805_2012Metric","C15850",1,"10uF","Ceramic capacitor 10µF 10V X5R"
"Flash Decoupling","C3","C_0805_2012Metric","C49678",1,"100nF","Ceramic capacitor 100nF 25V X7R"
"XIAO Decoupling","C4","C_0805_2012Metric","C49678",1,"100nF","Ceramic capacitor 100nF 25V X7R"
"RC Filter R (audio LPF)","R1","R_0805_2012Metric","C17673",1,"4.7K","Resistor 4.7KΩ 1%"
"RC Filter C (audio LPF)","C5","C_0805_2012Metric","C1710",1,"10nF","Ceramic capacitor 10nF 50V"
"Flash CS Pullup","R2","R_0805_2012Metric","C17414",1,"10K","Resistor 10KΩ 1% (holds CS high during boot)"
"Toy Connector","J1","JST_SH_SM10B-SRSS-TB_1x10_P1.00mm","C160404",1,"SM10B-SRSS-TB","JST SH 1.0mm 10-pin SMD right-angle"
"XIAO Header Left","J2","PinHeader_1x07_P2.54mm_Vertical","C124378",1,"1x7 2.54mm","Female pin header 1x7"
"XIAO Header Right","J3","PinHeader_1x07_P2.54mm_Vertical","C124378",1,"1x7 2.54mm","Female pin header 1x7"
1 Comment Designator Footprint LCSC Part Number Qty Value Description
2 Boost Converter U1 SOT-353_SC-70-5 C83951 1 TPS61220DCKR 3.3V fixed output boost converter 0.7-5.5V in
3 SPI Flash 16MB U2 SOIC-8_3.9x4.9mm_P1.27mm C194872 1 IS25LP128F-JBLE 128Mbit SPI NOR Flash 2.3-3.6V
4 Boost Inductor L1 L_0805_2012Metric C408336 1 4.7uH Inductor 4.7µH 1.2A saturation
5 Boost Input Cap C1 C_0805_2012Metric C15850 1 10uF Ceramic capacitor 10µF 10V X5R
6 Boost Output Cap C2 C_0805_2012Metric C15850 1 10uF Ceramic capacitor 10µF 10V X5R
7 Flash Decoupling C3 C_0805_2012Metric C49678 1 100nF Ceramic capacitor 100nF 25V X7R
8 XIAO Decoupling C4 C_0805_2012Metric C49678 1 100nF Ceramic capacitor 100nF 25V X7R
9 RC Filter R (audio LPF) R1 R_0805_2012Metric C17673 1 4.7K Resistor 4.7KΩ 1%
10 RC Filter C (audio LPF) C5 C_0805_2012Metric C1710 1 10nF Ceramic capacitor 10nF 50V
11 Flash CS Pullup R2 R_0805_2012Metric C17414 1 10K Resistor 10KΩ 1% (holds CS high during boot)
12 Toy Connector J1 JST_SH_SM10B-SRSS-TB_1x10_P1.00mm C160404 1 SM10B-SRSS-TB JST SH 1.0mm 10-pin SMD right-angle
13 XIAO Header Left J2 PinHeader_1x07_P2.54mm_Vertical C124378 1 1x7 2.54mm Female pin header 1x7
14 XIAO Header Right J3 PinHeader_1x07_P2.54mm_Vertical C124378 1 1x7 2.54mm Female pin header 1x7
-553
View File
@@ -1,553 +0,0 @@
#!/usr/bin/env python3
"""
Generate KiCad 7 schematic for Baby Mobile Audio Board v2.
Design: MDBT50Q (nRF52840) + IS25LP128F SPI Flash + PAM8302A Class-D Amp
Power: 2xAA → TPS61220 boost → 3.3V, USB-C via MCP1700 LDO, diode OR-ing
Audio: 30+ min at 8kHz/8-bit mono via 16MB SPI flash
USB: Mass storage for drag-and-drop audio upload
BLE: Wireless audio transfer from phone
FIX: Sub-symbol names (the _0_1, _1_1 variants) must NOT include the
library prefix. Only the outer symbol declaration gets "baby_mobile:".
"""
import uuid
import json
import os
LIB = "baby_mobile"
def uid():
return str(uuid.uuid4())
# ============================================================
# SYMBOL HELPERS
# ============================================================
def _sym_start(name, ref_prefix, default_value, footprint, extra_props=""):
"""Outer symbol with library prefix."""
return f"""
(symbol "{LIB}:{name}" (in_bom yes) (on_board yes)
(property "Reference" "{ref_prefix}" (at 0 1 0) (effects (font (size 1.27 1.27))))
(property "Value" "{default_value}" (at 0 -1 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "{footprint}" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
{extra_props}"""
def _unit(name, unit_id):
"""Inner sub-symbol WITHOUT library prefix — this was the bug."""
return f""" (symbol "{name}_{unit_id}" """
# ============================================================
# SYMBOL DEFINITIONS
# ============================================================
def sym_mdbt50q():
"""MDBT50Q-P nRF52840 BLE module, 32 pins exposed."""
s = _sym_start("MDBT50Q", "U", "MDBT50Q-P1MV2",
"RF_Module:Raytac_MDBT50Q",
"")
s += f"""
(symbol "MDBT50Q_0_1"
(rectangle (start -20 30) (end 20 -30) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "MDBT50Q_1_1"
(pin power_in line (at -5 -33 90) (length 3) (name "GND" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at -5 33 270) (length 3) (name "VCC" (effects (font (size 1 1)))) (number "32" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 20 0) (length 3) (name "P0.00/XL1" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 17.5 0) (length 3) (name "P0.01/XL2" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 15 0) (length 3) (name "P0.02/AIN0" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 12.5 0) (length 3) (name "P0.03/AIN1" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 10 0) (length 3) (name "P0.04/AIN2" (effects (font (size 1 1)))) (number "6" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 7.5 0) (length 3) (name "P0.05/AIN3" (effects (font (size 1 1)))) (number "7" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 5 0) (length 3) (name "P0.06" (effects (font (size 1 1)))) (number "8" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 2.5 0) (length 3) (name "P0.07" (effects (font (size 1 1)))) (number "9" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 0 0) (length 3) (name "P0.08" (effects (font (size 1 1)))) (number "10" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -2.5 0) (length 3) (name "P0.09/NFC1" (effects (font (size 1 1)))) (number "11" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -5 0) (length 3) (name "P0.10/NFC2" (effects (font (size 1 1)))) (number "12" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -7.5 0) (length 3) (name "P0.11" (effects (font (size 1 1)))) (number "13" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -10 0) (length 3) (name "P0.12" (effects (font (size 1 1)))) (number "14" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -12.5 0) (length 3) (name "P0.13" (effects (font (size 1 1)))) (number "15" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -15 0) (length 3) (name "P0.14" (effects (font (size 1 1)))) (number "16" (effects (font (size 1 1)))))
(pin bidirectional line (at -23 -17.5 0) (length 3) (name "P0.15" (effects (font (size 1 1)))) (number "17" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 20 180) (length 3) (name "P0.16" (effects (font (size 1 1)))) (number "18" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 17.5 180) (length 3) (name "P0.17" (effects (font (size 1 1)))) (number "19" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 15 180) (length 3) (name "P0.18/~{{RESET}}" (effects (font (size 1 1)))) (number "20" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 12.5 180) (length 3) (name "P0.19" (effects (font (size 1 1)))) (number "21" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 10 180) (length 3) (name "P0.20" (effects (font (size 1 1)))) (number "22" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 7.5 180) (length 3) (name "P0.21" (effects (font (size 1 1)))) (number "23" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 5 180) (length 3) (name "P0.22" (effects (font (size 1 1)))) (number "24" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 2.5 180) (length 3) (name "P0.23" (effects (font (size 1 1)))) (number "25" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 0 180) (length 3) (name "P0.24" (effects (font (size 1 1)))) (number "26" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -2.5 180) (length 3) (name "P1.00" (effects (font (size 1 1)))) (number "27" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -5 180) (length 3) (name "D-" (effects (font (size 1 1)))) (number "28" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -7.5 180) (length 3) (name "D+" (effects (font (size 1 1)))) (number "29" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -10 180) (length 3) (name "P0.25" (effects (font (size 1 1)))) (number "30" (effects (font (size 1 1)))))
(pin bidirectional line (at 23 -12.5 180) (length 3) (name "P0.26" (effects (font (size 1 1)))) (number "31" (effects (font (size 1 1)))))
(pin input line (at 23 -17.5 180) (length 3) (name "SWDIO" (effects (font (size 1 1)))) (number "33" (effects (font (size 1 1)))))
(pin input line (at 23 -20 180) (length 3) (name "SWDCLK" (effects (font (size 1 1)))) (number "34" (effects (font (size 1 1)))))
)
)"""
return s
def sym_is25lp128f():
s = _sym_start("IS25LP128F", "U", "IS25LP128F", "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm")
s += f"""
(symbol "IS25LP128F_0_1"
(rectangle (start -7 6) (end 7 -6) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "IS25LP128F_1_1"
(pin input line (at -10 4 0) (length 3) (name "~{{CS}}" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin output line (at -10 1.5 0) (length 3) (name "SO/IO1" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin input line (at -10 -1.5 0) (length 3) (name "~{{WP}}/IO2" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin power_in line (at -10 -4 0) (length 3) (name "GND" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin input line (at 10 -4 180) (length 3) (name "SI/IO0" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
(pin input line (at 10 -1.5 180) (length 3) (name "SCLK" (effects (font (size 1 1)))) (number "6" (effects (font (size 1 1)))))
(pin input line (at 10 1.5 180) (length 3) (name "~{{HOLD}}/IO3" (effects (font (size 1 1)))) (number "7" (effects (font (size 1 1)))))
(pin power_in line (at 10 4 180) (length 3) (name "VCC" (effects (font (size 1 1)))) (number "8" (effects (font (size 1 1)))))
)
)"""
return s
def sym_pam8302a():
s = _sym_start("PAM8302A", "U", "PAM8302A", "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm")
s += f"""
(symbol "PAM8302A_0_1"
(rectangle (start -8 8) (end 8 -8) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "PAM8302A_1_1"
(pin input line (at -11 5 0) (length 3) (name "~{{SD}}" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at -11 2 0) (length 3) (name "VDD" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin power_in line (at -11 -1 0) (length 3) (name "GND" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin input line (at -11 -4 0) (length 3) (name "A+" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin input line (at -11 -7 0) (length 3) (name "A-" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
(pin output line (at 11 2 180) (length 3) (name "VO+" (effects (font (size 1 1)))) (number "8" (effects (font (size 1 1)))))
(pin output line (at 11 -1 180) (length 3) (name "VO-" (effects (font (size 1 1)))) (number "7" (effects (font (size 1 1)))))
(pin power_in line (at 11 -4 180) (length 3) (name "PAD" (effects (font (size 1 1)))) (number "6" (effects (font (size 1 1)))))
)
)"""
return s
def sym_tps61220():
s = _sym_start("TPS61220", "U", "TPS61220DCK", "Package_TO_SOT_SMD:SOT-353_SC-70-5")
s += f"""
(symbol "TPS61220_0_1"
(rectangle (start -7 5) (end 7 -5) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "TPS61220_1_1"
(pin power_in line (at -10 3 0) (length 3) (name "VIN" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at -10 -3 0) (length 3) (name "GND" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin input line (at 10 -3 180) (length 3) (name "EN" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin power_out line (at 10 3 180) (length 3) (name "VOUT" (effects (font (size 1 1)))) (number "4" (effects (font (size 1 1)))))
(pin passive line (at 0 8 270) (length 3) (name "L" (effects (font (size 1 1)))) (number "5" (effects (font (size 1 1)))))
)
)"""
return s
def sym_mcp1700():
s = _sym_start("MCP1700", "U", "MCP1700-3302E", "Package_TO_SOT_SMD:SOT-23")
s += f"""
(symbol "MCP1700_0_1"
(rectangle (start -6 4) (end 6 -4) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "MCP1700_1_1"
(pin power_in line (at -9 2 0) (length 3) (name "VIN" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin power_in line (at 0 -7 90) (length 3) (name "GND" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
(pin power_out line (at 9 2 180) (length 3) (name "VOUT" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
)
)"""
return s
def sym_generic_2pin(name, ref, value, fp):
"""Generic 2-pin symbol for caps, resistors, diodes, connectors."""
s = _sym_start(name, ref, value, fp)
s += f"""
(symbol "{name}_0_1"
(polyline (pts (xy -1.5 1) (xy 1.5 1)) (stroke (width 0.4) (type default)) (fill (type none)))
(polyline (pts (xy -1.5 -1) (xy 1.5 -1)) (stroke (width 0.4) (type default)) (fill (type none)))
)
(symbol "{name}_1_1"
(pin passive line (at 0 3.5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -3.5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)"""
return s
def sym_usb_c():
s = _sym_start("USB_C", "J", "USB_C_Receptacle", "Connector_USB:USB_C_Receptacle_GCT_USB4085")
s += f"""
(symbol "USB_C_0_1"
(rectangle (start -6 8) (end 6 -8) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "USB_C_1_1"
(pin power_in line (at -9 6 0) (length 3) (name "VBUS" (effects (font (size 1 1)))) (number "A4" (effects (font (size 1 1)))))
(pin passive line (at -9 3 0) (length 3) (name "CC1" (effects (font (size 1 1)))) (number "A5" (effects (font (size 1 1)))))
(pin passive line (at -9 0 0) (length 3) (name "CC2" (effects (font (size 1 1)))) (number "B5" (effects (font (size 1 1)))))
(pin bidirectional line (at -9 -3 0) (length 3) (name "D+" (effects (font (size 1 1)))) (number "A6" (effects (font (size 1 1)))))
(pin bidirectional line (at -9 -6 0) (length 3) (name "D-" (effects (font (size 1 1)))) (number "A7" (effects (font (size 1 1)))))
(pin power_in line (at 9 -6 180) (length 3) (name "GND" (effects (font (size 1 1)))) (number "A1" (effects (font (size 1 1)))))
(pin passive line (at 9 0 180) (length 3) (name "SHIELD" (effects (font (size 1 1)))) (number "S1" (effects (font (size 1 1)))))
)
)"""
return s
def sym_switch():
s = _sym_start("Switch", "SW", "SW", "Button_Switch_SMD:SW_SPST_TL3342")
s += f"""
(symbol "Switch_0_1"
(circle (center -2 0) (radius 0.4) (stroke (width 0) (type default)) (fill (type none)))
(circle (center 2 0) (radius 0.4) (stroke (width 0) (type default)) (fill (type none)))
(polyline (pts (xy -1.6 0) (xy 1.6 1)) (stroke (width 0.254) (type default)) (fill (type none)))
)
(symbol "Switch_1_1"
(pin passive line (at -5 0 0) (length 3) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 5 0 180) (length 3) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)"""
return s
def sym_nmos():
s = _sym_start("NMOS", "Q", "AO3400A", "Package_TO_SOT_SMD:SOT-23")
s += f"""
(symbol "NMOS_0_1"
(polyline (pts (xy -0.5 2) (xy -0.5 -2)) (stroke (width 0.254) (type default)) (fill (type none)))
)
(symbol "NMOS_1_1"
(pin passive line (at 0 5 270) (length 2.5) (name "D" (effects (font (size 1 1)))) (number "3" (effects (font (size 1 1)))))
(pin input line (at -4 0 0) (length 2.5) (name "G" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -5 90) (length 2.5) (name "S" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)"""
return s
def sym_inductor():
s = _sym_start("Inductor", "L", "4.7uH", "Inductor_SMD:L_0805_2012Metric")
s += f"""
(symbol "Inductor_0_1"
(arc (start 0 2.5) (mid 0.75 1.875) (end 0 1.25) (stroke (width 0.254) (type default)) (fill (type none)))
(arc (start 0 1.25) (mid 0.75 0.625) (end 0 0) (stroke (width 0.254) (type default)) (fill (type none)))
(arc (start 0 0) (mid 0.75 -0.625) (end 0 -1.25) (stroke (width 0.254) (type default)) (fill (type none)))
(arc (start 0 -1.25) (mid 0.75 -1.875) (end 0 -2.5) (stroke (width 0.254) (type default)) (fill (type none)))
)
(symbol "Inductor_1_1"
(pin passive line (at 0 5 270) (length 2.5) (name "1" (effects (font (size 1 1)))) (number "1" (effects (font (size 1 1)))))
(pin passive line (at 0 -5 90) (length 2.5) (name "2" (effects (font (size 1 1)))) (number "2" (effects (font (size 1 1)))))
)
)"""
return s
def sym_conn(name, ref, npins, fp):
s = _sym_start(name, ref, name, fp)
h = npins * 2.5 + 1
s += f"""
(symbol "{name}_0_1"
(rectangle (start -3 {h}) (end 3 {-h}) (stroke (width 0.254) (type default)) (fill (type background)))
)
(symbol "{name}_1_1"
"""
for i in range(npins):
y = h - 2 - i * 2.5
s += f""" (pin passive line (at -6 {y:.1f} 0) (length 3) (name "P{i+1}" (effects (font (size 1 1)))) (number "{i+1}" (effects (font (size 1 1)))))
"""
s += """ )
)"""
return s
# ============================================================
# INSTANCE HELPER
# ============================================================
def _inst(lib_name, ref, value, footprint, x, y, angle=0):
return f""" (symbol (lib_id "{LIB}:{lib_name}") (at {x} {y} {angle}) (unit 1)
(in_bom yes) (on_board yes) (dnp no)
(uuid "{uid()}")
(property "Reference" "{ref}" (at {x+3} {y-3} 0) (effects (font (size 1.27 1.27))))
(property "Value" "{value}" (at {x+3} {y+3} 0) (effects (font (size 1.27 1.27))))
(property "Footprint" "{footprint}" (at {x} {y} 0) (effects (font (size 1.27 1.27)) hide))
(property "Datasheet" "" (at {x} {y} 0) (effects (font (size 1.27 1.27)) hide))
)"""
# ============================================================
# MAIN SCHEMATIC
# ============================================================
def generate_schematic():
sch = []
sch.append(f"""(kicad_sch (version 20230121) (generator "baby_mobile_gen_v2")
(uuid "{uid()}")
(paper "A3")
(title_block
(title "Baby Mobile Audio Board v2")
(date "2026-03-09")
(rev "2.0")
(comment 1 "MDBT50Q (nRF52840) + IS25LP128F + PAM8302A")
(comment 2 "2xAA Battery + USB-C, Diode OR, TPS61220 Boost")
(comment 3 "BLE + USB mass storage for audio upload")
(comment 4 "8-ohm 0.25W Speaker, DC Motor, 8 Buttons")
)
""")
# ---- LIB_SYMBOLS ----
sch.append(" (lib_symbols")
sch.append(sym_mdbt50q())
sch.append(sym_is25lp128f())
sch.append(sym_pam8302a())
sch.append(sym_tps61220())
sch.append(sym_mcp1700())
sch.append(sym_generic_2pin("Capacitor", "C", "C", "Capacitor_SMD:C_0805_2012Metric"))
sch.append(sym_generic_2pin("Resistor", "R", "R", "Resistor_SMD:R_0805_2012Metric"))
sch.append(sym_generic_2pin("Diode_Schottky", "D", "BAT54S", "Diode_SMD:D_SOT-23_ANK"))
sch.append(sym_generic_2pin("LED", "D", "LED", "LED_SMD:LED_0805_2012Metric"))
sch.append(sym_generic_2pin("Conn_2Pin", "J", "Conn_2", "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal"))
sch.append(sym_switch())
sch.append(sym_nmos())
sch.append(sym_inductor())
sch.append(sym_usb_c())
sch.append(sym_conn("SWD_Header", "J", 4, "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical"))
sch.append(sym_conn("Serial_Header", "J", 3, "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical"))
sch.append(" )") # end lib_symbols
# ---- COMPONENT INSTANCES ----
# == POWER: Battery path ==
sch.append(_inst("Conn_2Pin", "J1", "BATTERY", "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal", 20, 40))
sch.append(_inst("Switch", "SW9", "PWR", "Button_Switch_THT:SW_SPDT_CK-JS102011SAQN", 38, 35))
sch.append(_inst("Diode_Schottky", "D1", "BAT54S", "Diode_SMD:D_SOT-23_ANK", 55, 35)) # battery diode
sch.append(_inst("Capacitor", "C1", "100uF", "Capacitor_THT:CP_Radial_D5.0mm_P2.00mm", 48, 45))
# == POWER: Boost converter TPS61220 ==
sch.append(_inst("TPS61220", "U4", "TPS61220DCK", "Package_TO_SOT_SMD:SOT-353_SC-70-5", 80, 40))
sch.append(_inst("Inductor", "L1", "4.7uH", "Inductor_SMD:L_0805_2012Metric", 80, 28))
sch.append(_inst("Capacitor", "C9", "10uF", "Capacitor_SMD:C_0805_2012Metric", 68, 45)) # boost input
sch.append(_inst("Capacitor", "C10", "10uF", "Capacitor_SMD:C_0805_2012Metric", 95, 45)) # boost output
# == POWER: USB path ==
sch.append(_inst("USB_C", "J6", "USB_C", "Connector_USB:USB_C_Receptacle_GCT_USB4085", 20, 80))
sch.append(_inst("Resistor", "R7", "5.1K", "Resistor_SMD:R_0805_2012Metric", 38, 83)) # CC1
sch.append(_inst("Resistor", "R8", "5.1K", "Resistor_SMD:R_0805_2012Metric", 38, 88)) # CC2
sch.append(_inst("Diode_Schottky", "D3", "BAT54S", "Diode_SMD:D_SOT-23_ANK", 55, 74)) # USB diode
sch.append(_inst("MCP1700", "U5", "MCP1700-3302E", "Package_TO_SOT_SMD:SOT-23", 72, 74))
sch.append(_inst("Capacitor", "C11", "1uF", "Capacitor_SMD:C_0805_2012Metric", 62, 82)) # LDO in
sch.append(_inst("Capacitor", "C12", "1uF", "Capacitor_SMD:C_0805_2012Metric", 82, 82)) # LDO out
# == MCU: MDBT50Q (nRF52840 module) ==
sch.append(_inst("MDBT50Q", "U1", "MDBT50Q-P1MV2", "RF_Module:Raytac_MDBT50Q", 160, 100))
# MCU decoupling
sch.append(_inst("Capacitor", "C2", "100nF", "Capacitor_SMD:C_0805_2012Metric", 135, 60))
sch.append(_inst("Capacitor", "C3", "10uF", "Capacitor_SMD:C_0805_2012Metric", 128, 60))
# == SPI FLASH: IS25LP128F ==
sch.append(_inst("IS25LP128F", "U2", "IS25LP128F", "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm", 260, 60))
sch.append(_inst("Capacitor", "C5", "100nF", "Capacitor_SMD:C_0805_2012Metric", 285, 50))
# == AUDIO AMP: PAM8302A ==
sch.append(_inst("PAM8302A", "U3", "PAM8302A", "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm", 260, 140))
sch.append(_inst("Resistor", "R2", "4.7K", "Resistor_SMD:R_0805_2012Metric", 220, 135)) # LPF R
sch.append(_inst("Capacitor", "C7", "10nF", "Capacitor_SMD:C_0805_2012Metric", 230, 145)) # LPF C
sch.append(_inst("Capacitor", "C6", "1uF", "Capacitor_SMD:C_0805_2012Metric", 240, 135)) # coupling
sch.append(_inst("Capacitor", "C8", "10uF", "Capacitor_SMD:C_0805_2012Metric", 285, 130)) # amp bypass
sch.append(_inst("Resistor", "R3", "100K", "Resistor_SMD:R_0805_2012Metric", 240, 155)) # SD pulldown
sch.append(_inst("Conn_2Pin", "J2", "SPEAKER", "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal", 290, 145))
# == MOTOR DRIVER ==
sch.append(_inst("NMOS", "Q1", "AO3400A", "Package_TO_SOT_SMD:SOT-23", 160, 200))
sch.append(_inst("Resistor", "R4", "100R", "Resistor_SMD:R_0805_2012Metric", 140, 200))
sch.append(_inst("Resistor", "R5", "100K", "Resistor_SMD:R_0805_2012Metric", 150, 212))
sch.append(_inst("Diode_Schottky", "D4", "SS14", "Diode_SMD:D_SMA", 175, 190, 90))
sch.append(_inst("Conn_2Pin", "J3", "MOTOR", "Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal", 180, 180))
# == 8 BUTTONS ==
for i in range(8):
y = 80 + i * 14
sch.append(_inst("Switch", f"SW{i+1}", f"BTN{i+1}", "Button_Switch_SMD:SW_SPST_TL3342", 300, y))
# == STATUS LED ==
sch.append(_inst("LED", "D2", "LED_GRN", "LED_SMD:LED_0805_2012Metric", 115, 200))
sch.append(_inst("Resistor", "R6", "1K", "Resistor_SMD:R_0805_2012Metric", 105, 200))
# == HEADERS ==
sch.append(_inst("SWD_Header", "J4", "SWD", "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical", 200, 60))
sch.append(_inst("Serial_Header", "J5", "SERIAL", "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical", 200, 30))
# ---- NET LABELS ----
labels = [
# 3.3V rail (output of boost OR LDO)
("3V3", 95, 37), ("3V3", 135, 55), ("3V3", 128, 55),
("3V3", 285, 45), ("3V3", 285, 125), ("3V3", 155, 67),
("3V3", 82, 72), ("3V3", 180, 175),
# Battery rail (pre-boost)
("VBAT", 48, 35), ("VBAT", 55, 30),
("VBAT", 68, 37),
# Boost input/output
("VBOOST_IN", 65, 37), ("VBOOST_IN", 70, 37),
("3V3", 90, 37),
# USB VBUS
("USB_VBUS", 29, 74), ("USB_VBUS", 55, 69),
("USB_LDO_OUT", 81, 72),
# GND everywhere
("GND", 48, 55), ("GND", 68, 55), ("GND", 95, 55),
("GND", 80, 50), ("GND", 155, 133),
("GND", 260, 70), ("GND", 285, 55), ("GND", 285, 155),
("GND", 160, 215), ("GND", 150, 218),
("GND", 230, 155), ("GND", 240, 165),
("GND", 62, 92), ("GND", 82, 92), ("GND", 72, 81),
("GND", 38, 93), ("GND", 38, 98),
("GND", 135, 65), ("GND", 128, 65),
# USB data
("USB_D+", 29, 77), ("USB_D+", 183, 92.5),
("USB_D-", 29, 80), ("USB_D-", 183, 95),
# USB CC (to pulldowns)
("USB_CC1", 29, 83), ("USB_CC1", 38, 78),
("USB_CC2", 29, 86), ("USB_CC2", 38, 83),
# SPI bus
("SPI_MOSI", 183, 87.5), ("SPI_MOSI", 250, 56),
("SPI_MISO", 183, 85), ("SPI_MISO", 250, 61.5),
("SPI_SCK", 183, 82.5), ("SPI_SCK", 270, 58.5),
("FLASH_CS", 183, 80), ("FLASH_CS", 250, 64),
# Audio
("AUDIO_PWM", 183, 100), ("AUDIO_PWM", 210, 135),
("AMP_SD", 183, 102.5), ("AMP_SD", 240, 150),
# Motor
("MOTOR_PWM", 137, 112.5), ("MOTOR_PWM", 130, 200),
# Buttons (directly to GPIOs)
("BTN1", 295, 80), ("BTN1", 137, 120),
("BTN2", 295, 94), ("BTN2", 137, 117.5),
("BTN3", 295, 108), ("BTN3", 137, 115),
("BTN4", 295, 122), ("BTN4", 137, 112.5),
("BTN5", 295, 136), ("BTN5", 137, 110),
("BTN6", 295, 150), ("BTN6", 137, 107.5),
("BTN7", 295, 164), ("BTN7", 137, 105),
("BTN8", 295, 178), ("BTN8", 137, 102.5),
# Button GND side
("GND", 305, 80), ("GND", 305, 94), ("GND", 305, 108), ("GND", 305, 122),
("GND", 305, 136), ("GND", 305, 150), ("GND", 305, 164), ("GND", 305, 178),
# LED
("LED_OUT", 95, 200), ("LED_OUT", 137, 100),
# SWD header
("SWDIO", 194, 55.5), ("SWDIO", 183, 82.5),
("SWDCLK", 194, 58), ("SWDCLK", 183, 80),
("3V3", 194, 53), ("GND", 194, 60.5),
# Serial header
("TXD", 194, 25.5), ("TXD", 137, 80),
("RXD", 194, 28), ("RXD", 137, 82.5),
("GND", 194, 30.5),
# Flash WP and HOLD tied to VCC
("3V3", 250, 58.5), ("3V3", 270, 61.5),
# Boost EN tied to VIN (always on when battery present)
("VBAT", 90, 43),
]
for name, x, y in labels:
sch.append(f""" (label "{name}" (at {x} {y} 0) (effects (font (size 1.27 1.27))) (uuid "{uid()}"))""")
# ---- TEXT NOTES ----
notes = [
(10, 12, "POWER: 2xAA → BAT54S → TPS61220 boost → 3.3V (1.8-3.2V input)"),
(10, 15, "USB: VBUS → BAT54S → MCP1700 LDO → 3.3V (safe with any battery chemistry)"),
(10, 18, "MCU: MDBT50Q (nRF52840) — BLE 5.0, USB 2.0, 1.7-5.5V, UF2 bootloader"),
(10, 21, "FLASH: IS25LP128F 16MB (2.3-3.6V) = ~33 min @ 8kHz 8-bit PCM"),
(10, 24, "AMP: PAM8302A Class-D, 90% eff, Vmin=2.0V, shutdown pin for power save"),
(10, 27, "MOTOR: AO3400A logic-level N-MOSFET, PWM speed control"),
(10, 230, "USB-C: Drag-and-drop audio as mass storage device"),
(10, 233, "BLE: Wireless audio upload from phone (Web Bluetooth compatible)"),
(10, 236, "FIRMWARE: UF2 bootloader — update by drag-and-drop, no programmer needed"),
(10, 239, "RUNTIME: Audio+Motor ~25h, Audio only ~167h, Sleep ~years on 2xAA"),
]
for x, y, text in notes:
sch.append(f""" (text "{text}" (at {x} {y} 0)
(effects (font (size 1.5 1.5)) (justify left))
(uuid "{uid()}")
)""")
sch.append(")") # end kicad_sch
return "\n".join(sch)
# ============================================================
# PROJECT FILE
# ============================================================
def generate_project():
return json.dumps({
"meta": {"filename": "baby-mobile-v2.kicad_pro", "version": 1},
"board": {
"design_settings": {
"defaults": {"board_outline_line_width": 0.1, "copper_line_width": 0.2},
"rules": {"min_copper_edge_clearance": 0.3, "min_track_width": 0.2,
"min_via_diameter": 0.6, "min_via_annular_width": 0.13}
}
},
"net_settings": {
"classes": [{"name": "Default", "clearance": 0.2, "track_width": 0.3,
"via_diameter": 0.6, "via_drill": 0.3}]
},
"schematic": {"legacy_lib_dir": "", "legacy_lib_list": []},
"sheets": [["", ""]]
}, indent=2)
# ============================================================
# MAIN
# ============================================================
if __name__ == "__main__":
outdir = os.path.dirname(os.path.abspath(__file__))
sch = generate_schematic()
sch_path = os.path.join(outdir, "baby-mobile-v2.kicad_sch")
with open(sch_path, "w") as f:
f.write(sch)
print(f"Written: {sch_path} ({len(sch)} bytes)")
proj = generate_project()
proj_path = os.path.join(outdir, "baby-mobile-v2.kicad_pro")
with open(proj_path, "w") as f:
f.write(proj)
print(f"Written: {proj_path} ({len(proj)} bytes)")
# Validate: check no sub-symbol has library prefix
import re
outer = re.findall(r'\(symbol "baby_mobile:[^"]+?"', sch)
inner_bad = re.findall(r'\(symbol "baby_mobile:[^"]+?_[01]_1"', sch)
print(f"\nValidation: {len(outer)} outer symbols, {len(inner_bad)} bad inner symbols")
if inner_bad:
print("ERROR: Found inner symbols with library prefix:")
for m in inner_bad:
print(f" {m}")
else:
print("OK: All inner sub-symbols correctly omit library prefix")
+505
View File
@@ -0,0 +1,505 @@
#!/usr/bin/env python3
"""
Generate KiCad 7 combined panel PCB for Baby Mobile project.
PANEL LAYOUT (v-score breakaway):
┌─────────────────────────────────────────────────────┐
│ │
│ CARRIER BOARD (42mm × 24mm) │
│ ┌──────────────────────────────────────────────┐ │
│ │ ┌─────────────┐ [IS25LP128F] [JST SH 10] │ │
│ │ │ XIAO ■USB │ ●1 J1 │ │
│ │ │ nRF52840 │ [C3] [R1][C5] │ │
│ │ │ │ │ │
│ │ │ D0 .... D10│ [TPS61220] [R2] │ │
│ │ │ D1 D9 │ [L1][C1][C2] │ │
│ │ │ ... ...│ │ │
│ │ │ D6 3V3│ (M2) (M2) │ │
│ │ └─────────────┘ │ │
│ └──────────────────────────────────────────────┘ │
│ - - SNAP - - - - - - - - - - - - - - - - - - - - - │
│ ┌──────────┐ ┌────────────┐ ┌────────────┐ │
│ │ SOP-8 │ │ SOP-16N │ │ SOP-16W │ │
│ │ castell. │ │ castellated│ │ castellated│ │
│ │ [JST 8p] │ │ [JST 10p] │ │ [JST 10p] │ │
│ └──────────┘ └────────────┘ └────────────┘ │
└─────────────────────────────────────────────────────┘
Each SOP adapter:
- Board edges cut through SOP pad centers → castellated half-holes
- Top surface: JST SH connector + pin 1 dot + pin number silk labels
- Bottom surface: nothing (sits flush on toy PCB)
"""
import uuid, os, json
def uid():
return str(uuid.uuid4())
# ============================================================
# Geometry Constants
# ============================================================
CARRIER_W = 42.0
CARRIER_H = 24.0
ADAPTER_AREA_H = 10.0 # height for adapter strip below carrier
PANEL_W = 48.0
PANEL_H = CARRIER_H + ADAPTER_AREA_H + 2.0 # +2 for v-score margin
SOP_PITCH = 1.27
SOP8_PINS_PER_SIDE = 4
SOP16_PINS_PER_SIDE = 8
# SOP pad dimensions
PAD_W = 0.6
PAD_H = 1.5
# Castellated hole
CAST_DRILL = 0.6
CAST_PAD = 1.0
# JST SH 1.0mm pitch
JST_PITCH = 1.0
# ============================================================
# Helpers
# ============================================================
def smd(name, x, y, w, h, net, nname, layer="F.Cu", mask=True):
ml = f'"{layer}" "{layer[0]}.Paste" "{layer[0]}.Mask"' if mask else f'"{layer}"'
return f' (pad "{name}" smd rect (at {x:.3f} {y:.3f}) (size {w} {h}) (layers {ml}) (net {net} "{nname}") (uuid "{uid()}"))'
def thru(name, x, y, pd, dd, net, nname):
return f' (pad "{name}" thru_hole circle (at {x:.3f} {y:.3f}) (size {pd} {pd}) (drill {dd}) (layers "*.Cu" "*.Mask") (net {net} "{nname}") (uuid "{uid()}"))'
def cast(name, x, y, net, nname):
"""Castellated half-hole: thru-hole pad on board edge."""
return f' (pad "{name}" thru_hole circle (at {x:.3f} {y:.3f}) (size {CAST_PAD} {CAST_PAD}) (drill {CAST_DRILL}) (layers "*.Cu" "*.Mask") (net {net} "{nname}") (uuid "{uid()}"))'
def line(x1, y1, x2, y2, layer="Edge.Cuts", w=0.1):
return f' (gr_line (start {x1} {y1}) (end {x2} {y2}) (layer "{layer}") (width {w}) (uuid "{uid()}"))'
def rect(x1, y1, x2, y2, layer="F.SilkS", w=0.15):
return f' (gr_rect (start {x1} {y1}) (end {x2} {y2}) (layer "{layer}") (width {w}) (uuid "{uid()}"))'
def txt(s, x, y, sz=0.8, layer="F.SilkS", bold=False):
th = sz * 0.15
b = " bold" if bold else ""
return f' (gr_text "{s}" (at {x} {y}) (layer "{layer}") (uuid "{uid()}") (effects (font (size {sz} {sz}) (thickness {th}){b})))'
def circle_mark(x, y, r=0.3, layer="F.SilkS"):
"""Pin 1 dot marker."""
return f' (gr_circle (center {x} {y}) (end {x+r} {y}) (layer "{layer}") (width 0.15) (fill solid) (uuid "{uid()}"))'
def fp_start(name, x, y, layer="F.Cu"):
return f"""
(footprint "panel:{name}" (layer "{layer}")
(at {x} {y})
(uuid "{uid()}")
(fp_text reference "{name}" (at 0 0) (layer "{layer[0]}.Fab") (uuid "{uid()}")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))
(fp_text value "" (at 0 0) (layer "{layer[0]}.Fab") (uuid "{uid()}")
(effects (font (size 0.5 0.5) (thickness 0.08)) hide))"""
# ============================================================
# Generate Panel
# ============================================================
def generate_panel():
ox, oy = 100, 100 # KiCad origin offset
pcb = []
# --- Header ---
pcb.append(f"""(kicad_pcb (version 20221018) (generator "panel_gen_v3")
(general (thickness 1.6))
(paper "A4")
(title_block
(title "Baby Mobile — Combined Panel")
(date "2026-03-11")
(rev "3.0")
(comment 1 "Carrier: XIAO nRF52840 + IS25LP128F + TPS61220")
(comment 2 "Breakaway: SOP-8, SOP-16N, SOP-16W castellated adapters")
(comment 3 "Order as one panel from JLCPCB with castellated holes + v-score")
)
(layers
(0 "F.Cu" signal) (31 "B.Cu" signal)
(34 "B.Paste" user) (35 "F.Paste" user)
(36 "B.SilkS" user "B.Silkscreen") (37 "F.SilkS" user "F.Silkscreen")
(38 "B.Mask" user "B.Mask") (39 "F.Mask" user "F.Mask")
(44 "Edge.Cuts" user) (49 "F.Fab" user "F.Fab") (48 "B.Fab" user "B.Fab")
)
(setup (pad_to_mask_clearance 0.05))
(net 0 "")
(net 1 "GND") (net 2 "VBAT") (net 3 "3V3")
(net 4 "SPI_MOSI") (net 5 "SPI_MISO") (net 6 "SPI_SCK") (net 7 "FLASH_CS")
(net 8 "BOOST_SW")
(net 9 "SIG_1") (net 10 "SIG_2") (net 11 "SIG_3") (net 12 "SIG_4")
(net 13 "SIG_5") (net 14 "SIG_6") (net 15 "SIG_7") (net 16 "SIG_8")
""")
# ============================
# PANEL OUTLINE (Edge.Cuts)
# ============================
# Main panel rectangle
pcb.append(line(ox, oy, ox+PANEL_W, oy))
pcb.append(line(ox+PANEL_W, oy, ox+PANEL_W, oy+PANEL_H))
pcb.append(line(ox+PANEL_W, oy+PANEL_H, ox, oy+PANEL_H))
pcb.append(line(ox, oy+PANEL_H, ox, oy))
# V-score line between carrier and adapter strip
vscore_y = oy + CARRIER_H + 1.0
pcb.append(line(ox, vscore_y, ox+PANEL_W, vscore_y))
# Mark v-score on silk
pcb.append(txt("— SNAP HERE —", ox + PANEL_W/2, vscore_y, 0.6))
# V-score lines between adapters in the strip
adapt_y = vscore_y + 1.0
# Adapter positions in the strip
a8_x = ox + 1.0
a8_w = 10.0
a16n_x = a8_x + a8_w + 1.0
a16n_w = 14.0
a16w_x = a16n_x + a16n_w + 1.0
a16w_w = 14.0
pcb.append(line(a16n_x - 0.5, adapt_y, a16n_x - 0.5, oy + PANEL_H))
pcb.append(line(a16w_x - 0.5, adapt_y, a16w_x - 0.5, oy + PANEL_H))
# ============================
# CARRIER BOARD COMPONENTS
# ============================
cx = ox + 3 # carrier area left edge (with margin)
cy = oy + 1 # carrier area top edge
# ---- XIAO SOCKET ----
xiao_cx = cx + 13
xiao_cy = cy + CARRIER_H/2
xiao_w, xiao_h = 21, 17.5
row_half = 17.78 / 2
# XIAO outline with USB-C rectangle
pcb.append(rect(xiao_cx - xiao_w/2, xiao_cy - xiao_h/2,
xiao_cx + xiao_w/2, xiao_cy + xiao_h/2))
# USB-C bump
usb_w, usb_h = 9, 3.5
pcb.append(rect(xiao_cx - xiao_w/2 - 1, xiao_cy - usb_h/2,
xiao_cx - xiao_w/2, xiao_cy + usb_h/2))
pcb.append(txt("USB-C", xiao_cx - xiao_w/2 - 3, xiao_cy, 0.5))
pcb.append(txt("XIAO nRF52840", xiao_cx, xiao_cy, 0.7, bold=True))
# Pin labels along XIAO outline
left_labels = ["D0", "D1", "D2", "D3", "D4", "D5", "D6"]
right_labels = ["D10", "D9", "D8", "D7", "3V3", "GND", "5V"]
# Left header (D0-D6 → signals from toy)
left_nets = [9, 10, 11, 12, 13, 14, 15] # SIG_1 through SIG_7
pcb.append(fp_start("XIAO_L", xiao_cx - row_half, xiao_cy))
for i in range(7):
y = -7.62 + i * 2.54
pcb.append(thru(left_labels[i], 0, y, 1.7, 1.0, left_nets[i], f"SIG_{i+1}"))
pcb.append(" )")
for i, lbl in enumerate(left_labels):
pcb.append(txt(lbl, xiao_cx - row_half - 3, xiao_cy - 7.62 + i*2.54, 0.5))
# Right header (D10,D9,D8,D7 → audio/SPI/motor; 3V3,GND,5V → power)
right_nets = [16, 6, 4, 5, 3, 1, 0]
right_nnames = ["SIG_8", "SPI_SCK", "SPI_MOSI", "SPI_MISO", "3V3", "GND", ""]
pcb.append(fp_start("XIAO_R", xiao_cx + row_half, xiao_cy))
for i in range(7):
y = -7.62 + i * 2.54
n = right_nets[i]
nn = right_nnames[i]
if n > 0:
pcb.append(thru(right_labels[i], 0, y, 1.7, 1.0, n, nn))
else:
pcb.append(f' (pad "{right_labels[i]}" thru_hole circle (at 0 {y:.2f}) (size 1.7 1.7) (drill 1.0) (layers "*.Cu" "*.Mask") (uuid "{uid()}"))')
pcb.append(" )")
for i, lbl in enumerate(right_labels):
pcb.append(txt(lbl, xiao_cx + row_half + 3, xiao_cy - 7.62 + i*2.54, 0.5))
# ---- IS25LP128F (SOIC-8) ----
fl_cx = cx + 31
fl_cy = cy + 5.5
soic_span = 5.4
# Pin 1 dot
pcb.append(circle_mark(fl_cx - 2.5, fl_cy + soic_span/2 + 0.8))
# Outline
pcb.append(rect(fl_cx - 2.5, fl_cy - 2, fl_cx + 2.5, fl_cy + 2))
pcb.append(txt("U2 IS25LP128F", fl_cx, fl_cy - 3.5, 0.5))
pcb.append(txt("●1", fl_cx - 2.5, fl_cy + soic_span/2 + 1.5, 0.4))
flash_pins = [
(1, -1.905, soic_span/2, 7, "FLASH_CS"),
(2, -0.635, soic_span/2, 5, "SPI_MISO"),
(3, 0.635, soic_span/2, 3, "3V3"),
(4, 1.905, soic_span/2, 1, "GND"),
(5, 1.905, -soic_span/2, 4, "SPI_MOSI"),
(6, 0.635, -soic_span/2, 6, "SPI_SCK"),
(7, -0.635, -soic_span/2, 3, "3V3"),
(8, -1.905, -soic_span/2, 3, "3V3"),
]
pcb.append(fp_start("IS25LP128F", fl_cx, fl_cy))
for pin, x, y, net, nn in flash_pins:
pcb.append(smd(str(pin), x, y, 0.6, 1.5, net, nn))
pcb.append(" )")
# Flash decoupling C3 (0805)
pcb.append(fp_start("C3", fl_cx + 5, fl_cy))
pcb.append(smd("1", -1.0, 0, 1.0, 1.2, 3, "3V3"))
pcb.append(smd("2", 1.0, 0, 1.0, 1.2, 1, "GND"))
pcb.append(" )")
pcb.append(txt("C3 100n", fl_cx + 5, fl_cy - 1.2, 0.4))
# Polarity: + mark on pin 1 side
pcb.append(txt("+", fl_cx + 3.8, fl_cy, 0.4))
# ---- Flash CS pullup R2 ----
pcb.append(fp_start("R2", fl_cx + 5, fl_cy + 3))
pcb.append(smd("1", -1.0, 0, 1.0, 1.2, 7, "FLASH_CS"))
pcb.append(smd("2", 1.0, 0, 1.0, 1.2, 3, "3V3"))
pcb.append(" )")
pcb.append(txt("R2 10K", fl_cx + 5, fl_cy + 1.8, 0.4))
# ---- Audio RC LPF: R1 + C5 ----
pcb.append(fp_start("R1", cx + 31, cy + 12))
pcb.append(smd("1", -1.0, 0, 1.0, 1.2, 16, "SIG_8")) # from D10 (audio PWM)
pcb.append(smd("2", 1.0, 0, 1.0, 1.2, 0, "AUDIO_FILT")) # to cap & JST
pcb.append(" )")
pcb.append(txt("R1 4.7K", cx+31, cy+10.8, 0.4))
pcb.append(fp_start("C5", cx + 31, cy + 14.5))
pcb.append(smd("1", -1.0, 0, 1.0, 1.2, 0, "AUDIO_FILT"))
pcb.append(smd("2", 1.0, 0, 1.0, 1.2, 1, "GND"))
pcb.append(" )")
pcb.append(txt("C5 10n", cx+31, cy+13.3, 0.4))
# ---- TPS61220 BOOST ----
boost_cx = cx + 31
boost_cy = cy + 19
# Pin 1 dot
pcb.append(circle_mark(boost_cx - 1.2, boost_cy + 1.5))
pcb.append(txt("U1 TPS61220", boost_cx, boost_cy - 2.5, 0.5))
pcb.append(txt("●1", boost_cx - 1.2, boost_cy + 2.2, 0.4))
pcb.append(fp_start("TPS61220", boost_cx, boost_cy))
pcb.append(smd("1", -0.65, 0.7, 0.4, 0.55, 2, "VBAT")) # VIN
pcb.append(smd("2", 0, 0.7, 0.4, 0.55, 1, "GND")) # GND
pcb.append(smd("3", 0.65, 0.7, 0.4, 0.55, 2, "VBAT")) # EN (tied to VIN)
pcb.append(smd("4", 0.65,-0.7, 0.4, 0.55, 3, "3V3")) # VOUT
pcb.append(smd("5", -0.65,-0.7, 0.4, 0.55, 8, "BOOST_SW")) # L (switch)
pcb.append(" )")
# L1 inductor (0805)
pcb.append(fp_start("L1", boost_cx - 4, boost_cy))
pcb.append(smd("1", -1.0, 0, 1.0, 1.2, 8, "BOOST_SW"))
pcb.append(smd("2", 1.0, 0, 1.0, 1.2, 2, "VBAT"))
pcb.append(" )")
pcb.append(txt("L1 4.7u", boost_cx - 4, boost_cy - 1.2, 0.4))
# C1 boost input (0805)
pcb.append(fp_start("C1", boost_cx - 4, boost_cy + 3))
pcb.append(smd("1", -1.0, 0, 1.0, 1.2, 2, "VBAT"))
pcb.append(smd("2", 1.0, 0, 1.0, 1.2, 1, "GND"))
pcb.append(" )")
pcb.append(txt("C1 10u", boost_cx - 4, boost_cy + 1.8, 0.4))
# C2 boost output (0805)
pcb.append(fp_start("C2", boost_cx + 4, boost_cy))
pcb.append(smd("1", -1.0, 0, 1.0, 1.2, 3, "3V3"))
pcb.append(smd("2", 1.0, 0, 1.0, 1.2, 1, "GND"))
pcb.append(" )")
pcb.append(txt("C2 10u", boost_cx + 4, boost_cy - 1.2, 0.4))
# ---- JST SH 10-pin connector (top-right of carrier) ----
jst_cx = cx + 38
jst_cy = cy + 10
pcb.append(txt("J1 TO TOY →", jst_cx - 5, jst_cy - 4, 0.5))
pcb.append(txt("1=VBAT 2=GND 3-10=SIG", jst_cx - 5, jst_cy + 5, 0.35))
# Pin 1 mark
pcb.append(circle_mark(jst_cx - 4.5 * JST_PITCH - 0.8, jst_cy))
jst_pin_nets = [
(1, 2, "VBAT"), (2, 1, "GND"),
(3, 9, "SIG_1"), (4, 10, "SIG_2"), (5, 11, "SIG_3"),
(6, 12, "SIG_4"), (7, 13, "SIG_5"), (8, 14, "SIG_6"),
(9, 15, "SIG_7"), (10, 16, "SIG_8"),
]
pcb.append(fp_start("J1_JST_SH10", jst_cx, jst_cy))
for pin, net, nn in jst_pin_nets:
x = -(9 * JST_PITCH / 2) + (pin - 1) * JST_PITCH
pcb.append(smd(str(pin), x, 0, 0.6, 1.2, net, nn))
# Anchor pads
pcb.append(smd("S1", -6, 2.15, 1.2, 1.8, 0, "", mask=False))
pcb.append(smd("S2", 6, 2.15, 1.2, 1.8, 0, "", mask=False))
pcb.append(" )")
# ---- Mounting holes ----
for mx, my in [(cx + 1.5, cy + 1.5), (cx + CARRIER_W - 4, cy + CARRIER_H - 2)]:
pcb.append(fp_start(f"MH", mx, my))
pcb.append(f' (pad "" thru_hole circle (at 0 0) (size 3.5 3.5) (drill 2.2) (layers "*.Cu" "*.Mask") (uuid "{uid()}"))')
pcb.append(" )")
# ---- Carrier silkscreen ----
pcb.append(txt("Baby Mobile Carrier v3.0", cx + CARRIER_W/2, cy - 0.5, 0.7, bold=True))
pcb.append(txt("3V3", cx + CARRIER_W/2 + 8, cy + CARRIER_H + 0.3, 0.4))
# Back silk: wiring guide
pcb.append(txt("XIAO D0-D6 = SIG_1-7 (buttons/speaker/motor)", cx + CARRIER_W/2, cy + 5, 0.4, "B.SilkS"))
pcb.append(txt("XIAO D7=MISO D8=MOSI D9=SCK D10=AUDIO", cx + CARRIER_W/2, cy + 7, 0.4, "B.SilkS"))
pcb.append(txt("JST: 1=VBAT 2=GND 3-10=SIG_1-8", cx + CARRIER_W/2, cy + 9, 0.4, "B.SilkS"))
# ============================
# BREAKAWAY ADAPTERS
# ============================
def make_adapter(name, cx, cy, pins_per_side, row_span, n_jst_pins):
"""
Castellated SOP adapter.
Board edges run through pad centers on both long sides.
JST SH connector on one short edge (top).
"""
total_pins = pins_per_side * 2
row_len = (pins_per_side - 1) * SOP_PITCH
# Board dimensions
bw = row_len + 2.0 # a bit wider than pin span
bh = row_span # exactly the distance between pin rows — edges at pad centers
jst_tab = 3.0 # extra tab at top for JST connector
total_h = bh + jst_tab
bx = cx - bw / 2
by = cy - total_h / 2
# Board outline
pcb.append(line(bx, by, bx + bw, by))
pcb.append(line(bx + bw, by, bx + bw, by + total_h))
pcb.append(line(bx + bw, by + total_h, bx, by + total_h))
pcb.append(line(bx, by + total_h, bx, by))
# Labels
pcb.append(txt(name, cx, by - 1.0, 0.6, bold=True))
# Castellated pads — pins 1..N on bottom edge, pins N+1..2N on top edge
# Bottom edge (y = by + total_h): pins 1 through pins_per_side
# Top edge (y = by + jst_tab): pins 2N down to pins_per_side+1 (SOP convention)
pcb.append(fp_start(f"{name}_pads", cx, cy + jst_tab/2, "B.Cu"))
for i in range(pins_per_side):
pin = i + 1
x = -row_len/2 + i * SOP_PITCH
# Bottom row castellations (pins 1..N)
pcb.append(cast(str(pin), x, bh/2, 0, f""))
# Top row castellations (pins 2N..N+1, reversed per SOP convention)
top_pin = total_pins - i
pcb.append(cast(str(top_pin), x, -bh/2, 0, f""))
pcb.append(" )")
# Pin number labels on top silk
for i in range(pins_per_side):
x = cx - row_len/2 + i * SOP_PITCH
# Bottom row labels
pcb.append(txt(str(i+1), x, cy + jst_tab/2 + bh/2 + 0.8, 0.35))
# Top row labels
pcb.append(txt(str(total_pins - i), x, cy + jst_tab/2 - bh/2 - 0.8, 0.35))
# Pin 1 dot
pcb.append(circle_mark(cx - row_len/2 - 0.6, cy + jst_tab/2 + bh/2 + 0.5, 0.25))
# JST SH connector at the top tab
jst_y = by + jst_tab / 2
pcb.append(fp_start(f"{name}_JST", cx, jst_y))
for j in range(n_jst_pins):
x = -((n_jst_pins - 1) * JST_PITCH / 2) + j * JST_PITCH
pcb.append(smd(f"J{j+1}", x, 0, 0.6, 1.0, 0, ""))
pcb.append(" )")
pcb.append(txt("JST", cx, jst_y - 1.5, 0.35))
pcb.append(circle_mark(cx - (n_jst_pins-1)*JST_PITCH/2 - 0.8, jst_y, 0.2))
# --- SOP-8 adapter ---
make_adapter("SOP-8",
ox + 6,
vscore_y + 1 + ADAPTER_AREA_H/2,
SOP8_PINS_PER_SIDE,
3.9, # 150mil narrow row span
8) # 8 JST pins (all SOP pins)
# --- SOP-16 narrow adapter ---
make_adapter("SOP-16N",
ox + 20,
vscore_y + 1 + ADAPTER_AREA_H/2,
SOP16_PINS_PER_SIDE,
6.0, # narrow SOP-16 lead span
10) # 10 JST pins (all 16 SOP + VBAT + GND → 10 JST via mapping)
# --- SOP-16 wide adapter ---
make_adapter("SOP-16W",
ox + 37,
vscore_y + 1 + ADAPTER_AREA_H/2,
SOP16_PINS_PER_SIDE,
10.3, # wide SOP-16 (300mil body) lead span
10)
# Adapter strip instructions on back silk
pcb.append(txt("Snap off adapter matching your toy's MCU. Castellations solder into SOP footprint.",
ox + PANEL_W/2, vscore_y + ADAPTER_AREA_H + 1, 0.4, "B.SilkS"))
pcb.append(txt("JST cable connects adapter to carrier board J1.",
ox + PANEL_W/2, vscore_y + ADAPTER_AREA_H + 2, 0.4, "B.SilkS"))
pcb.append(")")
return "\n".join(pcb)
# ============================================================
# Project file
# ============================================================
def generate_project():
return json.dumps({
"meta": {"filename": "baby-mobile-panel.kicad_pro", "version": 1},
"board": {"design_settings": {"rules": {"min_track_width": 0.15, "min_via_diameter": 0.4}}},
"net_settings": {"classes": [
{"name": "Default", "clearance": 0.15, "track_width": 0.25},
{"name": "Power", "clearance": 0.2, "track_width": 0.5},
]},
}, indent=2)
# ============================================================
# Main
# ============================================================
if __name__ == "__main__":
outdir = os.path.dirname(os.path.abspath(__file__))
pcb_text = generate_panel()
pcb_path = os.path.join(outdir, "baby-mobile-panel.kicad_pcb")
with open(pcb_path, "w") as f:
f.write(pcb_text)
print(f"Written: baby-mobile-panel.kicad_pcb ({len(pcb_text)} bytes)")
proj_text = generate_project()
with open(os.path.join(outdir, "baby-mobile-panel.kicad_pro"), "w") as f:
f.write(proj_text)
print(f"\nPanel contents:")
print(f" Carrier board: 42mm × 24mm")
print(f" - XIAO socket (2×7 TH, 2.54mm, 17.78mm apart)")
print(f" - IS25LP128F SOIC-8 with pin 1 dot")
print(f" - TPS61220 SC-70-5 with pin 1 dot")
print(f" - L1 4.7µH, C1/C2 10µF, C3 100nF, R1 4.7K, C5 10nF, R2 10K")
print(f" - JST SH 10-pin right-angle SMD (J1)")
print(f" - 2× M2 mounting holes")
print(f" Breakaway adapters:")
print(f" - SOP-8 (4+4 pins, 3.9mm span, 8-pin JST)")
print(f" - SOP-16 narrow (8+8 pins, 6.0mm span, 10-pin JST)")
print(f" - SOP-16 wide (8+8 pins, 10.3mm span, 10-pin JST)")
print(f" All adapters: castellated edges, pin 1 dots, numbered silk")
+390
View File
@@ -0,0 +1,390 @@
/*
* Pin Discovery Tool for Toy PCB Brain Transplant
*
* Upload this to the XIAO nRF52840, then connect one breakout pin
* at a time to the PROBE_PIN. Open Serial Monitor at 115200 baud.
*
* The tool will tell you:
* - Resting voltage (VCC, GND, floating, pulled up/down)
* - Whether it responds to button presses
* - Whether it looks like an analog resistor ladder
* - Suggested function (power, button, output, NC)
*
* Workflow:
* 1. Desolder original MCU, solder SOP-16 breakout adapter
* 2. Install batteries in toy
* 3. Connect XIAO GND to toy GND (battery negative)
* 4. For each breakout pin, connect it to PROBE_PIN with a jumper
* 5. Type the pin number in Serial Monitor and press Enter
* 6. Follow prompts (press buttons when asked, etc.)
* 7. Tool builds a pin map as you go
*/
#include <Arduino.h>
#define PROBE_PIN A0 // Connect test jumper here
#define NUM_MCU_PINS 16 // SOP-16
// Storage for discovered pin map
struct PinInfo {
char label[20];
float voltage;
bool discovered;
};
PinInfo pinMap[NUM_MCU_PINS + 1]; // 1-indexed
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
memset(pinMap, 0, sizeof(pinMap));
Serial.println("╔══════════════════════════════════════════╗");
Serial.println("║ Toy PCB Pin Discovery Tool v1.0 ║");
Serial.println("║ Connect XIAO GND to toy battery GND ║");
Serial.println("║ Connect one SOP pin at a time to A0 ║");
Serial.println("╚══════════════════════════════════════════╝");
Serial.println();
Serial.println("Commands:");
Serial.println(" 1-16 = Probe that SOP pin number");
Serial.println(" map = Show current pin map");
Serial.println(" auto = Auto-detect VCC and GND pins");
Serial.println(" btn = Button detection mode (tests all states)");
Serial.println(" ladder = Resistor ladder detection");
Serial.println();
Serial.print("> ");
}
// Read voltage on probe pin (0-3.3V range)
float readVoltage() {
analogReadResolution(12); // nRF52840 supports 12-bit ADC
delay(10); // settle
// Average multiple readings
uint32_t sum = 0;
for (int i = 0; i < 16; i++) {
sum += analogRead(PROBE_PIN);
delayMicroseconds(500);
}
float raw = sum / 16.0;
return (raw / 4095.0) * 3.3; // Convert to voltage
}
// Check if pin is actively being driven or floating
String classifyVoltage(float v) {
if (v < 0.1) return "GND (hard low)";
if (v < 0.4) return "Weak pulldown or low output";
if (v > 3.1) return "VCC (hard high)";
if (v > 2.5) return "Weak pullup (~3V)";
if (v > 1.4 && v < 1.9) return "Floating (~mid-rail)";
return "Unknown voltage";
}
// Test if the pin changes state (button detection)
void testButton(int sopPin) {
Serial.println("\n--- Button Detection ---");
Serial.println("Watch the voltage while pressing each toy button.");
Serial.println("Monitoring for 10 seconds...");
Serial.println();
float baseline = readVoltage();
Serial.print("Baseline: ");
Serial.print(baseline, 3);
Serial.println("V");
float minV = baseline, maxV = baseline;
unsigned long start = millis();
int changes = 0;
float lastV = baseline;
while (millis() - start < 10000) {
float v = readVoltage();
if (v < minV) minV = v;
if (v > maxV) maxV = v;
// Detect transitions
if (abs(v - lastV) > 0.3) {
changes++;
Serial.print(" Change detected! ");
Serial.print(lastV, 2);
Serial.print("V → ");
Serial.print(v, 2);
Serial.print("V at t=");
Serial.print((millis() - start) / 1000.0, 1);
Serial.println("s");
}
lastV = v;
delay(20);
}
Serial.println();
Serial.print("Range: ");
Serial.print(minV, 3);
Serial.print("V to ");
Serial.print(maxV, 3);
Serial.println("V");
Serial.print("Transitions detected: ");
Serial.println(changes);
if (changes > 0 && maxV - minV > 1.0) {
Serial.println("→ LIKELY A BUTTON PIN (digital, active low)");
if (sopPin > 0) {
snprintf(pinMap[sopPin].label, sizeof(pinMap[sopPin].label), "Button");
pinMap[sopPin].voltage = baseline;
pinMap[sopPin].discovered = true;
}
} else if (changes > 0 && maxV - minV > 0.2) {
Serial.println("→ POSSIBLE ANALOG INPUT or RESISTOR LADDER");
} else {
Serial.println("→ No button activity detected on this pin");
}
}
// Detect resistor ladder (multiple buttons on one analog pin)
void testResistorLadder() {
Serial.println("\n--- Resistor Ladder Detection ---");
Serial.println("Press each button ONE AT A TIME when prompted.");
Serial.println("Press Enter after pressing each button.");
Serial.println("Type 'done' when finished.");
Serial.println();
float voltages[10];
String names[10];
int count = 0;
float baseline = readVoltage();
Serial.print("Baseline (no button): ");
Serial.print(baseline, 3);
Serial.println("V");
while (count < 10) {
Serial.print("\nPress button #");
Serial.print(count + 1);
Serial.println(" and type its name (or 'done'):");
Serial.print("> ");
while (!Serial.available()) delay(10);
String input = Serial.readStringUntil('\n');
input.trim();
if (input.equalsIgnoreCase("done")) break;
float v = readVoltage();
voltages[count] = v;
names[count] = input;
Serial.print(" ");
Serial.print(input);
Serial.print(": ");
Serial.print(v, 3);
Serial.println("V");
count++;
Serial.println(" Release button now.");
delay(500);
}
if (count > 1) {
Serial.println("\n--- Ladder Summary ---");
Serial.print("Baseline: ");
Serial.print(baseline, 3);
Serial.println("V");
for (int i = 0; i < count; i++) {
Serial.print(" ");
Serial.print(names[i]);
Serial.print(": ");
Serial.print(voltages[i], 3);
Serial.print("V (ADC ~");
Serial.print((int)(voltages[i] / 3.3 * 4095));
Serial.println(")");
}
// Check if voltages are distinct enough
bool isLadder = true;
for (int i = 0; i < count - 1; i++) {
for (int j = i + 1; j < count; j++) {
if (abs(voltages[i] - voltages[j]) < 0.15) {
isLadder = false;
}
}
}
if (isLadder && count >= 2) {
Serial.println("\n→ THIS IS A RESISTOR LADDER");
Serial.println(" Use analogRead() with thresholds to detect buttons.");
Serial.println(" Suggested thresholds (midpoints between readings):");
// Sort by voltage
for (int i = 0; i < count - 1; i++) {
for (int j = i + 1; j < count; j++) {
if (voltages[j] < voltages[i]) {
float tv = voltages[i]; voltages[i] = voltages[j]; voltages[j] = tv;
String ts = names[i]; names[i] = names[j]; names[j] = ts;
}
}
}
for (int i = 0; i < count; i++) {
float lo = (i == 0) ? 0 : (voltages[i-1] + voltages[i]) / 2;
float hi = (i == count-1) ? 3.3 : (voltages[i] + voltages[i+1]) / 2;
Serial.print(" ");
Serial.print(names[i]);
Serial.print(": ");
Serial.print(lo, 2);
Serial.print("V - ");
Serial.print(hi, 2);
Serial.println("V");
}
} else {
Serial.println("\n→ Doesn't look like a resistor ladder");
Serial.println(" (Voltages too close together or too few buttons)");
}
}
}
// Full probe of one pin
void probePin(int sopPin) {
Serial.print("\n═══ Probing SOP-16 Pin ");
Serial.print(sopPin);
Serial.println(" ═══");
// First read as analog input (high impedance)
pinMode(PROBE_PIN, INPUT);
delay(50);
float v_floating = readVoltage();
Serial.print("Floating voltage: ");
Serial.print(v_floating, 3);
Serial.print("V → ");
Serial.println(classifyVoltage(v_floating));
// Classify
if (v_floating < 0.1) {
Serial.println("→ This is a GND pin");
snprintf(pinMap[sopPin].label, sizeof(pinMap[sopPin].label), "GND");
pinMap[sopPin].voltage = v_floating;
pinMap[sopPin].discovered = true;
}
else if (v_floating > 2.8) {
// Could be VCC or a pulled-up button pin
// Try briefly enabling internal pulldown to see if it drops
pinMode(PROBE_PIN, INPUT_PULLDOWN);
delay(50);
float v_pulldown = readVoltage();
pinMode(PROBE_PIN, INPUT);
if (v_pulldown > 2.5) {
Serial.print("With pulldown: ");
Serial.print(v_pulldown, 3);
Serial.println("V — Still high → VCC (power) pin");
snprintf(pinMap[sopPin].label, sizeof(pinMap[sopPin].label), "VCC");
pinMap[sopPin].voltage = v_floating;
pinMap[sopPin].discovered = true;
} else {
Serial.print("With pulldown: ");
Serial.print(v_pulldown, 3);
Serial.println("V — Dropped → Weak pullup (likely button input)");
Serial.println("→ Try pressing buttons to confirm. Running button test...");
testButton(sopPin);
}
}
else if (v_floating > 0.4 && v_floating < 2.5) {
Serial.println("Mid-range voltage. Could be:");
Serial.println(" - Floating (not connected)");
Serial.println(" - Part of a resistor ladder");
Serial.println(" - An analog output");
Serial.println("→ Try pressing buttons to see if it changes...");
testButton(sopPin);
}
else {
Serial.println("Low but not GND. Could be pulled-down output.");
testButton(sopPin);
}
Serial.println();
}
// Print the current pin map
void showMap() {
Serial.println("\n╔════════════════════════════════════╗");
Serial.println("║ Current Pin Map ║");
Serial.println("╠════════════════════════════════════╣");
for (int i = 1; i <= NUM_MCU_PINS; i++) {
Serial.print("║ Pin ");
if (i < 10) Serial.print(" ");
Serial.print(i);
Serial.print(": ");
if (pinMap[i].discovered) {
Serial.print(pinMap[i].label);
// Pad to align
for (int j = strlen(pinMap[i].label); j < 12; j++) Serial.print(" ");
Serial.print("(");
Serial.print(pinMap[i].voltage, 2);
Serial.print("V)");
} else {
Serial.print("-- not probed -- ");
}
Serial.println("");
}
Serial.println("╚════════════════════════════════════╝");
// Count discovered
int found = 0;
for (int i = 1; i <= NUM_MCU_PINS; i++) {
if (pinMap[i].discovered) found++;
}
Serial.print("Discovered: ");
Serial.print(found);
Serial.print("/");
Serial.println(NUM_MCU_PINS);
}
void loop() {
if (Serial.available()) {
String input = Serial.readStringUntil('\n');
input.trim();
if (input.equalsIgnoreCase("map")) {
showMap();
}
else if (input.equalsIgnoreCase("btn")) {
Serial.println("Connect the pin you want to test to A0, then:");
testButton(0);
}
else if (input.equalsIgnoreCase("ladder")) {
testResistorLadder();
}
else if (input.equalsIgnoreCase("auto")) {
Serial.println("\n--- Auto-detect mode ---");
Serial.println("Connect each pin to A0 one at a time.");
Serial.println("Press Enter after connecting each pin.");
for (int pin = 1; pin <= NUM_MCU_PINS; pin++) {
Serial.print("\nConnect SOP pin ");
Serial.print(pin);
Serial.println(" to A0, then press Enter");
Serial.print("> ");
while (!Serial.available()) delay(10);
Serial.readStringUntil('\n');
probePin(pin);
}
showMap();
}
else {
int pin = input.toInt();
if (pin >= 1 && pin <= NUM_MCU_PINS) {
probePin(pin);
} else {
Serial.println("Unknown command. Use 1-16, map, auto, btn, or ladder");
}
}
Serial.print("\n> ");
}
}