Project Click: Open-Source Tactile Companion (Assembly & AI Applet Guide)
by prajjwall in Circuits > Gadgets
35 Views, 0 Favorites, 0 Comments
Project Click: Open-Source Tactile Companion (Assembly & AI Applet Guide)
Project Click is a pocket-sized, open-source tactile fidget device and desk companion designed to quiet background restlessness and help ground focus. Equipped with a 128x64 monochrome OLED display, dual MX mechanical switches, an RP2354A microcontroller, addressable RGB status LEDs, and a piezobuzzer, Click runs modular 1-bit micro-applets like Sisyphus and Just Ten.
This guide walks you through building your own Click using pre-manufactured files and customization options. You do not need to design anything from scratch. All 3D printing STL files, PCB Gerber/BOM/CPL manufacturing files, and firmware source code are completely open-source.
Supplies
To assemble your own Click device, you will need the following materials:
Core Hardware Components
- Assembled PCB (PCBA): The V4 RP2354A single-board circuit board. You can order pre-assembled boards from JLCPCB using the provided Gerber, BOM, and CPL position files, or solder components manually if you prefer DIY assembly. The current version, Click 4, works fine. But I will make some changes down the road. So please check the GitHub link for the latest file.
- 2x MX Keyswitches & Keycaps: Standard 3 pins MX mechanical key switches for the MODE and ACTION inputs, plus two 1U keycaps of your choice.
- 0.96 inch Monochrome OLED Display: 4-pin I2C interface (128x64 resolution, SSD1306 driver).
- LQ-S1 LiPo Battery: 3.7V rechargeable lithium-polymer smartwatch battery (commonly found on Amazon, AliExpress, or electronic hobby sites). Like this or this. This is a pretty common battery used in smartwatch, but make sure the dimensions and pin positions are correct (24mm x 31mm x 5.1mm)
- 4x M2x10mm Screws: Standard mechanical screws to secure the top and bottom enclosure halves together.
- Light Diffuser: You can 3D print the light diffuser insert using transparent PLA or PETG filament. Alternatively, you can use translucent hot glue filled directly into the diffuser window cavity.
Tools & Equipment
- 3D Printer: FDM or SLA printer to produce the top and bottom enclosure shells.
- Small Phillips Screwdriver: For M2 screws.
- USB Type-C Data Cable: For charging and flashing firmware.
- Computer: For browser-based flashing or custom code development in your preferred IDE.
Note on Official Kits: If you do not have access to a 3D printer or prefer not to order custom PCB batches, pre-assembled PCBs and complete ready-to-use kits will be available directly in the near future.
Download the Project Files
All files needed to build or customize Click are hosted open-source on GitHub:
- 3D Printing Files (STLs): Top shell, bottom shell, battery holder, and light diffuser insert.
- PCB Manufacturing Files: Gerber zip, Bill of Materials (BOM CSV), and Component Placement List (CPL CSV) for turnkey SMT ordering via JLCPCB. Or you can just order the bare boards and components separately and do the soldering yourself.
- Source Files & CAD: SLDPRT (SolidWorks CAD) models if you want to modify, or download STLs if you want to print it directly, KiCad schematics, and C++ firmware source code are available in the GitHub repository for those who want to make custom edits.
For the enclosure, there are multiple versions. Just the enclosure showing the PCB on the back side(that's shown here), or with back cover with or without the keychain loop. If you want clear enclosures like I made, JLC3DP's 8001 Resin (Transparent SLA) is your go to option. They also spray paint different colors, if you want eye-candy enclosures.
V4 Production files for JLC here. Editable files in the separate folders. Please navigate through the github files.
3D Print the Enclosure & Prepare the Light Diffuser
Print the enclosure files using your preferred 3D printing technology:
- Top & Bottom Shells: Print at 0.16mm or 0.20mm layer height with 100% infill for durability. Standard PLA, PETG, or ABS works great on FDM printers. Resin (SLA) printing also produces a sleek, premium finish.
- Light Diffuser Option A (3D Printed): Print the diffuser.stl file using clear or natural transparent PLA/PETG.
- Light Diffuser Option B (Hot Glue Method): If you prefer not to print a tiny transparent part, simply apply a small drop of translucent hot glue into the top diffuser cavity from the inside of the top shell. Once cooled, flush-trim any excess glue with a craft knife for a smooth, diffused status LED window.
You can also order fancy enclosures from JLC3DP, like I did. A lot of options to choose from.
Hardware Assembly
Assembly takes approximately 10 to 15 minutes and requires minimum soldering if you are using pre-assembled PCBA:
- Use four 8cm long flexible wires to connect the SDA, SCL, GND, VCC pads of the OLED to the main board. Please follow the html bom file inside the production file carefully to check the pad designations. I might replace this with a jst connector in next version.
- Solder the two MX keyswitches to the board. Dull down their pins on the back side by trimming the excess sharp pins so that it's comfortable to hold and to sit the back cover flush.
- Mount the OLED Display: Align the 0.96 inch OLED display into the designated front screen bezel of the 3D-printed top housing. Note that the display orientation should be 180 degrees.
- place the battery holder part with the wire routing window on the top side.
- VVV IMPORTANT: Install the LQ-S1 Battery by placing it into the battery holder cavity behind the OLED panel. Assuming the USB port is on the top side during the assembly position, the battery connector pads should be facing up and in the right side of the housing during the assembly. This is the step where you might fry the board if you're not careful. the + and - pads of the battery are adjacent and if it touches the wrong pin in the board, you'll damage the board.
- Seat the PCB & Keycaps: Align the PCB over the display and battery assembly, ensuring the USB-C port, SPDT power slide switch, and MX switch pins seat cleanly into place. Start from the bottom. seat the slider to its position in an inclination and slowly lower the board. The PCB has cutouts that align with their respective ribs on the enclosure. The extra wires from the display sit behind the battery, keeping it snug.
- Fasten the Enclosure: Bring the top and bottom enclosure halves together and secure them using the 4x M2x10mm screws through the corner mounting bosses. Do not over-tighten. Or just use without the back cover by just screwing the PCB directly to the enclosure.
**The toggle switch is small and a bit hard to move as it's almost flush to the enclosure surface. I'll change this in the next version.
Flashing Pre-Made Firmware (No-Code Browser Flashing)
If you do not want to write code or set up a programming IDE, you can flash pre-compiled firmwares directly from your web browser:
- Connect your assembled Click device to your computer using a USB Type-C data cable.
- Open Google Chrome or Microsoft Edge and navigate to flashclick.uprajjwal.com.np. Sadly, other browsers do not support webusb.
- Select your desired pre-made firmware build (such as the default OS release with Sisyphus and Just Ten applets). You can also name you device. You can see this custom name during the boot splash screen.
- Click Connect & Flash, select the WebSerial USB device port from the browser prompt, and wait for the automated flashing process to complete.
Whenever you re-flash the device, your game stats will be synced to the leaderboard on click.uprajjwal.com.np. I'll make that optional later. You can also sync the stats separately from the site. This is for fun only, to share what you've achieved and this can be total optional.
Setting Up Your Development Environment
For makers who want to write custom or modify existing applets:
- Install VS Code (Visual Studio Code) or any other preferred IDE on your computer.
- Install the PlatformIO IDE extension.
- Clone or download the Click firmware repository from GitHub and open the firmware folder in VS Code.
- PlatformIO will automatically download the Earle Philhower RP2040/RP2354A board definitions and required libraries (Adafruit_GFX, Adafruit_SSD1306, Adafruit_NeoPixel).
Creating Custom Applets With AI Assistance
The Click firmware architecture is modular and specifically optimized for AI-assisted code generation (using Gemini, Cursor, GitHub Copilot, Claude, or ChatGPT). I did this completely with AI, so the AI must be able to understand it easily.
Using Project_Rules.md for AI Context
In the root directory of the firmware repository, you will find a file named Project_Rules.md. This file contains the complete system architecture, hardware pin mappings, non-blocking timing constraints, and C++ class lifecycles.
When prompting an AI assistant to build a new applet for Click, feed or copy-paste Project_Rules.md into your AI prompt window. The AI will read the file and automatically understand:
- Pin Mappings: I2C display (GP20/GP21), MODE button (GP14), ACTION button (GP2), Battery ADC (GP29), Buzzer (GP27), RGB LEDs (GP11/GP12).
- Non-Blocking Logic: Enforcing millis() timer comparisons instead of execution-blocking delay() calls.
- Applet Lifecycle: Implementing init(), update(), draw(), and onActionClick().
Step-by-Step Custom Applet Workflow
- Ask AI to Generate an Applet: Provide a prompt like this to your AI tool: "Using the architecture rules in Project_Rules.md, write a C++ applet class named ClickCounterApplet. It should display a large digital click counter on the 128x64 OLED screen, increment the score on every ACTION button press with audio feedback on GP27, and save the score to non-volatile memory."
- Add the Applet Code: There is a specific folder, where you can store your applets separately in the respective folders. Create a new file in firmware/src/applets/ClickCounterApplet.h and paste the generated class code or ask AI to do that.
- Register the Applet: Open firmware/src/system/OSManager.cpp, include your new header, and register the applet in the OS loop. If you follow the prompt based development, it should be able to do all this by itself.
- Compile & Flash: Connect Click over USB-C, click the PlatformIO: Upload button in VS Code, and watch your custom applet launch on physical hardware! In the current firmware, the device goes to sleep after 30s of inactivity. To flash, the device needs to wake up, which you can do by double pressing the keys, or turning the device OFF-ON with the slider switch. And if you cannot flash the device, there is a chance that the mcu hasn't gone to the bootloader mode, which you can do by holding the Action Button (the right side) and turning the device on with the slider.
Conclusion & Community
Congratulations! You now have a working, fully customized Click device on your desk.
Whether you flash official releases, 3D print clear resin housings from JLC3DP, or prompt AI to build custom mini-games, Click is designed to be your hackable, tactile companion.
If you build an applet or print a custom shell, consider sharing your creation and submitting a pull request on the open-source GitHub repository!
I'm planning to make a prompt-based applet maker directly from the browser, that doesn't need the whole IDE setup. I'll post the updates on my site and Instagram