Visualizzazione post con etichetta audio. Mostra tutti i post
Visualizzazione post con etichetta audio. Mostra tutti i post

sabato 6 febbraio 2021

Trasmettere streaming audio da Microfono via ESP32

Era da un pezzo che volevo ottenere uno streaming audio da poter ascoltare attraverso la rete, oggi mi sono deciso a fare dei test, seguendo questo articolo di Julian .
Il sistema e' molto semplice da realizzare, basta collegare un microfono a condensatore al pin ADC1 canale 0 del nostro ESP32, stando attenti al fatto che il pin ADC del ESP32 puo' ricevere soltanto tensioni fino ad 1 volt, quindi se l'uscita del microfono ha dei valori maggiori, dobbiamo provvedere a livellarli con un partitore di tensione.




Di seguito il circuitino:



 

Quindi collegato il microfono tra ADC channel0 e GND del ESP32,  per ottenere lo streaming basta caricare il codice che ha fornito Julian, sostituire utente , password del nostro router e numero IP del computer che ricevera' il flusso audio.

/* Audio streamer with ESP32 and Adafruit elected microphone board. 
 * Created by Julian Schroeter.
*/
#include <Arduino.h>
#include <WiFi.h>
#include <driver/adc.h>

#define AUDIO_BUFFER_MAX 800

uint8_t audioBuffer[AUDIO_BUFFER_MAX];
uint8_t transmitBuffer[AUDIO_BUFFER_MAX];
uint32_t bufferPointer = 0;

const char* ssid     = "YOUR SSID";
const char* password = "YOUR PASSWORD";
const char* host     = "YOUR SERVER IP ADDRESS";

bool transmitNow = false;

WiFiClient client;

hw_timer_t * timer = NULL; // our timer
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; 

void IRAM_ATTR onTimer() {
  portENTER_CRITICAL_ISR(&timerMux); // says that we want to run critical code and don't want to be interrupted
  int adcVal = adc1_get_voltage(ADC1_CHANNEL_0); // reads the ADC
  uint8_t value = map(adcVal, 0 , 40960255);  // converts the value to 0..255 (8bit)
  audioBuffer[bufferPointer] = value; // stores the value
  bufferPointer++;
 
  if (bufferPointer == AUDIO_BUFFER_MAX) { // when the buffer is full
    bufferPointer = 0;
    memcpy(transmitBuffer, audioBuffer, AUDIO_BUFFER_MAX); // copy buffer into a second buffer
    transmitNow = true; // sets the value true so we know that we can transmit now
  }
  portEXIT_CRITICAL_ISR(&timerMux); // says that we have run our critical code
}


void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("MY IP address: ");
  Serial.println(WiFi.localIP());
  
  adc1_config_width(ADC_WIDTH_12Bit); // configure the analogue to digital converter
  adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_0db); // connects the ADC 1 with channel 0 (GPIO 36)

  const int port = 4444;
  while (!client.connect(host, port)) {
    Serial.println("connection failed");
    delay(1000);
  }

  Serial.println("connected to server");

  timer = timerBegin(080true); // 80 Prescaler
  timerAttachInterrupt(timer, &onTimer, true); // binds the handling function to our timer 
  timerAlarmWrite(timer, 125true);
  timerAlarmEnable(timer);

}

void loop() {
  if (transmitNow) { // checks if the buffer is full
    transmitNow = false;
    client.write((const uint8_t *)audioBuffer, sizeof(audioBuffer)); // sending the buffer to our server
  }
}

Per poter ascoltare lo streaming audio, possiamo creare una connessione attraverso, per esempio, il programma nc in linux

nc -l 4444 | aplay -r 8000 -f U8

Io ho utilizzato una Raspberry Pi che ho sulla scrivania, per ricevere il segnale dall' ESP32.

Il tutto funziona anche se dobbiamo utilizzare delle accortezze per schermare le connessioni audio, altrimenti il sistema "raccatta" un sacco di disturbi e l'audio ottenuto non e' eccellente.

Buon divertimento
TecnoGeppetto



mercoledì 13 gennaio 2021

Ascoltare Radio in Streaming con Raspberry Pi

 Tra le altre cose, durante le vacanze di Natale nell'anno della pandemia, mi sono divertito a costruire una radio web con raspberry ed mpc - mpd. Ho scoperto infatti il progetto Music Player Daemon (MPD) un'applicazione lato server flessibile e potente per la riproduzione di musica. Attraverso plugin e librerie può riprodurre una grande varietà di file audio e anche le trasmissioni delle radio in streaming web.


Il sistema e' testuale, cioe' lo si avvia attraverso comandi via shell. E' stato sviluppato un client per il sistema, che ne rende l'utilizzo  estremamente semplice e veloce, il Client si chiama MPC lo puoi trovare qui 

Come funziona?
Molto semplicemente, basta fornire il link allo streaming della radio che ci interessa, ad mpc che automaticamente parte la riproduzione. E' possibile aggiungere una playlist di radio (una sorta di cambio canale) che possono essere selezionate in modo da poter cambiare la programmazione ogni volta si voglia.

Con il comando :

$ mpc add "link_completo_di_http_allo_streaming_audio"

si aggiunge lo streaming alla coda della playlist

$ mpc play

si avvia la riproduzione dello streaming sul device audio di default del sistema.

Per l'utilizzo si Raspberry Pi possiamo creare il sistema pulito si microSD, operazione che oggi e' molto facile e veloce!, installare mpd e mpc direttamente dal repository ufficiale con

$ sudo apt-get install mpd

Possiamo provare subito se tutto funziona ( a me e' andata cosi!):

$ mpc add http://livex.radiopopolare.it/radiopop

$ mpc play

Con questi semplici comandi (sempre che la Raspberry Pi sia collegata ad internet via rete o via WiFi, ovviamente!) dal jack audio, collegando un paio di cuffiette o gli altoparlanti amplificati, si dovrebbe il flusso audio della radio web.

Nel caso che qualcosa non funzioni, possiamo fermare il servizio mpd che parte in automatico appena scaricato con:

$ sudo /etc/init.d/mpd stop

Ci possiamo creare una copia di backup del file di configurazione 

$ sudo cp /etc/mpd.conf /etc/mpd.conf.originale

E controllare che la configurazione sia simile a questa, aprendo iol file di configurazione attraverso un editor di testo (nano):

$ sudo nano /etc/mpd.conf

quindi cercare e controllare :

audio_output {
type               “alsa”
name            “Raspberry Onboard Audio” (verra’ visualizzato sul client)
device           “hw:0,0”
mixer-device “default”
mixer-control “PCM”
mixer-index   “0”
}

Nel caso modificare ed uscire dall'editor salvando.

Per far ripartire il servizio mpd:

$ sudo /etc/init.d/mpd start

Tutto dovrebbe funzionare correttamente.


Buon divertimento 

TecnoGeppetto