Serveur audio vintage

ASUS a lancé récemment un concurrent au Raspberry pi, la TINKER Board. Rien de particulier étant donné que les cartes sont très similaires, l’ASUS est juste un peu plus performante sur le papier.

L’idée est donc d’utiliser cette carte comme serveur de musique pour remplacer l’actuel qui consomme un peu trop pour l’utilisation qu’on en fait. La machine actuelle est une carte mini-ITX montée avec un CPU Atom, un disque SSD pour le système et un disque de 2Tb qui sert de backup et de source de musique.

Avant toute chose, il a fallu trouver un boîtier pour héberger notre nouveau système et on s’est dit qu’un truc kitch à souhait ferait l’affaire, nous sommes donc parti sur un vieux radio-réveil avec boîtier en formica véritable !
L’idée était de partir un max sur du matériel de récupération histoire de ne pas mettre 500 CHF pour fabriquer ce truc 🙂

La première étape a été de virer tout ce qui ne servait à rien, c’est à dire le circuit imprimé, le transfo, le haut parleur et une partie du mécanisme de rotation qui servait pour le sélection de la fréquence radio.

Le gros avantage est qu’on va pouvoir récupérer les 5 boutons poussoirs pour en faire quelque chose et contrôler la TINKER Board. Deux des boutons étaient de simples switch ON-OFF qui restaient en position lorsqu’ils sont enclenchés. Les 3 derniers fonctionnaient de la même manière mais avec une liaison pour que lorsqu’on appuie sur un des 3, celui qui était déjà enfoncé remonte. J’ai donc modifié le tout pour que les 5 boutons deviennent de simples boutons poussoirs sans verrouillage.

On rajoute ensuite un interrupteur général qui servira à couper le 230V des transfos mais qui laissera quand même l’alim à la partie “heure” vu qu’elle fonctionne très bien

Et puis vu la gueule de l’interrupteur, il s’intègre assez bien au reste du boîtier 🙂

Pour l’alimentation de la TINKER j’avais pensé récupérer le petit transfo présent dans la radio mais avec ses 12V alternatifs et son chauffage intégré, je suis plutôt parti sur des modules récupérés dans des adaptateurs secteurs USB.

L’idée de base était d’alimenter le disque dur 2.5″ directement sur la board mais le résultat était relativement aléatoire, d’une part parce que le petit adaptateur SATA-USB que j’ai était instable et d’autre part parce que les USB de la board ne sont pas terribles au niveau courant de sortie. Du coup j’ai opté pour un vieil adaptateur SATA-USB démonté d’un disque 3.5″, le tout alimenté par un petit bloc 12V que j’ai également piqué dans un adaptateur secteur. Nous nous retrouvons donc avec 2 alimentations, une 12V et une 5V.

Le montage de la board se fait comme à l’époque dans nos PC, sur des entretoises avec prolongation filetées.

Pour la connectique des GPIO, je comptais utiliser des connecteurs récupérés sur des vieilles cartes mères mais leur longueur empêche le curseur de fréquence radio de passer… même si il ne servira à rien dans ce montage, on voulait le garder mobile… du coup j’ai adapté des cavaliers de manière relativement fiable mais ça fonctionne pas mal et surtout ça occupe beaucoup moins de place.

Après plusieurs essais un peu dans tous les sens, le disque dur a trouvé sa place à la verticale, tenu par une petite pièce en alu taillée dans un reste de profilé.

Premier test d’intégration du matériel dans le caisson.

La sortie audio de la board est un jack 2.5 mais n’étant pas fan de ces connecteurs, j’ai préféré ajouter des cinches classiques, le tout soudé sur un jack mâle qui viendra se connecter sur la board. Là encore le câble est une récup d’un jack-jack reçu avec du matériel HP et les cinches traînaient dans mes tiroirs.

On passe ensuite à la connexion des boutons poussoirs !

Chaque bouton dispose de 2 rangées de connecteurs séparés et le dernier qu’on voit dépasser sur la photo en a 4 ! Je ne vais utiliser qu’une rangée par bouton, le reste, restera libre. Les GPIO de la board n’allant être utilisés que pour recevoir un signal UP ou DOWN, rien de bien compliqué au niveau câblage puisqu’on va se retrouver avec ça:

J’ai relié les pin communes des connecteurs avec un fil classique non isolé et pour les autres, c’est du fil récupéré dans des carcasses de PC.

Pour la LED en haut du schéma, c’est expliqué plus bas 🙂

Au niveau espace utilisé, ça donne ça avec tout le monde installé

J’ai hésité à chercher un jack coudé pour éviter d’écraser la tête de l’actuel mais au final tout fonctionne comme ça donc pour le moment je reste avec ça.

A l’origine j’avais connecté l’interrupteur général sur la totalité des équipements de la boîte mais du coup ça coupait également l’horloge, je lui ai donc fait un circuit pour elle qui est alimenté en permanence.

La LED représenté sur le schéma plus haut est une petite LED blanche que j’ai rajouté sur le curseur de fréquence radio pour donner un peu plus de “vie” à l’ensemble. Comme elle est connectée sur le 3.3V de la carte, elle n’est allumée que quand l’appareil est en fonction.

Pour l’installation, voulant être aligné avec le curseur, j’ai opté pour mettre la LED en “façade” avec 2 trous dans le plastique pour faire passer les pattes. Vu le diamètre de perçage (0.7mm), c’était relativement chaud.  Le premier trou a été percé avec un outil à main et voulant être plus “droit” pour le 2e, j’ai monté le tout sur la perceuse à colonne mais la vitesse de rotation de la mèche a fait fondre le plastique du curseur et du coup le trou s’est à moitié rebouché. Après un passage à la main, tout est rentré dans l’ordre.

Rajout des fils et de la résistance de manière plus ou moins propre

et installation dans le boîtier.

Ce n’est pas extrêmement propre mais ça fonctionne comme prévu \o/ 

J’ai également du attaquer un peu le boîtier de la LED, elle touchait l’intérieur de la boîte une fois le tout refermé et ça coinçait le curseur… même si il ne sert à rien je voulais qu’il reste mobile.

Une fois le tout refermé, ça a quand même de la gueule 🙂

Je vais probablement aussi remplacer l’espèce de pauvre veilleuse 230V qui se trouve sous les chiffres de l’horloge, vu l’efficacité du truc, une led orange sera nettement plus adaptée !

Les boutons étant couvert avec un vieux bout d’alu, la prochaine étape sera de découper des petits stickers pour les rendre un peu plus classe.

Pour la programmation associée aux boutons, ça ne va pas chercher bien loin, de gauche à droite nous avons les fonctions suivantes:

[chanson précédente] [play/pause] [chanson suivante] [remote off] [shutdown]

Le bouton “remote off” permet simplement d’éteindre à distance une machine qui ne dispose pas de bouton d’arrêt et qui ne peut s’éteindre que via une interface web ou par SSH. Comme on coupe cette machine tous les soirs… ça nous fait gagner du temps 🙂

Et le code python associé:

#!/usr/bin/env python2.7  

import ASUS.GPIO as GPIO
from time import sleep # for the sleep function 
import os # to run shell commands

PWR_BTN = 3   # power-down button
FW_BTN = 5    # plug the firewall-down button
NEXT_BTN = 7  # mpc next song button
PP_BTN = 11   # mpc play pause button
PREV_BTN = 13 # mpc prev song button
GPIO.setmode(GPIO.BOARD) # Set pin numbering to board numbering

# Shutdown interrupt callback
def shutdown(pin):
  if GPIO.input(NEXT_BTN) == GPIO.HIGH:
    sleep(0.3)
    os.system("/usr/bin/mpc next")
    return

  if GPIO.input(PREV_BTN) == GPIO.HIGH:
    sleep(0.3)
    os.system("/usr/bin/mpc prev")
    return

  if GPIO.input(PP_BTN) == GPIO.HIGH:
    sleep(0.3)
    if os.system("/usr/bin/mpc status | grep playing") == 0:
      os.system("/usr/bin/mpc pause")
      return
    else:
      if os.system("/etc/init.d/mpd status") != 0:
        os.system("/etc/init.d/mpd start")
      os.system("/usr/bin/mpc play")
      return
    return

  if GPIO.input(FW_BTN) == GPIO.HIGH:
    sleep(0.3)
    os.system("ssh mpd@machine 'sudo /sbin/shutdown -p now'")
    return

  if GPIO.input(PWR_BTN) == GPIO.HIGH:
    sleep(0.3)
    GPIO.cleanup()
    os.system("/sbin/shutdown -P now")
    return

GPIO.setup(PWR_BTN, GPIO.IN)
GPIO.setup(FW_BTN, GPIO.IN)
GPIO.setup(PP_BTN, GPIO.IN)
GPIO.setup(NEXT_BTN, GPIO.IN)
GPIO.setup(PREV_BTN, GPIO.IN)

# Add interrupt for all button
GPIO.add_event_detect(PWR_BTN, GPIO.RISING, callback=shutdown, bouncetime=200)
GPIO.add_event_detect(FW_BTN, GPIO.RISING, callback=shutdown, bouncetime=200)
GPIO.add_event_detect(PP_BTN, GPIO.RISING, callback=shutdown, bouncetime=200)
GPIO.add_event_detect(NEXT_BTN, GPIO.RISING, callback=shutdown, bouncetime=200)
GPIO.add_event_detect(PREV_BTN, GPIO.RISING, callback=shutdown, bouncetime=200)

try:
  while True:
    # sleep to reduce unnecessary CPU usage
    sleep(5)

except KeyboardInterrupt:
  GPIO.cleanup()

finally:
  GPIO.cleanup()

Bilan final, on arrive à une conso entre 6 et 8 watts contre 25 à 30 pour l’ancienne machine et je devrait pouvoir gagner encore 1 ou 2 watts si j’unifie l’alimentation avec tout en 5V !