Suringénierie d’un système de son DIY

Suringénierie d’un système de son DIY

Voici un descriptif (long) de mes bidouilles pour monter un système de son de salon DIY avec plein de logiciel libre dedans. Personnalisé aux petits oignons 🧅. Un peu de Raspberry Pi 🍓, une carte son FIIO X3 en USB, et beaucoup de logiciels libres qui discutent entre eux.

🔙 Épisodes précédents

En 2016, j’ai essayé d’utiliser Volumio comme système de son pour mon salon, pas un grand succès, voici une nouvelle tentative, j’en profite pour jouer avec plein de technologies. Vous pouvez voir cela dans une longue liste de pratiques d’écoute que j’ai commencé à documenté en 2013.

🐧 Debian de base et Mopidy

Retour à la base, pour éviter d’avoir une distribution construite par un tiers, j’installe une debian de base https://www.debian.org/ en utilisant https://www.raspbian.org/.

Ensuite, c’est parti pour utiliser l’écosystème de mopidy https://mopidy.com/ que j’avais vu utilisé sous le super projet PiMusicBox et qui est écrit en Python avec un système de plugins.

Peut-être qu’un jour j’irais encore « plus bas niveau » et j’installerais Music Player Daemon (MPD) et des trucs par dessus. Pour l’instant on va se contenter de Mopidy-MPD pour l’écosystème MPD.

La musique est sur un NAS (aussi debian 😍 ) et monté en NFS. Pas trivial de scanner ma collection conséquence (MP3 et FLAC) mais j’ai fini par y arriver (je vais probablement contribuer des améliorations).

⬆️Migration Mopidy

Après quelques semaines à bidouiller avec Mopidy, la migration vers python3 (tant attendue) est arrivée. J’ai du suivre les instructions sur leur FAQ car la mise à jour cassé migration à un peu tout cassé. D’ailleurs je pense que j’ai du passer à des pip install au lieu des beaux paquets debian initialement utilisés.

🕸 Interfaces web mopidy

Un des trucs chouette avec mopidy est son ecosystème d’interfaces web, notamment celles un peu sexy avec des visualisation des pochettes de disques. Voici une liste de celles que j’ai testés :

Finalement (pour l’instant) je ne les utilisé pas beaucoup.

📺 Écran OLED

Un des objectifs de ce système de son du salon est de fonctionner sans avoir à utiliser un ordinateur, ni un smartphone, ni une tablette… du coup je me suis tourné vers les écrans OLED que j’avais en stock pour d’autres projets.

Source

Avec volumio j’avais essayé le plugin de NanoSound de NanoMesher (écrit en python), mais celui-ci n’était pas trop maintenu, tombais en panne à presque chaque mise à jour, était difficilement personnalisable. Ils font des produits plutôt sympas, assez open vu d’ici.

Coté matériel j’avais un écran « fin » et un écran un peu plus « large » des SSD1306 très bien supporté par les librairies développées par Adafruit. Si vous voulez les soutenir, achetez vos OLED chez eux. 128×64 pixels ça reste petit… Challenging…

📜 Text based

À la recherche d’un outil pour facilement personnaliser l’affichage OLED j’ai exploré plusieurs pistes

  • luma est une excellente librairie en python 🐍, le code est clair, de la bonne documentation, des exemples bien fournis,
  • node-red-contrib-oled permet de faire des choses simples comme envoyer du texte et des forme depuis Node-RED (voir plus bas)

🖌 Rendu d’images avec jimp

Coté Node-RED je suis aussi tombé sur node-red-contrib-image-tools qui lui même enrobe JavaScript Image Manipulation Program. Chouette bibliothèque javascript, la documentation est bien faite, on peut jouer avec assez facilement dans https://jsfiddle.net/.

J’ai réussi à chaîner des transformations (réduction de la taille, noir et blanc, matrice de points pour l’OLED, affichage dans node-red pour debug)

Test d’affichage de la jaquette des disques sur l’écran OLED

La conclusion, comme vous aller voir avec l’écran sous forme d’une tablette android recyclée, est que l’écran est clairement trop petit pour être utile quand on est à quelques mètres (sur le canapé par exemple)…

🛋 Télécommande LIRC

Bon, et pour piloter cela depuis le canapé en lisant une bonne BD, on fait comment ?

Pour recommencer, je branche un capteur infrarouge sur une arduino, il y a pléthore de tutoriels là dessus, par exemple chez Adafruit.

Coté linux et raspberry pi, Lirc est un incontournable, mais je le trouve toujours un peu difficile à utiliser. Ça finit par tomber en marche, j’enregistre les touches de plusieurs télécommandes qui traînent, notamment celle (bien lourde) d’un lecteur CD haut de gamme trouvé dans la rue.

Recepteur infrarouge branché sur la raspberry pi

Faut que je teste un peu la portée du capteur, je pense que ça capte moins loin que mon Philips NP1100 (qui marche encore un peu).

Reste à déterminer comment brancher les signaux captés sur le reste…

🐝 MQTT to the rescue

Pour faire parler les composants entre eux, me suis dit que j’allais continuer à jouer avec MQTT, très largement utilisé en domotique, dont j’ai déjà un serveur chez moi. J’en ai parlé un peu sur mon blog.

lirc2mqtt

Et voilà un projet simple qui brancher ce que voit LIRC sur mqtt : lirc2mqtt on active –listen sur le serveur lircd, on renseigne le serveur MQTT et le tour est joué… plus qu’à brancher cela sur mopidy.

⏳📥📤🎈Node-red

Super tous ces composants. Comment on fait parler tout ce beau monde ?

L’excellent projet Node-RED (dont j’ai parlé sur mon blog ici et ) fourni de une chouette interface pour bidouiller en programmation par bloc logiques qui se transmettent des messages, déclenches des actions, etc. Le tout avec plein de bibliothèques disponibles pour plein d’usages variés qu’on peut combiner sans trop taper de lignes de codes.

Node-RED s’installe à coup de apt install nodered (sur raspbian) et hop, on file sur le navigateur http://localhost:1880 et on commence.

La bibliothèques de blocs se trouve sur https://flows.nodered.org/, il s’agit de « paquets » de code javascript, plus ou moins facile à installer.

Coté composants modipy :

Spaghetti code – entrées en MQTT, on allume et éteint les périphériques, envoie les codes de télécommandes over MQTT sont transformés en commandes mopidy

Tant qu’à avoir un Node-RED on ajoute une petite sonde de température et humidité…

Relevé de temperature envoyé vers graphite, et test d’affichage sur OLED

📴 Automatisation power on / off carte son

La carte son allumé 24h sur 24h me dérangeait un peu en terme de consommation mais aussi de l’usure du matériel pas vraiment prévu pour cet usage, du coup je suis aller chercher comment l’éteindre et la rallumer. J’ai donc trouvé le projet uhubctl pour piloter l’alimentation des appareils USB (disponible sous debian).

Pour couper le FIIO X3 :

sudo uhubctl -a off -p 4

Pour le rallumer :

sudo uhubctl -a on -p 4 -R

J’aimerais faire marcher cela assez dynamiquement lorsque l’on coupe la musique ou lorsqu’elle reprend, mais la reprise après être éteint ne marche pas hyper bien, à améliorer. Je vais peut-être faire moins ambitieux et couper la nuit avec node-red-contrib-light-scheduler.

📱 Affichage Android M.A.L.P.

Un pote m’a refilé une tablette Google Nexus 7, en attendant d’installer postmarketOS dessus, je vais la recycler comme écran.

Comme sur n’importe quel appareil Android, la base c’est de commencer par installer f-droid le catalogue d’application en logiciel libre (moins de trackers, de pub, de anti-features).

Ensuite coté MPD, j’installe M.A.L.P. qui ne marche pas trop mal en mode tablette (même si il y a un fork musicala pour les grand formats).

On donne les coordonnées sur serveur MPD de mopidy à MALP et hop, il affiche ce qui joue et permet de le contrôler (même si je vais préférer la télécommande).

MALP en affichage « Now Playing » (désolé pour la photo de nuit)

Pour récupérer l’état de l’écran (allumé ou pas, quel usage de la batterie) :

adb shell dumpsys power

Pour allumer et éteindre la tablette :

adb shell input keyevent 26

Ensuite on trouve tout plein de commandes :

# up
adb shell input keyevent keyboard 20
# down 
adb shell input keyevent keyboard 19
# swipe from x1,y1 to x2,y2 in j millisecondes
adb shell input swipe 500 1050 500 100 1500
# extrait l’état d'android 
adb shell dumpsys sensorservice -l

J’en profite aussi pour utiliser l’excellent projet scrcpy (qui rentre dans debian) qui permet d’ouvrir une session à distance (via câble USB ou même par le réseau local).

Bref ça ouvre tout un paquet de possibilité pour le ré-usage de téléphones ou tablettes android 🤖 pilotés à distance par un linux 🐧.

Joujou avec le niveau de batterie, de courant et le capteur de luminosité via adb dans node-red

Sur cette partie, il reste encore pas mal de boulot.

Démo / état actuel

J’appuie sur Play sur la télécommande, l’écran s’allume, la musique joue, je peux faire Next, Previous et Pause. Une bonne partie du temps une pochette s’affiche et alterne avec la photo du groupe ou de l’artiste. Quand je fais Stop, la musique s’arrête, l’écran s’éteint… 🎉✨

🎅 Liste au Père Noël

  • pas de réseau sur la tablette android, uniquement via réseau USB,
  • scan big library in mopidy,
  • gestion des playlists,
  • piloter l’écran android avec les flèches de la télécommande,
  • un module node-red qui enrobe les commandes adb plutôt que d’utiliser un exec à chaque opération,
  • brancher tout cela dans une vielle radio retro comme celle démontée il y a quelques années,
  • jouer avec des interfaces e-Paper (mais pour l’instant je trouve cela cher, faudra trouver une liseuse de récup),
  • documenter un projet reproductible par d’autres,
  • etc.

Je m’arrête là, (bravo si vous êtes arrivés ici!), il y a beaucoup trop de choses, qui chacune aurait mérité un article de blog. N’hésitez pas à mettre des commentaires ou me contacter sur mastodon pour me demander des détails techniques. Au delà des discussion démarrés par les tickets sur les différents projets au fil du projet, il faut que j’aille en parler sur les différents forums de ces projets.

Afficher les commentaires Masquer les commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.