265 lines
9.8 KiB
Markdown
265 lines
9.8 KiB
Markdown
# 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.
|