Controlador de áudio físico para Linux usando Arduino Nano e potenciômetros B10K. Desenvolvido com Python (GTK4/LibAdwaita) e Firmware C++.
Descrição: Controlador de volume físico para Linux usando Arduino Nano e Python/GTK4. Controle volumes de apps individuais (Spotify, Chrome) via potenciômetros.
Tags: arduino linux python gtk4 libadwaita pulseaudio volume-mixer maker hardware
- Criar e adicionar
icon.pngao repositório - Adicionar screenshot atualizada da interface (
screenshot.png) - Implementar seletor de aplicativos na GUI
- Adicionar suporte a PipeWire nativo (via compatibilidade pulsectl/pipewire-pulse)
- Criar pacote AUR para fácil instalação no Arch Linux
- Melhorar tratamento de desconexão USB
O Arduino envia leituras dos potenciômetros via Serial (9600 baud) no formato:
P<ID>:<VALOR>
ID: Número do potenciômetro (1, 2, 3)VALOR: Leitura analógica (0-1023)
Exemplo: P1:512 (Potenciômetro 1 em 50%)
- Firmware (.ino): Loop de leitura com debounce simples. Envia dados apenas quando há variação significativa (
THRESHOLD = 5). - Backend Python: Thread dedicada lê a porta Serial.
- PulseAudio Bridge: Mapeia valores 0-1023 para 0.0-1.0 e aplica ao Sink (Master) ou SinkInput (Apps) correspondente usando
pulsectl. - GUI (GTK4): Exibe níveis em tempo real e gerencia conexão. Atualizações de UI são feitas via
GLib.idle_addpara thread-safety.
- 🔊 Controle de volume master do sistema
- 🌐 Controle individual do Google Chrome
- 🎵 Controle individual do Spotify
- 🎨 Interface gráfica moderna com GTK4/Adwaita
- 🚀 Inicia automaticamente com o sistema
- 🔌 Detecção automática do Arduino
- 1x Arduino Nano V3 ATmega328P (USB-C)
- 3x Potenciômetros B10K (10kΩ)
- Jumpers
Arduino Nano:
├─ Potenciômetro 1 (Volume Master)
│ ├─ Pino central → A0
│ ├─ Extremo 1 → 5V
│ └─ Extremo 2 → GND
│
├─ Potenciômetro 2 (Google Chrome)
│ ├─ Pino central → A1
│ ├─ Extremo 1 → 5V
│ └─ Extremo 2 → GND
│
└─ Potenciômetro 3 (Spotify)
├─ Pino central → A2
├─ Extremo 1 → 5V
└─ Extremo 2 → GND
sudo pacman -S arduino-cli python python-gobject gtk4 libadwaita imagemagickgit clone https://github.com/bernardopg/arduino-audio-controller.git
cd arduino-audio-controllerpython -m venv venv
source venv/bin/activate
pip install pyserial pulsectlarduino-cli core update-index
arduino-cli core install arduino:avr
arduino-cli compile --fqbn arduino:avr:nano:cpu=atmega328old arduino_audio_controller
arduino-cli upload -p /dev/ttyUSB0 --fqbn arduino:avr:nano:cpu=atmega328old arduino_audio_controller# Copiar ícone
mkdir -p ~/.local/share/icons/hicolor/128x128/apps
cp icon.png ~/.local/share/icons/hicolor/128x128/apps/audio-controller.png
gtk-update-icon-cache ~/.local/share/icons/hicolor/
# Instalar .desktop
mkdir -p ~/.local/share/applications
cp audio-controller.desktop ~/.local/share/applications/
update-desktop-database ~/.local/share/applications/
# Ativar autostart
mkdir -p ~/.config/autostart
cp audio-controller.desktop ~/.config/autostart/./audio_controller_gui_wrapper.shcd arduino_audio_controller
source venv/bin/activate
python audio_controller.py -a chrome -b spotifyPara controlar outras aplicações, edite audio_controller_gui.py:
self.app1_name = "firefox" # Mude para sua aplicação
self.app2_name = "discord" # Mude para sua aplicaçãoOu use a versão CLI:
python audio_controller.py -a firefox -b vlcsudo usermod -a -G uucp $USER
sudo chmod 666 /dev/ttyUSB0ls /dev/tty* | grep -E "USB|ACM"python audio_controller.py --listPull requests são bem-vindos! Para mudanças grandes, abra uma issue primeiro.
MIT License - veja LICENSE para detalhes.
Bernardo Gomes (bitter)
- GitHub: @bernardopg
- Comunidade Arduino
- Projeto PulseAudio
- GTK/GNOME Team
