Skip to content

Week 15 — System Integration

Assignment

Design and document the system integration for your final project.

Here is my plan for the week.


What I Did This Week

This week was all about bringing Vision Voice together as one actual system instead of a bunch of separate components. The main thing I did was design and mill the final Vision Voice PCB — the full board with every component considered. I also connected everything up and did a test run of the whole system. The ADS1115 modules haven't arrived yet so I did a short-wire workaround for now, but everything else — OLED, MPU6050, DFPlayer, speaker, button, LiPo — is running through the real PCB. It worked first try which honestly felt really good after all the component testing from the previous weeks. ^-^


The Vision Voice System Plan

Before I opened KiCad I wanted to be clear on how Vision Voice actually comes together as a complete system. The idea is that it is fully self-contained — no phone, no laptop, nothing external. Just the glove and the wrist casing.

The glove has 5 flex sensors, one on each finger. The wires from those sensors run down the back of the hand into a casing on the wrist. Inside the casing is the PCB which holds everything — the XIAO ESP32-C3 which is the brain, two ADS1115 ADC modules that read all 5 flex sensors over I2C, an MPU6050 IMU that reads the hand orientation, a DFPlayer Mini that plays audio from an SD card, an OLED display that shows the detected gesture as text, a button for calibration and playback, and a LiPo battery to power it all. The XIAO runs a kNN gesture recognition algorithm that takes the flex sensor readings and the orientation data together and figures out which ASL gesture is being made, then shows it on the OLED and plays the audio through the speaker.

Here is the full system block diagram showing how all the subsystems connect:

kNN feature vector and hybrid training pipeline system diagram

This diagram was generated by Claude AI. Click here to view the prompt.

Components

Component What it does
XIAO ESP32-C3 Main microcontroller, runs the kNN model
ADS1115 x2 (0x48, 0x49) Reads all 5 flex sensors over I2C
MPU6050 Reads hand orientation (accel + gyro)
OLED SSD1306 0.96" Shows detected gesture as text
DFPlayer Mini Plays audio files from SD card
Flex sensors x5 One per finger, detects bend angle
LiPo 3.7V Powers everything
Push button Short press for audio, long press to calibrate
Speaker Audio output

How Everything Talks to Each Other

Bus What's on it
I2C on D4/D5 OLED 0x3C, MPU6050 0x68, ADS1115 #1 0x48, ADS1115 #2 0x49
UART on D6/D7 DFPlayer Mini
GPIO D1 Button

Planning the PCB with Claude AI

Before I touched KiCad I used Claude to plan out all the connections and figure out some things I wasn't sure about. I'm only covering the wiring and connection decisions here since that's what actually affected the PCB design.

Connector types for each component

I needed to figure out how each component physically attaches to the board. The OLED sits on the face of the wrist casing and the MPU6050 goes on the back of the hand — both need long flexible wires to reach, so I went with direct solder pads on the PCB for those instead of connectors. The ADS1115 modules, XIAO, and DFPlayer all go on SMD female pin headers so they can be removed if needed. Everything else — flex sensors, battery, speaker, button — uses screw terminals so the wires are easy to swap without soldering.

Finding the right resistor value

I wasn't sure what resistor values to use for the flex sensor voltage dividers so I ran a test first before committing to anything on the PCB. I used 10kΩ + 4.9kΩ SMD resistors and uploaded this quick sketch that Claude helped me write to check the range:

#define FLEX_PIN A0

int minVal = 4095;
int maxVal = 0;

void setup() {
  Serial.begin(115200);
  pinMode(FLEX_PIN, INPUT);
}

void loop() {
  int val = analogRead(FLEX_PIN);
  if (val < minVal) minVal = val;
  if (val > maxVal) maxVal = val;
  int range = maxVal - minVal;
  Serial.print("Current: "); Serial.print(val);
  Serial.print("  |  Min: "); Serial.print(minVal);
  Serial.print("  Max: "); Serial.print(maxVal);
  Serial.print("  |  Range: "); Serial.println(range);
  delay(100);
}

The range came out to around 1835 between fully open and fully closed which is really clean. So 10kΩ + 4.9kΩ is what went on the PCB.

Battery wiring

Since the XIAO sits on female pin headers the BAT pad underneath isn't reachable after it's mounted. The fix was to solder a wire directly to the BAT pad before mounting the XIAO, then run that wire to the LiPo screw terminal. The DFPlayer VCC also goes to that same terminal because it needs battery power directly and not the XIAO's 5V pin.

Button logic

I kept it to 1 button. Short press plays the audio, long press calibrates. No reason to add a second button when the logic already handles both.

Decoupling capacitors

I added 100nF ceramic capacitors on the VDD pins of both ADS1115 modules. The ADS1115 datasheet says these are needed because the chip draws transient current during conversion and without the cap it can make the analog readings unstable.


Step 1 — Schematic in KiCad

I started a new KiCad project called vision-voice-PCB-v2.

KiCad project file created with vision-voice-PCB-v2 schematic file highlighted

I opened the Schematic Editor and started adding all the component symbols from the library.

blank schematic editor open with symbol add dialog

I dropped everything on the canvas first before wiring anything — XIAO, DFPlayer, both ADS1115 connectors, OLED and MPU6050 solder pad connectors, all the screw terminals, resistors, capacitors, and the power LED.

all components placed in schematic not yet wired

Then I started wiring. I used net labels for all the shared nets — SDA, SCL, 3.3V, GND, BAT_POS — so the schematic stays clean and readable instead of wires crossing everywhere.

schematic mid-wiring with net labels being placed

Here is the finished schematic with everything connected.

completed schematic with all components wired and net labels

I ran the Electrical Rules Checker to catch any issues.

running the electrical rules checker from the Inspect menu

I had a couple of errors — missing PWR_FLAG symbols on the power nets and a dangling label. Fixed both and ran it again. Final result was 0 errors and 1 warning.

ERC result showing 0 errors and 1 warning

The warning is just a symbol mismatch on the DFPlayer because the symbol I downloaded is slightly different from the library version. It doesn't affect anything electrically so I left it.

After the schematic I went to Tools → Assign Footprints and matched everything to the fab-footprints library.

assign footprints menu option highlighted

footprint assignment window with all components assigned

Then I pushed it to the PCB editor using Tools → Update PCB from Schematic.

update PCB from schematic menu option


Step 2 — PCB Layout and Routing

All the footprints came into the PCB editor with 61 unrouted connections as ratsnest lines.

PCB editor with all footprints and ratsnest lines, 61 unrouted

I placed everything thinking about how Vision Voice will actually be used. The flex sensor screw terminals go along the top edge since the glove wires come in from there. DFPlayer goes on the left with the SD card slot facing the board edge so I can swap the card without opening the casing. XIAO is oriented so the USB-C port faces the right edge for charging and programming without opening anything. Battery and speaker screw terminals go at the bottom.

Before routing I set my trace widths. I went to the track width dropdown and clicked Edit Pre-defined Sizes.

editing pre-defined trace sizes dialog

I added 0.4mm, 0.6mm, and 0.8mm. Signal traces use 0.6mm and power traces use 0.8mm.

board setup showing the three trace widths added

Then I routed everything by hand. Single sided board so everything had to connect without any vias. I kept the 100nF caps right next to the ADS1115 VDD pins so the decoupling traces stay short.

completed PCB with all traces routed on F.Cu layer


Step 3 — Exporting for Milling

Same export process as the previous electronics weeks. File → Plot, SVG format, exported the F.Cu layer and Edge.Cuts layer separately.

plot dialog with SVG selected, F.Cu and Edge.Cuts highlighted

Opened the F.Cu SVG in Inkscape.

Inkscape file import dialog with F.Cu SVG selected

Set the export DPI to 1000 so Mods CE has enough resolution to read the traces properly.

Inkscape with PCB traces showing and DPI set to 1000 in the export panel

Loaded both PNGs into Mods CE using the Roland SRM-20 mill PCB program.

Mods CE full workflow with all nodes visible and PCB being processed

The colorized toolpath preview shows all the paths the mill will follow.

colorized toolpath preview in Mods CE

The 3D view confirmed everything looked clean and properly isolated.

3D simulation in Mods CE showing the milled copper board

Generated a separate RML file for the edge cuts. The board outline has chamfered corners.

3D view of edge cut showing board outline with chamfered corners


Step 4 — Milling

Sent the RML files to the Roland SRM-20 and started the mill.

Right after milling, before cleaning.

board fresh off the mill with copper dust still on the surface

After cleaning. The traces came out really clean and I was honestly so happy with how it looked!

final cleaned milled PCB showing clear isolated traces


Step 5 — Soldering

Before starting I wrote out every component in my notebook and laid all the parts out next to it so I wouldn't miss anything.

handwritten component list in notebook with SMD components and connectors laid out beside it

I started with the SMD components — resistors, capacitors, LED — since those need to go down before the pin headers and screw terminals can go on top.

PCB with all SMD resistors, capacitors and LED soldered, pin headers not yet added

Here is a timelapse of the full soldering session.

After all the pin headers and screw terminals were on and the XIAO and DFPlayer were plugged in, the red power LED came on as soon as I connected power. yay!! ^-^

completed PCB with XIAO, DFPlayer, pin headers, screw terminals all soldered and power LED glowing red


Step 6 — Packaging

This is basically where everything gets a proper place instead of just floating around on a bench with jumper wires everywhere.

On the PCB itself every component is fixed and intentional — XIAO and DFPlayer sit in SMD female pin headers so they are secure but still removable, flex sensors connect through labeled screw terminals along the top edge, speaker and battery through screw terminals at the bottom, and the OLED and MPU6050 have dedicated solder pads. Nothing is loose.

For the full wearable, the plan is: OLED on the face of the wrist casing so the text is easy to read, MPU6050 on the back of the hand, flex sensors along the back of each finger with the wires bundled back down into the casing, speaker inside the casing, button coming through to the outside so it's accessible, and LiPo inside the casing. The USB-C port on the XIAO faces the right edge of the board so you can charge and reprogram without taking anything apart.

Here is everything wired up to the PCB all together for the first time.

all components wired to the PCB laid out showing MPU6050, OLED, flex sensor, speaker, and LiPo battery all connected


Step 7 — Testing

The ADS1115 modules haven't arrived yet so I short-wired one flex sensor signal pin directly to A0 on the XIAO — same as how I tested during the component testing phase. Everything else is properly connected through the PCB.

I uploaded the same combined sketch from the component testing phase and powered up with the LiPo.

full system running with OLED showing OPEN and live flex and accel values, PCB on bench

It worked first try! The OLED showed "OPEN" with the live flex and accel values updating, bending the sensor triggered the DFPlayer to play audio through the speaker, and the button worked for both short press and long press. Everything that worked on the breadboard now w orks through the real PCB. Really happy about this one!! ^-^

Here is the demo video.

The sketch used here is the same full combined sketch from the project development page.


What I Learned

This week made me realise how much component placement actually matters. I spent a lot of time just thinking about where things go on the PCB before routing a single trace — which screw terminals face which edge, where the SD card slot needs to be accessible, how the USB-C port needs to stay reachable. That kind of thinking is what system integration actually is I think. It is not just making things work electrically, it is making sure they work together physically too. The full Vision Voice PCB is done now and it is working. Once the ADS1115 modules arrive I can wire up all 5 flex sensors, start training the kNN model with real glove data, and then move into building the actual glove and casing to make it a proper wearable. ^-^