Raspberry Pi Zero, audio output via I2S

luca 26/04/2017 8

Pi Zero è una piccola scheda – parte della famiglia Raspberry – pensata per applicazioni embedded. Il suo bassissimo costo (circa 10€ per la versione W, con connettività wifi) e la capacità di eseguire diversi sistemi operativi la rende la scelta ideale per diverse applicazioni (media center, datalogger…).

L’acquisto di un Raspberry Pi Zero può essere talvolta difficoltoso… è infatti spesso esaurito sui diversi negozi online. Può aiutare il sito ThePiLocator che mostra in tempo reale la disponibilità delle diverse schede Raspberry presso gli store ufficiali.

La scheda Pi Zero purtroppo non offre un connettore audio dedicato: normalmente infatti l’output audio avviene tramite il connettore HDMI:

pizero-i2s08

Sebbene tale scelta vada benissimo per utilizzi quali media center (audio e video sono riprodotti dal televisore collegato via HDMI), non è comoda per applicazioni embedded che hanno la necessità di riprodurre solo file audio (ad esempio per una voce guida…). Anche se esistono dei dispositivi in grado di estrarre il flusso audio dallo stream HDMI, tali dispositivi sono spesso costosi e di grandi dimensioni.

Una soluzione molto semplice, spiegata benissimo in un tutorial di Adafruit, è quella di generare il segnale audio utilizzando due pin PWM (Pulse Width Modulation) e un filtro passa-basso realizzato con alcuni componenti passivi. Questa soluzione ha il vantaggio di essere economica e di facile realizzazione; di contro la qualità dell’audio prodotto non è elevatissima.

Nel tutorial di oggi voglio invece mostrarvi  come ottenere un segnale audio di alta qualità utilizzando il bus I2S.

I2S

I2S è un bus seriale per collegare diversi dispositivi audio tra loro e trasferire, in formato digitale, dei flussi audio.

Le specifiche di tale bus sono state definite da Philips nel 1986. Il bus è formato da almeno 3 linee:

  • clock (indicato come SCK – serial clock o anche come BCLK – bit clock)
  • word select (WS, a volte definito anche LRCLK – left/right clock)
  • serial data (SD, o anche SDATA…)

pizero-i2s09

Possiamo sfruttare il bus I2S per far comunicare il nostro Pi Zero con un amplificatore che accetti in ingresso un segnale digitale su tale bus:

pizero-i2s10

Cosa serve

Ho scelto di utilizzare un amplificatore I2S basato sul chip MAX98357 di Maxim. Questo chip offre in uscita 3.2W e consente di collegare direttamente un piccolo altoparlante da 4 ohm. Sia la breakout board con il chip Maxim sia l’altoparlante sono di Adafruit:

Ho acquistato entrambi da un rivenditore italiano, melopero:

pizero-i2s11 pizero-i2s12

La breakout board viene venduta con una morsettiera a due contatti (per il collegamento con l’altoparlante) e con una serie di pin per alimentazione e bus I2S; entrambi da saldare alla scheda:

pizero-i2s13 pizero-i2s14

L’altoparlante viene venduto con un connettore JST che ho eliminato per poterlo collegare alla morsettiera:

pizero-i2s15 pizero-i2s16

Collegamenti e configurazione

Il collegamento tra Raspberry e la scheda con l’amplificatore MAX98357 richiede 5 fili:

  • 5V Raspberry -> Vin
  • GND Raspberry -> GND
  • PIN18 Raspberry -> BCLK
  • PIN19 Raspberry -> LRC
  • PIN21 Raspberry -> DIN

Ecco un paio di fotografie che illustrano i collegamenti indicati sopra

pizero-i2s17 pizero-i2s18

Procediamo ora alla configurazione software, partendo da una versione recente della distribuzione Raspbian.

Apriamo con un editor di testo (ad esempio nano) il file /boot/config.txt

sudo nano /boot/config.txt

commentiamo (aggiungendo un # ad inizio riga) la voce dtparam=audio=on e inseriamo due nuove voci – dtoverlay=hifiberry-dac dtoverlay=i2s-mmap:

pizero-i2s04

creiamo quindi il nuovo file /etc/asound.conf

sudo nano /etc/asound.conf

e inseriamo il contenuto mostrato nello screenshot seguente:

pizero-i2s05

Come ultimo passo, riavviamo il nostro Raspberry.

Test e mps-youtube

Proviamo a riprodurre un file audio di esempio con il comando:

speaker-test -c2 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav

Se configurazione e collegamenti sono ok, dovremmo sentire una voce pronunciare “front – center” in loop; possiamo terminare la riproduzione con CTRL-C.

Per poter riprodurre dei files mp3, abbiamo bisogno di un player. Ho scelto di utilizzare mpv:

sudo apt-get install mpv

Risentiamo la frase storica di Neil Armstrong – One small step for men, one giant leap for mainking – direttamente dal sito della Nasa:

mpv http://www.nasa.gov/mp3/590331main_ringtone_smallStep.mp3

pizero-i2s19

Vi voglio mostrare infine l’utilizzo di un programma, mps-youtube, che consente di riprodurre tracce audio da Youtube tramite una interfaccia a riga di comando. Essendo scritto in Python3, dobbiamo installare questa versione e uno dei suoi package managerpip:

sudo apt-get install python3 python3-pip

Possiamo quindi installare mps-youtube e le sue dipendenze con:

sudo pip3 install youtube-dl mps-youtube

Eseguiamo il programma con mpsyt. Per prima cosa dobbiamo indicare il player che vogliamo utilizzare (mpv):

pizero-i2s07

Quindi possiamo cercare un video, digitando la stringa di ricerca preceduta da /. In alternativa se già conosciamo l’URL di un video, possiamo riprodurlo con il comando playurl <url>:

pizero-i2s20

Disturbi nel cambio traccia

E’ possibile che nel cambio traccia o comunque all’inizio di una nuova riproduzione sentiate dei disturbi. Il motivo è ben spiegato in questo thread del forum di Adafruit (thread al quale anch’io ho contribuito): tutto è causato dal cambio di frequenza del segnale di clock del bus I2S.

Il modo più semplice per risolvere è riprodurre continuamente un segnale a frequenza fissa (es. 48KHz) di completo silenzio:

aplay -t raw -r 48000 -c 2 -f S16_LE /dev/zero &

Lanciate il comando sopra prima di eseguire mpv o qualsiasi altro player e vedrete che i disturbi scompariranno!

Demo

Ecco un filmato che mostra mps-youtube all’opera (è in lingua inglese ma sono disponibili i sottotitoli in italiano):

8 Comments »

  1. Darren 13/07/2017 at 23:43 - Reply

    I have been trying to do the same thing with the Raspberry pi 3 B with the April release and Jessie interface. Have you tried the RPi 3? I went through the Adafruit tutorial and I have all the commands correct. On Jessie I’m getting a red X and when I go into the audio settings I get that an ALSA device is not available. Any ideas would be appreciated.

    • luca 14/07/2017 at 08:48 - Reply

      Hi Darren, unfortunately I don’t own a Pi3 so I cannot test it…

  2. Dan Powell 24/01/2018 at 04:39 - Reply

    Hi Luca, Thanks for the nice demo and the instructions. I followed them and everything worked nicely except volume. The sound is very, very low and not adjustable with alsamixer. I’m running the rpi-z headless, so that’s all I’ve got. Have you encountered this before? When I run AlsaMixer it says “This sound device does not have any controls”

    • luca 24/01/2018 at 08:05 - Reply

      Hi Dan! Unfortunately no, I did’t find any problems related to volume control… but I found on the official Raspi forum this thread that may help… let me know if it solves your problem!

  3. Paul 15/08/2018 at 15:36 - Reply

    Hi Luca,
    I have the same problem as Dan Powell has. All setting went OK, but the sound is indead very, very low. Get also the same text “This sound device does not have any controls” Tried the volume control setting from the thread you posted, but didn’t get it to work. Do you have some other thoughts what to try?

    running on py zero.

  4. Paul 15/08/2018 at 16:13 - Reply

    Just to add:
    I got the alsamixer back working. Look on this page https://learn.adafruit.com/adafruit-speaker-bonnet-for-raspberry-pi?view=all#raspberry-pi-test.

    I got it in sync and it works. But still the audio is very, very low. Put it on 100% whit alsamixer. The ITEM in alsamixer is now PCM, i don’t see the gain.

  5. Willy 26/09/2018 at 16:07 - Reply

    Ciao, giusto per capire, l’amplificatore che usi, l'”Adafruit I2S 3W Class D Amplifier Breakout – MAX98357A” può gestire solo piccole casse o il segnale emesso può essere utilizzato come segnale di linea per pilotare anche casse attive (con amplificatore integrato) o indirizzato verso un impianto di amplificazione?

    • luca 29/09/2018 at 08:39 - Reply

      ciao, è possibile collegare il suo output a casse attive o amplificatori esterni

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi