Bruno nous présente son projet avec un Raspberry Pi, comble de la modernité, conjugué avec sa passion pour les téléphones d’un autre temps. Merci Bru!

Philippe

Si vous possédez un raspberry pi et un vieux téléphone à cadran, vous pouvez envisager de créer votre propre jukebox:

U43_jukebox


Préface:

Je possédais un vieux téléphone U43 (l’ancêtre du socotel S63) à titre décoratif, et je lui cherchais une utilité. J’ai donc décidé de lui donner le rôle de jukebox.
J’ai posé les grands principes de base d’un jukebox:

  • Pouvoir choisir dans une liste le numéro de l’album
  • Pouvoir choisir le numéro de la piste de cet album
  • Le choix ’00’ lors de la piste permet de lire l’album dans son intégralité.
  • Chaque morceau doit être lu dans l’ordre de programmation.
  • J’ai rajouté la possibilité d’arrêter la lecture et supprimer toute liste lorsque l’on rentre ‘0000’

 

Installation du système Raspbian:

Je n’aborderai pas ce sujet qui est déjà très bien traite ici : http://elinux.org/RPi_Easy_SD_Card_Setup

 

Paramétrages du Raspbian:

J’ai désactivé l’interface graphique qui ne me sert pas dans ce projet.
J’ai activé la fonction serveur SSH pour les modifications futures afin d’éviter de devoir démonter le jukebox.

 

Préparation du Raspberry sur le réseau:

La mise en réseau se fait de manière standard (modification du fichier /etc/network/interfaces.) . J’ai cependant rencontré un problème que je n’ai pas pu résoudre. A l’origine je voulais mettre en place une liaison wifi, et le dongle acheté précédemment chez deal extrême a été tout de suite reconnu par le système. Cependant, il semblerait que le raspberry pi (ou le dongle) ne pouvait pas conserver un ssid masqué. J’ai donc finalement déclaré forfait et rajouté un câble ethernet. L’adressage IP est statique afin d’éviter à chercher l’adresse obtenue par DHCP.

 

Déclaration des entrées du GPIO:

Le choix de l’album et du morceau se fera à l’aide du cadran téléphonique.

Après analyse du cadran, on peut distinguer deux contacts secs. Je les ai câblé sur deux entrées du GPIO (17 et 18) du Raspberry.

cablage_gpio

La déclaration des ports du GPIO se fait sous le compte root dans le crontab :

# m h dom mon dow command
@reboot sudo /home/pi/gpio_initializer.sh

Le code d’initialisation est le suivant :

#! /bin/bash
#Explications
#gpio17 = ready to send
#gpio18 = data to analyse
#Init des variables
echo "17" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio17/direction
echo "18" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio18/direction

 

Codage de la sélection souhaitée par le cadran:

J’ai créé puis lancé un script qui affichait les valeurs relevées en permanence dans une boucle infinie. Ceci m’a permis de découvrir 3 phases:

  • Etat au repos : le premier capteur (câbles Bleu/Blanc-Bleu) est en position ouverte et le second (Rouge/Blanc-Rouge) en position fermée. L’état au repos est donc : 0 – 1
  • Etat en phase de numérotation (rotation manuelle dans le sens des aiguilles d’une montre) : l’état est désormais à : 1 – 1
  • Envoi de la numérotation (je relâche le doigt est la roue du cadran revient à sa position d’origine) : l’état varie désormais en fonction du chiffre souhaité (par exemple si le chiffre souhaité était 2, les états successifs sont : 1-1 , 1-0, 1-1, 1-0,1-1 puis finalement 0-1, le dernier état étant en fait la position au repos).

Pour finir, nous récoltons les 4 digits nécessaires à l’identification de l’album (les deux premiers digits) et du numéro du morceau (les deux derniers digits).

La fin du script fait appel à un autre script chargé de la gestion de la playlist et du lancement du logiciel de lecture.

On obtient donc le code suivant :

#! /bin/bash
#Explications
#gpio17 = ready to send
#gpio18 = data to analyse
#last_value permet de voir si la valeur precedente etait deja prise en compte

caracter=0
last_value=1
already_done=0
digit=1
disc_1=0
disc_2=0
track_1=0
track_2=0

while true; do
	rts=`cat /sys/class/gpio/gpio17/value`
	if [ "$rts" == "0" ]; then
		sleep 0.1
	fi
	if [ "$rts" == "1" ]; then 
		dta=`cat /sys/class/gpio/gpio18/value`
		if [ "$dta" == "0" ]; then
			if [ "$last_value" == "1" ] && [ "$already_done" == "0" ]; then
				((caracter++))
				already_done=1
				last_value=0
			fi
		elif [ "$dta" == "1" ] && [ "$last_value" == "0" ]; then
			last_value=1
			already_done=0
		fi
	elif [ "$rts" == "0" ] &&  ! ( [ "$caracter" == "0" ] ) ; then
		if [ "$caracter" == "10" ]; then
			caracter=0
		fi
		case "$digit" in
			1)
				disc_1=$caracter
				((digit++))
				;;
			2)
				disc_2=$caracter
				((digit++))
				;;
			3)
				track_1=$caracter
				((digit++))
				;;
			4)	
				track_2=$caracter
				/home/pi/jukebox.sh $disc_1$disc_2$track_1$track_2
				digit=1
				;;
		esac
		caracter=0
	fi
done

Vous pouvez constater que le chiffre zéro ‘0’ est composé de 10 impulsions. La modification est faite en fin de récupération du nombre total d’impulsions de chaque digit.

 

Gestion de la playlist :

A la fin de la numérotation, nous faisons appel au script jukebox.sh qui a pour seul but de rajouter le(s) morceau(x) choisi(s) dans une playlist. Si le fichier playlist.lst n’existe pas, il sera alors créé. Le script reçoit les 4 digits en paramètre d’entrée, scinde ces 4 digits en deux pour en déterminer l’album et le(s) morceau(x )souhaité(s).

J’ai au préalable créé des fichiers XX00.lst contenant chacun le contenu d’un album que je souhaite avoir à disposition dans le jukebox. Voici par exemple le contenu d’un fichier :

nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/01 Natural Blues.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/02 Slipping Away.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/03 Porcelain.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/04 In This World.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/05 Why Does My Heart Feel So Bad.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/06 We Are All Made Of Stars.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/07 Find My Baby.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/08 In My Heart.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/09 Lift Me Up.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/10 Honey.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/11 New York, New York.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/12 Beautiful.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/13 Run On.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/14 Go.mp3
nas-home/Media Center/Musique/Moby/Go - The Very Best Of Moby/15 James Bond Theme.mp3

Chaque album est présent sur un lecteur réseau monté sur le Raspberry au démarrage du Raspbian. Ceci est fait dans le fichier /etc/fstab:

#Mounting the nas volume
//192.168.0.xxx/volume_1        /home/pi/nas-home       cifs    defaults        0       0

 

Voici le code du script jukebox.sh:

#! /bin/bash
playlist="$1"
album="${playlist:0:2}"
track="${playlist:2:2}"
if [ "$track" == "00" ]; then
	tail -n +1 "/home/pi/$album"00.lst >> /home/pi/playlist.lst
else
	tail -n +1 "/home/pi/$album"00.lst |sed -n "$track"p >> /home/pi/playlist.lst
fi

On pourra noter que le script jukebox.sh permet de rajouter la lecture d’un album complet.

 

Lancement du script tone_receiver.sh :

Le lancement du script se fait dans le crontab de l’utilisateur par défaut (pi):

# m h dom mon dow command
@reboot /home/pi/tone_receiver.sh

 

Lecture des morceaux programmés :

Un script lancé dans le crontab de l’utilisateur (pi par défaut dans Raspbian) permet d’initialiser la partie playlist et vérifie toutes les 5 secondes la présence d’un fichier playlist :

# m h dom mon dow command
@reboot /home/pi/mpg321_check.sh

 

Voici le contenu du script mpg321_check.sh :

#! /bin/bash
sleep 5
rm -f /home/pi/playlist.lst
cp /home/pi/playlist.lst.orig /home/pi/playlist.lst
while true; do
        if [ "$(pidof mpg321)" ]
        then
                sleep 5
        else
                if [ -f "/home/pi/playlist.lst" ]
                then
                        mpg321 -@ /home/pi/playlist.lst &
                        sleep 5
                        rm -f /home/pi/playlist.lst
                else
                        sleep 5
                fi
        fi
done

Le script vérifie la présence d’un process mpg321 et d’un fichier playlist.lst.

Si un tel process existe déjà, cela signifie qu’une lecture est déjà en cours. Par conséquent rien n’est fait. Une pause de 5 secondes permet d’éviter de surcharger le système de requêtes de vérification.
Si le process n’existe pas, on vérifie alors la présence du fichier playlist.lst. S’il n’existe pas, rien n’est fait et une pause de 5 secondes est effectué. Si le fichier playlist existe, alors nous lançons la lecture de cette liste. Le fichier playlist.lst est supprimé ensuite afin d’éviter les doublons de lecture.

En début de script, j’effectue une copie d’un fichier playlist.lst.orig qui contient un mp3 présent en local sur le Raspberry qui a été créé avec le logiciel DSPEECH (ce logiciel permet de réaliser une synthèse vocale depuis une saisie de texte). Le fichier mp3 annonce : ‘jukebox is now online’. Ceci permet d’éviter les saisies trop hâtives et ainsi provoquer des erreurs de saisie.

Mise à disposition :

Le jukebox ainsi créé permet de gérer 99 albums contenant chacun 99 titres. Afin de pouvoir facilement identifier le numéro de chaque album, j’ai créé un livret de cartes de visites, et j’ai ensuite acheté des cartes de visite à imprimer soi-même dont j’ai détourné l’usage :

carte