Ready to deploy design #9

February 3, 2026 · View on GitHub

Read this document from start to end before building anything. Ensure you understand everything.

A Discord user reported it to be working, but the sketch was customized.

Hardware features

  • Bluetooth Low Energy.
  • Externally powered through USB cable or quick-release.
  • Analog clutch paddles (potentiometers).
  • Up to 7 relative rotary encoders (without push button). Up to 8 if no funky switch is in place.
  • Optional funky switch or DPAD (but not both).
  • Shift paddles (x2).
  • "ALT" buttons (x2).
  • Up to 28 additional push buttons.

Button mapping

  • Bite point calibration: rotary #1 clockwise and counter-clockwise (while holding one and only one clutch paddle).

  • Next clutch function: START and Left shift paddle.

  • ALT buttons mode: START and Right shift paddle.

  • Recalibrate clutch paddles: Left shift paddle, Right shift paddle and START (in this order).

You may use the companion app as an alternative to those button combinations.

Needed parts

ItemQuantityNotes
Bare bone rotary encoder (without push button)up to 7You may place an additional rotary encoder if no funky switch is in place
Roller lever2For shift paddles (maybe they are included with your wheel's case)
Linear potentiometer 10 K-ohms or higher2For clutch paddles (maybe they are included with your wheel's case)
Push buttonup to 28You may place an additional push button if no funky switch/DPAD is in place
ALPS funky switch or DPAD1Optional
Standard-sized perfboard 28x6 holes1Single-side or double-side (does not matter)
Wemos (aka "Lolin") S3 mini (DevKit board)1No pins already soldered
MCP23017 GPIO expander2Mandatory. Do not substitute with other brand
Single-row 90-degree bended pin header (male or female up to you)52For external wiring at the satellite circuit (see below)
Double-row 90-degree bended pin header (male or female up to you)32For external wiring at the DevKit board
Power connector1Depends on your power source

Other parts (quantity unknown):

  • Thin wire.
  • Wire with Dupond terminals (for external wiring). A kit for protoboards will do the job. ¿Male or female? the opposite to pin headers. Make sure they are long enough. You need more than 30 of them.
  • Welding tin.

Other notes:

Pin-out plan for the Wemos S3 mini

GPIOInputOutputUsageNotes
1OKOKPush
2OKOKROT1_A
3OKOKROT1_B
4OKOKROT2_A
5OKOKROT2_B
12OKOKROT3_A
6OKOKROT3_B
13OKOKROT4_A
7OKOKROT4_B
11OKOKROT5_A
8OKOKROT5_B
10OKOKROT6_A
9OKOKROT6_B
14OKOKPOT1_OUTADC2_CH3
15OKOKPOT2_OUTADC2_CH4
17OKOKD (Right)
16OKOKENCODER_B
18OKOKC (Down)
21OKOKENCODER_A
34OKOKB (Left)
35OKOKSDADefault I2C bus
38OKOKA (Up)
36OKOKSCLDefault I2C bus
37OKOKROT7_A
RXOKRX pin(AVOID)See note
33OKOKROT7_B
TXTX pinOK(AVOID)See note

ℹ️ Note about RX and TX pins:

The Wemos S3 mini does not feature an USB-TO-UART chip, so those pins have no predetermined use. You may customize the sketch to use them. However, the firmware will configure those pins as UART0 if there are error messages. These pins are marked as "unusable" in the wiring diagrams below, but that is not true at all.

Circuit layout

We are reusing the GPIO expanders example as a satellite circuit.

Satellite circuit

Open the wiring layout using DIY Layout Creator.

Setup #9 wiring layout

This design includes the following subsystems (read for an in-depth explanation):

Notes and build tips:

  • We are using 90-degree blended pin headers to make it easier to fit the electronics into the wheel's housing. You may replace them with directly-soldered wires. You have to solder the double-row pin headers to the DevKit board yourself.

  • Check wiring and traces twice before soldering.

  • You may use bare-bone rotary encoders with push buttons, too. In such a case, wire SW and SW GND terminals as switches.

  • A funky switch or DPAD is optional. If you choose not to wire any of them, it's recommended to attach a switch to Push.

  • Anyway, do not left floating pins. Wire unused inputs to GND.

  • You may use an additional regular rotary encoder instead of a funky switch (adding up to 8 rotary encoders). In such a case, the A terminal is equivalent to ENCODER_A, and the B terminal is equivalent to ENCODER_B. However, you must modify the sketch (Setup9.ino) in this way. Locate the following text line:

    #define USE_FUNKY true
    

    and replace with the following text line:

    #define USE_FUNKY false
    
  • Cover the back of the satellite circuit and the DevKit board with cardboard and isolation tape. This prevents unnoticed short-circuits.

  • Make sure the satellite circuit is properly wired and there are no build mistakes. The firmware will not boot if the GPIO expanders are not found in the I2C bus.

External wiring

  • Certain inputs have a particular function as shown in the following table, so attach them properly.

    LocationTagParticular function
    DevKitPush"A" button in Windows
    DevKitA (Up)Navigation
    DevKitB (Left)Navigation
    DevKitC (Down)Navigation
    DevKitD (Right)Navigation
    Satellite circuitAddress = 7, GPA0Left SHIFT paddle
    Satellite circuitAddress = 7, GPA1Right SHIFT paddle
    Satellite circuitAddress = 7, GPA2"ALT" button
    Satellite circuitAddress = 7, GPA3"ALT" button
    Satellite circuitAddress = 0, GPB7"Start" button in Windows
    Satellite circuitAddress = 0, GPB6"Back" button in Windows
    Satellite circuitAddress = 0, GPB5"B" button in Windows
    Satellite circuitAddress = 0, GPB4"X" button in Windows
    Satellite circuitAddress = 0, GPB3"Y" button in Windows
  • The GND and 3V3 terminals of each potentiometer are interchangeable. If the clutch (or axis) goes to 100% when idle, swap those terminals. If you don't have the chance to swap those terminals, the companion app has the ability to swap axis polarity by user request. They are attached to the satellite circuit (same tags).

  • EXT_5V is the positive pole of your power source. EXT_GND is the negative pole of your power source. Attach them properly. Take care not to swap those terminals. If you have a Simagic QR, EXT_GND is the yellow wire and EXT_5V is the green one.

  • Alternatively, you may use a USB cable as the power source (attached to the USB header). However, under no circumstances should you power the board using the USB header and the EXT_ terminals simultaneously.

  • The actual wiring of your (optional) funky switch may not match the one shown here. Look for a data sheet.

  • Misleading tags have been reported at some ALPS funky switches. Be warned. Those show erroneously swapped COM and PUSH tags, at least, in their data sheet. Check first. If you come into one of them, swap those terminals.

  • The COM terminals of all rotary encoders (and the ENCODER_COM terminal of the funky switch) must be attached to GND at the satellite circuit.

  • Wire one terminal of each switch together in a chain to a single GND pin (as shown in the diagram above). If there are not enough GND pins in the satellite circuit, use this trick.

Firmware upload

In Arduino IDE:

  • Configure the board manager for "LOLIN S3 Mini (esp32)"
  • Set "Upload mode" to "USB-OTG CDC (TinyUSB)" in the "Tools" menu.

Then:

  1. Plug the USB cable to the Devkit board and upload the sketch with Arduino IDE.
  2. Open the serial monitor (Arduino IDE).
  3. Reset.
  4. Check there are no error messages.