- RDA5807M IC
- IC PT2258
- Skematisk
- Komponenter, der kræves
- Hvordan får vi data fra Google Assistant?
- Oprettelse af en Adafruit-konto til kommunikation
- Opsætning af en IFTTT-mægler til FM-radio
- Arduino-kode og forklaring
- Test af den stemmestyrede FM-radio ved hjælp af Arduino
- Yderligere forbedring
I dag kan de fleste af os lide at lytte til musik med vores smartphones. Men for et par år tilbage var dette ikke tilfældet, på det tidspunkt var FM-radioer det første valg til at lytte til musik, podcasts, nyheder og andre. I dag lytter ingen til radioen for musik, nyheder og andre, hvor bedstemor og bedstefar er en undtagelse.
Så for at genoplive FM-radioens gamle herlighed lidt, i dette projekt skal jeg opbygge en stemmestyret FM-radio ved hjælp af Google Assistance og den populære RDA5870M Superheterodyne Receiver IC.
Tjek også vores tidligere FM-radiokredsløb:
- Arduino-baseret FM-radio
- Smart telefonstyret FM-radio ved hjælp af Arduino
- Simpelt FM-senderkredsløb
- Sådan opbygges FM-senderkredsløb
RDA5807M IC
RDA5807M er en meget moderne FM-stereoradiotuner med en chip med en fuldt integreret synthesizer, IF-selektivitet, RDS / RBDS og MPX-dekoder, der understøtter frekvensområdet 50MHz til 115MHz. Det er en meget billig FM-modtager IC med en chip, som kræver meget få eksterne komponenter for at fungere funktionelt. Denne IC bruger I2C-grænsefladen til at kommunikere med enhver masterenhed, så al denne funktion gør den meget velegnet til bærbare enheder.
Denne IC har en intern lydprocessor, der er ansvarlig for dens store lydkvalitet.
Nogle af de grundlæggende funktioner inkluderer -
- Støtte til verdensomspændende frekvensbånd
- Support til RDS / RBDS
- Digital lav-IF-tuner
- Fuldt integreret digital frekvenssynthesizer
- Digital automatisk forstærkningskontrol (AGC)
- Bass Boost
- Understøtter direkte 32Ω modstandsbelastning
- Integreret LDO-regulator og mere
Du kan lære mere om denne IC ved at gennemgå dette projekt Arduino-baserede FM-radio ved hjælp af RDA5807.
IC PT2258
PT2258 er en IC, der er fremstillet til brug som en 6-kanals elektronisk volumenkontrol, denne IC bruger CMOS-teknologi specielt designet til flerkanals lyd-video applikationer.
Denne IC giver et I2C-kontrolinterface med et dæmpningsområde fra 0 til -79 dB ved 1 dB / trin og kommer i en 20-benet DIP- eller SOP-pakke.
Nogle af de grundlæggende funktioner inkluderer-
- 6-input- og outputkanaler (til 5.1 hjemmelydsystemer)
- Valgbar I2C-adresse (til Daisy-chain-applikation)
- Højkanalseparation (til anvendelse med lav støj)
- S / N-forhold på> 100 dB
- Driftsspænding er 5 til 9V
Vi har tidligere forklaret om denne IC i PT2258 Digital Audio Volume Control Project. Du kan kontrollere dette projekt, hvis du vil vide mere om denne IC.
Skematisk
Kredsløbsdiagram for Google Assistant Controlled FM Radio er angivet nedenfor:
Komponenter, der kræves
- NodeMCU Microcontroller - 1
- PT2258 Digital Volume Controller - 1
- RDA5807 FM-radiomodul - 1
- SPDT Relæ 6V - 1
- 1n4007 Diode - 1
- Skrueterminal 5mmx2 - 1
- 3,5 mm stik til hovedtelefoner - 1
- Logisk niveauomregner - 1
- 10K modstand, 5% - 4
- 150K modstand, 5% - 4
- 100K modstand, 5% - 2
- 10uF kondensator - 6
- 0,1 uF kondensator - 1
- Jumper Wire - 10
Hvordan får vi data fra Google Assistant?
Ovenstående billede giver dig den grundlæggende idé om kommunikationsprocessen mellem Google Assistent og NodeMCU.
Google Assistent har autoritet til at ændre data i Adafruit IO-serveren for at gøre det IFTTT med MQTT fungerer som mægler.
Hvis der forekommer nogen dataændring på serversiden (Adafruit IO), afspejles det på NodeMCU-siden. For at opnå dette skal du følge nedenstående instruktion-
Oprettelse af en Adafruit-konto til kommunikation
Opret først en Adafruit IO-konto. Log ind på Adafruit IO med dine legitimationsoplysninger, eller tilmeld dig, hvis du ikke har en konto. Vi har tidligere brugt Adafruit IO til at opbygge Alexa-styret LED, Raspberry Pi-hjemmeautomatisering og mange andre IoT-baserede projekter.
Efter at have logget ind på Adafruit-kontoen, Klik på Dashboards, og klik derefter på Action> Opret et nyt dashboard .
Dernæst skal vi tilføje et nyt navn og en kort beskrivelse af vores nye Dashboard.
Når du har oprettet instrumentbrættet, skal du hente brugernavnet og den aktive nøgle fra din konto, som det kræves i Arduino-koden. Du kan få det ved at klikke på KEY-ikonet.
Derefter lav tre blokke; en Toggle Block, en Gauge Block, en Text Block.
Blokkene er meget vigtige, da disse blokke er ansvarlige for kommunikationen mellem google assistance og NodeMCU.
For at oprette en blok skal du klikke på + -tegnet i øverste højre hjørne.
Dernæst skal vi lave blokke.
Dernæst skal du oprette hver blok, for det skal du markere en bestemt blok og klikke på Næste trin.
For dette projekt er der ikke behov for at ændre nogen indstillinger undtagen skifteknappen.
Teksten i vippeknappen er med store bogstaver, du skal gøre det til et lille bogstav og opdatere ændringerne.
Det er det, det er alle de ting, du har brug for at konfigurere i adafruit IO.
Min sidste skærm ser sådan ud-
Opsætning af en IFTTT-mægler til FM-radio
Som altid, tilmeld dig, hvis du ikke har en konto, eller log ind, hvis du allerede har en konto.
Nu skal du oprette en applet. Følg nedenstående trin for det:
For at oprette en applet skal du klikke på dit kontoikon og klikke på Opret.
Klik på ikonet + efter if på skærmbilledet Opret.
Derefter skal du give adgang til din Google-konto.
Til det skal du søge efter Google Assistant i søgefeltet og klikke på Google Assistant-ikonet.
I den næste skærm skal vi vælge en trigger, Husk, vi lavede tre blokke i Adafruit IO-serveren, vi skal lave triggere for de tre blokke.
For det første er Radio Station Block, for det skal vi vælge Sig en sætning med en tekstingrediens .
I det næste skærmbillede skal vi skrive, hvad vil du sige, og hvad google-assistenten skal svare dig med.
Klik derefter på Opret udløserknap.
Det næste skærmbillede ser sådan ud, da du har afsluttet If- delen, er det tid for den daværende del, skal du klikke på + -tegnet efter det .
Du får en skærm som nedenstående billede, søg efter Adafruit og klik på Adafruit-ikonet.
Autoriser derefter din Adafruit-konto med IFTTT, og klik derefter på Opret forbindelse.
Dernæst skal du klikke på Send data til Adafruit IO.
Derefter vil du blive præsenteret for en rullemenu med feeds, som du har oprettet tidligere på Adafruit-kontoen.
Vælg en hvilken som helst og klik på Opret handling, du skal gøre dette for alle tre.
Og med det markerer afslutningen på IFTTT-processen, min sidste appletskærm ser sådan ud,
Arduino-kode og forklaring
Arduino-koden er der for at styre al kommunikation mellem IC og kommunikationen mellem Adafruit IO IFTTT og WIFI. Komplet kode til denne Arduino Nano FM-radio findes i slutningen af denne vejledning. Koden er lidt lang og kompleks, her har vi forklaret den komplette kode linje for linje.
Først skal vi medtage alle de krævede biblioteker, de er:
#omfatte
Definer derefter SSID og adgangskode til WI-FI, dette er SSID og PASSORD på din router.
const char * ssid = "Android"; // SSID på din router const char * password = "12345678"; // Adgangskoden til din router
Derefter definerer vi to booleanere og en variabel, booleanerne bruges til at holde kommunikationsstatus for IC'erne, og lydstyrkevariablen bruges til at indstille lydstyrkeniveauet.
bool potStatus; // 1 når kommunikation er etableret mellem MCU og IC bool radioStatus; // 1 når kommunikation er etableret mellem MCU og IC int volume = 15; // standard lydstyrkeniveau med IC starter med
Derefter oprettede vi en GPIO-pin ved navn Relay_Pin til at tænde eller slukke for forstærkeren.
#define Relay_Pin D7 // Denne pin bruges til at tænde og slukke for radioen
Dernæst skal vi definere alle de nødvendige definer for at kommunikere med Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 for SSL #define AIO_USERNAME "debashis13" // Erstat det med dit brugernavn #definer AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp"
Nedenstående definitioner FIX_BAND er en proprietær definition, der bruges af biblioteket.
Den næste definerede sætning indstiller modulets interne lydstyrke.
#define FIX_BAND RADIO_BAND_FM // <Bandet vil blive tunet af denne skitse er FM. #define FIX_RADIO_VOLUME 6 /// <Standardvolumen for modulet.
Lav derefter de nødvendige objekter til PT2258, RDA5807M og WiFiClient.
PT2258 digitalPot; // PT2258 Objekt RDA5807M radio; // RDA5807M Object WiFiClient-klient; // WiFiClient-objekt
Konfigurer derefter MQTT-klassen ved at sende WiFi-klienten og MQTT-serveren og loginoplysninger.
Adafruit_MQTT_Client mqtt (& klient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Opsæt MQTT-klientklassen ved at overføre WiFi-klienten og MQTT-serveren og loginoplysninger.
Så er vi nødt til at abonnere på et feed. Hvad får det dig til at spørge?
Hvis nogle værdier, nogle parametre ændres i Adafruit-serveren, reflekteres ændringerne her.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Metoder, der bruges til at abonnere på et feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Metoder, der bruges til at abonnere på et feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Metoder, der bruges til at abonnere på et feed
Nedenfor er funktionsprototypen for MQTT_connect () -funktionen.
ugyldig MQTT_connect (); // Funktionsprototype til MQTT Connect
Så begynder vi vores installationsproces. Først starter vi UART-kommunikationen med startmetoden.
Serial.begin (9600); // UART begynder Serial.println (); // tilføjer en ekstra linje til afstand Serial.println (); // tilføjer en ekstra linje til afstand Derefter gør vi alt det sædvanlige for at oprette forbindelse til WiFI *************** alle de sædvanlige ting, der kræves til en WiFi-forbindelse ********************** / Serial.print ("forbinder til"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, password); mens (WiFi.status ()! = WL_CONNECTED) {forsinkelse (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi-tilsluttet"); Serial.println ("IP-adresse:"); Serial.println (WiFi.localIP ()); / **************** alle de sædvanlige ting, der kræves for en WiFi-forbindelse *********************** /
Derefter skal du ringe til Wire.begin () -metoden for at skabe en I2C-forbindelse, og vi kalder Wire.setClock () -metoden for at fastsætte I2C-frekvensen til 100 KHz, da den er den fulde hastighed af PT2258 IC.
Wire.begin (); // start I2C-startsekvensen Wire.setClock (100000); // indstilling af I2C-uret til 100 KHz
Derefter skal du kalde init () -metoden til både PT2258 og RDA5807 IC og holde returstatus i de tidligere definerede booleanske.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Kontroller derefter, om MCU'en var i stand til at kommunikere med IC'en eller ej. Vi gør dette med to hvis ellers udsagn.
hvis (potStatus) {Serial.println ("Fundet PT2258-enhed!"); } andet {Serial.println ("Kunne ikke starte PT2258"); } hvis (radioStatus) {Serial.println ("Fundet RDA5807M-enhed!"); } andet {Serial.println ("Kunne ikke starte RDA5807M"); }
Ring derefter til abonnementsmetoden fra MQTT-biblioteket. Vi får besked fra MQTT-serveren, hvis der sker ændringer i vores abonnerede feeds.
mqtt.subscribe (& Radio_Station); // Opsæt MQTT-abonnement til Radio_Station-feed mqtt.subscribe (& Toggle_FM); // Opsæt MQTT-abonnement for Toggle_FM-feed mqtt.subscribe (& Volume); // Opsætning af MQTT-abonnement til volumenfeed
Dernæst indstiller vi relæstiften som output og pin-status til LOW
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Indstil derefter en forudbestemt radiovolumen, denne parameter indstiller den interne lydstyrke for RDA5807 IC, som markerer slutningen af vores installationsproces.
radio.setVolume (FIX_RADIO_VOLUME); // næste indstiller vi normaliseringen af radiovolumen radio.setMono (falsk); // vi ønsker ikke, at chippen giver mono-output radio.setMute (false); // vi ønsker ikke, at chippen slukker ved start
Vi starter sløjfen ved at kalde funktionen MQTT_connect () , der opretter en forbindelse til MQTT-serveren.
I MQTT-tilslutningsfunktionen prøver vi tre gange at oprette forbindelse til MQTT-serveren.
Hvis det lykkes, får vi en succesmeddelelse, ellers får vi en fejlmeddelelse.
ugyldig MQTT_connect () {int8_t ret; // 8 bit heltal for at gemme forsøgene // Stop hvis det allerede er tilsluttet. hvis (mqtt.connected ()) {return; } Serial.print ("Opretter forbindelse til MQTT…"); uint8_t prøver igen = 3; mens ((ret = mqtt.connect ())! = 0) {// connect vil returnere 0 for tilsluttet Serial.println (mqtt.connectErrorString (ret)); Serial.println ("Forsøger igen MQTT-forbindelse på 5 sekunder…"); mqtt.disconnect (); forsinkelse (5000); // vent 5 sekunder igen -; hvis (prøver igen == 0) {// dybest set dør og vent på, at WDT nulstiller mig, mens (1); }} Serial.println ("MQTT Connected!"); }
Start derefter med at oprette en markør til et Adafruit_MQTT_Subscribe- objekt. Vi bruger dette til at bestemme, hvilket abonnement der blev modtaget.
Adafruit_MQTT_Abonner * abonnement;
Dernæst venter vi på en abonnementsbesked.
mqtt.readSubscription (timeInMilliseconds) lytter til et bestemt tidspunkt for alle meddelelser, der kommer fra MQTT-serveren.
Hvis den får en besked inden timeout, svarer den med en peger på abonnementet, eller den vil bare timeout og returnere 0. I så fald venter den i 2 sek.
while ((abonnement = mqtt.readSubscription (20000)))
Hvis der opstår en timeout, mislykkes while- loop-udfyldningen. Hvis ikke, sammenligner vi hvilket abonnement og får vores kendte abonnementer.
I denne kode gør vi dette for alle tre af vores abonnerede feeds.
hvis (abonnement == & Toggle_FM) hvis (abonnement == & Radio_Station) hvis (abonnement == & Volumen)
Disse var de tre vigtigste parametre, som du har brug for at forstå i loop-sektionen.
Dette afsnit af koden bruges til at overvåge og indstille Toggle_FM- feedet.
hvis (abonnement == & Toggle_FM) // er det en besked fra Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // udskriv feeddataene kun til debugging, hvis (String ((char *) Toggle_FM.lastread) == String ("on")) // vi sammenligner de modtagne data med en kendt parameter i dette tilfælde forventer vi, at "on "kommer fra severen {// men før vi gør det, skal vi gøre det til en streng, der gør sammenligningen super let digitalWrite (D7, HIGH); // hvis vi får en" on "streng fra den server, vi laver D7-stiften HIGH} hvis (String ((char *) Toggle_FM.lastread) == String ("off")) // igen kontrollerer vi for strengen fra {digitalWrite (D7, LOW); // hvis vi får en "off" streng fra serveren vi laver D7 pin LOW}}
Dette afsnit af koden bruges til at overvåge og indstille Radio_Station- feedet.
hvis (abonnement == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); hvis (String ((char *) Radio_Station.lastread) == String ("Big FM")) // hører, vi kontrollerer strengen Big FM {radio.setBandFrequency (FIX_BAND, 9270); // hvis ovennævnte betingelse er sand, sætter vi radoi-kanalen til 92,7MHz} // Ovennævnte proces fortsættes nedenfor hvis (String ((char *) Radio_Station.lastread) == String ("Red FM")) { radio.setBandFrequency (FIX_BAND, 9350); } hvis (String ((char *) Radio_Station.lastread) == String ("Radio Mirchi")) {radio.setBandFrequency (FIX_BAND, 9830); }}
Dette afsnit af koden bruges til at overvåge og indstille volumenfeed.
hvis (abonnement == & lydstyrke) // // hører, vi kontrollerer for strengen Volumen, og det er et heltal i et strengformat // Vi er nødt til at konvertere det tilbage til et heltal for at ændre lydstyrken ved hjælp af PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Vi bruger atoi () -metoden til at konvertere en tegnmarkør til et heltal volumen = kort (volumen, 0,100,79,0); // map (værdi, fromLow, fromHigh, toLow, toHigh) // da pt2258 kun forstår heltalværdier i dB // kortlægger vi 0dB - 79dB-værdien til 0% - 100%. digitalPot.setChannelVolume (volumen, 0); // når alt kommer til alt indstiller vi lydstyrken til kanal 0 i PT2258 IC digitalPot.setChannelVolume (volume, 1); // når alt kommer til alt indstiller vi lydstyrken for kanal 1 på PT2258 IC}}
Test af den stemmestyrede FM-radio ved hjælp af Arduino
For at teste kredsløbet blev følgende apparat brugt -
- En transformer, der har en 13-0-13 tap
- To 4Ω 20W højttalere som belastning.
- Telefon for at bruge Google Assistent.
I en tidligere artikel har jeg vist dig, hvordan du laver en simpel 2x32 Watt lydforstærker med TDA2050 IC, det vil jeg også bruge til denne demonstration, Jeg har forstyrret det mekaniske potentiometer og kortsluttet to ledninger med to små jumperkabler. Nu, ved hjælp af to trykknapper, var jeg i stand til at ændre forstærkerens lydstyrke.
Yderligere forbedring
Der er mange yderligere forbedringer, der kan foretages i dette kredsløb.
- Der er forskellige støjproblemer, fordi en lydkilde fungerer ved siden af NodeMCU, så vi er nødt til at implementere yderligere afskærmning for at forbedre støjimmuniteten.
- Opbygning af det samlede kredsløb til et printkort forbedrer støjimmuniteten.
- Yderligere filtre kan føjes til denne IC for at eliminere støj.
Jeg håber, du kunne lide denne artikel og lærte noget nyt ud af den. Hvis du er i tvivl, kan du spørge i kommentarerne nedenfor eller bruge vores fora til detaljeret diskussion.