mardi 1 décembre 2015

Jukebox DIY : Raspberry Pi + Subsonic



Quoi de mieux pour écouter de la musique que de mettre une pièce dans une fente et d'appuyer sur un gros bouton ? De hocher la tête au rythme du morceau en s'appuyant sur une machine et en sirotant son demi ? D'imposer à toute une assemblée votre morceau de merde préféré, car c'est vous, beau gosse, qui avez mis la pièce ?

Voilà pourquoi j'ai choisi comme premier projet autour du Raspberry Pi de fabriquer un jukebox avec monnayeur et gros boutons.

Petit cahier des charges :
  • un truc encombrant et intransportable
  • un nombre de morceaux limité (on écoute pas ce qu'on veut, on écoute ce qui est proposé)
  • des gros boutons sur lesquels on peut appuyer avec conviction (pas d'écran tactile, c’est désuet)
  • une UI hyper simple sans fioritures, utilisable dans toutes les conditions
  • un monnayeur mécanique avec une pièce qui doit faire du bruit en tombant, genre TCHING SHLINK
Grosses poignées bien tranchantes


Je suis parti du Raspberry Pi 2. L'atout principal de cet ordinateur miniature est le fameux GPIO (general-purpose input/output), un port de 40 broches qui permet d'intérragir avec le monde réel, via des capteurs, boutons, leds... C'est grace au GPIO que certains s'amusent à monitorer leur consommation électrique (plus fun que ça tu meurs), surveiller la température des deux pièces de leur appartement (l'apothéose de l'entertainment), ou encore déclencher l'allumage d'une LED à partir d'un bouton ( -_-!).



 
Pour lire la musique j'ai utilisé Subsonic. Il s'agit d'un serveur de streaming développé en java, et doté d'une API hyper claire et user friendly, assimilable en moins d'une heure. Il est ainsi facile de récupérer les infos des morceaux qu'on aura préalablement uploadés (titre, durée, artiste, pochette...) pour développer sa propre application cliente. Seul petit bémole pour continuer d'utiliser l'API au delà des 30 jours d'essai : acheter une licence à 12$.
Toute la partie gestion du catalogue musical se fait donc via l'interface d'administration de Subsonic (upload des morceaux, recherche des pochettes, création de la playlist). Mais si on ne veut/peut pas raccorder le jukebox au réseau on peut aussi copier directement des morceaux via une clé usb dans le bon répertoire.



L'interface presque responsive
L'application cliente est minimaliste, une simple page html à ouvir dans un navigateur en plein écran. Elle récupère la playlist depuis Subsonic, affiche les morceaux sur des pages contenant chacune 8 sélections possibles (car 8 boutons), avec infos du morceau et image de la pochette. Il est possible de naviguer dans les pages via des boutons Précédent/Suivant. A la sélection d'un morceau, il est ajouté à une file d'attente et une barre de progression apparaît au niveau du titre en cours de lecture. Un morceau ne peut être mis en attente que si une pièce a été insérée dans le jukebox -> $$$. Pour ajouter un peu de piment et provoquer des bagarres j'ai aussi ajouté un bouton Stop : quand quelqu'un a introduit une pièce il est possible d'interrompre la lecture de son morceau. Niveau technos, c'est du basique : html5 + jquery + bootstrap.
Le navigateur de base (Epiphany) fourni dans Raspbian étant très poussif j'ai installé Iceweasel. Tout est controllable depuis un clavier, les boutons physiques étant mappés vers des évènements clavier, on y vient.

Un petit script Python est lancé en tâche de fond pour mapper les boutons physiques (ou plus précisément les changements d'état aux bornes du GPIO) à des évènements  clavier (le monnayeur mécanique utilisé se comporte comme un bouton, quand la pièce tombe elle actionne un petit switch).
Deux façon de détecter les changements d’état, le polling : on boucle à intervalle régulier pour scruter l'état des bornes du GPIO (attention à ne pas faire un while true pour ne pas saturer le CPU), ou l'attente passive. C'est à dire l'utilisation de fonctions de callback délenchées par les changements d'états du GPIO, et cela dans un thread à part, j'ai opté pour cette deuxième façon, beaucoup plus stylée et feng shui.
Il existe différentes librairies pour intéragir avec le GPIO. Ayant eu des petits soucis avec RPi.GPIO, notamment avec le mode permettant de se mettre en écoute des deux changements d'états (rising edge / falling edge), j'ai fini par utiliser la lib PigPio. A noter que celle-ci se démarque également par le fait de pouvoir se connecter à un GPIO distant.
Enfin, pour que le script émette bien les évenements claviers, il faut installer le module python-uinput puis faire un modprobe uinput pour le charger dans le noyau.

Concernant le schéma de câblage : les pins du GPIO sont cablés vers le bouton, et le bouton vers la terre. On applique une tension aux bornes du GPIO en activant  un pulled up resistor (résistance intégrée au GPIO), la pression sur le bouton ferme le circuit et fait donc tomber la tension à 0, c'est ce changement d'état qui est détecté dans le script (vous remarquerez des vrais résistances cette fois, sur le montage, mais rien à voir avec la résistance de tirage, il s'agit juste d'une protection pour le GPIO au cas où). La petite plaque sur laquelle j'ai fait les soudures n'est pas obligatoire, mais c'est plus propre et robuste que de maintenir les fils avec de la patafixe et des trombones.


Le raspberry pi 2, surmonté du son perma-proto hat
Avant de se lancer dans la construction du jukebox je l’ai modélisé en 3D via une application en ligne très accessible : TinkerCad. A la base faite pour de petits modèles à imprimer, mais rien empêche de faire des trucs plus gros tant qu’on reste à l’échelle.







Voilà vous pouvez fabriquer le votre :D

Avertissement : vous devez bien entendu utiliser des morceaux dont vous avez les droits, et/ou possédez les originaux. N'utilisez que vos pièces de 20 centimes à vous. N'utilisez pas votre jukebox autrement que dans le cadre famillial. Et n'allez pas interroger les APIs de Deezer ou Spotify. Et surtout n'essayez jamais de le transporter seul.

La pièce, dans sa chute, actionne le microswitch

Les pièces de 20 cents tomben dans la cagnotte, les autres suivent la descente pour ressortir en façade

Bim!


La porte se verrouille pour protéger le pactole



Code source
http://github.com/glaphil/pijukebox

Ressources
modélisation 3D : https://www.tinkercad.com
boutons et monnayeur : http://www.smallcab.net
 et bien entendu : http://www.google.com 
brioclage du dimanche : http://www.leroymerlin.com
pour récupérer des écrans et systèmes audio : https://vide-greniers.org/