
Beeb wifiport
timhawes/beeb_wifiport
Serial interface for connecting a BBC Micro user port to an ESP32-S3.

Accessibility Switch with 3 buttons for previous, select, and next
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.
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.
| Buttons | SW1 Left Arrow, SW2 Enter, SW3 Right Arrow |
| Bluetooth name | RB Switch |
| Microcontroller | ESP32-S3-MINI-1-N4R2 |
| Power | USB-C or a single-cell Li-Po battery. No power switch and no sleep mode. |
| Charging | MCP73831, about 500 mA. D1 lights while charging. |
| Regulator | TPS63001 3.3 V buck-boost |
| PCB | KiCad 10, 4 layers, 115 × 38 mm |
| Firmware | Arduino sketch using NimBLE-Arduino 2.x |
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.
The production firmware is:
firmware/RB_SWITCH_firmware/RB_SWITCH_firmware.ino
| Switch | GPIO | Keyboard key |
|---|---|---|
| SW1 | GPIO10 | Left Arrow |
| SW2 | GPIO11 | Enter |
| SW3 | GPIO12 | Right 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.
.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.See Firmware for details.
| For | Read |
|---|---|
| Classroom staff setting up a device | Setup & Pairing |
| iPad and iPhone | iOS/iPadOS Switch Control |
| Android phones and tablets | Android Switch Access |
| How the buttons behave | Switch Operation |
| Something is not working | Troubleshooting |
| Evaluating a student for switch access and teaching switch skills | Switch Evaluation Package |
| Programming the board | Firmware, Firmware Customization |
| Hardware reference | Hardware |
| Enclosure label | QR 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/.
| Download | Source page | Use |
|---|---|---|
RB_Switch_Paraprofessional_Setup_Guide.docx | docs/setup.md | Classroom quick-reference for pairing, setup and troubleshooting |
RB_Switch_Evaluation_Package.docx | docs/evaluation-package.md | Fill-in package for evaluating, teaching and documenting adaptive switch access (checklists, five-stage data sheets, graphing sheet, summary report, IEP goal bank) |
| Symptom | First thing to try |
|---|---|
| Not in the Bluetooth list | Check power; turn Bluetooth off on other nearby devices that were paired before |
| Listed but will not connect | Forget RB Switch on the device and pair again |
| Connected, but no button works | Check it still shows Connected; a press made while disconnected is lost |
| Only two buttons work on Android | Assign the third switch under Assign switches for scanning |
| Will not power on | Charge from USB-C for 30 minutes with a known-good cable |
| Upload fails or no serial port | Hold BOOT, tap RESET, release BOOT; use a data cable |
The full guide, including board-level checks for technicians, is in Troubleshooting.
The current board uses:
Hardware source files are in electrical/, bom/, and mechanical/.
| Path | Contents |
|---|---|
electrical/mechanical_switch/RB_Switch.kicad_sch, .kicad_pcb | Current KiCad 10 schematic and 4-layer PCB. The schematic is fully wired and its netlist matches the PCB. |
electrical/mechanical_switch/VERIFICATION.md | How the board was checked against the firmware, and what was not checked |
electrical/mechanical_switch/net_table.json | Net-by-net list of pads |
bom/ | BOMs and placement files for JLCPCB and PCBWay, plus sourcing notes |
mechanical/ | Enclosure (OpenSCAD) |
docs/hardware.md | Pin map and a part-by-part description of the connections |
Before ordering boards: the files in
electrical/mechanical_switch/gerbers/and the PCB images inelectrical/mechanical_switch/diagrams/come from an earlier layout. Re-export them withcreate_gerber.ps1and check the CPL orientation of U1, REG1, D1, J_USB1, and L1 in the fab's preview.
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.
| Path | Contents |
|---|---|
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.docx | Printable classroom guide |
RB_Switch_Evaluation_Package.docx | Printable switch evaluation package |
CHANGES.md | Changelog |
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:
python3 tools/sync_documents.py
node tools/build_docx.jsThe 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.
Publish docs/ with GitHub Pages. The enclosure QR code should point to the published documentation home page. See QR Code.
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.
To report a suspected security or safety issue, see SECURITY.md rather than opening a public issue.
See CHANGES.md for a history of notable changes.
This project is licensed under the APACHE 2.0 License— see LICENSE for the full text, including a note on hardware-specific licensing alternatives.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | 100nF | Capacitor_SMD:C_0603_1608Metric | C5, C6, C8, C9, C10, C11 |
| 3 | 10uF | Capacitor_SMD:C_0603_1608Metric | C1, C3, C7 |
| 3 | B3F-100x | Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x | SW1, SW2, SW3 |
| 2 | 100k | Resistor_SMD:R_0603_1608Metric | R7, R8 |
| 2 | 10k | Resistor_SMD:R_0603_1608Metric | R5, R6 |
| 2 | 5.1k | Resistor_SMD:R_0603_1608Metric | R3, R4 |
| 2 | MountingHole | MountingHole:MountingHole_4.3mm_M4 | MH1, MH2 |
| 1 | 1k | Resistor_SMD:R_0603_1608Metric | R2 |
| 1 | 1uF | Capacitor_SMD:C_0603_1608Metric | C4 |
| 1 | 2.2uH | Inductor_SMD:L_Bourns-SRN4018 | L1 |
| 1 | 22uF | Capacitor_SMD:C_0603_1608Metric | C2 |
| 1 | 2k | Resistor_SMD:R_0603_1608Metric | R1 |
| 1 | BATT_JST-PH-2P | Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | J_BAT1 |
| 1 | BOOT | Button_Switch_SMD:SW_SPST_B3U-1000P | SW_BOOT1 |
| 1 | ESP32-S3-MINI-1-N4R2 | RF_Module:ESP32-S2-MINI-1 | U1 |
| 1 | MCP73831T-2ACI/OT | Package_TO_SOT_SMD:SOT-23-5 | U_CHG1 |
| 1 | RESET | Button_Switch_SMD:SW_SPST_B3U-1000P | SW_RST1 |
| 1 | STAT_LED | LED_SMD:LED_0603_1608Metric | D1 |
| 1 | TPS63001DRCR | Package_SON:Texas_DRC0010J | REG1 |
| 1 | USB4105-GF-A | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J_USB1 |
It measures 115 × 38 mm and has 4 copper layers, 1 mm thick.
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.
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.
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).

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

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

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.

open-ephys/ephys-test-board
General purpose, automated electrophysiology test board

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


Paumanok/kasa-remote
An ESP32 based remote control device for manipulating and monitoring TPLink Kasa devices.

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.