Skip to the content
PCBKitNew board
4 layers70.1 × 46.4 mmWireless switch, the printed circuit board in 3D

A fully wireless switch panel for a race car using two Raspberry Pi Pico 2 W boards. One board acts as the Transmitter (switch panel), the other as the Receiver (12 V output driver).

Size
70.1 × 46.4 mm
Copper layers
4
Thickness
1.6 mm
Parts
102
Nets
76
Pads
241
Tracks, vias
419, 43
Pours
7
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
31 Mar 2026
Updated
6 May 2026

Overview

Wireless switch is an open-source printed circuit board by hkymstr, from the hkymstr/Wireless-switch repository on GitHub. It is a 4-layer board of 70.1 × 46.4 mm with 102 parts on 76 nets, routed with 419 tracks and 43 vias.

It is built around the RCT-0C, LTST-C171KGKT and PPPC201LFBN-RC. Its parts include 51 resistors, 10 diodes, 9 capacitors, 9 transistors and 3 connectors.

Main components

3

README

README.md

Wireless Race Car Switch System — Hardware v2 (WiFi)

A fully wireless switch panel for a race car using two Raspberry Pi Pico 2 W boards.
One board acts as the Transmitter (switch panel), the other as the Receiver (12 V output driver).

Bluetooth version: see the bluetooth branch.


System Overview

text
 ┌──────────────────────────┐      WiFi (AP/STA)      ┌─────────────────────────────┐
 │      TRANSMITTER         │ ◄──── UDP 20 Hz ──────► │        RECEIVER             │
 │    Raspberry Pi Pico 2W  │                          │    Raspberry Pi Pico 2W     │
 │                          │  Web UI: 192.168.4.1     │  Web UI: <RX-IP>            │
 │  GPIO 1-5 ← 5 switches   │                          │  GPIO 8-11 → 4× MOSFET     │
 │  GPIO 0  → Connected LED │                          │  GPIO 12   → Relay K2      │
 │  GPIO 7  → Searching LED │                          │  GPIO 0    → Connected LED  │
 │  Powered from 12 V via   │                          │  GPIO 7    → Searching LED  │
 │  on-board 5 V regulator  │                          │  Takes 12 V from car        │
 └──────────────────────────┘                          └─────────────────────────────┘

TX creates an open WiFi access point (WirelessSwitch-1 by default). RX connects as a station.
Both boards host a web settings page — join the WiFi network and open a browser to configure.


Web Interface

BoardURLWhat you can change
TXhttp://192.168.4.1Pair ID
RXhttp://<RX-IP> (linked from TX page)Pair ID, hold time, channel modes

Connect any phone or laptop to the WirelessSwitch-N WiFi network (no password), then open the URL above. Settings are saved to flash and survive power cycles.


GPIO Pin Mapping — Hardware v2

Status LEDs (identical on both boards)

GPIOFunctionBehaviour
0CONNECTED LEDSolid ON when wireless link is up
7SEARCHING LEDFlashes 2 Hz while searching; OFF when linked

Transmitter — Switch Inputs

Switches are active-low (connect switch between GPIO pin and GND).
Internal pull-ups enabled in firmware.

GPIOChannelDescription
1SW1Switch 1 input
2SW2Switch 2 input
3SW3Switch 3 input
4SW4Switch 4 input
5SW5Switch 5 input

Receiver — Output Channels

Outputs are active-high (GPIO HIGH = output energised).

GPIOChannelTypeMax Load
8CH1N-ch MOSFET5 A @ 12 V
9CH2N-ch MOSFET5 A @ 12 V
10CH3N-ch MOSFET5 A @ 12 V
11CH4N-ch MOSFET5 A @ 12 V
12CH5Relay K2 (SPDT)Per relay rating

Repository Structure

text
├── kicad/
│   ├── wireless_switch.kicad_pro   KiCad project file
│   ├── wireless_switch.kicad_sch   Top-level schematic
│   ├── Pico_interface.kicad_sch    Pico 2 W GPIO interface sub-sheet
│   ├── analog_in.kicad_sch         Output channel sub-sheet (MOSFET + relay)
│   ├── input_power.kicad_sch       12 V → 5 V power supply sub-sheet
│   ├── wireless_switch.kicad_pcb   PCB layout
│   └── sym-lib-table               KiCad symbol library table
│
├── firmware/
│   ├── config.py        Shared configuration (defaults – overridden by web UI)
│   ├── tx_main.py       Transmitter MicroPython firmware
│   ├── rx_main.py       Receiver MicroPython firmware
│   ├── install_tx.bat   Windows transmitter installer  (default COM3)
│   ├── install_rx.bat   Windows receiver installer     (default COM5)
│   ├── install_tx.sh    Linux / macOS transmitter installer
│   ├── install_rx.sh    Linux / macOS receiver installer
│   ├── verify.bat       18-point verification script (Windows)
│   ├── led_test.bat     LED blink test (Windows)
│   └── polarity_test.bat  LED polarity / GPIO finder (Windows)
│
└── docs/
    └── wireless_switch.pdf   Full schematic PDF

Hardware Requirements

Per Board (× 2)

  • Raspberry Pi Pico 2 W
  • PCB from kicad/wireless_switch.kicad_pcb

Transmitter PCB BOM additions

  • 5× panel-mount toggle switches (SPDT or SPST)
  • 2× LEDs with 330 Ω series resistors for GPIO 0 & 7
  • 12 V → 5 V onboard regulator + capacitors (see input_power.kicad_sch)

Receiver PCB BOM additions

  • 4× N-channel logic-level MOSFETs (e.g. IRLZ44N) with gate resistors
  • 1× 12 V SPDT relay K2 (Omron G5V-1 or equivalent)
  • Relay driver transistor + flyback diodes
  • Fusing on each output channel

Software Installation

Step 1 — Flash MicroPython to each Pico 2 W

  1. Download the Pico 2 W MicroPython UF2 from
    https://micropython.org/download/RPI_PICO2_W/
  2. Hold BOOTSEL, plug USB → Pico appears as RPI-RP2 mass storage
  3. Drag the .uf2 onto the drive — Pico reboots automatically

Step 2 — Install mpremote

bash
pip install mpremote

Step 3 — Install Transmitter firmware

Windows (default COM3):

bat
cd firmware
install_tx.bat
install_tx.bat COM4    ← specify a different port if needed

Linux / macOS:

bash
cd firmware
chmod +x install_tx.sh && ./install_tx.sh

Confirm: board blinks SEARCHING LED 3× quickly then flashes slowly.

Step 4 — Install Receiver firmware

Windows (default COM5):

bat
install_rx.bat

Linux / macOS:

bash
./install_rx.sh

Step 5 — Verify (optional, Windows)

bat
verify.bat COM3 COM5
led_test.bat COM3 COM5

Operation

  1. Power on both boards. Both blink the SEARCHING LED 3× quickly to confirm firmware is running.
  2. TX creates an open WiFi access point. Both boards flash their SEARCHING LED while waiting for a link.
  3. Once linked, CONNECTED LED turns solid on both boards; SEARCHING LED turns off.
  4. Pressing a switch on TX activates the corresponding output on RX according to that channel's mode.
  5. On link loss: RX holds its last output states for the configured hold time (default 10 s), then turns all outputs off. Both boards resume searching.

Link Parameters

ParameterValue
Update rate20 Hz (every 50 ms)
Link timeout2 s
Hold on disconnect10 s (configurable)
ProtocolUDP port 4210
WiFi modeTX = AP, RX = Station
NetworkOpen (no password)

Channel Modes

Each output channel can be set independently via the RX web interface:

ModeBehaviour
MomentaryOutput ON while switch is held; OFF when released
LatchFirst press turns output ON; next press turns it OFF

Latch state is preserved through brief disconnects (within hold window).
A disconnection longer than the hold time resets all latch states to OFF.


Multiple Pairs

If two TX/RX pairs operate at the same time, each pair needs a unique Pair ID so they don't cross-connect.

Set the same Pair ID on both boards in a pair via the web interface:

PairTX SSIDRX connects to
1WirelessSwitch-1WirelessSwitch-1
2WirelessSwitch-2WirelessSwitch-2

Procedure for changing Pair ID:

  1. Connect to the current WiFi network
  2. Open RX settings → change Pair ID → Save (RX reboots, now looks for new SSID)
  3. Open TX settings (192.168.4.1) → change Pair ID → Save (TX reboots with new SSID)
  4. RX reconnects automatically

Troubleshooting

SymptomLikely causeFix
No 3× startup blinkFirmware not installedRe-run the installer; verify MicroPython UF2 was flashed first
SEARCHING LED never stops flashingWrong Pair ID or TX not poweredCheck both boards have the same Pair ID; confirm TX SEARCHING LED is also flashing
TX AP has stale WPA2 passwordOld security settings cached in chipFirmware resets the AP before configuring — power-cycle TX
Can't open web interfaceNot connected to WirelessSwitch-N WiFiJoin the WiFi network first (no password), then open the URL
RX web page not reachableRX IP unknownOpen TX page (192.168.4.1) first — it shows a clickable link to the RX page
Outputs don't activateWrong firmware on boardConfirm TX has tx_main.py installed as main.py
Latch output stuck after rebootExpected — latch state is in RAM onlyPress the switch once to toggle off
mpremote cannot find deviceDriver missing or wrong portRun python -m mpremote connect list
Pico not detected as storageNot holding BOOTSELHold BOOTSEL before plugging USB

Protocol Reference

UDP packet format (7 bytes, TX → RX, port 4210):

text
Byte 0   : 0xAA  (start marker)
Byte 1   : Switch 1 state  (0 = open, 1 = pressed)
Byte 2   : Switch 2 state
Byte 3   : Switch 3 state
Byte 4   : Switch 4 state
Byte 5   : Switch 5 state
Byte 6   : Checksum  = (SW1+SW2+SW3+SW4+SW5) & 0xFF

RX → TX heartbeat: b"RXHERE" (6 bytes, every 50 ms) — tells TX the RX's IP address.

Parts

102
QtyValueFootprintReferences
251kResistor_SMD:R_0603_1608MetricR1, R2, R3, R13, R14, R15, R16, R17, R18, R21, R22, R23, R26, R27, R28, R35 +9
16RCT-0CConnector_Wire:SolderWire-0.5sqmm_1x01_D0.9mm_OD2.1mmRLY_CM1, RLY_NC1, RLY_NO1, SW_GND1, SW_GND2, SW_GPIO15, SW1, SW1_OUT1, SW2, SW2_OUT1, SW3, SW3_OUT1, SW4, SW4_OUT1, SW5, SW6
1050milliResistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR19, R20, R29, R30, R31, R33, R44, R48, R57, R60
81kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR24, R25, R32, R34, R38, R39, R65, R66
8LTST-C171KGKTLED_SMD:LED_0805_2012MetricD1, D2, D3, D4, D5, D6, D12, D13
70.1uFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC1, C2, C3, C4, C5, C6, C8
710kResistor_SMD:R_0603_1608MetricR7, R8, R9, R10, R11, R12, R47
4MOSFET P-CH 30VPackage_TO_SOT_SMD:SOT-23Q2, Q5, Q6, Q13
4MOSTFET N-CH 50VPackage_TO_SOT_SMD:SOT-323_SC-70Q7, Q8, Q9, Q10
21N4148Diode_SMD:D_SOD-523D9, D14
2PPPC201LFBN-RCESQ-120-24-G-S:SAMTEC_ESQ-120-24-G-SJ2, J3
12.2uFCapacitor_SMD:C_1206_3216MetricC7
122uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC9
122uHInductor_SMD:L_1210_3225Metric_Pad1.42x2.65mm_HandSolderL1
130.1kResistor_SMD:R_0603_1608MetricR46
1691137710002691137710002:691137710002J1
1G5V-1Relay_THT:Relay_SPDT_Omron_G5V-1K2
1LT1933IS6_TRPBFPackage_TO_SOT_SMD:TSOT-23-6_HandSolderingU2
1MBRM140T3GDiode_SMD:D_Powermite_AKU1
1Q_NMOS_GSDPackage_TO_SOT_SMD:SOT-323_SC-70Q14

Questions

How big is the Wireless switch PCB?

It measures 70.1 × 46.4 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Wireless switch use?

102 parts, built around the RCT-0C, LTST-C171KGKT and PPPC201LFBN-RC. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Wireless switch KiCad files?

From the hkymstr/Wireless-switch repository on GitHub, at the commit this page was made from: the board is kicad/wireless_switch.kicad_pcb and its schematic kicad/Pico_interface.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Wireless switch design in my own project?

Its repository states no licence, so its author keeps all rights: ask hkymstr before reusing the design.

Similar boards

  • 2 layers120 × 49 mmSensor hat, the printed circuit board in 3D

    Sensor hat

    mikedahlgren/Pool-Controller

    This runs a pool from a Waveshare ESP32-S3-RELAY-6CH and the PoolVeras sensor hat plugged onto its Pico headers.

    69 parts
  • 6 layers87.8 × 48.3 mmBath clamp, the printed circuit board in 3D

    Bath clamp

    lucask07/covg_clamp

    kicad schematic and layout for COVG bath and guard clamps

    183 partsGPL-3.0
  • 2 layersLILYGO ESP32 SHIELD, the printed circuit board in 3D

    LILYGO ESP32 SHIELD

    R-Mutura/LILYGO_ESP32_SHIELD

    LILY GO SHIELD AND BREAKOUT FOR SENSORS

    47 parts
  • 2 layers102 × 103 mmOhmsprint, the printed circuit board in 3D

    Ohmsprint

    Jockkoo/Ohmsprint-2026-4Digitalca

    Ohmsprint hackaton 2026. KiCad

    123 parts1
  • 2 layers85 × 98 mmProject ornament, the printed circuit board in 3D

    Project ornament

    Boogami/PCB-ornament

    Christmas ornament - version 2024

    29 parts
  • 2 layers82.5 × 82.5 mmEPS V1, the printed circuit board in 3D

    EPS V1

    BrownSpaceEngineering/PVDX-EPS_V1

    Avionics files related to new overhauled EPS schematics, pcb design, and documentation

    197 parts
  • 2 layers65 × 40 mmVLO, the printed circuit board in 3D

    VLO

    dineshkiran97/Battery-Protected-Multi-Rail-Regulator-PCB

    KiCad project for a battery-powered linear regulator board that generates two regulated rails (5V and 3.3V) from a single-cell battery input, with reverse-polarity protection and a power-on indicator.

    19 partsMIT
  • 2 layers55 × 40.1 mmFirst design, the printed circuit board in 3D

    First design

    kian09/Guardian

    A compact health monitoring device that is worn on the wrist. Its capabilities are measuring your heart rate and detecting accidental falls using an accelerometer.

    55 parts