MAJ:

  • La dernière mise à jour date du 08 juillet 2023.
  • Elle utilise la distribution Debian Bullseye (d’avril 2023).
  • Elle met en œuvre un afficheur e-paper WaveShare.

Resources:

Il s’agit d’un projet pour Raspberry Pi visant à créer une radio Internet destinée à un niveau de compétence intermédiaire. Une certaine familiarité avec l’utilisation de Linux sera bénéfique.
Raspberry Pi exécute le « Music Player Daemon » MPD pour recevoir et décoder le flux de radio Internet.
ALSA fonctionnant sur le Raspberry Pi fournit le son via la prise Jack Socket ou la sortie HDMI.

Objectifs:

  • Apprendre à utiliser le mpd / mpc sur le Raspberry Pi
  • Faire une radio Internet cool

Prérequis:

  • Raspberry Pi2
  • Écran SSD1306 128×32 SPI OLED display de chez Adafruit (ou équivalent)
  • Clé WiFi si le Raspberry n’est pas équipé du WiFi

Les programmes utilisés sur le PC pour agir sur le Pi:

    • Pour se connecter en mode console au Pi:
      • Bitvise (pour se connecter & transférer des fichiers entre le PC & le Pi) Utilisateur: pi   Mdp: raspberry
    • TightVnc (sur le PC) en option pour prendre la main sur le Pi. Mdp: MrdVnc

Etape 1: Création de la carte SD avec Raspberry Pi Imager

Sans oublier les options (la roue dentée)

Cette nouvelle façon de charger la carte SD permet d’activer directement le SSH, VNC et le WiFi.

Étape 2: Mise à jour du Pi et de son heure

Nota: Toutes les instructions suivantes (celles commençant par $) sont à saisir dans Bitvise. Elles sont « collables » (sans le $) par le presse-papier. Dans Bitvise, le coller se fait par le clic droit de la souris.

$ sudo apt-get update
$ sudo dpkg-reconfigure tzdata

Étape 3: Validation du SPI et du I2C sur le Pi

$ sudo raspi-config

Cela lance l’interface de configuration du Raspberry Pi.

  • Sélectionner « Interface Options » puis valider
  • Sur le nouvel écran, sélectionnez « SPI » puis valider
  • Répondre « Yes » à toutes les questions qui suivent.
  • Faire de même pour I2C.

Il faut vérifier que le SPI n’est pas interdit:
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
Si le fichier est vide, pas de problème. Sinon, ajouter un # devant la ligne blacklist spi-bcm2708 pour l’inhiber.

Validation de VNC sur le Pi

Cette option est intéressante si la version de l’OS choisie comporte le bureau (desktop).

$ sudo raspi-config

Cela lance l’interface de configuration du Raspberry Pi.

  • Sélectionner « Interface Options » puis valider
  • Sur le nouvel écran, sélectionnez « VNC» puis valider
  • Répondre « Yes » à toutes les questions qui suivent.

Étape 4: Installation des packages

$ sudo apt-get install git
$ git clone https://github.com/wiringpi/wiringPi
$ cd wiringPi
$ ./build
$ cd ..

$ pip install wiringpi2

$ git clone https://github.com/doceme/py-spidev.git
$ cd py-spidev

$ python setup.py build
$ sudo python setup.py install
$ cd ..

$ sudo apt-get install mpc mpd

$ sudo -H pip3 install pyalsaaudio

$ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
$ tar zxvf bcm2835-1.71.tar.gz
$ cd bcm2835-1.71/
$ sudo ./configure && sudo make && sudo make check && sudo make install

$ sudo apt-get install python3-pip
$ sudo apt-get install python3-pil
$ sudo apt-get install python3-numpy
$ sudo pip3 install RPi.GPIO
$ sudo pip3 install spidev

Etape 5: Le programme Python.

Celui qui suit, c’est le Mrd prog qui est dans la Kty’s Web Radio.
Il se situera dans le répertoire /home/pi/MrdWebRadio.

Il faut donc d’abord le créer et s’y placer
$ md /home/pi/MrdWebRadio
$ cd /home/pi/MrdWebRadio

En utilisant nano ou votre éditeur favori, entrez le code Python suivant:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os

AppDir = os.path.dirname(os.path.realpath(__file__))
#print (« Répertoire de l’application:  » + AppDir)

picdir = os.path.join(AppDir, ‘pic’)
#print (picdir)

libdir = os.path.join(AppDir, ‘lib’)
#print (libdir)
if os.path.exists(libdir):
    sys.path.append(libdir)

import time
from time import sleep, strftime
from subprocess import call
import subprocess
import alsaaudio, sys, os
import RPi.GPIO as GPIO

import logging    
import math
import traceback
from waveshare_OLED import OLED_0in96
#from waveshare_OLED import OLED_1in3
from PIL import Image,ImageDraw,ImageFont
logging.basicConfig(level=logging.DEBUG)

wifi=0
statusRadio=0

# ——————————–Pour afficher la date en Francais
dic_jour={‘Mon’:’Lundi’,’Tue’:’Mardi’,’Wed’:’Mercredi’,’Thu’:’Jeudi’,’Fri’:’Vendredi’,’Sat’:’Samedi’,’Sun’:’Dimanche’}
dic_mois={‘Jan’:’Janvier’,’Feb’:’Fevrier’,’Mar’:’Mars’,’Apr’:’Avril’,’May’:’Mai’,’Jun’:’Juin’,’Jul’:’Juillet’,’Aug’:’Aout’,’Sep’:’Septembre’,’Oct’:’Octobre’,’Nov’:’Novembre’,’Dec’:’Decembre’}

# ——————————–GPIO utilisé pour les poids du rotacteur
A1 = 4 #7    #GPIO4
A2 = 17 #11    #GPIO17
A3 = 27 #13    #GPIO27
A4 = 22 #15    #GPIO22
GPIO.setmode(GPIO.BCM)
GPIO.setup(A1, GPIO.IN)
GPIO.setup(A2, GPIO.IN)
GPIO.setup(A3, GPIO.IN)
GPIO.setup(A4, GPIO.IN)

#try:
disp = OLED_0in96.OLED_0in96()
#disp = OLED_1in3.OLED_1in3()

logging.info(« \r 0.96inch OLED « )
# Initialize library.
disp.Init()
# Clear display.
logging.info(« clear display »)
disp.clear()

# ———————————Chargement des stations dans MPC (WebRadio Player)
# Elles sont dans le fichier « MesFlux.cfg »
MesFlux = open(AppDir + « /MesFlux.cfg », « r ») # ouverture du fichier en lecture
MonContenu = MesFlux.read()        # Lecture du fichier complet
MesLignes = MonContenu.split(« \n ») # separation en lignes (une par station)
LibelleStations=[]                 # Creation d’une liste vide de nom de stations

os.system(« mpc stop »)
os.system(« mpc clear »)
os.system(« mpc volume 100 »)

for i in MesLignes:
    MesElements = i.split(« \t »)    # Séparation des lignes en champs (separes par des tab)
    LibelleStations.append (MesElements[1]) # Ajout des noms des stations dans la liste
    os.system(« mpc add « +  MesElements[2])  # Chargement des radios dans MPC
    print (« mpc add « +  MesElements[2])
    
MemStation=0
MaStation=0

def getRotacteurPosition(): # Recuperation de la position du rotacteur (Codage binaire vers les entrees Bit0 — Bit3)   
    CodageStations=0
    if GPIO.input(A1):
        CodageStations=2**0
    if GPIO.input(A2):
        CodageStations=CodageStations+2**1
    if GPIO.input(A3):
        CodageStations=CodageStations+2**2
    if GPIO.input(A4):
        CodageStations=CodageStations+2**3
    if CodageStations==0:
        CodageStations=7
    if CodageStations>10:
        CodageStations=7
    return CodageStations

def clock():
    image1 = Image.new(‘1’, (disp.width, disp.height), « WHITE »)
    draw = ImageDraw.Draw(image1)
    font1 = ImageFont.truetype(os.path.join(picdir, ‘Font.ttc’), 24)
    font2 = ImageFont.truetype(os.path.join(picdir, ‘Font.ttc’), 25)
    #logging.info (« ***draw text »)

    StrStation = « St. » + « %02d » % MaStation
    StrStation = « %02d » % MaStation
    draw.text((0,0),time.strftime(« %H:%M:%S », time.localtime())+ »  « +StrStation, font = font1, fill = 0)
    draw.text((0,35),str(LibelleStations[MaStation-1]), font = font2, fill = 0)
    image11 = image1.rotate(0)
    disp.ShowImage(disp.getbuffer(image11))
    
while 1: #Boucle infinie
    MaStation=getRotacteurPosition()
    if MemStation != MaStation:
        clock()
        sleep(.05)
        MaStation=getRotacteurPosition()
        print (« CodageStations =  » + str(MaStation))
        os.system(« mpc play  » + str(MaStation))
    clock()
    MemStation = MaStation
    
    sleep(.8)

Une fois saisi, enregistrez-le (Ctrl+o) en tant que radio.py, et sortez de nano (Ctrl+x).

Ce Mrd prog utilise un autre fichier (MesFlux.cfg) comme playlist. Il faut donc le créer aussi (toujours avec nano, par exemple, et toujours dans le répertoire /home/pi/MrdWebRadio,):
1 Cherie FM http://cdn.nrjaudio.fm/audio1/fr/30201/mp3_128.mp3?origine=fluxradios
2 Nostalgie http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3?origine=fluxradios
3 France Bleue http://direct.francebleu.fr/live/fbhautenormandie-midfi.mp3
4 Fip http://direct.fipradio.fr/live/fip-midfi.mp3
5 Skyrock http://icecast.skyrock.net/s/natio_mp3_128k
6 Radio Classique http://radioclassique.ice.infomaniak.ch/radioclassique-high.mp3
7 Lyric FM http://av.rasset.ie/av/live/radio/lyric.m3u
8 Rtl 2 http://streaming.radio.rtl2.fr/rtl2-1-44-128
9 Mfm http://mfm.ice.infomaniak.ch/mfm-128.mp3
10 Radio Caroline http://sc6.radiocaroline.net:8040
Une fois saisi, enregistrez-le (Ctrl+o) en tant que MesFlux.cfg, et sortez de nano (Ctrl+x).

Lancez le prog radio.py:
$ python radio.py

Vous devriez maintenant pouvoir changer de station à partir du rotacteur et voir la station sélectionnée sur l’écran LCD.

Étape 7: Démarrez le programme Python dès le boot du Pi

Trouvé sur le site: https://www.raspberrypi-france.fr/lancer-un-script-python-au-demarrage-du-raspberry-pi/

  • Créer un script shell à exécuter

$ cd /home/pi
$ nano lancement.sh
Dans le fichier créé, écrire les commandes pour exécuter votre script Python :
$ cd /home/pi/MrdWebRadio
$ python3 radio.py &
Une fois saisi, enregistrez-le (Ctrl+o) en tant que MesFlux.cfg, et sortez de nano (Ctrl+x).

  • Rendre le fichier exécutable

Avant de pouvoir utiliser ce fichier shell, il faut le rendre exécutable :
$ chmod 755 lancement.sh
Testez votre fichier et vérifiez que votre script python se lance avec la commande :
$ sh lancement.sh
Si tout fonctionne, vous pouvez passer à l’étape suivante.

  • Créer un fichier de logs

Dans votre répertoire utilisateur, créez un dossier “logs” qui contiendra les différents fichiers logs de vos programmes. Ils serviront à avoir une trace écrite en cas d’erreur de votre programme.
$ mkdir /home/pi/logs

  • Ajouter dans le crontab

Crontab est un processus qui permet d’exécuter des scripts en tâche de fond. Il va exécuter des scripts et commandes à des heures précises ou lors d’évènements précis.
Pour ajouter une nouvelle commande dans crontab :
$ sudo crontab -e
En bas du fichier, ajoutez la ligne :
@reboot sh /home/pi/lancement.sh > /home/pi/logs/log.txt 2>&1
Cette ligne va permettre d’effectuer la commande “sh /home/pi/lancement.sh” lors du démarrage du Raspberry Pi, et enregistrera les messages d’erreur et logs dans le fichier “/home/pi/logs/log.txt”.
Sauvegardez avec le raccourci Control + X.

  • Vérifiez que tout fonctionne

Redémarrez votre Raspberry Pi
$ reboot
Si votre programme ne s’est pas lancé ou qu’il y a un problème, regardez alors dans le fichier de logs les erreurs qui sont survenues.

Le schéma de la sélection des stations:

La distribution des GPIO: