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:
- https://ouiaremakers.com/posts/tutoriel-diy-veritable-radio-reveil-raspberry-avec-radio-internet-et-ecran-lcd
- https://deusyss.developpez.com/tutoriels/RaspberryPi/PythonEtLeGpio/
- https://www.waveshare.com/wiki/2.13inch_e-Paper_HAT
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
- Pour se connecter en mode console au Pi:
Etape 1: Création de la carte SD avec Raspberry Pi Imager
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
$ 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: