The initial idea was to "just" solder wires to LEDs and buttons and detect when the level is high to determine the active mode. And to emulate the button press, we thought we could output high voltage on the "button" pin.
After some investigation with a multimeter and "oscilloscope" made from Raspberry Pi Pico, it became clear that it wouldn't be that easy. The control board utilizes some kind of matrix and different PWM cycles to control interface elements (buttons and LEDs) using fewer pins. Thankfully, the board has a hack-friendly design with debug pads. After even more investigation and building a "logic analyzer", we found patterns in those signals.
Each LED is driven by two transistors. When both signals controlling those transistors are high, transistors are open, and the LED is lit. But the board also uses different phases of the PWM cycle to drive multiple LEDs with the same transistor controlling pins. So, we can detected when the LED is lit if we listen to an LED's transistor's inputs and wait for both of them to be high simultaneously.
Buttons, are almost the same. The board uses a single "listening" pin and multiple signal-emitting pins to operate several buttons utilizing different PWM cycle phases. So, if we connect one of the AND gate's inputs to the button's "emitting" pin, the other input to ESP32, and the gate's output to the board's button "listening" pin, we can open the gate using ESP32 and emulate a button press.
Because ESP32 couldn't keep up with 9 different signals combined into 12 different states, we decided to use hardware AND gates to reduce the load on ESP32.
Resistors were used to pull down all the AND gate inputs to avoid "floating inputs." Diodes were used to ensure the board's button driving pin isn't shorted to the ground or to the AND gate's output.
Schematic and PCB designed using https://easyeda.com/
Schematic | Top View | Bottom View |
---|---|---|
![]() |
![]() |
![]() |
Name | Designator | Footprint | Manufacturer | Manufacturer Part | Shop Link | Spec Link |
---|---|---|---|---|---|---|
AND Gate | G1,G2,G3 | SOP-14 [1] | Toshiba | TC74HC08AF(F) | RS-Online | RS-Online |
Capacitor | C1,C2,C3 | Through hole | Kemet | C322C104K5R5TA | RS-Online | RS-Online |
Shottky Diode | D1,D2 | DO-35 | STMicroelectronics | BAT41 | RS-Online | RS-Online |
10kΩ Resistor | R1,R2 | 2.7x6.2mm (MRS25?) | ??? | ??? | Aliexpress | - |
2x8pin Socket | ESP_L, ESP_R | Through hole, 2.54mm | HARWIN | M20-7830846 | RS-Online | RS-Online |
10kΩ Resistor Array | RN1 | Through hole, 2.54mm | KOA or clone | 103J | Eleshop | KOA |
12Pin Screw Terminal | U1 | Through hole, 2.54mm | ??? | ??? | Amazon | Probably LCSC |
ESP32-S2 Dev Board | - | - | Wemos | S2 mini | Aliexpress | Wemos |
Important
[1]: The gate is in SOP-14 package, but there's a mistake on the PCB and the gate there is in SOIC-14 package. I was able to solder the gate onto SOIC-14, but that should be avoided in the future
Credits:
Schematic, PCB design, remote debugging & 1-day delivery sponsor: @AshotPilosian