- RDA5807M IC
- IC PT2258
- Skjematisk
- Komponenter kreves
- Hvordan får vi data fra Google Assistant?
- Opprette en Adafruit-konto for kommunikasjon
- Sette opp en IFTTT-megler for FM-radio
- Arduino-kode og forklaring
- Testing av stemmestyrt FM-radio ved hjelp av Arduino
- Ytterligere forbedring
I dag liker de fleste av oss å høre på musikk med smarttelefonene våre. Men for noen år tilbake var dette ikke tilfelle, på det tidspunktet var FM-radioer førstevalget for å lytte til musikk, podcaster, nyheter og andre. I dag lytter ingen til radio for musikk, nyheter og andre, bestemor og bestefar er et unntak.
Så for å gjenopplive den gamle herligheten til FM-radioen litt, i dette prosjektet skal jeg bygge en stemmestyrt FM-radio ved hjelp av Google Assistance og den populære RDA5870M Superheterodyne Receiver IC.
Sjekk også våre forrige FM-radiokretser:
- Arduino-basert FM-radio
- Smarttelefonkontrollert FM-radio ved hjelp av Arduino
- Enkel FM-senderkrets
- Hvordan bygge FM-senderkrets
RDA5807M IC
RDA5807M er en veldig moderne FM-stereo radiotuner med en brikke, med en fullt integrert synthesizer, IF-selektivitet, RDS / RBDS og MPX-dekoder som støtter frekvensområdet 50MHz til 115MHz. Det er en veldig billig single-chip FM-mottaker IC som krever svært lite eksterne komponenter for å fungere funksjonelt. Denne IC bruker I2C-grensesnittet til å kommunisere med hvilken som helst masterenhet, så all denne funksjonen gjør den veldig godt egnet for bærbare enheter.
Denne IC har en intern lydprosessor som er ansvarlig for den gode lydkvaliteten.
Noen av de grunnleggende funksjonene inkluderer -
- Støtte for verdensomspennende frekvensbånd
- Støtte for RDS / RBDS
- Digital lav-IF-tuner
- Fullt integrert digital frekvenssynthesizer
- Digital automatisk forsterkningskontroll (AGC)
- Bass boost
- Støtter direkte 32Ω motstandsbelastning
- Integrert LDO-regulator og mer
Du kan lære mer om denne ICen ved å gå gjennom dette Arduino-baserte FM-radioprosjektet ved hjelp av RDA5807.
IC PT2258
PT2258 er en IC laget for å brukes som en 6-kanals elektronisk volumkontroller, denne IC bruker CMOS-teknologi spesielt designet for flerkanals lyd-videoapplikasjoner.
Denne IC gir et I2C-kontrollgrensesnitt med et dempningsområde fra 0 til -79 dB ved 1 dB / trinn og kommer i en 20-pinners DIP- eller SOP-pakke.
Noen av de grunnleggende funksjonene inkluderer -
- 6-inngangs- og utgangskanaler (for 5.1 hjemmelydsystemer)
- Valgbar I2C-adresse (for applikasjon av Daisy-chain)
- Separasjon med høy kanal (for applikasjon med lite støy)
- S / N-forhold på> 100 dB
- Driftsspenning er 5 til 9V
Vi har tidligere forklart om denne ICen i PT2258 Digital Audio Volume Control Project. Du kan sjekke det prosjektet hvis du vil vite mer om denne IC.
Skjematisk
Kretsskjema for Google Assistant Controlled FM Radio er gitt nedenfor:
Komponenter kreves
- NodeMCU Microcontroller - 1
- PT2258 Digital volumkontroller - 1
- RDA5807 FM-radiomodul - 1
- SPDT Relé 6V - 1
- 1n4007 Diode - 1
- Skruterminal 5mmx2 - 1
- 3,5 mm hodetelefonkontakt - 1
- Logic Level Converter - 1
- 10K motstand, 5% - 4
- 150K motstand, 5% - 4
- 100K motstand, 5% - 2
- 10uF kondensator - 6
- 0.1uF kondensator - 1
- Jumper Wire - 10
Hvordan får vi data fra Google Assistant?
Ovenstående bilde gir deg den grunnleggende ideen om kommunikasjonsprosessen mellom Google Assistant og NodeMCU.
Google Assistant har myndighet til å endre data i Adafruit IO-serveren for å gjøre at IFTTT med MQTT fungerer som megler.
Hvis det forekommer dataendringer på serversiden (Adafruit IO), gjenspeiles det på NodeMCU-siden. For å oppnå dette må du følge instruksjonene nedenfor -
Opprette en Adafruit-konto for kommunikasjon
Lag først en Adafruit IO-konto. Logg inn på Adafruit IO med din legitimasjon eller Registrer deg hvis du ikke har en konto. Vi brukte tidligere Adafruit IO til å bygge Alexa-styrt LED, Raspberry Pi hjemmeautomatisering og mange andre IoT-baserte prosjekter.
Etter at du har logget på Adafruit-kontoen, Klikk på Dashboards, og klikk deretter på Action> Create a New Dashboard .
Deretter skal vi legge til et nytt navn og en kort beskrivelse av vårt nye dashbord.
Etter at du har opprettet dashbordet, må du hente brukernavnet og den aktive nøkkelen fra kontoen din slik det kreves i Arduino-koden. Du kan få det ved å klikke på NØkkel-ikonet.
Etter det, lag tre blokker; en Toggle Block, en Gauge Block, en Text Block.
Blokkene er veldig viktige, siden disse blokkene er ansvarlige for kommunikasjonen mellom google assistanse og NodeMCU.
For å lage en blokk må du klikke på + -tegnet øverst til høyre.
Deretter skal vi lage blokkene.
Deretter må du sette opp hver blokk, for det må du krysse av for en bestemt blokk og klikke Neste trinn.
For dette prosjektet er det ikke nødvendig å endre noen innstillinger bortsett fra veksleknappen.
Teksten i veksleknappen er med store bokstaver, du må gjøre det til en liten bokstav og oppdatere endringene.
Det er det, det er alle tingene du trenger å sette opp i adafruit IO.
Min siste skjerm ser ut slik:
Sette opp en IFTTT-megler for FM-radio
Som alltid, registrer deg hvis du ikke har en konto eller Logg på hvis du allerede har en konto.
Nå må du opprette en applet. Følg trinnene nedenfor for det:
For å lage en applet, klikk på kontoikonet ditt og klikk på Create.
I opprettingsskjermbildet klikker du på + -ikonet etter if.
Etter det må du gi tilgang til Google-kontoen din.
For det må du søke etter Google Assistant i søkefeltet og klikke på Google Assistant-ikonet.
I det neste skjermbildet må vi velge en utløser, Husk at vi lagde tre blokker i Adafruit IO Server, vi må lage triggere for de tre blokkene.
Først, Radio Station Block, for det, må vi velge Si en setning med en tekstingrediens .
I det neste skjermbildet må vi skrive hva du vil si og hva google-assistenten skal svare deg med.
Klikk deretter på Opprett utløserknappen.
Neste skjermbilde ser ut som dette, ettersom du har fullført If- delen, er det tid for den da delen, klikk på + -tegnet etter det .
Du vil bli presentert med en skjerm som bildet nedenfor, søk etter Adafruit og klikk på Adafruit-ikonet.
Autoriser deretter Adafruit-kontoen din med IFTTT, og klikk deretter Koble til.
Deretter må du klikke Send data til Adafruit IO.
Deretter vil du bli presentert for en rullegardinmeny med feeder du har opprettet tidligere i Adafruit-kontoen.
Velg hvilken som helst og klikk på Opprett handling, du må gjøre dette for alle tre.
Og med det, markerer slutten på IFTTT-prosessen, ser min siste appletskjerm slik ut,
Arduino-kode og forklaring
Arduino-koden er der for å administrere all kommunikasjon mellom IC og kommunikasjonen mellom Adafruit IO IFTTT og WIFI. Komplett kode for denne Arduino Nano FM-radioen er gitt på slutten av denne veiledningen. Koden er litt lang og kompleks, her har vi forklart den komplette koden linje for linje.
Først må vi inkludere alle nødvendige biblioteker, de er:
#inkludere
Definer deretter SSID og passord for WI-FI, dette er SSID og PASSORD på ruteren din.
const char * ssid = "Android"; // SSID for ruteren din const char * password = "12345678"; // Passordet til ruteren din
Deretter definerer vi to booleanere og en variabel, booleanene brukes til å holde kommunikasjonsstatusen til IC-ene, og volumvariabelen brukes til å stille volumnivået.
bool potten Status; // 1 når kommunikasjon er opprettet mellom MCU og IC bool radioStatus; // 1 når kommunikasjon er opprettet mellom MCU og IC int volum = 15; // standard volumnivå med IC starter med
Deretter satte vi opp en GPIO-pinne som heter Relay_Pin for å slå på eller av forsterkeren.
#define Relay_Pin D7 // Denne pinnen brukes til å slå på og av radioen
Deretter må vi definere alle nødvendige definisjoner for å kommunisere med Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 for SSL #define AIO_USERNAME "debashis13" // Erstatt det med brukernavnet ditt #definer AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp"
Definisjonene nedenfor FIX_BAND er en proprietær definisjon som brukes av biblioteket.
Den neste definerte setningen setter modulets interne volum.
#define FIX_BAND RADIO_BAND_FM // <Bandet blir innstilt etter denne skissen er FM. #define FIX_RADIO_VOLUME 6 /// <Standardvolum for modulen.
Lag deretter de nødvendige objektene for PT2258, RDA5807M og WiFiClient.
PT2258 digitalPot; // PT2258 Objekt RDA5807M radio; // RDA5807M Object WiFiClient-klient; // WiFiClient-objekt
Sett deretter opp MQTT-klientklassen ved å sende inn WiFi-klienten og MQTT-serveren og påloggingsinformasjonen.
Adafruit_MQTT_Client mqtt (& klient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Sett opp MQTT-klientklassen ved å sende inn WiFi-klienten og MQTT-serveren og påloggingsinformasjonen.
Da må vi abonnere på en feed. Hva får det deg til å spørre?
Hvis noen verdier, noen parametere endres i Adafruit-serveren, vil endringene gjenspeiles her.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Metoder som brukes til å abonnere på en feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Metoder som brukes til å abonnere på et feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Metoder som brukes til å abonnere på en feed
Nedenfor er funksjonsprototypen for MQTT_connect () -funksjonen.
ugyldig MQTT_connect (); // Funksjonsprototype for MQTT Connect
Så begynner vi installasjonsprosessen. Først starter vi UART-kommunikasjonen med startmetoden.
Serial.begin (9600); // UART begynner Serial.println (); // legger til en ekstra linje for avstand Serial.println (); // legger til en ekstra linje for avstand Neste, vi gjør alt det vanlige for å koble til WiFI **************** alle de vanlige tingene som kreves for en WiFi-forbindelse ********************** / Serial.print ("tilkobling til"); Serial.println (ssid); WiFi-modus (WIFI_STA); WiFi.begin (ssid, passord); mens (WiFi.status ()! = WL_CONNECTED) {forsinkelse (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi-tilkoblet"); Serial.println ("IP-adresse:"); Serial.println (WiFi.localIP ()); / **************** alle vanlige ting som kreves for en WiFi-forbindelse *********************** /
Deretter kaller du Wire.begin () -metoden for å sette i gang en I2C-forbindelse, og vi kaller Wire.setClock () -metoden for å fikse I2C-frekvensen til 100 KHz, da den er full hastighet på PT2258 IC.
Wire.begin (); // begynn I2C-startsekvensen Wire.setClock (100000); // stiller I2C-klokken til 100 KHz
Deretter kaller du init () -metoden for både PT2258 og RDA5807 IC og holder returstatusen i de tidligere definerte booleanene.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Sjekk deretter om MCU var i stand til å kommunisere med IC eller ikke. Vi gjør dette med to hvis ellers uttalelser.
hvis (potStatus) {Serial.println ("Fant PT2258-enhet!"); } annet {Serial.println ("Kunne ikke starte PT2258"); } hvis (radioStatus) {Serial.println ("Fant RDA5807M-enhet!"); } annet {Serial.println ("Kunne ikke starte RDA5807M"); }
Deretter kaller du abonnementsmetoden fra MQTT-biblioteket. Vi vil bli varslet av MQTT-serveren hvis det skjedde noen endringer i abonnementene våre.
mqtt. abonnement (& Radio_Station); // Oppsett MQTT-abonnement for Radio_Station-feed mqtt.subscribe (& Toggle_FM); // Oppsett MQTT-abonnement for Toggle_FM feed mqtt.subscribe (& Volume); // Oppsett MQTT-abonnement for volumstrøm
Deretter setter vi relépinnen som utgang og pinnestatusen til LAV
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Deretter stiller du inn et forhåndsbestemt radiovolum, denne parameteren angir det interne volumet til RDA5807 IC, som markerer slutten på vår installasjonsprosess.
radio.setVolume (FIX_RADIO_VOLUME); // neste setter vi normaliseringsradiovolumet radio.setMono (false); // vi vil ikke at brikken skal gi mono-utgang radio.setMute (false); // vi vil ikke at brikken skal dempes i starten
Vi starter sløyfen ved å ringe MQTT_connect () -funksjonen som oppretter en forbindelse til MQTT-serveren.
I MQTT-tilkoblingsfunksjonen prøver vi tre ganger å opprette en forbindelse til MQTT-serveren.
Hvis det lykkes, får vi en suksessmelding, ellers får vi en feilmelding.
ugyldig MQTT_connect () {int8_t ret; // 8-biters heltall for å lagre forsøkene // Stopp hvis allerede tilkoblet. hvis (mqtt.connected ()) {retur; } Serial.print ("Koble til MQTT…"); uint8_t prøver på nytt = 3; mens ((ret = mqtt.connect ())! = 0) {// connect vil returnere 0 for tilkoblet Serial.println (mqtt.connectErrorString (ret)); Serial.println ("Prøver på nytt MQTT-tilkobling på 5 sekunder…"); mqtt. koble fra (); forsinkelse (5000); // vent 5 sekunder på nytt--; hvis (prøver på nytt == 0) {// i utgangspunktet dør og vent til WDT vil tilbakestille meg mens (1); }} Serial.println ("MQTT Connected!"); }
Deretter starter du med å lage en peker til et Adafruit_MQTT_Subscribe- objekt. Vi bruker dette for å bestemme hvilket abonnement som ble mottatt.
Adafruit_MQTT_Abonner * abonnement;
Deretter venter vi på en abonnementsmelding.
mqtt.readSubscription (timeInMilliseconds) vil lytte til et bestemt tidspunkt, for eventuelle meldinger som kommer fra MQTT-serveren.
Hvis den får en melding før tidsavbrudd, vil den svare med en peker på abonnementet, ellers vil den bare avvikle og returnere 0. I så fall vil den vente i 2 sekunder.
while ((abonnement = mqtt.readSubscription (20000)))
Hvis det oppstår en tidsavbrudd, mislykkes mens sløyfefyllingen feiler. Hvis ikke, sammenligner vi hvilket abonnement og får våre kjente abonnementer.
I denne koden gjør vi dette for alle tre feeds som vi abonnerer på.
hvis (abonnement == & Toggle_FM) hvis (abonnement == & Radio_Station) hvis (abonnement == & Volum)
Dette var de tre viktigste parametrene du trenger å forstå i loop-delen.
Denne delen av koden brukes til å overvåke og stille inn Toggle_FM- feed.
hvis (abonnement == & Toggle_FM) // er det en melding fra Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // skriv ut feeddataene bare for feilsøking hvis (String ((char *) Toggle_FM.lastread) == String ("on")) // vi sammenligner de mottatte dataene til en kjent parameter i dette tilfellet vi forventer at "on "kommer fra severen {// men før vi gjør det, må vi gjøre det til en streng som gjør sammenligningen superenkel digitalWrite (D7, HIGH); // hvis vi får en" on "streng fra serveren vi lager D7-pinnen HIGH} hvis (String ((char *) Toggle_FM.lastread) == String ("off")) // igjen ser vi etter strengen av {digitalWrite (D7, LOW); // hvis vi får en "av" streng fra serveren vi lager D7-pinnen LAV}}
Denne delen av koden brukes til å overvåke og stille inn Radio_Station- feed.
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 ser etter strengen Big FM {radio.setBandFrequency (FIX_BAND, 9270); // hvis tilstanden ovenfor er sant, setter vi radoi-kanalen til 92,7MHz} // Ovennevnte prosess fortsetter 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); }}
Denne delen av koden brukes til å overvåke og stille inn volumstrømmen.
hvis (abonnement == & Volum) // // hører vi ser etter strengvolum og det er en heltallverdi i strengformat // Vi må konvertere den tilbake til et heltall for å endre volumet ved hjelp av PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Vi bruker atoi () -metoden for å konvertere en tegnpeker til et helt tallvolum = kart (volum, 0,100,79,0); // map (verdi, fromLow, fromHigh, toLow, toHigh) // som pt2258 bare forstår heltallverdier i dB // vi kartlegger 0dB - 79dB-verdien til 0% - 100%. digitalPot.setChannelVolume (volum, 0); // når alt kommer til alt setter vi volumet for kanal 0 til PT2258 IC digitalPot.setChannelVolume (volum, 1); // når alt kommer til alt setter vi volumet for kanal 1 til PT2258 IC}}
Testing av stemmestyrt FM-radio ved hjelp av Arduino
For å teste kretsen ble følgende apparat brukt -
- En transformator som har en 13-0-13 trykk
- To 4Ω 20W høyttalere som belastning.
- Telefon for å bruke Google Assistant.
I en tidligere artikkel har jeg vist deg hvordan du lager en enkel 2x32 Watt lydforsterker med TDA2050 IC, jeg skal bruke den til denne demonstrasjonen, også, Jeg har forstyrret det mekaniske potensiometeret og kortsluttet to ledninger med to små jumperkabler. Nå, ved hjelp av to trykknapper, klarte jeg å endre volumet på forsterkeren.
Ytterligere forbedring
Det er mange ytterligere forbedringer som kan gjøres på denne kretsen.
- Det er forskjellige støyproblemer fordi en lydkilde fungerer ved siden av NodeMCU, så vi må implementere ytterligere skjerming for å forbedre støyimmuniteten.
- Å bygge den totale kretsen til et PCB vil forbedre støyimmuniteten.
- Ytterligere filtre kan legges til denne ICen for å eliminere støy.
Jeg håper du likte denne artikkelen og lærte noe nytt ut av den. Hvis du er i tvil, kan du spørre i kommentarene nedenfor eller bruke forumene våre for detaljert diskusjon.