Personal
Alienware AW410K RGB Controller
This project uses a Raspberry Pi Pico 2 as an intermediate between an Alienware AW410K keyboard and a host computer, allowing individual control of the RGB lighting of keys while passing through all keyboard inputs. The RGB configuration is done over a webpage so that no software needs to be installed on the host machine.
The Raspberry Pi Pico 2 acts as both a USB host and a USB device, passing through the USB descriptors and all inputs from the keyboard to the connected device. In addition, the Raspberry Pi Pico 2 presents itself as a CDC-NCM device over USB, allowing it to serve webpages on a network connection over the USB port. There is also a CDC-ACM device for outputting debug information. Finally, the ADC is used to measure the ambient lighting condition so that the RGB lighting adjust automatically, getting brighter when the ambient conditions are dark and dimmer whent he ambient conditions are bright.
Pico BLE HID
This project uses a Raspberry Pi Pico W microcontroller as a USB human interface device to Bluetooth Low Energy adapter. (YouTube Video)
The Raspberry Pi Pico W acts both as a USB host using TinyUSB and as a BLE device using BTstack. When a USB HID keyboard, mouse, joystick, game controller, or any other input peripheral is plugged into the Pico W, it reads the HID report descriptors on all interfaces, and it combines them into a single report descriptor to be transmitted using the HID over GATT Protocol. Upon receiving an HID input report, it then translates the report ID on the USB host to the appropriate report ID on the BLE GATT service. This allows the Pico W to mimic any USB HID input peripheral over a BLE connection.
Hauslane UC-PS18 range hood ESPHome external component
This external component for ESPHome allows for control of a Hauslane UC-PS18 range hood using an ESP device such as ESP32-C3. It uses optocouplers to discharge the capacitive spring sensors to simulate button presses, and it uses the UART decoder built-in to ESPHome to read the state of the fan and light. (YouTube video)
The UC-PS18 model only has one-way communication from the front panel control board to the main control board. It constantly streams data to the main control board with the requested fan speed and light state. The main control board does not send any information back to the front panel, and indeed there is only a single data transmission line from the front panel to the main board with no line for data flowing in the other direction. If the main control board does not receive any messages for a set amount of time (about 2 seconds), then it assumes the front panel is off and turns off all fans and lights.
Nagios plugin for Mirotalk SFU Server
A Nagios plugin for querying a Mirotalk SFU server to report on its status written in Python. This plugin can be used in LibreNMS for monitoring the server as a Service.
Nagios plugin for Mumble Server
A Nagios plugin for querying a Mumble server to report on its status written in Python. This plugin can be used in LibreNMS for monitoring the server as a Service.
Corsair Strafe RGB Mk. 2 Automatic Backlight
This project uses a Raspberry Pi Pico to control the RGB lighting on a Corsair Strafe RGB Mk. 2 keyboard while passing through key events from the keyboard to the host device.
The Raspberry Pi Pico uses the ADC to determine the ambient brightness using an attached light dependent resistor, then sends the RGB control signals to the keyboard to provide either dim white light when the ambient environment is bright or a bright white light when the ambient environment is dark.
HyperX Alloy Elite 2 RGB Controller
This project uses a Raspberry Pi Pico as both a USB host (using PIO) and as a USB device, acting as an intermediate between a Hyper X Alloy Elite 2 keyboard and the host while also serving a web page over USB-NCM for configuring the RGB lighting at the individual key level.
The Raspberry Pi Pico uses the ADC to determine the ambient brightness using an attached light dependent resistor, then sends RGB control signals to the keyboard. optionally adjusting the brightness of the keys with the LDR reading. The LEDs are set to full brightness when the room is dark, with the LEDs becoming less bright as the ambient brightness increases. In addition, all keyboard input is received by the Pico then forwarding to the host device. Updated programming dynamically updates the HID descriptors and HID report descriptors to match those on the device plugged into the Pico. This allows HID reports to be passed directly without any processing for increased responsiveness and for all input functionality of the keyboard to be preserved. This includes full compability of the media keys and volume scrol wheel.
Web Keyboard
This project turns a Raspberry Pi Pico W into a web-based keyboard. Keyboard input from a webpage is captured and forwarded to the Pico W’s host device. (YouTube video)
The latest version has improved performance by using a WebSocket connection instead of HTTP GET requests sent from a JavaScript queue. A WebSocket implementation that can be run alongside an unmodifed HTTPD module was written on top of lwIP to support the lower latency protocol.
Code
I frequently write programs for computations related to research and general software for computers and microcontrollers for my own use. Occasionally, the code may be of interest to others who are looking to do the same or similar things. Below are some projects that I think might be interesting and/or useful for others. I have tried to provide a minimal amount of documentation and/or instructions for usage, but as this is mostly code generated purely for my own purposes, they are not up to professional standards. The software are provided as-is, but if you have questions or suggestions for improvement, please feel free to reach out. The repositories are configured to allow cloning over HTTPS, but for the security of the servers, the ability to push/merge changes has been blocked.