Assembly Manual
Oh My Ondas Hardware Prototype — March 2026 — Barcelona
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
- Use Teensy built-in SD (SanDisk Ultra 32GB). Audio Shield SD slot unused.
- LCD is 2.8″ ILI9341 (P1770) — DMA-optimized ILI9341_t3 library.
- Dual I2C: Wire (18/19) audio-path, Wire1 (16/17) UI-polling.
- 4 main buttons direct to Teensy pins for latency + interrupts.
- 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.
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).
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
pjrc.com/store/teensy3_audio.html.- Format as FAT32 (not exFAT).
- Copy PJRC test WAV files to root.
- Insert into Teensy built-in slot (not Audio Shield slot).
- Teensy into breadboard (spans center gap).
- Audio Shield on top via headers.
- Headphones into Audio Shield 3.5mm jack.
- USB to computer.
#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.
| CAP1188 Pin | Teensy Pin | Notes |
|---|---|---|
| SDA | 17 (SDA1) | Wire1 bus |
| SCL | 16 (SCL1) | Wire1 bus |
| VIN | 3.3V | |
| GND | GND |
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.
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.
| OLED Pin | Teensy Pin | Bus |
|---|---|---|
| SDA | 18 (SDA0) | Wire — shared with Audio Shield |
| SCL | 19 (SCL0) | Wire |
| VCC | 3.3V | |
| GND | GND |
I2C scan on Wire should show: 0x0A (SGTL5000) + 0x3C (SSD1306).
| LCD Pin | Teensy Pin | Notes |
|---|---|---|
| CLK | 13 (SCK) | SPI clock |
| MOSI | 11 | SPI data out |
| MISO | 12 | SPI data in |
| CS | 10 | Chip select |
| DC | 9 | Data/Command |
| RST | 15 | Reset (NOT pin 8!) |
| LITE | 3.3V | Backlight always on |
Data → pin 6 via 470Ω series resistor. VCC → 5V. GND → GND.
| ADS1115 Pin | Teensy Pin | Notes |
|---|---|---|
| SDA | 18 (SDA0) | Shared I2C0 bus |
| SCL | 19 (SCL0) | |
| VDD | 3.3V | |
| GND | GND | |
| ADDR | GND | Sets address to 0x48 |
Each pot: Left → GND, Right → 3.3V, Wiper → ADS1115 A0–A3. Pot 5 wiper → Teensy pin 14 (A0).
Add 100nF ceramic cap from each wiper to GND, close to the ADC input.
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.
| Button | Teensy Pin | Wiring |
|---|---|---|
| MODE | 2 | Button between pin and GND, INPUT_PULLUP |
| SHIFT | 3 | Same |
| REC | 4 | Same |
| PLAY | 5 | Same — Pressed=LOW, Released=HIGH |
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.
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.
Common → GND. Up/Down/Left/Right/Select → MCP#2 GPIOs. Internal pull-ups.
| PA1010D Pin | Teensy Pin | Notes |
|---|---|---|
| SDA | 18 (SDA0) | Shared I2C0 |
| SCL | 19 (SCL0) | |
| VIN | 3.3V | |
| GND | GND |
Adafruit_GPS GPS(&Wire);
GPS.begin(0x10);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
Flash WiFi test via its own USB port before wiring to Teensy. Verify it connects to your network.
| ESP32 Pin | Teensy Pin | Notes |
|---|---|---|
| TX | 0 (RX1) | ESP32 sends → Teensy receives |
| RX | 1 (TX1) | Teensy sends → ESP32 receives |
| 5V / VBUS | VIN | Shared 5V from USB |
| GND | GND |
// Teensy:
Serial1.begin(115200);
if (Serial1.available()) {
String msg = Serial1.readStringUntil('\n');
Serial.print("From ESP32: ");
Serial.println(msg);
}
I2C BUS ARCHITECTURE — Wire (audio-path) and Wire1 (UI-polling, external pull-ups required)
POWER DISTRIBUTION — USB 5V → Teensy LDO 3.3V (~60mA external) + ESP32-S2 (own regulator)
Bus Map — Final State
Wire — I2C0
Wire1 — I2C1
SPI
Audio Shield SD NOT used — Teensy SDIO instead
UART — Serial1
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