Brisk4t’s “Tossed The TV — Kept The Remote” (TTVKTR) is an open-source firmware project for Raspberry Pi RP2040 USB boards that aims to reduce electronics waste by converting old IR remote controls into presentation clickers.
Most Raspberry Pi RP2040 boards with USB ports should work, but the project highlights the Waveshare RP2040-Zero combined with a standard 38 kHz infrared receiver due to its small size and low price ($4-5). The project also relies on the built-in RGB LED for layer color feedback.
That’s about it for the hardware. It just required some basic soldering of the IR receiver to GPIO 28 (OUT), 5V or 3.3V, and GND pins. Nothing too hard. The WS2812 RGB LED is already connected to GPIO 16. I tried to look for RP2040 USB boards with a built-in IR receiver, but I could not find any.

The firmware receives IR codes from a standard 38 kHz receiver and translates them to USB HID reports based on a JSON configuration stored on the device’s filesystem. But users don’t need to edit the JSON themselves, since a browser-based config tool communicates over Web Serial to let users map buttons, learn IR codes, and arrange layouts in a way similar to VIA or QMK for mechanical keyboards and macropads. It’s what differentiates TTVKTR firmware from other similar attempts such as Adafruit pIRkey and CH32V003-USB-IR-Receiver, which require some manual coding for each remote.

The user interface offers the following features:
- Custom Keybindings UI in a browser for assigning remote buttons to keys, media controls, or custom actions.
- Multiple layers for one remote with the board’s RGB LED showing the layer selection
- Support for multi-step inputs, including modifier combinations, repeated presses, and chained actions.
- Layouts enable a distinct way of telling different IR remotes apart
- Manual configuration editing with JSON editor
Example of JSON file stored in /settings.json on the board’s partition:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{ "ir": { "modeChangeCode": "0xC40387EE", "modeCount": 2, "receivePin": 28, "handleRepeat": true, "repeatInitialDelayReports": 5 }, "led": { "pin": 16, "modeColors": ["0xFF0040", "0x0080FF"], "brightnessPercent": 10 }, "modes": [ { "name": "Layer 1", "slots": [ { "irCode": "0xC40387EE", "type": "consumer", "key": "0xCD" }, { "irCode": "0x...", "type": "keyboard", "key": "0x28" }, { "irCode": "0x...", "type": "keyboard", "key": "0x1D", "mods": "0x01" }, { "irCode": "0x...", "type": "mode_switch" }, { "irCode": "0x...", "type": "text", "value": "hello world" }, { "irCode": "0x...", "type": "combo", "steps": [ { "type": "keyboard", "key": "0x04", "mods": "0x01" }, { "type": "keyboard", "key": "0x4C" } ]} ] } ], "layouts": [ { "name": "Default Layout", "buttons": [ { "irCode": "0x...", "x": 0, "y": 0 }, { "irCode": "0x...", "x": 1, "y": 0 } ] } ] } |
Note that you’ll need Chrome or another browser that supports Web Serial, and for instance, Firefox is not supported [Update: recent versions of Firefox now support WebSerial, see comments section].
The source code for the firmware (Arduino/PlatformIO) and web interface (HTML+JavaScript), as well as instructions to build the code and get started, are available on GitHub.
Via Hackster.io

Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress. We also use affiliate links in articles to earn commissions if you make a purchase after clicking on those links.





