Files
baby-mobile/BRAIN_TRANSPLANT.md
T
2026-07-04 03:28:12 -07:00

9.8 KiB
Raw Blame History

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:

// 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.