Contrôler (physiquement) les sorties audio d'un PC

Contrôler (physiquement) les sorties audio d'un PC

Si vous utilisez votre PC sous Windows pour écouter de la musique en même temps que vous travaillez, et que, en fonction des circonstances, vous écoutez cette musique avec un casque Bluetooth ou des haut-parleurs externes, vous avez probablement remarqué que basculer d'un mode à l'autre est un peu fastidieux. Il faut éventuellement déverrouiller l'économiseur d'écran, puis ouvrir l'interface sound et choisir le périphérique de sortie dans un drop-down. Pourquoi ne pas fabriquer une interface physique qui serait quand même un peu plus pratique?


On aimerait avoir la même chose, mais avec des vrais boutons
On aimerait avoir la même chose, mais avec des vrais boutons



En fait, ce n'est pas fondamentalement compliqué à construire, mais pour le faire bien, cela demande pas mal de travail.

Le hardware

L'idée est d'avoir un petit boîtier connecté à un câble Ethernet PoE, ce qui permettra de le poser à peu près n'importe où pourvu qu'il y ai une prise réseau à proximité. On aimerait un bouton rotatif pour changer de sortie, un écran pour afficher le nom de la sortie active, et pendant qu'on y est, un autre bouton pour contrôler le volume.

On va donc utiliser:

On a besoin d'un YoctoHub-Ethernet, d'un Yocto-MiniDisplay et d'un Yocto-Maxiknob
On a besoin d'un YoctoHub-Ethernet, d'un Yocto-MiniDisplay et d'un Yocto-Maxiknob



Pour les boutons, on va utiliser des encodeurs quadratiques, on en a choisi deux différents:

  • un E33-VT610-M03T de Elma qui clique bien fort quand on le tourne pour sélectionner la sortie audio.
  • un PEC11R-4215F-S0024 de Bourns, plus facile à tourner, pour le volume.


Comme ces deux encodeurs ont une fonction poussoir, on va utiliser celle du bouton de volume pour une fonction "Mute".

On va aussi utiliser la sortie RGB du Yocto-MaxiKnob pour piloter une LED WS2812D-F5 de world-semi qui indiquera si la boîte est en fonctionnement, i.e. si le software qui la pilote est actif.

Pour le boîtier, on a choisi un boîtier 1455k120BU de Hammond. Plutôt que d'utiliser les façades et le système de fixation d'origine, on a taraudé les trous du boîtier et on a découpé de nouvelle façades dans du l'aluminium 1.5 mm qu'on fixe avec des vis M4 a tête (très) plates. On a taillé une petite vitre pour l'écran et la LED dans du verre acrylique 2mm avec une fraiseuse CNC. Les encodeurs sont fixés sur la façade. Les boutons eux-mêmes ont été fabriqués avec une imprimante 3D à résine.


Le boîter et sa facade originale Les élément de la nouvelle façade
Les éléments du boîtier et la façade



Câblage et montage

Le câblage est juste trivial, il suffit de connecter tout les éléments ensemble.

Interconnexion des différents éléments
Interconnexion des différents éléments



Pour obtenir un montage propre, les différents éléments sont fixés sur une plaque de verre acrylique qui se glisse dans le boîtier. Il a fallu couper le Yocto-MiniDisplay en deux pour pouvoir placer la partie écran juste en face de la fenêtre de la façade. Les modules sont interconnectés avec des câbles 1.27-1.27-11 et les boutons sont connectés au Yocto-MaxiKnob à l'aide de câbles Dupont.

L'électronique toute montée
L'électronique toute montée



Une fois la façade et les boutons peints, on obtient un petit objet au look plutôt professionnel.

Pas mal, pas mal...
Pas mal, pas mal...



Le software

Coder la partie logicielle a clairement pris plus de temps que construire la partie matérielle. On a choisi de la coder en C++ parce que cela permet de créer un exécutable sans aucune dépendance.

Principe général

Les encodeurs sont gérés avec des callbacks valueCallback. L'appel de ces callbacks agit sur les configurations des AudioEndPoint de Windows. En parallèle d'autres callbacks sont appelés à chaque changement lié à un AudioEndPoint. Ces callbacks déclenchent un rafraichissement de l'écran de la boîte. Avec cette technique, l'écran se met toujours à jour, peu importe que les changements soient faits depuis la boîte, depuis l'interface de Windows ou même du clavier.

Gestion de la LED

Évidement la boîte ne fonctionne que si le soft qui la gère tourne. Pour indiquer si la boîte est active, on a configuré la LED RGB pour qu'elle soit rouge à la mise sous tension. Le software créée une animation qui passe la LED à vert pendant 15 secondes puis saute dans une autre animation qui passe la LED au rouge. Toutes les 13 secondes le soft réinitialise l'animation verte. Ainsi, la LED reste verte tant que le soft est actif, mais tourne au rouge quelques secondes après que le soft se soit arrêté. On avait déjà utilisé cette technique dans notre détecteur de panne réseau.

Exécution

Évidement, on n'avait pas tellement envie de devoir lancer l'exécutable à chaque fois que le PC démarre. On a donc fait en sorte que le soft puisse tourner à la fois en mode ligne de commande et en mode Service.

Vous pouvez télécharger l'exécutable avec son code source ici. Son utilisation est relativement simple vous pouvez le lancer avec les commandes suivantes:

  • -help: affiche l'aide
  • -install: installe l'exécutable sous la forme d'un service nommé YAudioOutputSwitcher
  • -uninstall: désinstalle le service
  • -start: démarre le service
  • -stop: stoppe le service
  • -hub ip: sauve l'adresse IP du YoctoHub-Ethernet et lance l'execution

Si vous le lancez sans commande, le soft va démarrer avec la dernière adresse de hub enregistrée.

Ça marche
Ça marche



Conclusion

On est très content de notre petite boîte qui permet de choisir la sortie audio et de régler le volume d'un PC en tournant deux boutons. On a utilisé un YoctoHub-Ethernet parce que chez Yoctopuce il y a des prises réseau PoE un peu partout, mais on aurait facilement pu faire une version Wifi avec un YoctoHub-Wireless-n. A l'usage, le seul petit défaut de ce petit bricolage est la taille de l'écran: il faut un peu plisser les yeux pour le lire, mais un Yocto-Display aurait été difficile à intégrer dans une si petite boîte.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.