Transform a simple Arduino keypad into a powerful productivity tool that executes commands, hotkeys, and macros at the press of a button.
Features • Quick Start • Demo • Configuration • Contributing
A button that executes the command google-chrome & code to open the browser and VS Code, improving efficiency.
|
✅ Custom Button Actions ✅ Multi-Layer Support ✅ Short & Long Press ✅ Command Execution |
✅ Hotkey Automation ✅ Macro Chaining ✅ Plug & Play ✅ JSON Configuration |
As developers, designers, and power users, we constantly switch between applications, execute repetitive commands, and trigger the same hotkey combinations dozens of times a day. Action Pad was born from frustration with this inefficiency.
- ⏱️ Repetitive keyboard shortcuts slow you down
- 🧠 Remembering complex key combinations is mentally taxing
- 💻 Context switching breaks your flow
- 🔄 Running the same terminal commands over and over is tedious
A physical, programmable button pad that puts your most-used actions at your fingertips. One button press can:
- Launch your entire development environment
- Copy text and send a notification
- Switch between different workflow "modes"
- Execute complex multi-step macros
It's like having a custom control panel for your digital life. 🎮
- Arduino board (Uno, Nano, Mega, etc.)
- 4x4 matrix keypad (or any compatible keypad)
- Python 3.6+
- Arduino IDE
1. Clone the repository
git clone https://github.com/HimC29/action-pad.git
cd action-pad2. Install Python dependencies
pip install pyserial pyautogui3. Wire your keypad to Arduino
Connect keypad pins to Arduino digital pins (see Wiring Guide)
4. Upload Arduino code
- Open
/code/arduino/main/main.inoin Arduino IDE - Select your board and port
- Click Upload ⬆️
5. Configure your buttons
# Edit config.json to customize button actions
nano config.json # or use your favorite editor6. Launch Action Pad
# Linux/macOS
./launch.sh
# Windows
launch.bat7. Select your Arduino from the menu and start pressing buttons! 🎉
Matrix keypads typically have 7-8 pins that connect to Arduino digital pins.
- Connect all keypad pins to Arduino digital pins
- Check your keypad's datasheet for the correct pin order (or experiment!)
- Update the Arduino code if your mapping differs from the example
Keypad Pin → Arduino Pin
─────────────────────────
Pin 1 → D2
Pin 2 → D3
Pin 3 → D4
Pin 4 → D5
Pin 5 → D6
Pin 6 → D7
Pin 7 → D8
Pin 8 → D9
💡 Tip: Different keypads may have different pin configurations. If buttons don't respond correctly, try adjusting the pin assignments in
/code/arduino/main/main.ino.
Action Pad uses a simple JSON file to define button behaviors. Edit config.json to customize your setup.
{
"active_layer": "default",
"layers": {
"default": {
"btn1": { /* button config */ }
}
}
}active_layer- The layer that loads on startuplayers- Contains all your layer definitions
Trigger keyboard shortcuts
"btn1": {
"type": "hotkey",
"keys": ["ctrl", "c"],
"long": {
"type": "hotkey",
"keys": ["ctrl", "v"]
}
}Execute terminal commands
"btn2": {
"type": "command",
"command": "google-chrome"
}Chain multiple actions together
"btn3": {
"type": "macro",
"actions": [
{
"type": "hotkey",
"keys": ["ctrl", "c"]
},
{
"type": "command",
"command": "notify-send 'Copied!'"
}
]
}Change to a different button layout
"btn16": {
"type": "layer",
"target": "code-mode"
}Click to expand full config.json example
{
"active_layer": "default",
"layers": {
"default": {
"btn1": {
"type": "macro",
"actions": [
{
"type": "hotkey",
"keys": ["ctrl", "c"]
},
{
"type": "command",
"command": "notify-send --app-name='System' 'Copied text!'"
}
],
"long": {
"type": "macro",
"actions": [
{
"type": "hotkey",
"keys": ["ctrl", "v"]
},
{
"type": "command",
"command": "notify-send --app-name='System' 'Pasted text!'"
}
]
}
},
"btn2": {
"type": "command",
"command": "google-chrome",
"long": {
"type": "command",
"command": "firefox"
}
},
"btn16": {
"type": "layer",
"target": "code-mode"
}
},
"code-mode": {
"btn1": {
"type": "command",
"command": "google-chrome & code"
},
"btn16": {
"type": "layer",
"target": "default"
}
}
}
}Contributions make the open-source community an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated!
- Fork the Project
- Create your Feature Branch
git checkout -b feature/AmazingFeature
- Commit your Changes
git commit -m 'Add some AmazingFeature' - Push to the Branch
git push origin feature/AmazingFeature
- Open a Pull Request
- 🎨 Add new action types (mouse movements, delays, conditionals)
- 🖥️ Build a GUI configuration tool
- 📚 Improve documentation and examples
- 🐛 Report bugs and suggest features via Issues
Thanks to everyone who has contributed to Action Pad!
Want to see your name here? Check out the Contributing section!
- Additional action types (mouse control, delays, conditionals)
- Web-based GUI configuration tool
- Support for ESP32 and Raspberry Pi Pico
- Profile switching for different workflows
- Cloud sync for configurations
- Mobile companion app
Have an idea? Open an issue and let's discuss!
Distributed under the MIT License. See LICENSE for more information.
TL;DR: You can use, modify, and distribute this project freely. Just keep the original license notice.
Built with amazing open-source tools:
- Arduino - The hardware platform that makes this possible
- pyserial - Python serial communication library
- pyautogui - GUI automation for Python
Made with ❤️ by HimC29