Raspberry Pi Zero, audio output via I2S

luca 26/04/2017 0

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):

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