- RDA5807M IC
- IC PT2258
- Schematic
- Componente necesare
- Cum obținem date de la Asistentul Google?
- Configurarea unui cont Adafruit pentru comunicare
- Configurarea unui broker IFTTT pentru radio FM
- Cod Arduino și explicație
- Testarea radioului FM controlat prin voce folosind Arduino
- Îmbunătățire suplimentară
În zilele noastre, majorității dintre noi le place să asculte muzică, cu smartphone-urile noastre. Dar cu câțiva ani în urmă, acest lucru nu era cazul, în acel moment, radiourile FM erau prima alegere pentru ascultarea muzicii, podcast-urilor, știrilor și altele. În zilele noastre nimeni nu ascultă radio pentru muzică, știri și altele, bunica și bunicul fiind o excepție.
Deci, pentru a revigora puțin vechea glorie a radioului FM, în acest proiect, voi construi un radio FM controlat prin voce folosind asistența Google și popularul IC receptor RDA5870M Superheterodyne.
De asemenea, verificați circuitele noastre radio FM anterioare:
- Radio FM bazat pe Arduino
- Radio FM controlat prin telefon inteligent folosind Arduino
- Circuit transmițător FM simplu
- Cum se construiește un circuit transmițător FM
RDA5807M IC
RDA5807M este un tuner radio FM stereo cu un singur cip foarte modern, cu un sintetizator complet integrat, selectivitate IF, RDS / RBDS și decodor MPX care acceptă gama de frecvențe de la 50MHz la 115MHz. Este un IC FM cu un singur cip foarte ieftin, care necesită foarte puține componente externe pentru a funcționa funcțional. Acest IC utilizează interfața I2C pentru a comunica cu orice dispozitiv master, deci toată această caracteristică îl face foarte potrivit pentru dispozitivele portabile.
Acest CI are un procesor audio intern, care este responsabil pentru calitatea sa audio excelentă.
Unele dintre caracteristicile de bază includ-
- Suport pentru benzi de frecvență la nivel mondial
- Suport pentru RDS / RBDS
- Tuner digital low-IF
- Sintetizator de frecvență digital complet integrat
- Control digital al câștigului automat (AGC)
- Bass boost
- Susțineți direct încărcarea rezistenței de 32Ω
- Regulator LDO integrat și multe altele
Puteți afla mai multe despre acest IC parcurgând acest proiect Radio FM bazat pe Arduino folosind RDA5807.
IC PT2258
PT2258 este un IC conceput pentru a fi utilizat ca un controler electronic de volum cu 6 canale, acest IC utilizează tehnologia CMOS special concepută pentru aplicații audio-video cu mai multe canale.
Acest IC oferă o interfață de control I2C cu un domeniu de atenuare de la 0 la -79dB la 1dB / pas și vine într-un pachet DIP sau SOP cu 20 de pini.
Unele dintre caracteristicile de bază includ-
- 6 canale de intrare și ieșire (pentru sisteme audio 5.1 de acasă)
- Adresă I2C selectabilă (pentru aplicația Daisy-chain)
- Separare canal mare (pentru aplicații cu zgomot redus)
- Raport S / N> 100dB
- Tensiunea de funcționare este de 5 până la 9V
Am explicat anterior despre acest IC în proiectul PT2258 Digital Audio Volume Control. Puteți verifica acel proiect dacă doriți să aflați mai multe despre acest IC.
Schematic
Diagrama circuitului pentru radio FM controlat de Google Assistant este prezentată mai jos:
Componente necesare
- Microcontroler NodeMCU - 1
- Controler digital de volum PT2258 - 1
- Modul radio RDA5807 FM - 1
- Releu SPDT 6V - 1
- 1n4007 Diodă - 1
- Borna cu șurub 5mmx2 - 1
- Mufă pentru căști de 3,5 mm - 1
- Convertor de nivel logic - 1
- Rezistor 10K, 5% - 4
- Rezistor 150K, 5% - 4
- Rezistor 100K, 5% - 2
- Condensator 10uF - 6
- Condensator 0.1uF - 1
- Jumper Wire - 10
Cum obținem date de la Asistentul Google?
Imaginea de mai sus vă oferă ideea de bază a procesului de comunicare între Asistentul Google și NodeMCU.
Asistentul Google are autoritatea de a modifica datele din serverul Adafruit IO pentru ca IFTTT cu MQTT să funcționeze ca un broker.
Dacă are loc o modificare a datelor de pe server (Adafruit IO), aceasta se reflectă pe partea NodeMCU. Pentru a realiza acest lucru, trebuie să urmați instrucțiunile date mai jos-
Configurarea unui cont Adafruit pentru comunicare
Mai întâi, creați un cont Adafruit IO. Conectați-vă la Adafruit IO cu acreditările dvs. sau Înscrieți-vă dacă nu aveți un cont. Am folosit anterior Adafruit IO pentru a construi LED-uri controlate de Alexa, Raspberry Pi home automation și multe alte proiecte bazate pe IoT.
După conectarea la contul Adafruit, Faceți clic pe Tablouri de bord, apoi faceți clic pe Acțiune> Creați un tablou de bord nou .
În continuare, vom adăuga un nume nou și o scurtă descriere a noului nostru tablou de bord.
După ce ați creat tabloul de bord, trebuie să obțineți numele de utilizator și cheia activă din contul dvs., deoarece este necesar în codul Arduino. Puteți obține acest lucru dând clic pe pictograma CHEIE.
După aceea, faceți trei blocuri; un bloc de comutare, un bloc de ecartament, un bloc de text.
Blocurile sunt foarte importante, deoarece aceste blocuri sunt responsabile pentru comunicarea dintre asistența Google și NodeMCU.
Pentru a crea un bloc, trebuie să faceți clic pe semnul + din colțul din dreapta sus.
Apoi, vom face blocurile.
Apoi, trebuie să configurați fiecare bloc, pentru aceasta, trebuie să bifați un anumit bloc și să faceți clic pe Pasul următor.
Pentru acest proiect, nu este nevoie să modificați setările, cu excepția butonului de comutare.
Textul din butonul de comutare este cu majuscule, trebuie să-l faceți o literă mică și să actualizați modificările.
Gata, sunt toate lucrurile de care aveți nevoie pentru a configura în IO adafruit.
Ecranul meu final arată așa-
Configurarea unui broker IFTTT pentru radio FM
Ca întotdeauna, Înscrieți-vă dacă nu aveți un cont sau Conectați-vă dacă aveți deja un cont.
Acum, trebuie să creați un applet. Pentru aceasta, urmați pașii de mai jos:
Pentru a crea un applet, faceți clic pe pictograma contului dvs. și faceți clic pe Creare.
În ecranul de creare, faceți clic pe pictograma + după if.
După aceea, trebuie să permiteți accesul la contul dvs. Google.
Pentru aceasta, trebuie să căutați Asistent Google în bara de căutare și să faceți clic pe pictograma Asistent Google.
În ecranul următor, trebuie să alegem un declanșator, Amintiți-vă, am făcut trei blocuri în Adafruit IO Server, trebuie să facem declanșatoare pentru aceste trei blocuri.
În primul rând, blocul de stații radio, pentru aceasta, trebuie să selectăm Rostiți o frază cu un ingredient text .
În ecranul următor, trebuie să tastăm ce doriți să spuneți și cu ce ar trebui să vă răspundă asistentul Google.
Apoi faceți clic pe butonul Creați declanșator.
Ecranul următor arată ceva de genul acesta, după cum ați finalizat Dacă o parte, timpul aferent, apoi o parte, faceți clic pe + semnul după atunci .
Vi se va afișa un ecran precum imaginea de mai jos, căutați Adafruit și faceți clic pe pictograma Adafruit.
Apoi, autorizați contul Adafruit cu IFTTT, apoi faceți clic pe Conectare.
Apoi, trebuie să faceți clic pe Trimiteți datele către Adafruit IO.
Apoi vi se va prezenta un meniu derulant de fluxuri pe care le-ați creat anterior în contul Adafruit.
Alegeți oricare și faceți clic pe creați acțiune, trebuie să faceți acest lucru pentru toate cele trei.
Și odată cu aceasta, marchează sfârșitul procesului IFTTT, ecranul meu final de applet arată astfel,
Cod Arduino și explicație
Codul Arduino este acolo pentru a gestiona toate comunicațiile dintre IC și comunicarea dintre Adafruit IO IFTTT și WIFI. Codul complet pentru acest radio FM Arduino Nano este dat la sfârșitul acestui tutorial. Codul este puțin lung și complex, aici am explicat codul complet rând cu rând.
În primul rând, trebuie să includem toate bibliotecile necesare, acestea fiind:
#include
Apoi, definiți SSID-ul și parola pentru WI-FI, acesta este SSID-ul și PASSWORD-ul routerului.
const char * ssid = "Android"; // SSID al routerului const char * password = "12345678"; // Parola routerului dvs.
Apoi definim două booleeni și o variabilă, booleenii sunt utilizați pentru a menține starea de comunicare a IC-urilor, iar variabila de volum este utilizată pentru a seta nivelul de volum.
bool potStatus; // 1 când se stabilește comunicația între MCU și IC bool radioStatus; // 1 când se stabilește comunicarea între MCU și volumul IC int = 15; // nivelul implicit al volumului cu IC începe cu
Apoi, am configurat un pin GPIO numit Relay_Pin pentru a porni sau opri amplificatorul.
#define Relay_Pin D7 // Acest pin este folosit pentru a porni și opri radioul
În continuare, trebuie să definim toate definițiile necesare pentru a comunica cu Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // utilizați 8883 pentru SSL #define AIO_USERNAME "debashis13" // Înlocuiți-l cu numele dvs. de utilizator #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp" // Înlocuiți cu proiectul dvs.
Definițiile de mai jos FIX_BAND este o definiție proprietară utilizată de bibliotecă.
Următoarea declarație definită setează volumul intern al modulului.
#define FIX_BAND RADIO_BAND_FM // <Banda va fi acordată de această schiță FM. #define FIX_RADIO_VOLUME 6 /// <Volumul implicit al modulului.
Apoi, creați obiectele necesare pentru PT2258, RDA5807M și WiFiClient.
PT2258 digitalPot; // PT2258 Obiect radio RDA5807M; // Client RDA5807M obiect WiFiClient; // Obiectul WiFiClient
Apoi configurați clasa de client MQTT trecând clientul WiFi și serverul MQTT și detaliile de conectare.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Configurați clasa de client MQTT trecând clientul WiFi și serverul MQTT și detaliile de conectare.
Apoi, trebuie să ne abonăm la un feed. Ce te face să te întrebi?
Dacă unele valori, unii parametri se modifică în serverul Adafruit, modificările vor fi reflectate aici.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Metode utilizate pentru a vă abona la un feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Metode utilizate pentru a vă abona la un flux Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Metode utilizate pentru abonarea la un feed
Mai jos este prototipul funcției pentru funcția MQTT_connect () .
void MQTT_connect (); // Function Prototype for MQTT Connect
Apoi începem procesul de configurare. La început, începem comunicarea UART cu metoda begin.
Serial.begin (9600); // UART începe Serial.println (); // adaugă o linie suplimentară pentru spațiere Serial.println (); // adaugă o linie suplimentară pentru spațiere În continuare, facem tot ceea ce de obicei ne conectăm la WiFI **************** toate lucrurile obișnuite necesare pentru o conexiune WiFi ********************************/ Serial.print („conectarea la”); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, parolă); while (WiFi.status ()! = WL_CONNECTED) {întârziere (500); Serial.print ("."); } Serial.println (""); Serial.println („WiFi conectat”); Serial.println ("adresa IP:"); Serial.println (WiFi.localIP ()); / **************** toate lucrurile obișnuite necesare pentru o conexiune WiFi *********************** /
Apoi, apelați metoda Wire.begin () pentru a crea o conexiune I2C și numim metoda Wire.setClock () pentru a fixa frecvența I2C la 100KHz, deoarece este viteza maximă a PT2258 IC.
Wire.begin (); // începe secvența de pornire I2C Wire.setClock (100000); // setarea ceasului I2C la 100KHz
Apoi, apelați metoda init () atât pentru PT2258, cât și pentru RDA5807 IC și mențineți starea de returnare în booleenii definiți anterior.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Apoi, verificați dacă MCU a reușit să comunice cu IC sau nu. Facem acest lucru cu două afirmații if else .
if (potStatus) {Serial.println ("Dispozitiv PT2258 găsit!"); } else {Serial.println ("Nu a putut iniția PT2258"); } if (radioStatus) {Serial.println ("Dispozitiv RDA5807M găsit!"); } else {Serial.println ("Nu a putut iniția RDA5807M"); }
Apoi, apelați metoda de abonare din biblioteca MQTT. Vom fi anunțați de serverul MQTT dacă s-au produs modificări în fluxurile noastre abonate.
mqtt.subscribe (& Radio_Station); // Configurați abonamentul MQTT pentru feedul Radio_Station mqtt.subscribe (& Toggle_FM); // Configurați abonamentul MQTT pentru fluxul Toggle_FM mqtt.subscribe (& Volum); // Configurați abonamentul MQTT pentru fluxul de volum
Apoi, setăm pinul de releu ca ieșire și starea pinului la LOW
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Apoi, setați un volum radio predeterminat, acest parametru setează volumul intern al IC-ului RDA5807, care marchează sfârșitul procesului nostru de configurare.
radio.setVolume (FIX_RADIO_VOLUME); // apoi setăm volumul radio normalizat radio.setMono (fals); // nu vrem ca cipul să dea ieșire mono radio.setMute (fals); // nu vrem ca cipul să mute la început
Începem bucla apelând funcția MQTT_connect () care stabilește o conexiune la serverul MQTT.
În funcția de conectare MQTT, încercăm de trei ori să stabilim o conexiune la serverul MQTT.
Dacă are succes, vom primi un mesaj de succes, altfel vom primi un mesaj de eroare.
void MQTT_connect () {int8_t ret; // Număr întreg de 8 biți pentru a stoca reîncercările // Opriți dacă este deja conectat. if (mqtt.connected ()) {return; } Serial.print („Conectarea la MQTT…”); uint8_t reîncearcă = 3; while ((ret = mqtt.connect ())! = 0) {// connect va returna 0 pentru Serial.println conectat (mqtt.connectErrorString (ret)); Serial.println ("Reîncercarea conexiunii MQTT în 5 secunde…"); mqtt.disconnect (); întârziere (5000); // așteptați 5 secunde reîncercați--; if (reîncercări == 0) {// practic mor și așteptați ca WDT să mă reseteze în timp ce (1); }} Serial.println ("MQTT conectat!"); }
Apoi, începeți prin crearea unui pointer către un obiect Adafruit_MQTT_Subscribe . Vom folosi acest lucru pentru a determina ce abonament a fost primit.
Adafruit_MQTT_Subscribe * abonament;
Apoi, așteptăm un mesaj de abonament.
mqtt.readSubscription (timeInMilliseconds) va asculta o anumită oră, pentru orice mesaje care vin de pe serverul MQTT.
Dacă primește un mesaj înainte de expirare, va răspunde cu un pointer la abonament sau va expira și va returna 0. În acest caz, va aștepta 2 sec.
while ((abonament = mqtt.readSubscription (20000)))
Dacă are loc un timeout, umplerea buclei while eșuează. Dacă nu, comparăm ce abonament și vom obține abonamentele noastre cunoscute.
În acest cod, facem acest lucru pentru toate cele trei fluxuri abonate.
if (abonament == & Toggle_FM) if (abonament == & Radio_Station) if (abonament == & Volum)
Aceștia au fost principalii trei parametri pe care trebuie să îi înțelegeți în secțiunea buclă.
Această secțiune a codului este utilizată pentru a monitoriza și seta fluxul Toggle_FM .
if (abonament == & Toggle_FM) // este un mesaj din fluxul Toggle_FM {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // tipăriți datele Feed doar pentru depanare dacă (String ((char *) Toggle_FM.lastread) == String („on”)) // comparăm datele primite cu un parametru cunoscut în acest caz, ne așteptăm ca „pe „vine de la sever {// dar înainte de a face acest lucru trebuie să-l transformăm într-un șir care face comparativul foarte ușor digitalWrite (D7, HIGH); // dacă obținem un șir„ pe ”de pe server pinul D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // verificăm din nou șirul off {digitalWrite (D7, LOW); // dacă obținem un "off" șir de pe server facem pinul D7 LOW}}
Această secțiune a codului este utilizată pentru a monitoriza și seta feedul Radio_Station .
if (abonament == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // aud că verificăm șirul Big FM {radio.setBandFrequency (FIX_BAND, 9270); // dacă condiția de mai sus este adevărată setăm canalul radoi la 92,7 MHz} // Procesul menționat mai sus este continuat mai jos dacă (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); }}
Această secțiune a codului este utilizată pentru a monitoriza și seta fluxul de volum.
dacă (abonament == & Volum) // // auzim că verificăm volumul șirului și este o valoare întreagă într-un format șir // Trebuie să îl convertim înapoi într-un număr întreg pentru a schimba volumul cu ajutorul PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volum = atoi ((char *) Volume.lastread); // Folosim metoda atoi () pentru a converti un pointer de caractere într-un volum întreg = hartă (volum, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // ca pt2258 înțelege doar valorile întregi din dB // mapăm valoarea 0dB - 79dB la 0% - 100%. digitalPot.setChannelVolume (volum, 0); // după toate acestea, setăm volumul pentru canalul 0 al PT2258 IC digitalPot.setChannelVolume (volum, 1); // după toate acestea, setăm volumul pentru canalul 1 al PT2258 IC}}
Testarea radioului FM controlat prin voce folosind Arduino
Pentru a testa circuitul, a fost utilizat următorul aparat-
- Un transformator care are un 13-0-13 Tap
- Două difuzoare de 4Ω 20W ca sarcină.
- Telefon pentru a utiliza Asistentul Google.
Într-un articol anterior, v-am arătat cum să creați un amplificator audio simplu de 2x32 W cu IC TDA2050, o voi folosi și pentru această demonstrație, Am dezordonat potențiometrul mecanic și am scurtcircuitat două conductoare cu două cabluri jumper mici. Acum, cu ajutorul a două butoane, am putut schimba volumul amplificatorului.
Îmbunătățire suplimentară
Există multe îmbunătățiri suplimentare care pot fi aduse acestui circuit.
- Există diverse probleme de zgomot, deoarece o sursă audio funcționează lângă NodeMCU, deci trebuie să implementăm o ecranare suplimentară pentru a îmbunătăți imunitatea la zgomot.
- Construirea circuitului general la un PCB va îmbunătăți imunitatea la zgomot.
- La acest CI pot fi adăugate filtre suplimentare pentru a elimina zgomotul.
Sper că ți-a plăcut acest articol și ai învățat ceva nou din el. Dacă aveți vreo îndoială, puteți întreba în comentariile de mai jos sau puteți folosi forumurile noastre pentru discuții detaliate.