- RDA5807M IC
- IC PT2258
- Shema
- Potrebne komponente
- Kako pridobivamo podatke iz Pomočnika Google?
- Vzpostavitev računa Adafruit za komunikacijo
- Nastavitev posrednika IFTTT za FM radio
- Koda Arduino in razlaga
- Testiranje glasovno nadzorovanega FM radia z uporabo Arduina
- Nadaljnje izboljšanje
Dandanes nas večina rada posluša glasbo s pametnimi telefoni. Toda nekaj let nazaj temu ni bilo tako, takrat so bili FM radii prva izbira za poslušanje glasbe, podcastov, novic in drugih. Dandanes nihče ne posluša radia za glasbo, novice in druge, babica in dedek sta izjema.
Torej, da bi nekoliko obudil staro slavo FM radia, bom v tem projektu zgradil glasovno nadzorovan FM radio z Googlovo pomočjo in priljubljenim IC sprejemnikom superheterodinskih RDA5870M.
Preverite tudi naša prejšnja FM radijska vezja:
- FM radio na osnovi Arduina
- FM radio, ki ga nadzira pametni telefon s pomočjo Arduina
- Preprosto vezje FM oddajnika
- Kako zgraditi vezje FM oddajnika
RDA5807M IC
RDA5807M je zelo sodoben enočipni FM stereo radijski sprejemnik s popolnoma integriranim sintetizatorjem, IF selektivnostjo, RDS / RBDS in MPX dekodirnikom, ki podpira frekvenčno območje od 50 MHz do 115 MHz. Gre za zelo poceni IC sprejemnik z enim čipom, ki za delovanje potrebuje zelo malo zunanjih komponent. Ta IC uporablja vmesnik I2C za komunikacijo s katero koli glavno napravo, zato je zaradi te funkcije zelo primeren za prenosne naprave.
Ta IC ima notranji avdio procesor, ki je odgovoren za njegovo odlično kakovost zvoka.
Nekatere osnovne značilnosti vključujejo
- Podpora za frekvenčne pasove po vsem svetu
- Podpora za RDS / RBDS
- Digitalni sprejemnik z nizko IF
- Popolnoma integriran digitalni frekvenčni sintetizator
- Digitalni samodejni nadzor ojačanja (AGC)
- Ojačanje nizkih tonov
- Neposredno podpira 32Ω uporovno obremenitev
- Integriran LDO regulator in še več
Več o tem IC lahko izveste tako, da s pomočjo RDA5807 preberete ta projekt FM radia, ki temelji na Arduinu.
IC PT2258
PT2258 je IC, ki je narejen za uporabo kot 6-kanalni elektronski regulator glasnosti, ta IC uporablja tehnologijo CMOS, posebej zasnovano za večkanalne avdio-video aplikacije.
Ta IC nudi nadzorni vmesnik I2C z obsegom dušenja od 0 do -79dB pri 1dB / korak in je na voljo v 20-polnem DIP ali SOP paketu.
Nekatere osnovne značilnosti vključujejo -
- 6-vhodni in izhodni kanali (za 5.1 domače avdio sisteme)
- Izbirni naslov I2C (za uporabo Daisy-chain)
- Ločevanje visokih kanalov (za uporabo z nizko stopnjo hrupa)
- Razmerje S / N> 100dB
- Delovna napetost je od 5 do 9V
O tej IC smo že razložili v projektu za nadzor glasnosti PT2258 Digital Audio. Ta projekt lahko preverite, če želite izvedeti več o tej IC.
Shema
Shema vezja za FM radio, ki ga nadzoruje Google Assistant, je spodaj:
Potrebne komponente
- Mikrokrmilnik NodeMCU - 1
- PT2258 Digitalni regulator glasnosti - 1
- RDA5807 FM radijski modul - 1
- Rele SPDT 6V - 1
- 1n4007 Dioda - 1
- Vijačni priključek 5mmx2 - 1
- 3,5 mm priključek za slušalke - 1
- Pretvornik logičnega nivoja - 1
- 10K upor, 5% - 4
- 150K upor, 5% - 4
- 100K upor, 5% - 2
- Kondenzator 10uF - 6
- Kondenzator 0,1uF - 1
- Jumper žica - 10
Kako pridobivamo podatke iz Pomočnika Google?
Zgornja slika vam daje osnovno predstavo o komunikacijskem procesu med Googlovim asistentom in NodeMCU.
Google Assistant je pooblaščen za spreminjanje podatkov na strežniku Adafruit IO, da IFTTT z MQTT deluje kot posrednik.
Če pride do spremembe podatkov na strani strežnika (Adafruit IO), se to odraža na strani NodeMCU. Da bi to dosegli, morate slediti spodnjim navodilom -
Vzpostavitev računa Adafruit za komunikacijo
Najprej ustvarite račun Adafruit IO. Prijavite se v Adafruit IO s svojimi poverilnicami ali se prijavite, če nimate računa. Prej smo Adafruit IO uporabljali za izdelavo LED pod nadzorom Alexa, avtomatizacije doma Raspberry Pi in številnih drugih IoT projektov.
Po prijavi v račun Adafruit
Kliknite Nadzorne plošče, nato kliknite Dejanje> Ustvari novo nadzorno ploščo .
Nato bomo dodali novo ime in kratek opis naše nove nadzorne plošče.
Ko ustvarite nadzorno ploščo, morate iz svojega računa dobiti uporabniško ime in aktivni ključ, kot to zahteva koda Arduino. To lahko dobite s klikom na ikono KLJUČ.
Po tem naredite tri bloke; en preklopni blok, en merilni blok, en besedilni blok.
Bloki so zelo pomembni, saj so ti bloki odgovorni za komunikacijo med Googlovo pomočjo in NodeMCU.
Če želite blokirati, morate v zgornjem desnem kotu klikniti znak +.
Nato bomo naredili bloke.
Nato morate nastaviti vsak blok, za to morate označiti določen blok in klikniti Naslednji korak.
Za ta projekt ni treba spreminjati nobenih nastavitev, razen preklopnega gumba.
Besedilo na preklopnem gumbu je z velikimi črkami, narediti morate majhno črko in posodobiti spremembe.
To je to, vse stvari morate nastaviti v adafruit IO.
Moj zadnji zaslon je videti takole -
Nastavitev posrednika IFTTT za FM radio
Kot vedno se prijavite, če nimate računa, ali pa se prijavite, če že imate račun.
Zdaj morate ustvariti programček. Za to sledite spodnjim korakom:
Če želite izdelati programček, kliknite ikono računa in kliknite Ustvari.
Na zaslonu za ustvarjanje kliknite ikono + za if.
Po tem morate dovoliti dostop do svojega google računa.
Za to morate v iskalni vrstici poiskati Google Assistant in klikniti ikono Google Assistant.
Na naslednjem zaslonu moramo izbrati sprožilec, Ne pozabite, da smo v strežniku Adafruit IO naredili tri bloke, za te tri bloke moramo narediti sprožilce.
Najprej blok radijske postaje, za to moramo izbrati Povej besedno zvezo z besedilno sestavino .
Na naslednjem zaslonu moramo vnesti, kaj želite povedati, in s čim naj vam odgovori Google asistent.
Nato kliknite gumb Ustvari sprožilec.
Naslednji zaslon izgleda nekako tako, kot ste končali If del, je čas za takratne strani, kliknite + znak po takrat .
Prikazal se vam bo zaslon, kot je spodnja slika, poiščite Adafruit in kliknite ikono Adafruit.
Nato pooblastite svoj račun Adafruit z IFTTT in kliknite Connect.
Nato morate klikniti Pošlji podatke na Adafruit IO.
Nato se vam prikaže spustni vir, ki ste ga prej ustvarili v računu Adafruit.
Izberite katero koli in kliknite na ustvarjanje dejanja, to morate storiti za vse tri.
In s tem, konec postopka IFTTT, je moj zadnji zaslon programčka videti tako,
Koda Arduino in razlaga
Koda Arduino je na voljo za upravljanje celotne komunikacije med IC in komunikacijo med Adafruit IO IFTTT in WIFI. Popolna koda tega radia Arduino Nano FM je podana na koncu te vadnice. Koda je nekoliko dolga in zapletena, tukaj smo razložili celotno kodo po vrsticah.
Najprej moramo vključiti vse zahtevane knjižnice, to so:
#include
Nato določite SSID in geslo za WI-FI, to je SSID in GESLO vašega usmerjevalnika.
const char * ssid = "Android"; // SSID vašega usmerjevalnika const char * password = "12345678"; // Geslo vašega usmerjevalnika
Nato definiramo dve logični vrednosti in spremenljivko, logični vrednosti se uporabljajo za zadrževanje komunikacijskega stanja IC-jev, spremenljivka glasnosti pa za nastavitev glasnosti.
bool potStatus; // 1, ko je vzpostavljena komunikacija med MCU in IC bool radioStatus; // 1, ko je vzpostavljena komunikacija med MCU in IC int volume = 15; // privzeta raven glasnosti z IC se začne s
Nato smo nastavili GPIO pin z imenom Relay_Pin za vklop ali izklop ojačevalnika.
#define Relay_Pin D7 // Ta zatič se uporablja za vklop in izklop radia
Nato moramo opredeliti vse potrebne definicije za komunikacijo z Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // uporabi 8883 za SSL #define AIO_USERNAME "debashis13" // Zamenjaj ga s svojim uporabniškim imenom #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoF KeyH ProjectFirnoF
Spodnje definicije FIX_BAND so lastniška definicija, ki jo uporablja knjižnica.
Naslednji definirani stavek nastavi notranji volumen modula.
#define FIX_BAND RADIO_BAND_FM // <Skupina, ki jo bo ta skica nastavila, je FM. #define FIX_RADIO_VOLUME 6 /// <Privzeta glasnost modula.
Nato naredite zahtevane predmete za PT2258, RDA5807M in WiFiClient.
PT2258 digitalPot; // PT2258 Predmet RDA5807M radio; // RDA5807M objekt WiFiClient odjemalec; // Objekt WiFiClient
Nato nastavite razred odjemalca MQTT, tako da vnesete odjemalca WiFi in strežnik MQTT ter podatke za prijavo.
Adafruit_MQTT_Client mqtt (& odjemalec, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Nastavite razred odjemalca MQTT tako, da vnesete odjemalca WiFi in strežnik MQTT ter podatke za prijavo.
Nato se moramo naročiti na vir. Kaj vas lahko vpraša?
Če se nekatere vrednosti ali nekateri parametri spremenijo na strežniku Adafruit, bodo spremembe prikazane tukaj.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Metode, uporabljene za naročanje na vir Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // metode, uporabljene za naročanje na vir Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Metode, uporabljene za naročanje na vir
Spodaj je prototip funkcije za funkcijo MQTT_connect () .
void MQTT_connect (); // Prototip funkcije za MQTT Connect
Nato začnemo postopek namestitve. Komunikacijo UART najprej začnemo z metodo start.
Serial.begin (9600); // UART začnemo Serial.println (); // dodaja dodatno vrstico za razmik Serial.println (); // dodaja dodatno vrstico za razmik. Nato naredimo vse običajno, da se povežemo z WiFI **************** vse običajne stvari, potrebne za povezavo WiFi *********************** / Serial.print ("povezovanje z"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, geslo); medtem ko (WiFi.status ()! = WL_CONNECTED) {zamuda (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi povezan"); Serial.println ("Naslov IP:"); Serial.println (WiFi.localIP ()); / **************** vse običajne stvari, potrebne za povezavo WiFi *********************** /
Nato pokličite metodo Wire.begin (), da ustvarite povezavo I2C, mi pa pokličemo metodo Wire.setClock (), da določimo frekvenco I2C na 100KHz, saj gre za polno hitrost IC IC PT2258.
Wire.begin (); // začnemo začetno zaporedje I2C Wire.setClock (100000); // nastavitev ure I2C na 100KHz
Nato pokličite metodo init () za PT2258 in RDA5807 IC in zadržite status vrnitve v predhodno definirane logične vrednosti.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Nato preverite, ali je MCU lahko komuniciral z IC ali ne. To naredimo z dvema izjavama, če ne drugače .
if (potStatus) {Serial.println ("Najdena naprava PT2258!"); } else {Serial.println ("Pogon PT2258 ni uspel"); } if (radioStatus) {Serial.println ("Najdena naprava RDA5807M!"); } else {Serial.println ("RDA5807M ni uspelo zagnati"); }
Nato pokličite metodo naročanja iz knjižnice MQTT. Strežnik MQTT nas bo obvestil, če se bodo v naših naročenih virih zgodile kakšne spremembe.
mqtt.subscribe (& Radio_Station); // Nastavitev naročnine na MQTT za vir Radio_Station mqtt.subscribe (& Toggle_FM); // Nastavitev naročnine MQTT za vir Toggle_FM mqtt.subscribe (& Volume); // Nastavitev naročnine na MQTT za količinski vir
Nato nastavimo relejski zatič kot izhod in stanje zatiča na LOW
pinMode (D7, IZHOD); digitalWrite (D7, LOW);
Nato nastavite vnaprej določeno glasnost radia, ta parameter nastavi notranjo glasnost IC RDA5807, ki označuje konec našega postopka nastavitve.
radio.setVolume (FIX_RADIO_VOLUME); // nato nastavimo normalizacijo glasnosti radia radio.setMono (false); // ne želimo, da čip daje mono izhod radio.setMute (false); // ne želimo, da čip na začetku ugasne
Zanko začnemo s klicem funkcije MQTT_connect (), ki vzpostavi povezavo s strežnikom MQTT.
V funkciji MQTT connect trikrat poskusimo vzpostaviti povezavo s strežnikom MQTT.
Če je uspešen, dobimo sporočilo o uspehu, sicer pa sporočilo o napaki.
void MQTT_connect () {int8_t ret; // 8-bitno celo število za shranjevanje ponovnih poskusov // Ustavi, če je že povezan. if (mqtt.connected ()) {return; } Serial.print ("Povezovanje z MQTT…"); uint8_t poskusi = 3; while ((ret = mqtt.connect ())! = 0) {// connect bo vrnil 0 za priključen Serial.println (mqtt.connectErrorString (ret)); Serial.println ("Ponovni poskus povezave MQTT v 5 sekundah…"); mqtt.disconnect (); zamuda (5000); // počakamo 5 sekund, poskusi--; if (retries == 0) {// v bistvu umre in počaka, da me WDT ponastavi, medtem ko (1); }} Serial.println ("MQTT povezan!"); }
Nato začnite z ustvarjanjem kazalca na objekt Adafruit_MQTT_Subscribe . S tem bomo ugotovili, katero naročnino smo prejeli.
Naročnina Adafruit_MQTT_Subscribe *;
Nato čakamo na naročniško sporočilo.
mqtt.readSubscription (timeInMilliseconds) bo poslušal določen čas za vsa sporočila, ki prihajajo s strežnika MQTT.
Če prejme sporočilo pred časovno omejitvijo, bo odgovoril s kazalcem na naročnino ali pa bo le potekel čas in vrnil 0. V tem primeru bo počakal 2 sek.
medtem ko ((naročnina = mqtt.readSubscription (20000)))
Če pride do prekinitve je pa za polnjenje zanke ne. Če ne, primerjamo kakšno naročnino in dobimo znane naročnine.
V tej kodi to storimo za vse tri naročene vire.
if (subscription == & Toggle_FM) if (subscription == & Radio_Station) if (subscription == & Volume)
To so bili glavni trije parametri, ki jih morate razumeti v odseku zanke.
Ta odsek kode se uporablja za nadzor in nastavitev vira Toggle_FM .
if (subscription == & Toggle_FM) // ali je to sporočilo iz vira Toggle_FM {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // natisnemo podatke vira samo za odpravljanje napak, če (String ((char *) Toggle_FM.lastread) == String ("on")) // prejete podatke primerjamo z znanim parametrom, v tem primeru pričakujemo, da bo „on“ "prihaja iz sever {// ampak preden to storimo, moramo narediti niz, zaradi česar je primerjava super enostavna digitalWrite (D7, HIGH); // če dobimo niz" on "od strežnika, ki ga ustvarjamo D7 pin HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // spet preverjamo, ali je niz off {digitalWrite (D7, LOW); // če dobimo niz "izklopljen" s strežnika izdelujemo D7 pin LOW}}
Ta odsek kode se uporablja za nadzor in nastavitev vira Radio_Station .
if (naročnina == & Radio_Station) {Serial.print (F ("Dobil:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // slišimo, da preverjamo niz Big FM {radio.setBandFrequency (FIX_BAND, 9270); // če je zgornji pogoj izpolnjen, kanal radoi nastavljamo na 92,7 MHz} // Zgoraj omenjeni postopek se nadaljuje spodaj, če (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); }}
Ta odsek kode se uporablja za nadzor in nastavitev podajanja glasnosti.
if (subscription == & Volume) // // slišimo, preverjamo niz Nivo in gre za celoštevilčno vrednost v obliki niza // Za spremembo glasnosti jo moramo pretvoriti nazaj v celo število s pomočjo PT2258 IC Serial.print (F ("Dobil:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Metodo atoi () uporabljamo za pretvorbo kazalca na znak v celo število volume = map (volume, 0,100,79,0); // preslikava (vrednost, odLow, fromHigh, toLow, toHigh) // ker pt2258 razume le celoštevilske vrednosti v dB // vrednost 0dB - 79dB preslikavamo na 0% - 100%. digitalPot.setChannelVolume (glasnost, 0); // po vsem, kar nastavljamo glasnost za kanal 0 PT2258 IC digitalPot.setChannelVolume (glasnost, 1); // po vsem tem, kar nastavljamo glasnost kanala 1 IC IC PT2258}}
Testiranje glasovno nadzorovanega FM radia z uporabo Arduina
Za testiranje vezja je bila uporabljena naslednja naprava -
- Transformator s pipo 13-0-13
- Dva 4Ω 20W zvočnika kot obremenitev.
- Telefon za uporabo Google Pomočnika.
V prejšnjem članku sem vam pokazal, kako narediti enostaven avdio ojačevalnik 2x32 W z IC TDA2050, to bom uporabil tudi za to predstavitev, Zmotil sem mehanski potenciometer in z dvema majhnima mostičnima kabloma zaskočil dva kabla. Zdaj sem s pomočjo dveh tipk lahko spremenil glasnost ojačevalnika.
Nadaljnje izboljšanje
Obstaja še veliko dodatnih izboljšav tega vezja.
- Obstajajo različne težave s hrupom, ker zraven NodeMCU deluje zvočni vir, zato moramo za izboljšanje odpornosti proti hrupu izvesti dodatno zaščito.
- Izdelava celotnega vezja na tiskano vezje bo izboljšala odpornost proti hrupu.
- Temu IC lahko dodate dodatne filtre za odpravo hrupa.
Upam, da vam je bil ta članek všeč in ste se iz njega naučili kaj novega. Če dvomite, lahko vprašate v spodnjih komentarjih ali pa uporabite naše forume za podrobno razpravo.