Assembly Manual

Oh My Ondas Hardware Prototype — March 2026 — Barcelona

Teensy 4.1 complete pin assignment

TEENSY 4.1 — COMPLETE PIN ASSIGNMENT — Pins 7, 8, 20, 21, 23 RESERVED by Audio Shield I2S

Before You Start

Confirm these counts. If anything is short, note it before beginning.

  • Slide pots 45mm (P4272): ordered 5 — confirm you have 5
  • Wire Kit 22AWG (P3174): check Adafruit box
  • Helping Third Hand (P291): check Adafruit box

Key Decisions

  1. Use Teensy built-in SD (SanDisk Ultra 32GB). Audio Shield SD slot unused.
  2. LCD is 2.8″ ILI9341 (P1770) — DMA-optimized ILI9341_t3 library.
  3. Dual I2C: Wire (18/19) audio-path, Wire1 (16/17) UI-polling.
  4. 4 main buttons direct to Teensy pins for latency + interrupts.
  5. ESP32-S2 powered from 5V, not Teensy 3.3V.

Tools

Soldering station 48W, solder 1mm, flux, 2× breadboard, jumper wires, helping hand, micro-USB cable, 3.5mm headphones.

1

Core Audio

GOAL: Hear a WAV file through headphones

Teensy 4.1Audio Shield Rev D2SD Card (32GB)Headphones
1.1 — Solder Audio Shield Headers

The Audio Shield Rev D2 stacks directly on top of the Teensy 4.1 via two rows of female headers. You need 2 × 14-pin female headers (cut from a 40-pin strip).

  1. Cut headers: Count 14 pins on the strip and cut with flush cutters. You need two 14-pin pieces. Cut on the 15th socket to avoid cracking pin 14.
  2. Insert headers into Teensy: Push the two 14-pin female headers onto the Teensy's outer male pin rows (the two long rows of pins along each edge). The headers sit on top of the Teensy, sockets facing up.
  3. Stack the Audio Shield on top: Place the Audio Shield board onto the headers so the shield's through-holes line up with all 28 header pins. The Audio Shield's 3.5mm jack should face the same end as the Teensy's USB port. The Teensy is your alignment jig — stacking before soldering guarantees all pins are straight and spaced correctly.
  4. Solder from the TOP of the Audio Shield: Flip the stack so the Audio Shield PCB is on the bottom. The header pins now poke through the Audio Shield's top surface. Solder each pin where it comes through the Audio Shield PCB. Do NOT solder anything to the Teensy itself.
  5. Technique: Heat the pad and pin together for 2 seconds, feed solder until it flows around the pin and wets the pad. Move to the next pin. Do corners first to lock alignment, then fill in the rest.
  6. Separate: After all 28 joints cool, gently pull the Audio Shield off the Teensy. Inspect every joint — look for bridges between adjacent pins and cold joints (dull/blobby). Reflow any bad joints.
The Audio Shield connects to the Teensy through these pins: I2S audio (7, 20, 21, 23), I2C control (18, 19 — SGTL5000 codec at 0x0A), and power (3.3V, GND, VIN). All of these are on the outer pin rows you just soldered. No extra wiring needed — the header connection carries everything.
If you've never soldered headers before: practice on a spare piece of perfboard first. The key mistakes are (1) not heating long enough so solder blobs instead of flowing, and (2) moving the board while the joint cools, creating a cold joint. PJRC has photos of the correct stack at pjrc.com/store/teensy3_audio.html.
1.2 — Prepare SD Card
  1. Format as FAT32 (not exFAT).
  2. Copy PJRC test WAV files to root.
  3. Insert into Teensy built-in slot (not Audio Shield slot).
1.3 — Stack and Connect
  1. Teensy into breadboard (spans center gap).
  2. Audio Shield on top via headers.
  3. Headphones into Audio Shield 3.5mm jack.
  4. USB to computer.
1.4 — Flash and Test
#define SDCARD_CS_PIN    BUILTIN_SDCARD
// DO NOT use pins 10/7/14 for SD
// Those are Audio Shield SD (unused)

Open WavFilePlayer example. Set CS pin as above. Upload. Serial Monitor 9600 baud.

If no sound: check Serial Monitor for “Unable to access SD card”. Verify FAT32 format, correct slot, headphone jack fully inserted.
✓ VALIDATION: Hear WAV audio through headphones
2

Touch Sensing

GOAL: Touch copper pads to trigger audio samples

CAP1188 BreakoutCopper Tape 5mm10KΩ Resistors ×2Jumper Wires
2.1 — Wire CAP1188 to I2C1
CAP1188 PinTeensy PinNotes
SDA17 (SDA1)Wire1 bus
SCL16 (SCL1)Wire1 bus
VIN3.3V
GNDGND
Wire1 has NO built-in pull-ups. Add 10KΩ from pin 17 to 3.3V and from pin 16 to 3.3V. (2.2K better — next Diotronic visit.)
2.2 — Make Touch Pads

Cut 8 pieces of copper tape (~20×20mm). Stick on cardboard in 2×4 grid, 5mm spacing. Solder wire to each. Connect to C1–C8.

2.3 — Test
Wire1.begin();
Adafruit_CAP1188 cap = Adafruit_CAP1188();
cap.begin(0x29, &Wire1);  // I2C1 at 0x29

Serial Monitor: touch each pad → see event. Then integrate: pad N triggers sample N via AudioPlaySdWav.

✓ VALIDATION: Touch each pad → hear different sample
3

Displays + LEDs

GOAL: OLED shows status, LCD shows UI, NeoPixels animate — audio still clean

SSD1306 OLED 0.96″ILI9341 2.8″ TFTWS2812B NeoPixel ×8470Ω Resistor
3.1 — Wire OLED
OLED PinTeensy PinBus
SDA18 (SDA0)Wire — shared with Audio Shield
SCL19 (SCL0)Wire
VCC3.3V
GNDGND

I2C scan on Wire should show: 0x0A (SGTL5000) + 0x3C (SSD1306).

3.2 — Wire ILI9341 LCD
LCD PinTeensy PinNotes
CLK13 (SCK)SPI clock
MOSI11SPI data out
MISO12SPI data in
CS10Chip select
DC9Data/Command
RST15Reset (NOT pin 8!)
LITE3.3VBacklight always on
3.3 — Wire NeoPixels

Data → pin 6 via 470Ω series resistor. VCC → 5V. GND → GND.

If audio glitches when NeoPixels update: switch to WS2812Serial library with a Serial TX pin.
✓ VALIDATION: OLED text + LCD graphics + NeoPixels animate — audio still clean
4

Analog Inputs

GOAL: Slide pots control parameters, smooth 0–26000 readings

ADS1115 16-bit ADCSlide Pots ×5100nF Caps ×5
4.1 — Wire ADS1115
ADS1115 PinTeensy PinNotes
SDA18 (SDA0)Shared I2C0 bus
SCL19 (SCL0)
VDD3.3V
GNDGND
ADDRGNDSets address to 0x48
4.2 — Wire Slide Pots

Each pot: Left → GND, Right → 3.3V, Wiper → ADS1115 A0–A3. Pot 5 wiper → Teensy pin 14 (A0).

Pots to 3.3V only! The ADS1115 and Teensy ADC are 3.3V max. 5V will damage them.

Add 100nF ceramic cap from each wiper to GND, close to the ADC input.

4.3 — Test
Adafruit_ADS1115 ads;
ads.begin(0x48, &Wire);
// ads.readADC_SingleEnded(0) ... sweep 0 to ~26000

If jumpy: check 100nF caps, keep wiper wires away from SPI lines.

✓ VALIDATION: All 5 faders sweep smoothly — no jitter
5

I/O Expansion

GOAL: Encoders rotate, buttons click, nav switch responds in all 5 directions

MCP23017 ×2DIP Sockets ×2EC11 Encoders ×7 Buttons ×45-Way Nav Switch100nF Caps ×2
5.1 — Wire 4 Direct Buttons
ButtonTeensy PinWiring
MODE2Button between pin and GND, INPUT_PULLUP
SHIFT3Same
REC4Same
PLAY5Same — Pressed=LOW, Released=HIGH
5.2 — Install MCP23017s into DIP Sockets

Watch the notch — pin 1 at the notch end. Both on I2C1 (16/17). #1 at 0x20 (A0/A1/A2 = GND). #2 at 0x21 (A0 = 3.3V). RESET pins → 3.3V. 100nF cap on each VDD–VSS.

5.3 — Wire Encoders

Each EC11: C (common) → GND, A + B → MCP GPIO, SW → MCP GPIO. Enable MCP internal pull-ups in firmware. 5 encoders on MCP#1, 2 on MCP#2.

5.4 — Wire 5-Way Nav

Common → GND. Up/Down/Left/Right/Select → MCP#2 GPIOs. Internal pull-ups.

✓ VALIDATION: 7 encoders rotate + click, 4 buttons respond, nav switch 5 directions
6

GPS

GOAL: Barcelona coordinates on the OLED

PA1010D GPS (STEMMA QT)
6.1 — Wire GPS
PA1010D PinTeensy PinNotes
SDA18 (SDA0)Shared I2C0
SCL19 (SCL0)
VIN3.3V
GNDGND
6.2 — Test GPS
Adafruit_GPS GPS(&Wire);
GPS.begin(0x10);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
Test outdoors or near a window. PA1010D built-in antenna needs sky view.
✓ VALIDATION: OLED shows Barcelona lat/lon and satellite count
7

WiFi Link

GOAL: ESP32 and Teensy communicate over UART

SparkFun ESP32-S2 Thing Plus
7.1 — Program ESP32 Separately First

Flash WiFi test via its own USB port before wiring to Teensy. Verify it connects to your network.

7.2 — Wire ESP32 to Teensy
ESP32 PinTeensy PinNotes
TX0 (RX1)ESP32 sends → Teensy receives
RX1 (TX1)Teensy sends → ESP32 receives
5V / VBUSVINShared 5V from USB
GNDGND
Do NOT connect ESP32 3.3V to Teensy 3.3V. Each board uses its own regulator.
7.3 — Test UART
// Teensy:
Serial1.begin(115200);
if (Serial1.available()) {
  String msg = Serial1.readStringUntil('\n');
  Serial.print("From ESP32: ");
  Serial.println(msg);
}
✓ VALIDATION: Teensy receives ESP32 messages — audio still clean
8

Full Integration

GOAL: Everything runs simultaneously — CPU <70%, no I2C errors, audio clean

Everything
Run health monitor in loop() — print CPU% and memory every 5 seconds. If CPU exceeds 70%, check which audio objects are running.
✓ VALIDATION: All 12 checks pass — prototype complete
I2C Bus Architecture

I2C BUS ARCHITECTURE — Wire (audio-path) and Wire1 (UI-polling, external pull-ups required)

Power Distribution

POWER DISTRIBUTION — USB 5V → Teensy LDO 3.3V (~60mA external) + ESP32-S2 (own regulator)

Bus Map — Final State

Wire — I2C0

Pins 18 (SDA), 19 (SCL)
SGTL5000 Audio Codec0x0A
PA1010D GPS0x10
SSD1306 OLED0x3C
ADS1115 ADC0x48

Wire1 — I2C1

Pins 16 (SCL1), 17 (SDA1) — 10K pull-ups required
MCP23017 #10x20
MCP23017 #20x21
CAP1188 Touch0x29

SPI

Pins 10 (CS), 11 (MOSI), 12 (MISO), 13 (SCK)
ILI9341 2.8″ LCDDC=9, RST=15

Audio Shield SD NOT used — Teensy SDIO instead

UART — Serial1

Pins 0 (RX1), 1 (TX1)
ESP32-S2 Thing Plus115200 baud

Next Diotronic Visit

  • 2.2KΩ resistors ×4 — replace 10K I2C1 pull-ups with proper values
  • 1KΩ resistors ×5 — RC filter series resistors for slide pots
  • 470Ω resistor ×1 — NeoPixel data line (check your assortment first)
  • EC11 rotary encoders ×6 — complete the 13-encoder interface

Parts Set Aside

  • KB2040 (P5302) — RP2040 keyboard MCU
  • RFM95W LoRa (P3072) — 900MHz radio, future device-to-device
  • USB-C Plug + Vertical Port (P5978, P5993) — enclosure phase
  • Backup Teensy 4.1 + Audio Shield — in the drawer

Before Day 1 — 15 min, do tonight

  • Format SD card as FAT32 on your computer
  • Download PJRC test WAV files from pjrc.com → copy to SD root
  • Install Arduino IDE + Teensyduino (or PlatformIO)
  • Install libraries: Adafruit_CAP1188, Adafruit_SSD1306, Adafruit_GPS, Adafruit_ADS1X15, Adafruit_MCP23017, ILI9341_t3, Adafruit_NeoPixel, Bounce2
  • Confirm you have a data-capable micro-USB cable
1

Solder + Stack + First Sound

60 MIN — MILESTONE: Hear audio through headphones

Day 1 wiring diagram

DAY 1 — AUDIO SHIELD STACK + SD CARD + HEADPHONES

MinTask
0–5Set up soldering station. Tin tip. Open flux.
5–10Cut 2× female 14-pin headers from 40-pin strips.
10–15Insert female headers through Audio Shield bottom holes.
15–20Place Audio Shield onto Teensy (use Teensy as alignment jig).
20–40Solder all 28 pins. One at a time, check alignment every 5 pins.
40–42Cool. Separate. Inspect joints for bridges or cold solder.
42–45Insert Teensy into breadboard. Insert SD card into built-in slot.
45–47Stack Audio Shield on Teensy. Plug headphones. Connect USB.
47–52Open WavFilePlayer example. Set SDCARD_CS_PIN to BUILTIN_SDCARD. Upload.
52–57Listen. WAV files should play through headphones.
57–60If no sound: check Serial Monitor, SD format, headphone jack.
✓ MILESTONE: Hear audio through headphones
2

OLED + CAP1188 + 8 Touch Pads

60 MIN — MILESTONE: 8 pads on I2C1, OLED on I2C0, audio still clean

Day 2 wiring diagram

DAY 2 — OLED ON WIRE + CAP1188 ON WIRE1 WITH 10K PULL-UPS

MinTask
0–3Solder 4-pin header onto OLED module.
3–8Wire OLED: SDA→pin 18, SCL→pin 19, VCC→3.3V, GND→GND.
8–12Flash I2C scanner. Should see 0x0A (SGTL5000) + 0x3C (OLED).
12–15Flash SSD1306 example. Display shows Adafruit splash.
15–18Solder headers onto CAP1188 breakout (if not pre-soldered).
18–23Wire CAP1188: SDA→pin 17, SCL→pin 16, VIN→3.3V, GND→GND.
23–26Add 10K pull-up resistors: pin 17→3.3V, pin 16→3.3V.
26–28Flash I2C scanner on Wire1. Should see 0x29.
28–45Cut 8 copper tape pads (20×20mm). Stick to cardboard. Solder wire to each. Connect to C1–C8.
45–55Flash CAP1188 test (use Wire1). Touch each pad → Serial shows events.
55–60Test: audio plays while touching pads. Both I2C buses independent.
✓ MILESTONE: 8 pads detected on I2C1, OLED shows text, audio plays
3

Touch Triggers Audio Samples

60 MIN — MILESTONE: Touch pad → hear sample → see on OLED

Day 3 data flow diagram

DAY 3 — CAP1188 EVENTS DRIVE AUDIO LIBRARY SAMPLE PLAYBACK

MinTask
0–10Create 8 short WAV samples (or rename PJRC test files to pad1.wavpad8.wav). Copy to SD /samples/.
10–30Write combined sketch: read CAP1188 on Wire1, when pad N touched → play /samples/padN.wav via Audio Library.
30–40Flash and test. Touch pad 1 → hear sample 1, pad 2 → sample 2, etc.
40–50Add OLED feedback: show which pad was touched and filename.
50–55Test simultaneous touches, retrigger behavior.
55–60Polish: add debounce, show active pad as highlight on OLED.
✓ MILESTONE: Touch pad → hear sample → see on OLED
4

NeoPixels + ADS1115 + First Fader

60 MIN — MILESTONE: Fader controls volume, LEDs sync with touch, audio clean

Day 4 wiring diagram

DAY 4 — WS2812B ON PIN 6 + ADS1115 ON I2C0 + FIRST SLIDE POT

MinTask
0–5Wire NeoPixel strip: DIN→pin 6 (via 470Ω resistor), VCC→5V, GND→GND.
5–10Flash NeoPixel strandtest. 8 LEDs cycle colors.
10–13Test with audio. If glitches → switch to WS2812Serial library later.
13–18Solder headers onto ADS1115 breakout. Insert into breadboard.
18–23Wire ADS1115: SDA→pin 18, SCL→pin 19, VDD→3.3V, GND→GND, ADDR→GND.
23–28Wire first slide pot: left→GND, right→3.3V, wiper→ADS1115 A0. Add 100nF cap wiper→GND.
28–35Flash ADS1115 example. Move fader → values sweep 0–26000. Check for jitter.
35–45Integrate: fader controls volume. NeoPixels light on touch.
45–55Combined test: touch pad → sample plays + LED lights + fader controls volume.
55–60I2C scanner on Wire: 0x0A, 0x3C, 0x48 — three devices confirmed.
✓ MILESTONE: Fader controls volume, LEDs sync with touch, audio clean
5

All 5 Faders

60 MIN — MILESTONE: 5 faders smooth, no jitter, OLED bar graphs

Day 5 wiring diagram

DAY 5 — 4 POTS ON ADS1115 + 1 POT ON TEENSY PIN 14

MinTask
0–15Wire pots 2–4 to ADS1115 A1, A2, A3. Same pattern each: ends to 3.3V/GND, wiper to input, 100nF cap.
15–20Wire pot 5 to Teensy pin 14 (A0) — built-in ADC. Add 100nF cap.
20–30Update firmware: read all 5 pots. Print values to Serial. Move each fader independently.
30–40Assign functions: pot 1=volume, pot 2=FX mix, pot 3=mod depth, pot 4=tempo, pot 5=crossfade.
40–50Update OLED: show 5 fader positions as bar graphs.
50–60Full test: 5 faders + 8 pads + audio + OLED + NeoPixels all running.
✓ MILESTONE: 5 faders smooth, no jitter, OLED shows bar graphs
6

MCP23017 ×2 + Encoders + Buttons + Nav Switch

60 MIN — MILESTONE: 7 encoders + 5-way nav + 4 buttons all responding

Day 6 wiring diagram

DAY 6 — BIGGEST WIRING DAY: 4 DIRECT BUTTONS + 2 MCP23017 + 7 ENCODERS + NAV

This is the biggest wiring day. Repetitive but straightforward.

MinTask
0–5Wire 4 buttons directly to Teensy: MODE→pin 2, SHIFT→pin 3, REC→pin 4, PLAY→pin 5. Each button between pin and GND. Use INPUT_PULLUP in code.
5–10Press MCP23017 #1 into DIP socket. Wire: SDA(chip pin 13)→Teensy pin 17, SCL(12)→pin 16, VDD(9)→3.3V, VSS(10)→GND, RST(18)→3.3V, A0/A1/A2→GND. Add 100nF cap.
10–13Press MCP23017 #2 into DIP socket. Same wiring but A0→3.3V (address 0x21).
13–15Flash I2C scanner on Wire1: should show 0x20, 0x21, 0x29.
15–40Wire 7 encoders. Each: A→GPx, B→GPx, C→GND, SW→GPx, SW common→GND. Encoders 1–5 on MCP#1, encoders 6–7 on MCP#2. See diagram for exact pin map.
40–45Wire 5-way nav switch to MCP#2: up/down/left/right/select→GPB0–GPB4, common→GND.
45–55Flash combined test: all 7 encoders + nav switch + 4 buttons.
55–58Put Rainbow Micro Knobs on encoders. Test fit.
58–60Verify no I2C errors. Full UI responding.
If you run over: finish encoder wiring tomorrow and push remaining days by one. This is the only day that might spill.
✓ MILESTONE: 7 encoders + 5-way nav + 4 buttons all responding
7

ILI9341 2.8″ LCD

60 MIN — MILESTONE: LCD shows UI, audio clean, no SPI/I2S conflict

Day 7 SPI wiring

DAY 7 — SPI DISPLAY ON PINS 10-13 · AVOID PIN 8 (I2S RX)

MinTask
0–5Solder headers onto ILI9341 breakout (P1770) if needed.
5–15Wire SPI: CLK→pin 13, MOSI→pin 11, MISO→pin 12, CS→pin 10, DC→pin 9, RST→pin 15, VIN→5V, GND→GND, LITE→3.3V.
15–20Double check: pin 8 is NOT used for LCD. Pin 8 = I2S RX (Audio Shield).
20–30Flash ILI9341_t3 graphicstest. Fast graphics demo on 2.8″ screen.
30–40Test with audio playing simultaneously. SPI + I2S = different buses, should be clean.
40–55Write a basic UI screen: mode name, fader bars, pad activity, GPS placeholder.
55–60Run everything: LCD + OLED + NeoPixels + faders + pads + encoders + audio.
✓ MILESTONE: LCD shows UI, audio clean, no SPI/I2S conflict
8

GPS + ESP32 + Full Integration

60 MIN — MILESTONE: Full system running. Prototype complete.

Day 8 integration diagram

DAY 8 — PA1010D ON I2C0 + ESP32-S2 UART (5V, NOT 3.3V)

MinTask
0–3Solder headers onto PA1010D GPS (or use STEMMA QT cable).
3–8Wire GPS: SDA→pin 18, SCL→pin 19, VIN→3.3V, GND→GND.
8–12Flash Adafruit_GPS I2C example. GPS.begin(0x10).
12–18Go to window/balcony. Wait for fix (30–60 sec). Verify Barcelona coordinates.
18–22Show GPS on OLED: lat, lon, satellites.
22–25Connect ESP32-S2 to computer via its own USB. Flash WiFi connect sketch. Verify it connects.
25–28Disconnect ESP32 from computer.
28–33Wire ESP32 to Teensy: TX→pin 0, RX→pin 1, GND→GND, 5V→VIN. NOT 3.3V.
33–40Flash Teensy with Serial1 receive code. Test: ESP32 sends message → Teensy prints it.
40–50Full integration: power on, init all subsystems, test every input/output.
50–55Monitor: CPU usage, audio memory, I2C errors. CPU should be <70%.
55–60Everything works. Take a photo of the complete breadboard build.
✓ MILESTONE: FULL SYSTEM RUNNING — Oh My Ondas prototype complete

Summary

DayWhatMilestone
1Solder Audio Shield + stack + first soundHear audio
2OLED on I2C0 + CAP1188 on I2C1 + 8 padsTouch + display
3Code: touch → play sample → OLED feedbackTouch = sound
4NeoPixels + ADS1115 + first faderLight + fader + sound
5Remaining 4 slide pots5 faders
62× MCP23017 + 7 encoders + 4 buttons + navFull interface
7ILI9341 2.8″ LCD on SPIMain display
8GPS + ESP32 UART + integration testComplete prototype

8 hours total. One hour per day. No blockers with current hardware.

If You Get Stuck

  • No sound (Day 1): SD must be FAT32, files on root, CS = BUILTIN_SDCARD.
  • I2C device not found (Day 2+): Check wiring. Wire1 needs external 10K pull-ups.
  • Audio glitches with NeoPixels (Day 4): Switch to WS2812Serial library.
  • Fader jitter (Day 4–5): Add 100nF caps on wipers. Keep analog wires away from SPI.
  • ESP32 causes Teensy reboot (Day 8): Power ESP32 from 5V, not 3.3V.
  • GPS no fix (Day 8): Go outdoors or to window. First fix needs sky view.
  • Encoder knobs don't fit (Day 6): Check for set screw hole. May need D-shaft adapter.

After Day 8

  • Write actual Oh My Ondas firmware (sampling engine, sequencer, effects routing)
  • Source 6 more EC11 encoders for full 13-encoder interface
  • Pick up 2.2K + 1K + 470Ω resistors from Diotronic
  • Design 3D-printed enclosure at FabLab Barcelona
  • First field recording walk