- RDA5807M IC
- IC PT2258
- Schema
- Būtini komponentai
- Kaip gauname duomenis iš „Google“ padėjėjo?
- „Adafruit“ paskyros sukūrimas bendravimui
- „IFTTT“ tarpininko nustatymas FM radijui
- „Arduino“ kodas ir paaiškinimas
- Balso valdomo FM radijo bandymas naudojant „Arduino“
- Tolesnis tobulinimas
Šiais laikais dauguma iš mūsų mėgsta klausytis muzikos naudodamiesi savo išmaniaisiais telefonais. Tačiau praėjus keleriems metams to nebuvo, tuo metu FM radijas buvo pirmasis pasirinkimas klausytis muzikos, tinklalaidžių, naujienų ir kitų. Šiais laikais niekas neklauso radijo muzikos, naujienų ir kitų, močiutė ir senelis yra išimtis.
Taigi, norėdamas šiek tiek atgaivinti seną FM radijo šlovę, šiame projekte ketinu sukurti balsu valdomą FM radiją naudodamas „ Google“ pagalbą ir populiarųjį RDA5870M „Superheterodyne Receiver IC“.
Taip pat patikrinkite ankstesnes FM radijo grandines:
- „Arduino“ pagrįstas FM radijas
- Išmanusis telefonas valdomas FM radijas, naudojant „Arduino“
- Paprasta FM siųstuvo grandinė
- Kaip sukurti FM siųstuvo grandinę
RDA5807M IC
RDA5807M yra labai modernus vieno lusto FM stereofoninis radijo imtuvas su visiškai integruotu sintezatoriumi, IF selektyvumu, RDS / RBDS ir MPX dekoderiu, palaikančiu nuo 50 MHz iki 115 MHz dažnių diapazoną. Tai labai pigus vienos mikroschemos FM imtuvo IC, kuriam funkcionuoti reikia labai mažai išorinių komponentų. Šis IC naudoja I2C sąsają, kad galėtų bendrauti su bet kokiu pagrindiniu įrenginiu, todėl visa ši funkcija daro ją labai tinkamą nešiojamiesiems įrenginiams.
Šis IC turi vidinį garso procesorių, kuris yra atsakingas už puikią garso kokybę.
Kai kurios pagrindinės funkcijos apima:
- Parama pasaulinėms dažnių juostoms
- RDS / RBDS palaikymas
- Skaitmeninis mažo IF derintuvas
- Pilnai integruotas skaitmeninio dažnio sintezatorius
- Skaitmeninis automatinio stiprinimo valdymas (AGC)
- Boso stiprinimas
- Tiesiogiai palaikykite 32Ω varžos apkrovą
- Integruotas LDO reguliatorius ir dar daugiau
Galite sužinoti daugiau apie šį IC, atlikdami šį projektą „Arduino“ pagrįstas FM radijas naudodamas RDA5807.
IC PT2258
„PT2258“ yra IC, skirtas naudoti kaip 6 kanalų elektroninis garsumo valdiklis, šis IC naudoja CMOS technologiją, specialiai sukurtą daugiakanalėms garso ir vaizdo programoms.
Šis IC suteikia „I2C“ valdymo sąsają su slopinimo diapazonu nuo 0 iki -79 dB iki 1 dB / žingsnis ir yra 20 kontaktų DIP arba SOP pakuotėje.
Kai kurie pagrindiniai bruožai apima:
- 6 įvesties ir išvesties kanalai (5.1 namų garso sistemoms)
- Pasirenkamas I2C adresas („Daisy-chain Application“)
- Didelio kanalo atskyrimas (taikant nedidelį triukšmą)
- S / N santykis> 100dB
- Darbinė įtampa yra nuo 5 iki 9 V
Mes anksčiau paaiškinome apie šį IC „ PT2258“ skaitmeninio garso garsumo valdymo projekte. Galite patikrinti tą projektą, jei norite sužinoti daugiau apie šį IC.
Schema
Žemiau pateikiama „ Google Assistant“ valdomo FM radijo grandinės schema:
Būtini komponentai
- „NodeMCU“ mikrovaldiklis - 1
- PT2258 skaitmeninis garsumo valdiklis - 1
- RDA5807 FM radijo modulis - 1
- SPDT relė 6V - 1
- 1n4007 Diodas - 1
- Sraigtinis gnybtas 5mmx2 - 1
- 3,5 mm ausinių lizdas - 1
- Loginio lygio keitiklis - 1
- 10K rezistorius, 5% - 4
- 150K rezistorius, 5% - 4
- 100K rezistorius, 5% - 2
- 10uF kondensatorius - 6
- 0,1 uF kondensatorius - 1
- Džemperio viela - 10
Kaip gauname duomenis iš „Google“ padėjėjo?
Aukščiau pateiktame paveikslėlyje pateikiama pagrindinė „Google“ padėjėjo ir „NodeMCU“ ryšio proceso idėja.
„Google“ padėjėjas turi teisę modifikuoti „Adafruit IO“ serverio duomenis, kad IFTTT su „MQTT“ būtų brokeris.
Jei serveryje („Adafruit IO“) įvyksta kokių nors duomenų pasikeitimų, tai atsispindi „NodeMCU“ pusėje. Norėdami tai pasiekti, turite laikytis toliau pateiktų nurodymų-
„Adafruit“ paskyros sukūrimas bendravimui
Pirmiausia sukurkite „Adafruit IO“ paskyrą. Prisijunkite prie „Adafruit IO“ naudodami savo kredencialus arba prisiregistruokite, jei neturite paskyros. Anksčiau „Adafruit IO“ naudojome kurdami „Alexa“ valdomą šviesos diodą, „Raspberry Pi“ namų automatiką ir daugelį kitų „IoT“ pagrįstų projektų.
Prisijungę prie „Adafruit“ paskyros, Spustelėkite Informacijos suvestines, tada spustelėkite Veiksmas> Sukurti naują informacijos suvestinę .
Tada mes pridėsime naują pavadinimą ir trumpą naujos informacijos suvestinės aprašymą .
Sukūrę prietaisų skydelį, turite gauti vartotojo vardą ir aktyvųjį raktą iš savo paskyros, kaip to reikalauja „Arduino“ kodas. Tai galite gauti spustelėję RAKTO piktogramą.
Po to padarykite tris blokus; vienas perjungimo blokas, vienas matuoklio blokas, vienas teksto blokas.
Blokai yra labai svarbūs, nes šie blokai yra atsakingi už „Google“ pagalbos ir „NodeMCU“ ryšį.
Norėdami užblokuoti, turite spustelėti + ženklą viršutiniame dešiniajame kampe.
Tada mes padarysime kaladėles.
Tada turite nustatyti kiekvieną bloką, tam turite pažymėti tam tikrą bloką ir spustelėkite Kitas žingsnis.
Šiam projektui nereikia keisti jokių nustatymų, išskyrus perjungimo mygtuką.
Perjungimo mygtuko tekstas yra didžiosiomis raidėmis, jums reikia padaryti jį mažą raidę ir atnaujinti pakeitimus.
Viskas, tai viskas, ko jums reikia nustatyti „Adafruit IO“.
Mano paskutinis ekranas atrodo taip-
„IFTTT“ tarpininko nustatymas FM radijui
Kaip visada, prisiregistruokite, jei neturite paskyros, arba prisijunkite, jei jau turite paskyrą.
Dabar turite sukurti programėlę. Tam atlikite toliau nurodytus veiksmus:
Norėdami sukurti programėlę, spustelėkite savo paskyros piktogramą ir spustelėkite Sukurti.
Kūrimo ekrane spustelėkite piktogramą + po to, jei.
Po to turite leisti pasiekti savo „ Google“ paskyrą.
Tam reikia paieškos juostoje ieškoti „Google“ padėjėjo ir spustelėti „Google“ padėjėjo piktogramą.
Kitame ekrane turime pasirinkti trigerį, Atminkite, kad mes sukūrėme tris blokus „Adafruit IO Server“, mes turime padaryti tų trijų blokų trigerius.
Pirma, radijo stoties blokas, tam turime pasirinkti Pasakykite frazę su teksto ingredientu .
Kitame ekrane turime įvesti, ką norite pasakyti ir ką „Google“ padėjėjas turėtų jums atsakyti.
Tada spustelėkite mygtuką Sukurti aktyviklį.
Kitas ekranas atrodo maždaug taip, kaip užpildėte „ If“ dalį, atėjo laikas tai daliai, po to spustelėkite „ +“ ženklą.
Jums bus pateiktas ekranas, panašus į žemiau esantį vaizdą, ieškokite „ Adafruit“ ir spustelėkite „Adafruit“ piktogramą.
Tada patvirtinkite savo „Adafruit“ paskyrą IFTTT, tada spustelėkite Prisijungti.
Tada turite spustelėti Siųsti duomenis „Adafruit IO“.
Tada jums bus pateiktas kanalų, kuriuos anksčiau sukūrėte „ Adafruit“ paskyroje, išskleidžiamasis meniu .
Pasirinkite bet kurį ir spustelėkite sukurti veiksmą. Tai turite padaryti visiems trims.
Tai žymi IFTTT proceso pabaigą, mano galutinis programėlės ekranas atrodo taip,
„Arduino“ kodas ir paaiškinimas
„Arduino“ kodas yra skirtas valdyti visą ryšį tarp IC ir ryšį tarp „Adafruit IO IFTTT“ ir WIFI. Pilnas šio „ Arduino Nano FM“ radijo kodas pateikiamas šios pamokos pabaigoje. Kodas yra šiek tiek ilgas ir sudėtingas, čia mes paaiškinome visą kodą eilutėmis.
Pirma, turime įtraukti visas reikalingas bibliotekas, jos yra:
# įtraukti
Tada nustatykite WI-FI SSID ir slaptažodį, tai yra jūsų maršrutizatoriaus SSID ir SLAPTAŽODIS.
const char * ssid = "Android"; // Jūsų maršrutizatoriaus SSID const char * password = "12345678"; // Jūsų maršrutizatoriaus slaptažodis
Tada mes apibrėžiame du loginius parametrus ir kintamąjį, loginiai parametrai naudojami IC ryšio būsenai palaikyti, o garsumo kintamasis naudojamas garso lygiui nustatyti.
bool potStatus; // 1, kai užmezgamas ryšys tarp MCU ir IC „Bool radioStatus“; 1, kai užmezgamas ryšys tarp MCU ir IC int tūris = 15; // numatytasis garsumo lygis su IC prasideda
Tada mes nustatėme GPIO kaištį, pavadintą „ Relay_Pin“, kad įjungtumėte arba išjungtumėte stiprintuvą.
#define Relay_Pin D7 // Šis kaištis naudojamas įjungti ir išjungti radiją
Toliau turime apibrėžti visus reikalingus apibrėžimus, kad galėtume bendrauti su „Adafruit IO“.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // SSL naudoti 8883
Žemiau pateikiami „ FIX_BAND“ apibrėžimai yra patentuotas apibrėžimas, kurį naudoja biblioteka.
Kitas apibrėžtas sakinys nustato vidinį modulio tūrį.
#define FIX_BAND RADIO_BAND_FM // <Juosta bus sureguliuota pagal šį eskizą yra FM. #define FIX_RADIO_VOLUME 6 /// <Numatytasis modulio tūris.
Tada sukurkite reikiamus objektus PT2258, RDA5807M ir „ WiFiClient“.
PT2258 digitalPot; // PT2258 Object RDA5807M radijas; // RDA5807M Object WiFiClient klientas; // „WiFiClient“ objektas
Tada nustatykite „MQTT“ kliento klasę, įvesdami „WiFi“ klientą ir „MQTT“ serverį bei prisijungimo duomenis.
„Adafruit_MQTT_Client mqtt“ (& klientas, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Nustatykite „MQTT“ kliento klasę, įvesdami „WiFi“ klientą ir MQTT serverį bei prisijungimo duomenis.
Tada mes turime užsiprenumeruoti kanalą. Ko tai verčia paklausti?
Jei „Adafruit“ serveryje pasikeis kai kurios vertės, kai kurie parametrai, pakeitimai čia atsispindės.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Metodai, naudojami prenumeruojant kanalą „Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME" / feeds / Toggle_FM "); // Sklaidos kanalo „Adafruit_MQTT_Subscribe Volume“ prenumeratos metodai = „Adafruit_MQTT_Subscribe“ (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Metodai, naudojami prenumeruojant kanalą
Žemiau pateikiamas funkcijos MQTT_connect () funkcijos prototipas.
void MQTT_connect (); // „MQTT Connect“ funkcijos prototipas
Tada mes pradedame savo sąrankos procesą. Iš pradžių UART ryšį pradedame pradžios metodu.
Serijos pradžia (9600); // UART prasideda Serial.println (); // prideda papildomą eilutę tarpams „Serial.println ()“; // prideda papildomą eilutę tarpams įvesti. Toliau mes atliekame visus įprastus veiksmus prisijungdami prie „WiFI“ ************** visi įprasti dalykai, reikalingi „WiFi“ ryšiui ************************ / Serial.print („prisijungimas prie“); Serial.println (ssid); „WiFi.mode“ (WIFI_STA); „WiFi.begin“ (ssid, slaptažodis); while (WiFi.status ()! = WL_CONNECTED) {delsa (500); Serijinis spaudinys ("."); } Serial.println (""); Serial.println („Wi-Fi prijungtas“); Serial.println ("IP adresas:"); Serial.println („WiFi.localIP“ ()); / ***************** visi įprasti dalykai, reikalingi „WiFi“ ryšiui ************************ /
Tada iškvieskite „ Wire.begin“ () metodą, kad gautumėte I2C ryšį, ir mes vadiname „ Wire.setClock“ () metodą, kad nustatytume I2C dažnį iki 100KHz, nes tai yra visas PT2258 IC greitis.
Viela.prasideda (); // pradėti I2C pradinę seką Wire.setClock (100000); // I2C laikrodžio nustatymas į 100KHz
Tada iškvieskite PT2258 ir RDA5807 IC metodą init () ir palaikykite grąžinimo būseną į anksčiau apibrėžtus loginius parametrus.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Tada patikrinkite, ar MCU galėjo bendrauti su IC, ar ne. Mes tai darome dviem teiginiais, jei kitaip .
if (potStatus) {Serial.println ("Rastas įrenginys PT2258!"); } else {Serial.println ("Nepavyko inicijuoti PT2258"); } if (radioStatus) {Serial.println ("Rastas RDA5807M įrenginys!"); } else {Serial.println ("Nepavyko inicijuoti RDA5807M"); }
Tada iškvieskite prenumeratos metodą iš MQTT bibliotekos. MQTT serveris mus informuos, jei įvyko kokių nors pokyčių mūsų prenumeruojamuose kanaluose.
mqtt.subscribe (& Radio_Station); // „MQTT“ prenumeratos nustatymas „Radio_Station“ kanalui „mqtt.subscribe“ (& Toggle_FM); // MQTT prenumeratos nustatymas „Toggle_FM“ kanalui „mqtt.subscribe (& Volume“); // Nustatykite „MQTT“ prenumeratą „Volume feed“
Toliau nustatome „Relay“ kaištį kaip išvestį, o kaiščio būseną - „LOW“
pinMode (D7, OUTPUT); „digitalWrite“ (D7, LOW);
Tada nustatykite iš anksto nustatytą radijo garsumą, šis parametras nustato RDA5807 IC vidinį tūrį, kuris žymi mūsų sąrankos pabaigą.
radio.setVolume (FIX_RADIO_VOLUME); // toliau nustatome normalizuoti radijo garsumą radio.setMono (false); // mes nenorime, kad lustas duotų monofoninį išėjimą radio.setMute (false); // mes nenorime, kad lustas būtų nutildytas paleidus
Pradedame kilpą iškvietę funkciją MQTT_connect (), kuri užmezga ryšį su MQTT serveriu.
Naudodamiesi „MQTT connect“ funkcija, mes tris kartus bandome užmegzti ryšį su MQTT serveriu.
Jei jis bus sėkmingas, gausime pranešimą apie sėkmę, dar kartą gausime klaidos pranešimą.
negaliojantis MQTT_connect () {int8_t ret; // 8 bitų sveikasis skaičius bandymams išsaugoti // Sustabdyti, jei jau prijungtas. jei (mqtt.connected ()) {return; } Serial.print („Prisijungiama prie MQTT…“); uint8_t bandymai = 3; o ((ret = mqtt.connect ())! = 0) {// connect grąžins 0 prijungto Serial.println (mqtt.connectErrorString (ret)); Serial.println ("MQTT ryšys bandomas iš naujo per 5 sekundes…"); mqtt.donnect (); vėlavimas (5000); // palaukite 5 sekundes pakartotinai--; if (pakartotinai == 0) {// iš esmės miršta ir laukia, kol WDT mane atstatys, kol (1); }} Serial.println („MQTT prijungtas!“); }
Tada pradėkite nuo „ Adafruit_MQTT_Subscribe“ objekto žymeklio sukūrimo . Tai naudosime nustatydami, kuri prenumerata buvo gauta.
„Adafruit_MQTT_Subscribe *“ prenumerata;
Toliau laukiame prenumeratos pranešimo.
„mqtt.readSubscription“ (timeInMilliseconds) tam tikrą laiką išklausys visus pranešimus, gaunamus iš MQTT serverio.
Jei jis gaus pranešimą prieš skirtąjį laiką, jis atsakys su prenumeratos žymekliu, arba jis tiesiog praleis laiką ir grąžins 0. Tokiu atveju jis lauks 2 sek.
while ((prenumerata = mqtt.readSubscription (20000)))
Jei pasireiškia laikui, o kilpa užpildyti nepavyksta. Jei ne, palyginame, kokia prenumerata, ir gausime žinomas prenumeratas.
Šiame kode tai darome visiems trims mūsų užsiprenumeruotiems kanalams.
if (prenumerata == & Toggle_FM) if (prenumerata == & Radio_Station) if (prenumerata == & apimtis)
Tai buvo trys pagrindiniai parametrai, kuriuos turite suprasti ciklo skyriuje.
Ši kodo dalis naudojama stebėti ir nustatyti „ Toggle_FM“ kanalą.
if (subscription == & Toggle_FM) // ar tai pranešimas iš Toggle_FM kanalo {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // išspausdinkite tiekimo duomenis tik derinimui, jei (String ((char *) Toggle_FM.lastread) == String ("on")) // gautus duomenis palyginame su žinomu parametru, šiuo atveju mes tikimės, kad "on "ateina iš" sever "{//, bet prieš tai darant, mes turime padaryti ją eilute, kuri daro palyginimą labai lengvą" digitalWrite "(D7, HIGH); // jei gauname" on "eilutę iš mūsų sukurto serverio D7 kaištis HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // vėl tikriname, ar eilutė išjungta {digitalWrite (D7, LOW); // jei gausime „off“ eilutė iš serverio, kuriame D7 kaištį LOW}}
Ši kodo dalis naudojama „ Radio_Station“ srautui stebėti ir nustatyti.
if (prenumerata == & Radio_Station) {Serial.print (F ("Turiu:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // girdime, mes tikriname, ar nėra eilutės Big FM {radio.setBandFrequency (FIX_BAND, 9270); // jei minėta sąlyga yra teisinga, mes nustatome radoi kanalą į 92,7MHz} // Pirmiau minėtas procesas tęsiamas toliau, jei (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); }}
Ši kodo dalis naudojama stebėti ir nustatyti garsų tiekimą.
if (subscription == & Volume) // // girdime, kad tikriname eilutę „Volume“ ir tai yra sveiko skaičiaus reikšmė eilutės formatu // Turime ją konvertuoti atgal į sveikąjį skaičių, kad galėtume pakeisti tūrį naudodami PT2258 „IC Serial.print“ (F („Turiu:“)); Serial.println ((char *) Apimtis.paskelbta); tūris = atoi ((char *) Apimtis.paleista); // Mes naudojame atoi () metodą, kad pakeistume simbolių rodyklę į sveikojo skaičiaus tūrį = žemėlapis (tūris, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // kadangi pt2258 supranta tik sveikųjų skaičių reikšmes dB //, žemėlapį 0dB - 79dB vertiname iki 0% - 100%. digitalPot.setChannelVolume (tūris, 0); // po visko mes nustatome PT2258 IC digitalPot.setChannelVolume (volume, 1) 0 kanalo garsumą; // po visko nustatome PT2258 IC 1 kanalo garsumą}}
Balso valdomo FM radijo bandymas naudojant „Arduino“
Norėdami patikrinti grandinę, buvo naudojamas šis aparatas:
- Transformatorius, turintis 13-0-13 čiaupą
- Du 4Ω 20W garsiakalbiai kaip apkrova.
- Telefonas, kad galėtumėte naudoti „Google“ padėjėją.
Ankstesniame straipsnyje aš jums parodžiau, kaip padaryti paprastą 2x32 vatų garso stiprintuvą su TDA2050 IC, naudosiu tai ir šiai demonstracijai, Aš sutvarkiau mechaninį potenciometrą ir sutrumpinau du laidus dviem mažais trumpikliais. Dabar, naudodamas du mygtukus, man pavyko pakeisti stiprintuvo garsumą.
Tolesnis tobulinimas
Šioje grandinėje galima atlikti dar daug patobulinimų.
- Yra įvairių triukšmo problemų, nes garso šaltinis veikia šalia „NodeMCU“, todėl norėdami pagerinti triukšmo atsparumą, turime įdiegti papildomą ekraną.
- Nustačius bendrą grandinę prie PCB, pagerės triukšmo atsparumas.
- Norėdami pašalinti triukšmą, prie šio IC galima pridėti papildomų filtrų.
Tikiuosi, kad šis straipsnis jums patiko ir iš jo sužinojote kažką naujo. Jei turite kokių nors abejonių, galite paklausti žemiau pateiktų komentarų arba pasinaudoti mūsų forumais išsamiai diskusijai.