- RDA5807M IC
- IC PT2258
- Esquema
- Components necessaris
- Com obtenim dades de l'Assistent de Google?
- Configuració d’un compte d’Adafruit per a la comunicació
- Configuració d’un corredor IFTTT per a ràdio FM
- Codi Arduino i explicació
- Prova de la ràdio FM controlada per veu mitjançant Arduino
- Millora addicional
Actualment, a la majoria de nosaltres ens agrada escoltar música amb els nostres telèfons intel·ligents. Però fa uns anys, aquest no era el cas, en aquell moment, les ràdios FM eren la primera opció per escoltar música, podcasts, notícies i altres. Avui en dia ningú escolta a la ràdio música, notícies i altres, l’àvia i l’avi són una excepció.
Per tant, per reviure una mica la vella glòria de la ràdio FM, en aquest projecte, vaig a construir una ràdio FM controlada per veu mitjançant Google Assistance i el popular RDA5870M Superheterodyne Receiver IC.
A més, consulteu els nostres circuits de ràdio FM anteriors:
- Ràdio FM basada en Arduino
- Ràdio FM controlada per telèfon intel·ligent mitjançant Arduino
- Circuit transmissor FM senzill
- Com construir un circuit de transmissor FM
RDA5807M IC
El RDA5807M és un sintonitzador de ràdio estèreo FM d’un xip molt modern amb sintetitzador totalment integrat, selectivitat IF, RDS / RBDS i descodificador MPX que admet el rang de freqüències de 50 MHz a 115 MHz. És un CI de receptor FM d’un xip molt econòmic que requereix molt pocs components externs per funcionar funcionalment. Aquest CI utilitza la interfície I2C per comunicar-se amb qualsevol dispositiu mestre, de manera que tota aquesta característica el fa molt adequat per a dispositius portàtils.
Aquest CI té un processador d'àudio intern que és responsable de la seva gran qualitat d'àudio.
Algunes de les funcions bàsiques inclouen:
- Suport per a bandes de freqüència a tot el món
- Suport per a RDS / RBDS
- Sintonitzador digital de baix IF
- Sintetitzador de freqüències digitals totalment integrat
- Control digital de guany automàtic (AGC)
- Intensificació dels sons més greus
- Admet directament la càrrega de resistència de 32Ω
- Regulador LDO integrat i molt més
Podeu obtenir més informació sobre aquest CI si passeu per aquest projecte de ràdio FM basat en Arduino mitjançant RDA5807.
IC PT2258

El PT2258 és un CI fabricat per utilitzar-se com a controlador electrònic de volum de 6 canals, aquest IC utilitza la tecnologia CMOS especialment dissenyada per a aplicacions d’àudio-vídeo multicanal.
Aquest CI proporciona una interfície de control I2C amb un rang d’atenuació de 0 a -79 dB a 1 dB / pas i ve en un paquet DIP o SOP de 20 pins.
Algunes de les funcions bàsiques inclouen:
- 6 canals d'entrada i sortida (per a sistemes d'àudio domèstic 5.1)
- Adreça I2C seleccionable (per a aplicacions de cadena Daisy)
- Separació de canals elevats (per a aplicacions de baix soroll)
- Relació S / N> 100dB
- La tensió de funcionament és de 5 a 9V
Prèviament, vam explicar aquesta IC al Projecte de control de volum d’àudio digital PT2258. Podeu consultar aquest projecte si voleu obtenir més informació sobre aquest IC.
Esquema
A continuació es mostra el diagrama de circuits de la ràdio FM controlada per l' Assistent de Google:

Components necessaris
- Microcontrolador NodeMCU: 1
- Controlador de volum digital PT2258 - 1
- Mòdul de ràdio FM RDA5807 - 1
- Relé SPDT 6V - 1
- 1n4007 díode - 1
- Terminal de cargol 5mmx2 - 1
- Presa per a auriculars de 3,5 mm: 1
- Convertidor de nivell lògic: 1
- Resistència 10K, 5% - 4
- Resistència 150K, 5% - 4
- Resistència 100K, 5% - 2
- Condensador 10uF - 6
- Condensador de 0,1 uF: 1
- Jumper Wire - 10
Com obtenim dades de l'Assistent de Google?
La imatge anterior us proporciona la idea bàsica del procés de comunicació entre l'Assistent de Google i el NodeMCU.
L'Assistent de Google té l'autoritat per modificar les dades del servidor d'Adafruit IO perquè IFTTT amb MQTT funcioni com a intermediari.
Si es produeix algun canvi de dades al costat del servidor (Adafruit IO), això es reflecteix al costat de NodeMCU. Per aconseguir-ho, heu de seguir les instruccions que es donen a continuació:
Configuració d’un compte d’Adafruit per a la comunicació
En primer lloc, feu un compte d’Adafruit IO. Inicieu la sessió a Adafruit IO amb les vostres credencials o registreu-vos si no teniu cap compte. Anteriorment, vam utilitzar Adafruit IO per crear LED controlats per Alexa, automatització domèstica Raspberry Pi i molts altres projectes basats en IoT.

Després d’iniciar la sessió al compte d’Adafruit, Feu clic a Taulers i, a continuació , feu clic a Acció> Crea un tauler nou .
A continuació, afegirem un nou nom i una breu descripció del nostre nou tauler.
Un cop hàgiu creat el tauler, heu d’obtenir el nom d’usuari i la clau activa del vostre compte, ja que és necessari al codi Arduino. Podeu aconseguir-ho fent clic a la icona de CLAU.

Després d'això, feu tres blocs; un bloc de commutació, un bloc de calibre, un bloc de text.
Els blocs són molt importants, ja que aquests blocs són responsables de la comunicació entre l'assistència de Google i el NodeMCU.
Per fer un bloc, heu de fer clic al signe + a l'extrem superior dret.

A continuació, farem els blocs.

A continuació, heu de configurar tots els blocs; per a això, heu de marcar un bloc concret i fer clic a Pas següent.
Per a aquest projecte, no cal canviar cap configuració, excepte el botó de commutació.
El text del botó de commutació està en majúscules, heu de convertir-lo en una lletra petita i actualitzar els canvis.
Això és tot, són totes les coses que necessiteu configurar a l’Adafruit IO.
La meva pantalla final té aquest aspecte:

Configuració d’un corredor IFTTT per a ràdio FM
Com sempre, Crear si vostè no té un compte o entrar si ja té un compte.

Ara, heu de crear un applet. Per a això, seguiu els passos següents:
Per crear una miniaplicació, feu clic a la icona del vostre compte i feu clic a Crea.
A la pantalla de creació, feu clic a la icona + després de si.

Després, haureu de permetre l'accés al vostre compte de Google.
Per a això, heu de cercar l'Assistent de Google a la barra de cerca i fer clic a la icona de l'Assistent de Google.

A la pantalla següent, hem de triar un activador, Recordeu, hem creat tres blocs al servidor d'Adafruit IO, hem de crear activadors per a aquests tres blocs.
En primer lloc, el bloc d’estacions de ràdio, per a això, hem de seleccionar Dir una frase amb un ingredient de text .
A la pantalla següent, hem d’escriure què voleu dir i amb què us hauria de respondre l’assistent de Google.

A continuació, feu clic al botó Crea un activador.
La següent pantalla es veu alguna cosa com això, com vostè ha completat el Si banda, és el moment per a la continuació banda, feu clic al + signe després de llavors .

Se us mostrarà una pantalla com la següent imatge, cerqueu Adafruit i feu clic a la icona Adafruit.

A continuació, autoritzeu el vostre compte d'Adafruit amb IFTTT i, a continuació, feu clic a Connecta.
A continuació, heu de fer clic a Envia dades a Adafruit IO.
A continuació, se us mostrarà un menú desplegable de feeds que heu creat anteriorment al compte d'Adafruit.
Trieu-ne qualsevol i feu clic a Crea acció. Cal fer-ho per a tots tres.

I amb això, marca el final del procés IFTTT, la pantalla final de la miniaplicació té aquest aspecte,

Codi Arduino i explicació
El codi Arduino hi és per gestionar tota la comunicació entre l’IC i la comunicació entre Adafruit IO IFTTT i WIFI. El codi complet d'aquesta ràdio FM Arduino Nano es dóna al final d'aquest tutorial. El codi és una mica llarg i complex, aquí hem explicat el codi complet línia per línia.
En primer lloc, hem d’incloure totes les biblioteques necessàries, que són:
#incloure
A continuació, definiu el SSID i la contrasenya per al WI-FI, aquest és el SSID i la CONTRASENYA del vostre enrutador.
const char * ssid = "Android"; // SSID del vostre encaminador const char * password = "12345678"; // Contrasenya del vostre enrutador
A continuació, definim dos booleans i una variable, els booleans s’utilitzen per mantenir l’estat de comunicació dels IC i la variable de volum s’utilitza per establir el nivell de volum.
pot boolStatus; // 1 quan s'estableix la comunicació entre l'MCU i la IC bool radioStatus; // 1 quan s'estableix la comunicació entre la MCU i l'IC int volum = 15; // el nivell de volum per defecte amb l'IC comença per
A continuació, vam configurar un pin GPIO anomenat Relay_Pin per encendre o apagar l’amplificador.
#define Relay_Pin D7 // Aquest pin s'utilitza per encendre i apagar la ràdio
A continuació, hem de definir totes les definicions necessàries per comunicar-nos amb Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 for SSL #define AIO_USERNAME "debashis13" // Substitueix-lo pel teu nom d'usuari #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp" // Substitueix amb el teu projecte
Les definicions següents FIX_BAND és una definició pròpia que utilitza la biblioteca.
La següent instrucció definida defineix el volum intern del mòdul.
#define FIX_BAND RADIO_BAND_FM // <La banda serà sintonitzada per aquest esbós FM. #define FIX_RADIO_VOLUME 6 /// <Volum predeterminat del mòdul.
A continuació, feu els objectes necessaris per al PT2258, el RDA5807M i el WiFiClient.
PT2258 digitalPot; // Ràdio PT2258 Object RDA5807M; // Client objecte RDA5807M WiFiClient; // Objecte WiFiClient
A continuació, configureu la classe de client MQTT passant el client WiFi i el servidor MQTT i les dades d'inici de sessió.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Configureu la classe de client MQTT passant el client WiFi i el servidor MQTT i les dades d’inici de sessió.
Després, ens hem de subscriure a un feed. Què us fa preguntar?
Si es canvien alguns valors, alguns paràmetres al servidor d'Adafruit, els canvis es reflectiran aquí.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Mètodes utilitzats per subscriure's a un feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Mètodes utilitzats per subscriure's a un feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Mètodes utilitzats per subscriure's a un feed
A continuació es mostra el prototip de funció per a la funció MQTT_connect () .
void MQTT_connect (); // Prototip de funció per a MQTT Connect
A continuació, comencem el nostre procés de configuració. Al principi, iniciem la comunicació UART amb el mètode begin.
Serial.begin (9600); // UART comença Serial.println (); // afegeix una línia addicional per a l'espaiat Serial.println (); // afegeix una línia addicional per a l'espaiat A continuació, fem tot el que és habitual per connectar-nos a WiFI **************** totes les coses habituals necessaris per a una connexió WiFi *********************** / Serial.print ("connectar a"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, contrasenya); while (WiFi.status ()! = WL_CONNECTED) {demora (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi connectat"); Serial.println ("adreça IP:"); Serial.println (WiFi.localIP ()); / **************** totes les coses habituals necessàries per a una connexió WiFi *********************** /
A continuació, truqueu al mètode Wire.begin () per iniciar una connexió I2C i anomenem el mètode Wire.setClock () per fixar la freqüència I2C a 100 KHz, ja que és la velocitat màxima del PT2258 IC.
Wire.begin (); // comenceu la seqüència inicial I2C Wire.setClock (100000); // configuració del rellotge I2C a 100 KHz
A continuació, truqueu al mètode init () tant per al PT2258 com per l'IC RDA5807 i manteniu l'estat de retorn als booleans definits prèviament.
potStatus = digitalPot.init (); radioStatus = radio.init ();
A continuació, comproveu si l'MCU ha pogut comunicar-se amb l'IC o no. Ho fem amb dues afirmacions if else .
if (potStatus) {Serial.println ("S'ha trobat el dispositiu PT2258!"); } else {Serial.println ("No s'ha pogut iniciar PT2258"); } if (radioStatus) {Serial.println ("Dispositiu RDA5807M trobat!"); } else {Serial.println ("No s'ha pogut iniciar RDA5807M"); }
A continuació, truqueu al mètode de subscripció des de la biblioteca MQTT. El servidor MQTT ens notificarà si es produeixen canvis en els nostres feeds subscrits.
mqtt.subscribe (& Radio_Station); // Configureu la subscripció MQTT per al canal Radio_Station mqtt.subscribe (& Toggle_FM); // Configureu la subscripció MQTT per al canal Toggle_FM mqtt.subscribe (& Volume); // Configureu la subscripció MQTT per al feed de volums
A continuació, establim el pin del relé com a sortida i l’estat del pin a LOW
pinMode (D7, OUTPUT); digitalWrite (D7, BAIX);
A continuació, configureu un volum de ràdio predeterminat, aquest paràmetre estableix el volum intern de l'IC RDA5807, que marca el final del nostre procés de configuració.
radio.setVolume (FIX_RADIO_VOLUME); // a continuació, configurem el volum de ràdio normalize radio.setMono (false); // no volem que el xip doni una sortida mono radio.setMute (false); // no volem que el xip quedi silenciós al principi
Comencem el bucle trucant a la funció MQTT_connect () que estableix una connexió amb el servidor MQTT.
A la funció de connexió MQTT, intentem tres vegades establir una connexió amb el servidor MQTT.
Si té èxit, rebem un missatge d’èxit; en cas contrari, rebrem un missatge d’error.
void MQTT_connect () {int8_t ret; // Enter de 8 bits per emmagatzemar els reintents // Atureu si ja esteu connectat. if (mqtt.connected ()) {return; } Serial.print ("Connexió a MQTT…"); uint8_t torna a intentar = 3; while ((ret = mqtt.connect ())! = 0) {// connect retornarà 0 per a Serial.println connectat (mqtt.connectErrorString (ret)); Serial.println ("Reintentar la connexió MQTT en 5 segons…"); mqtt.disconnect (); retard (5000); // espereu 5 segons a tornar-ho a intentar; if (reintenta == 0) {// bàsicament mor i espera que WDT em restableixi mentre (1); }} Serial.println ("MQTT connectat!"); }
A continuació, comenceu creant un punter a un objecte Adafruit_MQTT_Subscribe . L'utilitzarem per determinar quina subscripció s'ha rebut.
Adafruit_MQTT_Subscribe * subscripció;
A continuació, esperem un missatge de subscripció.
mqtt.readSubscription (timeInMilliseconds) escoltarà una hora determinada per a qualsevol missatge que provingui del servidor MQTT.
Si rep un missatge abans del temps d'espera, respondrà amb un punter a la subscripció o simplement esgotarà el temps i retornarà 0. En aquest cas, esperarà 2 segons.
while ((subscripció = mqtt.readSubscription (20000)))
Si es produeix un temps d'espera, el temps d'ompliment de bucle falla. Si no, comparem quina subscripció i obtindrem les nostres subscripcions conegudes.
En aquest codi, ho fem per als tres feeds subscrits.
if (subscripció == & Toggle_FM) if (subscripció == & Radio_Station) if (subscripció == & Volum)
Aquests van ser els tres paràmetres principals que heu d’entendre a la secció del bucle.
Aquesta secció del codi s'utilitza per supervisar i configurar el feed Toggle_FM .
if (subscripció == & Toggle_FM) // és un missatge del feed Toggle_FM {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // imprimeix les dades del feed només per depurar si (String ((char *) Toggle_FM.lastread) == String ("on")) // comparem les dades rebudes amb un paràmetre conegut en aquest cas esperem que "a "prové del sever {// però abans de fer-ho hem de convertir-lo en una cadena que faci que la comparació sigui molt fàcil digitalWrite (D7, HIGH); // si obtenim una cadena" on "del servidor que estem fent el pin D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // de nou estem comprovant la cadena off {digitalWrite (D7, LOW); // si obtenim un "off" string des del servidor estem fent el pin D7 BAIX}}
Aquesta secció del codi s'utilitza per supervisar i configurar el canal Radio_Station .
if (subscripció == i Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // sentim que estem cercant la cadena Big FM {radio.setBandFrequency (FIX_BAND, 9270); // si la condició anterior és certa, estem establint el canal radoi a 92,7 MHz} // El procés esmentat es continua a continuació si (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); }}
Aquesta secció del codi s'utilitza per controlar i configurar el feed de volum.
if (subscripció == i volum) // // sentim que comprovem la cadena Volum i és un valor enter en format de cadena // Hem de convertir-lo de nou a un enter per canviar el volum amb l'ajuda del PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volum = atoi ((char *) Volume.lastread); // Estem utilitzant el mètode atoi () per convertir un punter de caràcters a un volum enter = mapa (volum, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // com el pt2258 només entén els valors enters en dB // assignem el valor 0dB - 79dB al 0% - 100%. digitalPot.setChannelVolume (volum, 0); // després de tot això, estem configurant el volum per al canal 0 del PT2258 IC digitalPot.setChannelVolume (volum, 1); // després de tot això estem configurant el volum per al canal 1 del PT2258 IC}}
Prova de la ràdio FM controlada per veu mitjançant Arduino
Per provar el circuit, es va utilitzar el següent aparell:
- Un transformador que té un toc 13-0-13
- Dos altaveus de 4Ω 20W com a càrrega.
- Telèfon per utilitzar l'Assistent de Google.
En un article anterior, us he mostrat com es fabrica un amplificador d'àudio simple de 2x32 watts amb IC TDA2050, també ho faré per a aquesta demostració, He desordenat el potenciòmetre mecànic i heu curtcircuitat dos cables amb dos petits cables de pont. Ara, amb l’ajut de dos polsadors, vaig poder canviar el volum de l’amplificador.
Millora addicional
Hi ha moltes millores addicionals que es poden fer en aquest circuit.
- Hi ha diversos problemes de soroll perquè una font d'àudio funciona al costat del NodeMCU, de manera que hem d'implementar protecció addicional per millorar la immunitat contra el soroll.
- Construir el circuit general a un PCB millorarà la immunitat contra el soroll.
- Es poden afegir filtres addicionals a aquest CI per eliminar el soroll.
Espero que aquest article us hagi agradat i n’hagueu après alguna cosa nova. Si teniu algun dubte, podeu demanar-los als comentaris següents o fer servir els nostres fòrums per a una discussió detallada.
