Skip to the content
PCBKitNew board
4 layers115 × 38 mmRB SWITCH, the printed circuit board in 3D

Accessibility Switch with 3 buttons for previous, select, and next

Size
115 × 38 mm
Copper layers
4
Thickness
1 mm
Parts
33
Nets
53
Pads
179
Tracks, vias
201, 57
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
27 Sep 2026
Updated
11 Oct 2026

Overview

RB SWITCH is an open-source printed circuit board by mrhunsaker, from the mrhunsaker/RB_SWITCH repository on GitHub, published under the Apache-2.0 licence. It is a 4-layer board of 115 × 38 mm with 33 parts on 53 nets, routed with 201 tracks and 57 vias.

It is built around the ESP32-S3-MINI-1-N4R2, MCP73831T-2ACI/OT-HXY and USB4105-GF-A. Its parts include 11 capacitors, 8 resistors, 3 switches, 1 IC and 1 diode. It belongs with the ESP32 boards of this library.

Main components

3

README

README.md

RB Switch

License GitHub top language Documentation Last commit GitHub Release Contributors PRs welcome

The RB Switch is a three-button Bluetooth Low Energy (BLE) accessibility switch. It presents itself to a computer, tablet, or phone as a standard Bluetooth keyboard, so it works with Switch Control (iOS/iPadOS), Switch Access (Android), and any app that accepts keyboard input.

At a glance

ButtonsSW1 Left Arrow, SW2 Enter, SW3 Right Arrow
Bluetooth nameRB Switch
MicrocontrollerESP32-S3-MINI-1-N4R2
PowerUSB-C or a single-cell Li-Po battery. No power switch and no sleep mode.
ChargingMCP73831, about 500 mA. D1 lights while charging.
RegulatorTPS63001 3.3 V buck-boost
PCBKiCad 10, 4 layers, 115 × 38 mm
FirmwareArduino sketch using NimBLE-Arduino 2.x

Quick start

  1. Power the switch from USB-C or its battery.
  2. Pair RB Switch in the device's Bluetooth settings.
  3. Press each button in a text field: Left, Enter, Right.
  4. Set up Switch Control (iOS/iPadOS) or Switch Access (Android) from the guides below.

Important for Android users: Android's Switch Access is a separate app you install/update from the Google Play Store, and its setup wizard only offers a one-switch or two-switch configuration. It does not offer a third switch by default. Using the RB Switch's third button on Android requires one extra step beyond the wizard. This is different from iOS/iPadOS, where all three buttons can be assigned directly in the normal setup flow. See Android Switch Access and iOS/iPadOS Switch Control before you configure a device.

Production firmware

The production firmware is:

firmware/RB_SWITCH_firmware/RB_SWITCH_firmware.ino

Button mapping

SwitchGPIOKeyboard key
SW1GPIO10Left Arrow
SW2GPIO11Enter
SW3GPIO12Right Arrow

Each button press produces one key press followed by one key release. Holding a button does not repeat the key. A press made while no host is connected is ignored.

Building the firmware

  1. Install the Arduino IDE, the ESP32 Arduino core by Espressif, and NimBLE-Arduino 2.x.
  2. Select ESP32S3 Dev Module and set USB CDC On Boot to Enabled.
  3. Open the .ino file, click Verify, then Upload over a data-capable USB-C cable. If the upload does not start, hold BOOT, tap RESET, release BOOT.
  4. Open the Serial Monitor at 115200 baud.

See Firmware for details.

Documentation

ForRead
Classroom staff setting up a deviceSetup & Pairing
iPad and iPhoneiOS/iPadOS Switch Control
Android phones and tabletsAndroid Switch Access
How the buttons behaveSwitch Operation
Something is not workingTroubleshooting
Evaluating a student for switch access and teaching switch skillsSwitch Evaluation Package
Programming the boardFirmware, Firmware Customization
Hardware referenceHardware
Enclosure labelQR Code

Published documentation: https://mrhunsaker.github.io/RB_SWITCH/

Two printable Word documents are also available. Both are generated from the matching page in docs/.

DownloadSource pageUse
RB_Switch_Paraprofessional_Setup_Guide.docxdocs/setup.mdClassroom quick-reference for pairing, setup and troubleshooting
RB_Switch_Evaluation_Package.docxdocs/evaluation-package.mdFill-in package for evaluating, teaching and documenting adaptive switch access (checklists, five-stage data sheets, graphing sheet, summary report, IEP goal bank)

Troubleshooting at a glance

SymptomFirst thing to try
Not in the Bluetooth listCheck power; turn Bluetooth off on other nearby devices that were paired before
Listed but will not connectForget RB Switch on the device and pair again
Connected, but no button worksCheck it still shows Connected; a press made while disconnected is lost
Only two buttons work on AndroidAssign the third switch under Assign switches for scanning
Will not power onCharge from USB-C for 30 minutes with a known-good cable
Upload fails or no serial portHold BOOT, tap RESET, release BOOT; use a data cable

The full guide, including board-level checks for technicians, is in Troubleshooting.

Hardware

The current board uses:

  • ESP32-S3-MINI-1-N4R2
  • Three Omron B3F-series tactile switches
  • USB-C power/programming connection (native USB, no USB-to-serial chip)
  • Single-cell Li-Po battery connection and MCP73831 charger
  • TPS63001 3.3 V buck-boost regulator
  • Battery-voltage sensing (not yet used by the firmware)
  • MCP73831 charge-status LED
  • Reset and boot buttons, with a 10 kΩ pull-up and 1 µF capacitor on the reset line

Hardware source files are in electrical/, bom/, and mechanical/.

PathContents
electrical/mechanical_switch/RB_Switch.kicad_sch, .kicad_pcbCurrent KiCad 10 schematic and 4-layer PCB. The schematic is fully wired and its netlist matches the PCB.
electrical/mechanical_switch/VERIFICATION.mdHow the board was checked against the firmware, and what was not checked
electrical/mechanical_switch/net_table.jsonNet-by-net list of pads
bom/BOMs and placement files for JLCPCB and PCBWay, plus sourcing notes
mechanical/Enclosure (OpenSCAD)
docs/hardware.mdPin map and a part-by-part description of the connections

Before ordering boards: the files in electrical/mechanical_switch/gerbers/ and the PCB images in electrical/mechanical_switch/diagrams/ come from an earlier layout. Re-export them with create_gerber.ps1 and check the CPL orientation of U1, REG1, D1, J_USB1, and L1 in the fab's preview.

Production scope

The production design has three mechanical switch inputs only. It does not implement touch sensors, proximity sensors, NeoPixel/RGB indicators, mono-jack inputs, or the earlier F-key input mapping.

The charge-status LED (D1) is controlled by the battery charger and is not a programmable RGB LED.

Repository layout

PathContents
firmware/RB_SWITCH_firmware/Production sketch
firmware/BLE_ADAPTIVE_SWITCH_EXPANDED_SCAFFOLD/Archived earlier firmware, not production
electrical/KiCad project, gerbers, diagrams, verification notes
bom/BOM, placement and sourcing files
mechanical/Enclosure and storage box models
docs/GitHub Pages source
documents/Packaging-friendly copy of docs/
tools/Scripts that keep documents/ and the printable Word documents in sync with docs/
RB_Switch_Paraprofessional_Setup_Guide.docxPrintable classroom guide
RB_Switch_Evaluation_Package.docxPrintable switch evaluation package
CHANGES.mdChangelog

Documentation source

docs/ is the published GitHub Pages source.

documents/ contains the same documentation in a packaging-friendly directory. Keep the two documentation sets synchronized when documentation changes.

After editing docs/, run:

text
python3 tools/sync_documents.py
node tools/build_docx.js

The first script rewrites documents/ from docs/. The second rebuilds both Word documents (RB_Switch_Paraprofessional_Setup_Guide.docx from docs/setup.md and RB_Switch_Evaluation_Package.docx from docs/evaluation-package.md). It needs Node.js and the docx package (npm install docx). Pass setup or evaluation to build just one. See tools/README.md.

GitHub Pages and enclosure QR code

Publish docs/ with GitHub Pages. The enclosure QR code should point to the published documentation home page. See QR Code.

Contributing

Contributions to firmware, hardware, and documentation are welcome. See CONTRIBUTING.md for project structure, how to propose a change, and pull request expectations, and CODE_STYLE.md for formatting and naming conventions. Please review CODE_OF_CONDUCT.md before participating.

Security

To report a suspected security or safety issue, see SECURITY.md rather than opening a public issue.

Changelog

See CHANGES.md for a history of notable changes.

License

This project is licensed under the APACHE 2.0 License— see LICENSE for the full text, including a note on hardware-specific licensing alternatives.

Parts

33
QtyValueFootprintReferences
6100nFCapacitor_SMD:C_0603_1608MetricC5, C6, C8, C9, C10, C11
310uFCapacitor_SMD:C_0603_1608MetricC1, C3, C7
3B3F-100xButton_Switch_THT:SW_TH_Tactile_Omron_B3F-100xSW1, SW2, SW3
2100kResistor_SMD:R_0603_1608MetricR7, R8
210kResistor_SMD:R_0603_1608MetricR5, R6
25.1kResistor_SMD:R_0603_1608MetricR3, R4
2MountingHoleMountingHole:MountingHole_4.3mm_M4MH1, MH2
11kResistor_SMD:R_0603_1608MetricR2
11uFCapacitor_SMD:C_0603_1608MetricC4
12.2uHInductor_SMD:L_Bourns-SRN4018L1
122uFCapacitor_SMD:C_0603_1608MetricC2
12kResistor_SMD:R_0603_1608MetricR1
1BATT_JST-PH-2PConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ_BAT1
1BOOTButton_Switch_SMD:SW_SPST_B3U-1000PSW_BOOT1
1ESP32-S3-MINI-1-N4R2RF_Module:ESP32-S2-MINI-1U1
1MCP73831T-2ACI/OTPackage_TO_SOT_SMD:SOT-23-5U_CHG1
1RESETButton_Switch_SMD:SW_SPST_B3U-1000PSW_RST1
1STAT_LEDLED_SMD:LED_0603_1608MetricD1
1TPS63001DRCRPackage_SON:Texas_DRC0010JREG1
1USB4105-GF-AConnector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_HorizontalJ_USB1

Questions

How big is the RB SWITCH PCB?

It measures 115 × 38 mm and has 4 copper layers, 1 mm thick.

What parts does the RB SWITCH use?

33 parts, built around the ESP32-S3-MINI-1-N4R2, MCP73831T-2ACI/OT-HXY and USB4105-GF-A. 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 RB SWITCH KiCad files?

From the mrhunsaker/RB_SWITCH repository on GitHub, at the commit this page was made from: the board is electrical/mechanical_switch/old/RB_Switch.kicad_pcb and its schematic electrical/mechanical_switch/RB_Switch.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the RB SWITCH design in my own project?

Its repository publishes it under the Apache-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers28 × 28 mmBeeb wifiport, the printed circuit board in 3D

    Beeb wifiport

    timhawes/beeb_wifiport

    Serial interface for connecting a BBC Micro user port to an ESP32-S3.

    18 parts
  • 2 layers22.9 × 63.5 mmEsp rust board, the printed circuit board in 3D

    Esp rust board

    swayerloren/KICAD_ENGINE

    AI-assisted KiCad PCB design workflow for schematics, PCB layouts, DRC, BOM/CPL, and fabrication outputs using Codex or Claude.

    96 parts10MIT
  • 2 layers48 × 65.5 mmOpen telegraph, the printed circuit board in 3D

    Open telegraph

    animesh-chouhan/open-telegraph

    A pocket-size Morse key. One button, one RGB LED, an ESP32-S3, and a battery. Plug it in over USB-C or pair it over Bluetooth and it types Morse into any device as a standard keyboard. Fully open, down to the copper.

    52 parts5CERN-OHL-S-2.0
  • 4 layers150 × 120 mmEphys test board, the printed circuit board in 3D

    Ephys test board

    open-ephys/ephys-test-board

    General purpose, automated electrophysiology test board

    567 parts1
  • 4 layers117 × 77 mmProdDeck, the printed circuit board in 3D

    ProdDeck

    arsovskiteodor/A.ProdDeck

    Open-hardware macro pad (WIP): custom KiCad PCB with keys, encoders and a fader, plus firmware and a desktop configurator

    69 parts
  • 2 layers42 × 85 mmKasa remote, the printed circuit board in 3D

    Kasa remote

    Paumanok/kasa-remote

    An ESP32 based remote control device for manipulating and monitoring TPLink Kasa devices.

    47 parts
  • 4 layers46 × 86.4 mmOpenCycle, the printed circuit board in 3D

    OpenCycle

    Vishvak365/OpenCycle

    Everything is generated from design.py — do not hand-edit the board and then regenerate, you will lose the edit. If you do route by hand in KiCad, stop using the pipeline for that board and say so in docs/DECISIONS.md.

    79 parts