Receptor de radio para emisoras de internet con esp8266


Construir un receptor de web radio o streaming mp3 es muy fácil y barato con cualquier placa ESP8266. Son muchas las ventajas de armar este receptor ya que podemos escuchar emisoras con la música de nuestra preferencia, menos comerciales y en algunos casos son nulos.

A pesar de su montaje simple, es un ejemplo de lo poderosos que pueden ser los ESP8266, y como puede generar audio usando la modulación delta-sigma.  Con solo unos pocos componentes externos podemos adecuar la señal enviarla a un parlante activo o sistema de sonido domestico.
Esta es la versión mas minimalista y funcional del web radio ya que las demás versiones presentes en otras paginas no corren correctamente, y el sonido se torna intermitente lo que lo hace imposible de usar en una aplicación real.

Espero que todos puedan replicar este proyecto sin ningun problema en las placas económicas basadas en el ESP8266. En este caso voy a usar la Wemos D1 mini para hacer mas didáctico y fácil de montar.Ustedes pueden usar cualquier ESP8266.

Materiales:
Placa de desarrollo ESP8266 (Wemos D1 mini, nodemcu etc )
3 Resistencias de 330ohm
2 Capacitores de 10uf a 6.3v o superior
Cable usb
Cable de audio estéreo o mono
Parlante activo, amplificadorde audio, parlantes de pc o lo que tengas a mano.

El esquema:


El montaje es muy simple y podemos ver el estado de la conexión a través de un par de LEDs.
La alimentación la podemos tomar de una fuente de 5v directamente a la placa, o usar el puerto USB con un cable de smartphone. Basta con usar los 5v de un cargador, un power bank o como hice en mi caso aproveché el puerto USB del parlante portatil.
La salida de audio que obtendremos será monofonica pues solo tenemos un canal disponible para generar el sonido a partir de la modulación delta sigma.


Como siempre nuestro viejo amigo el Arduino IDE va a ser nuestra herramienta para programar este maravilloso radio.

Es necesario instalar la librería https://github.com/earlephilhower/ESP8266Audio muy útil para generar audio, ya sea usando un convertidor digital analógico externo o como en este caso usando el pin RX como salida modulando el audio por software, esta es la opción mas minimalista y por tanto la calidad es básica. Sin embargo tuve que añadir un filtro a la salida para desacoplar la señal DC y eliminar ruidos y frecuencias indeseables.

IMPORTANTE
Antes de subir nuestro código debemos verificar que este seleccionada la velocidad la placa en 160Mhz y desconectar el pin RX del resto de circuito para que no interfiera durante la programación ya que este se ocupa para reprogramar el micro.

Código:
/*
Ejemplo de como construir un receptor de Web-Radio Wifi  
Basado en el proyecto: https://create.arduino.cc/projecthub/earlephilhower/esp8266-digital-radio-ee747f
y en el ejemplo llamado "WebRadio" de la libreria ESP8266Audio 
que debes instalar disponible en: https://github.com/earlephilhower/ESP8266Audio

Este ejemplo es de dominio publico hagan lo que quieran con el :D

Es necesaria una conexion medianamente estable con el punto de acceso wifi de tu casa.
Se debe debe seleccionar la frecuencia de la CPU en 160Mhz para que funcione correctamente.
*/
#include <ESP8266WiFi.h>
#include "AudioFileSourceICYStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

const int LED_RED = D0;
const int LED_BLUE = D5;
// Enter your WiFi setup here:
const char *SSID = "dorime";
const char *PASSWORD = "wesdx1235";

const char *URL="http://allclassical-ice.streamguys.com/ac32kmp3";

AudioGeneratorMP3 *mp3;
AudioFileSourceICYStream *file;
AudioFileSourceBuffer *buff;
AudioOutputI2SNoDAC *out;

// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc.
void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string)
{
  const char *ptr = reinterpret_cast<const char *>(cbData);
  (void) isUnicode; // Punt this ball for now
  // Note that the type and string may be in PROGMEM, so copy them to RAM for printf
  char s1[32], s2[64];
  strncpy_P(s1, type, sizeof(s1));
  s1[sizeof(s1)-1]=0;
  strncpy_P(s2, string, sizeof(s2));
  s2[sizeof(s2)-1]=0;
  Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2);
  Serial.flush();
}

// Called when there's a warning or error (like a buffer underflow or decode hiccup)
void StatusCallback(void *cbData, int code, const char *string)
{
  const char *ptr = reinterpret_cast<const char *>(cbData);
  // Note that the string may be in PROGMEM, so copy it to RAM for printf
  char s1[64];
  strncpy_P(s1, string, sizeof(s1));
  s1[sizeof(s1)-1]=0;
  Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1);
  Serial.flush();
}


void setup()
{
  Serial.begin(115200);
  
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
  digitalWrite(LED_RED, HIGH);
  digitalWrite(LED_BLUE, LOW);
  
  delay(1000);
  Serial.println("Conectno WiFi");

  WiFi.disconnect();
  WiFi.softAPdisconnect(true);
  WiFi.mode(WIFI_STA);
  
  WiFi.begin(SSID, PASSWORD);

  // Try forever
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("...Conectando Wifi");
    delay(1000);
  }
  Serial.println("Conectado");
  
  audioLogger = &Serial;
  file = new AudioFileSourceICYStream(URL);
  file->RegisterMetadataCB(MDCallback, (void*)"ICY");
  buff = new AudioFileSourceBuffer(file, 8192);
  buff->RegisterStatusCB(StatusCallback, (void*)"buffer");
  out = new AudioOutputI2SNoDAC();
  mp3 = new AudioGeneratorMP3();
  mp3->RegisterStatusCB(StatusCallback, (void*)"mp3");
  mp3->begin(buff, out);
}

void loop()
{
  static int lastms = 0;
  if (mp3->isRunning()) {
    digitalWrite(LED_RED, LOW);
    digitalWrite(LED_BLUE, HIGH);
    if (millis()-lastms > 1000) {
      lastms = millis();
      Serial.printf("Running for %d ms...\n", lastms);
      Serial.flush();
     }
    if (!mp3->loop()) mp3->stop();
  } else {
    Serial.printf("MP3 done\n");
    digitalWrite(LED_RED, HIGH);
    digitalWrite(LED_BLUE, LOW);
    delay(1000);
    
  }
}

Pueden cambiar la URL del streaming y para que funcione correctamente debe ser máximo a 32kbps. Puedes disfrutar de mucha música con total libertad de implementarla en tu proyecto.

Espero que sea de ayuda déjenme sus comentarios.

Este proyecto fue patrocinado por NextPCB. Aprovechemos estos descuentos para llevar nuestros proyectos a otro nivel: 

Regístrate y obtén un cupón de $5 dólares 

Fabricación confiable de placas de circuito multicapa:

10 placas de circuito impreso de 4 capas por solo $12 dolares:

20% de descuento en pedidos de PCB y 15 % en SMT:  

Publicar un comentario

2 Comentarios

  1. Excelente, muito bom, boa qualidade, obrigado por compartilhar, única dificuldade que as rádios que quero escutar, não são MP3, são m3u8 e essas não abrem

    ResponderEliminar