- RDA5807M IC
- IC PT2258
- Skematika
- Kinakailangan ang Mga Bahagi
- Paano tayo Kumukuha ng Data mula sa Google Assistant?
- Pagse-set up ng isang Adafruit Account para sa Komunikasyon
- Pagse-set up ng isang IFTTT Broker para sa FM Radio
- Arduino Code at Paliwanag
- Pagsubok sa Voice Controlled FM Radio gamit ang Arduino
- Karagdagang Pagpapahusay
Ngayon, karamihan sa atin ay nais na makinig ng musika, kasama ang aming mga smartphone. Ngunit ilang taon na ang nakalilipas, hindi ito ang kaso, sa puntong iyon ng oras, ang mga radio ng FM ang unang pagpipilian para sa pakikinig ng musika, mga podcast, balita, at iba pa. Ngayong mga araw na ito ay walang nakikinig sa radyo para sa musika, balita, at iba pa, lola at lolo ay isang pagbubukod.
Kaya, upang muling buhayin ang dating kaluwalhatian ng radyo ng FM nang kaunti, sa proyektong ito, magtatayo ako ng isang radio na kinokontrol ng boses gamit ang Google Assistance at ang tanyag na RDA5870M Superheterodyne Receiver IC.
Gayundin, suriin ang aming nakaraang mga FM radio circuit:
- Arduino Batay sa FM Radio
- Kinokontrol ng Smart Phone FM Radio gamit ang Arduino
- Simpleng FM Transmitter Circuit
- Paano Bumuo ng FM Transmitter Circuit
RDA5807M IC
Ang RDA5807M ay isang napaka-modernong solong-chip FM stereo radio tuner na may isang ganap na isinamang synthesizer, KUNG selectivity, RDS / RBDS, at MPX decoder na sumusuporta sa 50MHz hanggang 115MHz na saklaw ng dalas. Ito ay isang napaka-murang solong-chip FM receiver IC na nangangailangan ng napakakaunting panlabas na mga sangkap upang gumana nang gumagana. Gumagamit ang IC na ito ng interface ng I2C upang makipag-usap sa anumang master device, kaya't ang lahat ng tampok na ito ay ginagawang angkop para sa mga portable device.
Ang IC na ito ay may panloob na Audio Processor na responsable para sa mahusay na kalidad ng audio.
Ang ilan sa mga pangunahing tampok ay may kasamang-
- Suporta para sa buong mundo na mga banda ng dalas
- Suporta para sa RDS / RBDS
- Digital low-IF tuner
- Ganap na isinama digital frequency synthesizer
- Digital auto gain control (AGC)
- Pampalakas ng bass
- Direktang suportahan ang 32Ω na paglalagay ng paglaban
- Pinagsamang regulator ng LDO at marami pa
Maaari kang matuto nang higit pa tungkol sa IC sa pamamagitan ng pagdaan sa proyektong ito ng Arduino batay sa FM Radio gamit ang RDA5807.
IC PT2258
Ang PT2258 ay isang IC na ginawa upang magamit bilang isang 6-Channel Electronic Volume Controller, ang IC na ito ay gumagamit ng teknolohiyang CMOS na espesyal na idinisenyo para sa mga multi-channel na application ng audio-video.
Nagbibigay ang IC na ito ng I2C Control Interface na may saklaw ng pagpapalambing ng 0 hanggang -79dB sa 1dB / hakbang at dumating sa isang 20-pin DIP o SOP na pakete.
Ang ilan sa mga pangunahing tampok sa tampok na kasama-
- 6-Input at mga output channel (Para sa 5.1 Home Audio Systems)
- Napipiling I2C address (Para sa Daisy-chain Application)
- Paghihiwalay ng mataas na channel (Para sa Mababang Aplikasyon ng Ingay)
- S / N ratio ng> 100dB
- Ang boltahe sa pagpapatakbo ay 5 hanggang 9V
Nauna naming ipinaliwanag ang tungkol sa IC na ito sa PT2258 Digital Audio Volume Control Project. Maaari mong suriin ang proyektong iyon kung nais mong malaman ang tungkol sa IC na ito.
Skematika
Ang diagram ng circuit para sa Google Assistant Controlled FM Radio ay ibinibigay sa ibaba:
Kinakailangan ang Mga Bahagi
- NodeMCU Microcontroller - 1
- PT2258 Digital Volume Controller - 1
- RDA5807 FM Radio Module - 1
- SPDT Relay 6V - 1
- 1n4007 Diode - 1
- Screw Terminal 5mmx2 - 1
- 3.5mm Headphone Jack - 1
- Logic Level Converter - 1
- 10K Resistor, 5% - 4
- 150K Resistor, 5% - 4
- 100K Resistor, 5% - 2
- 10uF Capacitor - 6
- 0.1uF Capacitor - 1
- Jumper Wire - 10
Paano tayo Kumukuha ng Data mula sa Google Assistant?
Binibigyan ka ng imahe sa itaas ng pangunahing ideya ng proseso ng komunikasyon sa pagitan ng Google Assistant at ng NodeMCU.
Ang Google Assistant ay may awtoridad na magbago ng data sa server ng Adafruit IO upang gawin na ang IFTTT kasama ang MQTT ay gumagana bilang isang broker.
Kung may anumang pagbabago ng data na nangyayari sa server-side (Adafruit IO), makikita ito sa panig ng NodeMCU. Upang makamit ito, kailangan mong sundin ang tagubiling ibinigay sa ibaba-
Pagse-set up ng isang Adafruit Account para sa Komunikasyon
Una, gumawa ng isang Adafruit IO account. Mag-login sa Adafruit IO gamit ang iyong mga kredensyal o Mag-sign up kung wala kang isang account. Ginamit namin dati ang Adafruit IO upang buuin ang kontrolado ng Alexa na LED, Raspberry Pi home automation, at maraming iba pang Mga Proyektong batay sa IoT.
Pagkatapos mag-log in sa Adafruit account, Mag-click sa Dashboard, pagkatapos ay mag-click sa Aksyon> Lumikha ng isang Bagong Dashboard .
Susunod, magdaragdag kami ng isang bagong pangalan at isang maikling paglalarawan ng aming bagong Dashboard.
Matapos mong likhain ang dashboard, kailangan mong kunin ang Username at ang Aktibong Key mula sa iyong account tulad ng kinakailangan sa Arduino code. Maaari mo itong makuha sa pamamagitan ng pag-click sa KEY icon.
Pagkatapos nito, gumawa ng tatlong mga bloke; isang Toggle Block, isang Gauge Block, isang Text Block.
Napakahalaga ng mga bloke, dahil ang mga bloke na ito ay responsable para sa komunikasyon sa pagitan ng tulong ng google at ng NodeMCU.
Upang makagawa ng isang bloke, kailangan mong mag-click sa sign + sa kanang sulok sa itaas.
Susunod, gagawin namin ang mga bloke.
Susunod, Kailangan mong i-set up ang bawat bloke, para doon, kailangan mong mag- tick sa isang partikular na block at i-click ang Susunod na hakbang.
Para sa proyektong ito, hindi kailangang baguhin ang anumang mga setting maliban sa pindutan ng toggle.
Ang teksto sa pindutan ng toggle ay nasa malalaking titik, kailangan mong gawin itong isang maliit na titik at i- update ang mga pagbabago.
Iyon lang, lahat ng mga bagay na kailangan mong i-set up sa adafruit IO.
Ganito ang aking panghuling screen-
Pagse-set up ng isang IFTTT Broker para sa FM Radio
Tulad ng dati, Mag-sign Up kung wala kang isang account o Mag-sign In kung mayroon ka nang isang account.
Ngayon, kailangan mong lumikha ng isang Applet. Para doon, sundin ang mga hakbang sa ibaba:
Upang makagawa ng isang applet, mag-click sa iyong account icon at i- click ang Lumikha.
Sa lumikha ng screen, I-click ang + icon pagkatapos kung.
Pagkatapos nito, kailangan mong payagan ang pag-access sa iyong google account.
Para doon, kailangan mong maghanap para sa Google Assistant sa search bar at mag-click sa icon ng Google Assistant.
Sa Susunod na Screen, kailangan naming pumili ng isang gatilyo, Tandaan, gumawa kami ng tatlong mga bloke sa Adafruit IO Server, kailangan naming gumawa doon ng mga pag-trigger para sa tatlong mga bloke na iyon.
Una, ang Radio Station Block, para doon, kailangan nating pumili ng Sabihin ang isang parirala na may sangkap sa teksto .
Sa susunod na screen, kailangan naming i-type kung ano ang gusto mong sabihin at kung ano ang dapat tumugon sa iyo ng katulong ng google.
Pagkatapos mag-click sa pindutang Lumikha ng gatilyo.
Ang susunod na screen ay ganito ang hitsura, dahil nakumpleto mo ang Kung bahagi, oras na para sa pagkatapos na bahagi, i-click ang sign + pagkatapos pagkatapos .
Ipapakita sa iyo ang isang screen tulad ng larawan sa ibaba, maghanap para sa Adafruit, at mag-click sa icon ng Adafruit.
Susunod, pahintulutan ang iyong Adafruit account sa IFTTT, pagkatapos ay i-click ang Connect.
Susunod, kailangan mong mag-click sa Magpadala ng data sa Adafruit IO.
Pagkatapos ay bibigyan ka ng isang dropdown ng mga feed na nilikha mo nang mas maaga sa Adafruit account.
Pumili ng anumang isa at mag-click sa lumikha ng aksyon, kailangan mong gawin ito para sa lahat ng tatlo.
At kasama nito, minamarkahan ang pagtatapos ng proseso ng IFTTT, ganito ang hitsura ng aking panghuling screen ng applet,
Arduino Code at Paliwanag
Nariyan ang Arduino code upang pamahalaan ang lahat ng komunikasyon sa pagitan ng IC at ng komunikasyon sa pagitan ng Adafruit IO IFTTT at WIFI. Ang kumpletong code para sa Arduino Nano FM Radio na ito ay ibinibigay sa pagtatapos ng tutorial na ito. Ang code ay medyo mahaba at kumplikado, narito namin ipinaliwanag ang kumpletong linya ng code sa pamamagitan ng linya.
Una, kailangan nating isama ang lahat ng mga kinakailangang aklatan, ang mga ito ay:
# isama
Pagkatapos, tukuyin ang SSID at password para sa WI-FI, ito ang SSID at ang PASSWORD ng iyong router.
const char * ssid = "Android"; // SSID ng iyong router const char * password = "12345678"; // Password ng Iyong Router
Pagkatapos ay tinutukoy namin ang dalawang boolean at isang variable, ang booleans ay ginagamit upang hawakan ang katayuan ng komunikasyon ng mga IC, at ang variable ng dami ay ginagamit upang maitakda ang antas ng lakas ng tunog.
bool potStatus; // 1 kapag naitatag ang komunikasyon sa pagitan ng MCU at ng IC bool radioStatus; // 1 kapag ang komunikasyon ay naitatag sa pagitan ng MCU at ng IC int volume = 15; // antas ng default na dami sa IC ay nagsisimula sa
Pagkatapos, nag-set up kami ng isang GPIO pin na pinangalanang Relay_Pin upang i-on o i-off ang amplifier.
#define Relay_Pin D7 // Ginagamit ang pin na ito upang i-on at i-off ang radyo
Susunod, kailangan nating tukuyin ang lahat ng kinakailangang mga kahulugan upang makipag-usap sa Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 for SSL #define AIO_USERNAME "debashis13" // Palitan ito ng iyong username #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp" // Key sa iyong Project A
Ang mga kahulugan sa ibaba FIX_BAND ay isang pagmamay-ari na kahulugan na ginamit ng library.
Ang susunod na tinukoy na pahayag ay nagtatakda ng panloob na dami ng module.
#define FIX_BAND RADIO_BAND_FM // <Ang banda ay mai-tune ng sketch na ito ay ang FM. # tukuyin ang FIX_RADIO_VOLUME 6 /// <Default na dami ng module.
Susunod, gawin ang mga kinakailangang bagay para sa PT2258, RDA5807M, at WiFiClient.
PT2258 digitalPot; // PT2258 Object RDA5807M radio; // RDA5807M Object WiFiClient client; // Object ng WiFiClient
Pagkatapos ay i-set up ang klase ng kliyente ng MQTT sa pamamagitan ng pagpasa sa client ng WiFi at MQTT server at mga detalye sa pag-login.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// I-set up ang klase ng kliyente ng MQTT sa pamamagitan ng pagpasa sa client ng WiFi at MQTT server at mga detalye sa pag-login.
Pagkatapos Kailangan naming mag-subscribe sa isang Feed. Ano ang maaari mong itanong?
Kung ang ilang mga halaga, ang ilang mga parameter ay nagbabago sa Adafruit server, makikita rito ang mga pagbabago.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Mga pamamaraang ginamit upang mag-subscribe sa isang Feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Mga pamamaraang ginamit upang mag-subscribe sa isang Feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Mga pamamaraang ginamit upang mag-subscribe sa isang Feed
Nasa ibaba ang function na prototype para sa pagpapaandar ng MQTT_connect () .
walang bisa ang MQTT_connect (); // Function Prototype para sa MQTT Connect
Pagkatapos ay sinisimulan namin ang aming proseso ng pag-set up. Sa una, sinisimulan namin ang komunikasyon sa UART sa pagsisimulang pamamaraan.
Serial.begin (9600); // UART simulan ang Serial.println (); // nagdadagdag ng isang dagdag na linya para sa spacing Serial.println (); // nagdadagdag ng isang dagdag na linya para sa spacing Susunod, namin ang lahat ng mga karaniwang mga bagay upang kumonekta sa WiFi **************** ang lahat ng mga karaniwang bagay na kinakailangan para sa isang koneksyon sa WiFi ***** Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, password); habang (WiFi.status ()! = WL_CONNected) {pagkaantala (500); Serial.print ("."); } Serial.println (""); Serial.println ("Konektado sa WiFi"); Serial.println ("IP address:"); Serial.println (WiFi.localIP ()); / **************** lahat ng karaniwang mga bagay na kinakailangan para sa isang koneksyon sa WiFi
Susunod, tawagan ang Wire.begin () na pamamaraan upang masimulan ang isang koneksyon sa I2C at tawagan namin ang Wire.setClock () na pamamaraan upang ayusin ang dalas ng I2C sa 100KHz dahil ito ang buong bilis ng PT2258 IC.
Wire.begin (); // simulan ang pagsisimula ng I2C na pagkakasunud-sunod ng Wire.setClock (100000); // setting ng I2C na orasan sa 100KHz
Susunod, tawagan ang init () na pamamaraan para sa parehong PT2258 at RDA5807 IC at hawakan ang katayuan sa pagbalik sa dati nang tinukoy na mga boolean.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Susunod, suriin kung ang MCU ay nakipag-usap sa IC o hindi. Ginagawa namin ito sa dalawa kung may iba pang mga pahayag.
kung (potStatus) {Serial.println ("Natagpuan ang PT2258 Device!"); } iba pa {Serial.println ("Nabigong Simulan ang PT2258"); } kung (radioStatus) {Serial.println ("Natagpuan ang RDA5807M Device!"); } iba pa {Serial.println ("Nabigong Simulan ang RDA5807M"); }
Susunod, tawagan ang paraan ng pag-subscribe mula sa MQTT library. Aabisuhan kami ng MQTT server kung may mga pagbabagong nangyari sa aming mga naka-subscribe na feed.
mqtt.subscribe (& Radio_Station); // Setup MQTT subscription for Radio_Station feed mqtt.subscribe (& Toggle_FM); // Setup MQTT subscription for Toggle_FM feed mqtt.subscribe (& Volume); // I-set up ang subscription ng MQTT para sa Volume feed
Susunod, itinakda namin ang Relay pin bilang output at ang katayuan ng pin sa LOW
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Susunod, magtakda ng isang paunang natukoy na dami ng radyo, itinatakda ng parameter na ito ang panloob na dami ng RDA5807 IC, na nagmamarka sa pagtatapos ng aming proseso ng pag-set up.
radio.setVolume (FIX_RADIO_VOLUME); // susunod na itinakda namin ang gawing normal ang dami ng radyo na radio.setMono (false); // hindi namin nais ang chip na magbigay ng mono output radio.setMute (false); // hindi namin nais na ang chip ay maging pipi sa simula
Sinimulan namin ang loop sa pamamagitan ng pagtawag sa MQTT_connect () function na nagtataguyod ng isang koneksyon sa MQTT server.
Sa pagpapaandar ng MQTT na kumonekta, susubukan namin ng tatlong beses upang makakonekta sa MQTT server.
Kung ito ay matagumpay, nakakakuha kami ng isang mensahe ng Tagumpay iba pa makakakuha kami ng isang mensahe ng Error.
walang bisa ang MQTT_connect () {int8_t ret; // 8 bit integer upang maiimbak ang mga muling pagsubok // Itigil kung nakakonekta na. kung (mqtt.connected ()) {return; } Serial.print ("Kumokonekta sa MQTT…"); uint8_t retants = 3; habang ((ret = mqtt.connect ())! = 0) {// ay babalik 0 para sa konektadong Serial.println (mqtt.connectErrorString (ret)); Serial.println ("Sinusubukang muli ang koneksyon ng MQTT sa loob ng 5 segundo…"); mqtt.disconnect (); pagkaantala (5000); // maghintay ng 5 segundo na muling pagsubok--; kung (muling susubukan == 0) {// karaniwang mamatay at hintayin ang WDT na i-reset ako habang (1); }} Serial.println ("MQTT Nakakonekta!"); }
Susunod, magsimula sa pamamagitan ng paglikha ng isang pointer sa isang object ng Adafruit_MQTT_Subscribe . Gagamitin namin ito upang matukoy kung aling subscription ang natanggap.
Adafruit_MQTT_Subscribe * subscription;
Susunod, naghihintay kami para sa isang mensahe sa subscription.
Ang mqtt.readSubscription (timeInMilliseconds) ay makikinig sa isang tiyak na oras, para sa anumang mga mensahe na nagmumula sa server ng MQTT.
Kung nakakakuha ito ng isang mensahe bago mag-timeout, ito ay tutugon sa isang pointer sa subscription o magtatapos lamang at ibabalik ang 0. Sa kasong iyon, maghihintay ito para kay 2 Sec.
habang ((subscription = mqtt.readSubscription (20000)))
Kung ang isang timeout ay nangyayari, ang habang loop fill nabigo. Kung hindi, ihinahambing namin kung anong subscription at makukuha ang aming mga kilalang subscription.
Sa code na ito, ginagawa namin ito para sa lahat ng tatlong naka-subscribe na feed.
kung (subscription == & Toggle_FM) kung (subscription == & Radio_Station) kung (subscription == & Volume)
Ito ang pangunahing tatlong mga parameter na kailangan mong maunawaan sa seksyon ng loop.
Ang seksyon na ito ng code ay ginagamit upang subaybayan at itakda ang Toggle_FM feed.
kung (subscription == & Toggle_FM) // ay isang mensahe ba ito mula sa Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // print the Feed data just for debugging if (String ((char *) Toggle_FM.lastread) == String ("on")) // ihinahambing namin ang natanggap na data sa isang kilalang parameter sa kasong ito inaasahan namin na "sa "ay nagmumula sa sever {// ngunit bago namin gawin iyon kailangan naming gawin itong isang string na ginagawang mas madali ang paghahambing sa digitalWrite (D7, HIGH); // kung makakakuha kami ng isang" on "na string mula sa ginagawa naming server ang D7 pin TAAS} kung (String ((char *) Toggle_FM.lastread) == String ("off")) // muli ay sinusuri namin ang string off {digitalWrite (D7, LOW); // kung nakakuha kami ng "off" na string mula sa server na ginagawa naming mababa ang D7 pin}}
Ang seksyon na ito ng code ay ginagamit upang subaybayan at itakda ang feed ng Radio_Station .
kung (subscription == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); kung (String ((char *) Radio_Station.lastread) == String ("Big FM")) // marinig sinusuri namin ang string na Big FM {radio.setBandFrequency (FIX_BAND, 9270); // kung totoo ang kondisyon sa itaas ay itinatakda namin ang radoi channel sa 92.7MHz} // Ang nabanggit na mga proces ay nagpatuloy sa ibaba kung (String ((char *) Radio_Station.lastread) == String ("Red FM")) { radio.setBandFrequency (FIX_BAND, 9350); } kung (String ((char *) Radio_Station.lastread) == String ("Radio Mirchi")) {radio.setBandFrequency (FIX_BAND, 9830); }}
Ang seksyon na ito ng code ay ginagamit upang subaybayan at itakda ang Volume feed.
kung (subscription == & Volume) // // marinig sinusuri namin ang string na Volume at ito ay isang integer na halaga sa isang format ng string // Kailangan naming i-convert ito pabalik sa isang integer upang baguhin ang dami sa tulong ng PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.last); dami = atoi ((char *) Volume.lastread); // Gumagamit kami ng atoi () methode upang mai-convert ang isang character pointer sa isang integer volume = mapa (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // bilang ang pt2258 ay naiintindihan lamang ang mga integer na halaga sa dB // nilalagay namin ang mapa ng 0dB - 79dB na halaga sa 0% - 100%. digitalPot.setChannelVolume (dami, 0); // pagkatapos ng lahat na itinatakda namin ang dami para sa channel 0 ng PT2258 IC digitalPot.setChannelVolume (dami, 1); // pagkatapos ng lahat na itinatakda namin ang dami para sa channel 1 ng PT2258 IC}}
Pagsubok sa Voice Controlled FM Radio gamit ang Arduino
Upang subukan ang circuit, ginamit ang sumusunod na aparato -
- Isang transpormer na mayroong 13-0-13 Tapikin
- Dalawang 4Ω 20W speaker bilang isang pagkarga.
- Telepono upang magamit ang Google Assistant.
Sa isang nakaraang artikulo, ipinakita ko sa iyo kung paano gumawa ng isang Simple 2x32 Watt Audio Amplifier na may TDA2050 IC, gagamitin ko iyon para sa pagpapakitang ito, din, Na-disorde ko ang mekanikal na potensyomiter at pinababa ang dalawang lead na may dalawang maliit na mga jumper cable. Ngayon, sa tulong ng dalawang mga push-button, nabago ko ang dami ng amplifier.
Karagdagang Pagpapahusay
Maraming mga karagdagang pagpapahusay na maaaring gawin sa circuit na ito.
- Mayroong iba't ibang mga isyu sa ingay dahil gumagana ang isang mapagkukunan ng audio sa tabi ng NodeMCU, kaya kailangan naming magpatupad ng karagdagang kalasag upang mapabuti ang kaligtasan sa ingay.
- Ang pagbuo ng pangkalahatang circuit sa isang PCB ay magpapabuti sa kaligtasan sa ingay.
- Ang mga karagdagang filter ay maaaring idagdag sa IC na ito upang maalis ang ingay.
Inaasahan kong nagustuhan mo ang artikulong ito at may natutunan na bago dito. Kung mayroon kang anumang pag-aalinlangan, maaari kang magtanong sa mga komento sa ibaba o maaaring magamit ang aming mga forum para sa detalyadong talakayan.