- RDA5807M IC
- IC PT2258
- Esquemático
- Componentes requeridos
- ¿Cómo obtenemos datos del Asistente de Google?
- Configurar una cuenta de Adafruit para la comunicación
- Configuración de un agente IFTTT para radio FM
- Código y explicación de Arduino
- Prueba de la radio FM controlada por voz usando Arduino
- Mejora adicional
Hoy en día, a la mayoría de nosotros nos gusta escuchar música con nuestros teléfonos inteligentes. Pero hace unos años, este no era el caso, en ese momento, las radios FM eran la primera opción para escuchar música, podcasts, noticias y otros. Hoy en día nadie escucha la radio por música, noticias y demás, siendo la abuela y el abuelo una excepción.
Entonces, para revivir un poco la vieja gloria de la radio FM, en este proyecto, voy a construir una radio FM controlada por voz usando Google Assistance y el popular receptor IC superheterodino RDA5870M.
Además, consulte nuestros circuitos de radio FM anteriores:
- Radio FM basada en Arduino
- Radio FM controlada por teléfono inteligente usando Arduino
- Circuito transmisor FM simple
- Cómo construir un circuito transmisor de FM
RDA5807M IC
El RDA5807M es un sintonizador de radio FM estéreo de un solo chip muy moderno con un sintetizador totalmente integrado, selectividad IF, RDS / RBDS y decodificador MPX que admite el rango de frecuencia de 50MHz a 115MHz. Es un IC receptor de FM de un solo chip muy económico que requiere muy pocos componentes externos para funcionar funcionalmente. Este IC utiliza la interfaz I2C para comunicarse con cualquier dispositivo maestro, por lo que toda esta característica lo hace muy adecuado para dispositivos portátiles.
Este IC tiene un procesador de audio interno que es responsable de su gran calidad de audio.
Algunas de las características básicas incluyen:
- Soporte para bandas de frecuencia mundiales
- Soporte para RDS / RBDS
- Sintonizador digital de FI baja
- Sintetizador de frecuencia digital totalmente integrado
- Control de ganancia automático digital (AGC)
- Refuerzo de graves
- Admite directamente carga de resistencia de 32 Ω
- Regulador LDO integrado y más
Puede obtener más información sobre este IC revisando este proyecto de radio FM basada en Arduino usando RDA5807.
IC PT2258
El PT2258 es un IC diseñado para usarse como un controlador de volumen electrónico de 6 canales, este IC utiliza tecnología CMOS especialmente diseñada para aplicaciones de audio y video multicanal.
Este IC proporciona una interfaz de control I2C con un rango de atenuación de 0 a -79dB a 1dB / paso y viene en un paquete DIP o SOP de 20 pines.
Algunas de las funciones básicas incluyen:
- 6 canales de entrada y salida (para sistemas de audio doméstico 5.1)
- Dirección I2C seleccionable (para aplicación en cadena)
- Separación de canales altos (para aplicaciones con poco ruido)
- Relación S / N de> 100dB
- El voltaje de funcionamiento es de 5 a 9 V
Anteriormente explicamos acerca de este IC en el Proyecto de control de volumen de audio digital PT2258. Puede consultar ese proyecto si desea saber más sobre este CI.
Esquemático
El diagrama de circuito de la radio FM controlada por el asistente de Google se muestra a continuación:
Componentes requeridos
- Microcontrolador NodeMCU - 1
- Controlador de volumen digital PT2258 - 1
- Módulo de radio FM RDA5807 - 1
- Relé SPDT 6V - 1
- Diodo 1n4007 - 1
- Terminal de tornillo 5mmx2 - 1
- Conector de auriculares de 3,5 mm - 1
- Convertidor de nivel lógico - 1
- Resistencia de 10K, 5% - 4
- Resistencia de 150 K, 5% - 4
- Resistencia de 100 K, 5% - 2
- Condensador 10uF - 6
- Condensador 0.1uF - 1
- Cable de puente - 10
¿Cómo obtenemos datos del Asistente de Google?
La imagen de arriba le da la idea básica del proceso de comunicación entre el Asistente de Google y NodeMCU.
El Asistente de Google tiene la autoridad para modificar datos en el servidor IO de Adafruit para hacer que IFTTT con MQTT funcione como un corredor.
Si se produce algún cambio de datos en el lado del servidor (Adafruit IO), eso se refleja en el lado de NodeMCU. Para lograr esto, debe seguir las instrucciones que se dan a continuación:
Configurar una cuenta de Adafruit para la comunicación
Primero, cree una cuenta IO de Adafruit. Inicie sesión en Adafruit IO con sus credenciales o regístrese si no tiene una cuenta. Anteriormente usamos Adafruit IO para construir LED controlados por Alexa, automatización del hogar Raspberry Pi y muchos otros proyectos basados en IoT.
Después de iniciar sesión en la cuenta de Adafruit, Haga clic en Dashboards, luego haga clic en Action> Create a New Dashboard .
A continuación, agregaremos un nuevo nombre y una breve descripción de nuestro nuevo Panel.
Una vez que haya creado el panel, debe obtener el nombre de usuario y la clave activa de su cuenta, como se requiere en el código Arduino. Puede obtenerlo haciendo clic en el icono LLAVE.
Después de eso, haz tres bloques; un bloque de palanca, un bloque de calibre, un bloque de texto.
Los bloques son muy importantes, ya que estos bloques son responsables de la comunicación entre la asistencia de Google y NodeMCU.
Para hacer un bloque, debe hacer clic en el signo + en la esquina superior derecha.
A continuación, vamos a hacer los bloques.
A continuación, debe configurar cada bloque, para eso, debe marcar un bloque en particular y hacer clic en Siguiente paso.
Para este proyecto, no es necesario cambiar ninguna configuración, excepto el botón de alternancia.
El texto en el botón de alternar está en letras mayúsculas, debe convertirlo en una letra pequeña y actualizar los cambios.
Eso es todo, son todas las cosas que necesita configurar en el adafruit IO.
Mi pantalla final se ve así-
Configuración de un agente IFTTT para radio FM
Como siempre, regístrese si no tiene una cuenta o inicie sesión si ya tiene una.
Ahora, necesita crear un Applet. Para eso, siga los pasos a continuación:
Para crear un subprograma, haga clic en el icono de su cuenta y haga clic en Crear.
En la pantalla de creación, haga clic en el icono + después de si.
Después de eso, debe permitir el acceso a su cuenta de Google.
Para eso, debe buscar el Asistente de Google en la barra de búsqueda y hacer clic en el ícono del Asistente de Google.
En la siguiente pantalla, tenemos que elegir un disparador, Recuerde, hicimos tres bloques en el servidor IO de Adafruit, tenemos que crear activadores para esos tres bloques.
Primero, el Bloque de estación de radio, para eso, debemos seleccionar Decir una frase con un ingrediente de texto .
En la siguiente pantalla, tenemos que escribir qué quieres decir y con qué debería responderte el asistente de Google.
Luego haga clic en el botón Crear disparador.
La siguiente pantalla se parece a esto, ya que ha completado la parte Si , es hora de la parte entonces , haga clic en el signo + después de eso .
Se le presentará una pantalla como la imagen de abajo, busque Adafruit y haga clic en el icono de Adafruit.
A continuación, autorice su cuenta de Adafruit con IFTTT, luego haga clic en Conectar.
A continuación, debe hacer clic en Enviar datos a Adafruit IO.
Luego se le presentará un menú desplegable de feeds que ha creado anteriormente en la cuenta de Adafruit.
Elija cualquiera y haga clic en crear acción, debe hacer esto para los tres.
Y con eso, marca el final del proceso IFTTT, la pantalla de mi applet final se ve así,
Código y explicación de Arduino
El código Arduino está ahí para administrar toda la comunicación entre el IC y la comunicación entre Adafruit IO IFTTT y WIFI. El código completo para esta radio Arduino Nano FM se proporciona al final de este tutorial. El código es un poco largo y complejo, aquí hemos explicado el código completo línea por línea.
Primero, necesitamos incluir todas las bibliotecas requeridas, son:
#incluir
Luego, defina el SSID y la contraseña para el WI-FI, este es el SSID y la CONTRASEÑA de su enrutador.
const char * ssid = "Android"; // SSID de su enrutador const char * password = "12345678"; // Contraseña de su enrutador
Luego definimos dos booleanos y una variable, los booleanos se usan para mantener el estado de comunicación de los IC, y la variable de volumen se usa para establecer el nivel de volumen.
bool potStatus; // 1 cuando se establece la comunicación entre la MCU y el IC bool radioStatus; // 1 cuando se establece la comunicación entre la MCU y el IC int volume = 15; // el nivel de volumen predeterminado con el IC comienza con
Luego, configuramos un pin GPIO llamado Relay_Pin para encender o apagar el amplificador.
#define Relay_Pin D7 // Este pin se usa para encender y apagar la radio
A continuación, necesitamos definir todas las definiciones necesarias para comunicarnos con Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 para SSL #define AIO_USERNAME "debashis13" // Reemplácelo con su nombre de usuario #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFph Key" // Reemplace con su clave de autenticación del proyecto "//
Las siguientes definiciones FIX_BAND es una definición propietaria utilizada por la biblioteca.
La siguiente declaración definida establece el volumen interno del módulo.
#define FIX_BAND RADIO_BAND_FM // <La banda será sintonizada por este boceto es FM. #define FIX_RADIO_VOLUME 6 /// <Volumen predeterminado del módulo.
A continuación, cree los objetos necesarios para el PT2258, el RDA5807M y el WiFiClient.
PT2258 digitalPot; // PT2258 Objeto RDA5807M radio; // Cliente RDA5807M Object WiFiClient; // Objeto WiFiClient
Luego configure la clase de cliente MQTT pasando el cliente WiFi y el servidor MQTT y los detalles de inicio de sesión.
Adafruit_MQTT_Client mqtt (& cliente, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Configure la clase de cliente MQTT pasando el cliente WiFi y el servidor MQTT y los detalles de inicio de sesión.
Entonces necesitamos suscribirnos a un Feed. ¿Qué te hace preguntar eso?
Si algunos valores, algunos parámetros cambian en el servidor de Adafruit, los cambios se reflejarán aquí.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Métodos utilizados para suscribirse a un feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Métodos utilizados para suscribirse a un feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Métodos utilizados para suscribirse a un feed
A continuación se muestra el prototipo de función para la función MQTT_connect () .
void MQTT_connect (); // Prototipo de función para MQTT Connect
Luego comenzamos nuestro proceso de configuración. Al principio, iniciamos la comunicación UART con el método de inicio.
Serial.begin (9600); // UART comienza Serial.println (); // agrega una línea adicional para espaciar Serial.println (); // agrega una línea adicional para espaciar A continuación, hacemos todo lo habitual para conectarnos a WiFI **************** todas las cosas habituales necesarias para una conexión WiFi *********************** / Serial.print ("conectarse a"); Serial.println (ssid); Modo WiFi (WIFI_STA); WiFi.begin (ssid, contraseña); while (WiFi.status ()! = WL_CONNECTED) {retraso (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi conectado"); Serial.println ("dirección IP:"); Serial.println (WiFi.localIP ()); / **************** todas las cosas habituales necesarias para una conexión WiFi ********************** /
A continuación, llame al método Wire.begin () para crear una instancia de una conexión I2C y llamamos al método Wire.setClock () para fijar la frecuencia I2C a 100 KHz, ya que es la velocidad máxima del PT2258 IC.
Wire.begin (); // comenzar la secuencia de inicio I2C Wire.setClock (100000); // configurar el reloj I2C a 100 KHz
A continuación, llame al método init () tanto para el circuito integrado PT2258 como para el RDA5807 y mantenga el estado de retorno en los valores booleanos previamente definidos.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Luego, verifique si la MCU pudo comunicarse con el IC o no. Hacemos esto con dos declaraciones if else .
if (potStatus) {Serial.println ("¡Dispositivo PT2258 encontrado!"); } else {Serial.println ("No se pudo iniciar PT2258"); } if (radioStatus) {Serial.println ("¡Dispositivo RDA5807M encontrado!"); } else {Serial.println ("No se pudo iniciar RDA5807M"); }
A continuación, llame al método subscribe de la biblioteca MQTT. El servidor MQTT nos notificará si se produce algún cambio en nuestros feeds suscritos.
mqtt.subscribe (y Radio_Station); // Configurar la suscripción MQTT para Radio_Station feed mqtt.subscribe (& Toggle_FM); // Configurar la suscripción MQTT para Toggle_FM feed mqtt.subscribe (& Volume); // Configurar la suscripción MQTT para la alimentación por volumen
A continuación, configuramos el pin de relé como salida y el estado del pin en BAJO
pinMode (D7, SALIDA); escritura digital (D7, BAJA);
A continuación, establezca un volumen de radio predeterminado, este parámetro establece el volumen interno del RDA5807 IC, que marca el final de nuestro proceso de configuración.
radio.setVolume (FIX_RADIO_VOLUME); // a continuación establecemos el volumen de radio normalizado radio.setMono (false); // no queremos que el chip dé salida mono radio.setMute (false); // no queremos que el chip se silencie al inicio
Comenzamos el ciclo llamando a la función MQTT_connect () que establece una conexión con el servidor MQTT.
En la función de conexión MQTT, intentamos tres veces hacer una conexión con el servidor MQTT.
Si tiene éxito, recibimos un mensaje de éxito; de lo contrario, recibiremos un mensaje de error.
void MQTT_connect () {int8_t ret; // Entero de 8 bits para almacenar los reintentos // Detener si ya está conectado. if (mqtt.connected ()) {return; } Serial.print ("Conectando a MQTT…"); uint8_t reintentos = 3; while ((ret = mqtt.connect ())! = 0) {// connect devolverá 0 para Serial.println conectado (mqtt.connectErrorString (ret)); Serial.println ("Reintentando la conexión MQTT en 5 segundos…"); mqtt.disconnect (); retraso (5000); // espera 5 segundos reintentos--; if (reintentos == 0) {// básicamente muere y espera a que WDT me reinicie while (1); }} Serial.println ("¡MQTT conectado!"); }
A continuación, comience creando un puntero a un objeto Adafruit_MQTT_Subscribe . Usaremos esto para determinar qué suscripción se recibió.
Suscripción Adafruit_MQTT_Subscribe *;
A continuación, esperamos un mensaje de suscripción.
mqtt.readSubscription (timeInMilliseconds) escuchará un cierto tiempo, para cualquier mensaje proveniente del servidor MQTT.
Si recibe un mensaje antes del tiempo de espera, responderá con un puntero a la suscripción o simplemente agotará el tiempo de espera y devolverá 0. En ese caso, esperará 2 segundos.
while ((suscripción = mqtt.readSubscription (20000)))
Si se produce un tiempo de espera, el tiempo de llenado de bucle falla. Si no, comparamos qué suscripción y obtendremos nuestras suscripciones conocidas.
En este código, hacemos esto para los tres feeds suscritos.
if (suscripción == & Toggle_FM) if (suscripción == & Radio_Station) if (suscripción == & Volumen)
Estos fueron los tres parámetros principales que debe comprender en la sección de bucles.
Esta sección del código se usa para monitorear y configurar el feed Toggle_FM .
if (subscription == & Toggle_FM) // ¿es un mensaje de Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // imprimimos los datos del feed solo para depurar if (String ((char *) Toggle_FM.lastread) == String ("on")) // comparamos los datos recibidos con un parámetro conocido, en este caso estamos esperando que "on "viene del servidor {// pero antes de hacerlo tenemos que convertirlo en una cadena que hace que la comparación sea muy fácil. digitalWrite (D7, HIGH); // si obtenemos una cadena" on "del servidor que estamos creando el pin D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // nuevamente estamos comprobando la cadena off {digitalWrite (D7, LOW); // si obtenemos un cadena "off" del servidor, estamos haciendo que el pin D7 sea BAJO}}
Esta sección del código se utiliza para monitorear y configurar la alimentación de Radio_Station .
if (suscripción == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // escucha que estamos buscando la cadena Big FM {radio.setBandFrequency (FIX_BAND, 9270); // si la condición anterior es cierta, estamos configurando el canal radoi en 92.7MHz} // El proceso mencionado anteriormente continúa a continuación if (String ((char *) Radio_Station.lastread) == String ("Red FM")) { radio.setBandFrequency (FIX_BAND, 9350); } if (String ((char *) Radio_Station.lastread) == String ("Radio Mirchi")) {radio.setBandFrequency (FIX_BAND, 9830); }}
Esta sección del código se usa para monitorear y configurar la alimentación de volumen.
if (suscripción == & Volumen) // // escuchamos que estamos comprobando el volumen de la cadena y es un valor entero en un formato de cadena // Tenemos que convertirlo de nuevo a un número entero para cambiar el volumen con la ayuda del PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volumen = atoi ((char *) Volume.lastread); // Estamos usando el método atoi () para convertir un puntero de carácter en un entero volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // ya que pt2258 solo entiende valores enteros en dB // estamos mapeando el valor 0dB - 79dB a 0% - 100%. digitalPot.setChannelVolume (volumen, 0); // después de todo eso estamos configurando el volumen para el canal 0 del PT2258 IC digitalPot.setChannelVolume (volume, 1); // después de todo eso estamos configurando el volumen para el canal 1 del PT2258 IC}}
Prueba de la radio FM controlada por voz usando Arduino
Para probar el circuito, se utilizó el siguiente aparato:
- Un transformador que tiene un Tap 13-0-13
- Dos altavoces de 4Ω 20W como carga.
- Teléfono para usar el Asistente de Google.
En un artículo anterior, le mostré cómo hacer un amplificador de audio simple de 2x32 vatios con TDA2050 IC, también lo usaré para esta demostración, He desordenado el potenciómetro mecánico y corto dos cables con dos pequeños cables de puente. Ahora, con la ayuda de dos botones, pude cambiar el volumen del amplificador.
Mejora adicional
Hay muchas mejoras adicionales que se pueden realizar en este circuito.
- Hay varios problemas de ruido debido a que una fuente de audio está funcionando al lado de NodeMCU, por lo que debemos implementar un blindaje adicional para mejorar la inmunidad al ruido.
- La construcción del circuito general en una PCB mejorará la inmunidad al ruido.
- Se pueden agregar filtros adicionales a este IC para eliminar el ruido.
Espero que les haya gustado este artículo y hayan aprendido algo nuevo de él. Si tiene alguna duda, puede preguntar en los comentarios a continuación o puede utilizar nuestros foros para una discusión detallada.