- RDA5807M IC
- IC PT2258
- Skematik
- Komponen Diperlukan
- Bagaimana kita Mendapatkan Data dari Pembantu Google?
- Menetapkan Akaun Adafruit untuk Komunikasi
- Menubuhkan Broker IFTTT untuk Radio FM
- Kod dan Penjelasan Arduino
- Menguji Radio FM yang Dikawal Suara menggunakan Arduino
- Peningkatan Lanjutan
Pada masa kini, kebanyakan kita suka mendengar muzik, dengan telefon pintar kita. Tetapi beberapa tahun yang lalu, ini tidak berlaku, pada ketika itu, radio FM adalah pilihan pertama untuk mendengar muzik, podcast, berita, dan lain-lain. Pada masa ini tidak ada yang mendengar radio untuk muzik, berita, dan lain-lain, nenek dan datuk menjadi pengecualian.
Oleh itu, untuk menghidupkan kembali kegemilangan lama radio FM, dalam projek ini, saya akan membina radio FM yang dikawal suara menggunakan Google Assistance dan IC Penerima RDA5870M Superheterodyne yang popular .
Juga, periksa litar radio FM kami yang sebelumnya:
- Radio FM Berasaskan Arduino
- Telefon Pintar dikendalikan Radio FM menggunakan Arduino
- Litar Pemancar FM Mudah
- Cara Membina Litar Pemancar FM
RDA5807M IC
RDA5807M adalah penala radio stereo FM cip tunggal yang sangat moden dengan synthesizer bersepadu sepenuhnya, selektiviti IF, RDS / RBDS, dan decoder MPX yang menyokong julat frekuensi 50MHz hingga 115MHz. Ia adalah IC penerima FM cip tunggal yang sangat murah yang memerlukan komponen luaran yang sangat sedikit untuk beroperasi secara berfungsi. IC ini menggunakan antara muka I2C untuk berkomunikasi dengan mana-mana peranti induk, jadi semua ciri ini menjadikannya sangat sesuai untuk peranti mudah alih.
IC ini mempunyai Pemproses Audio dalaman yang bertanggungjawab terhadap kualiti audio yang hebat.
Beberapa ciri asas merangkumi-
- Sokongan untuk jalur frekuensi di seluruh dunia
- Sokongan untuk RDS / RBDS
- Penala IF rendah digital
- Pensintesis frekuensi digital bersepadu sepenuhnya
- Kawalan perolehan automatik digital (AGC)
- Peningkatan bass
- Secara langsung menyokong pemuatan rintangan 32Ω
- Pengatur LDO bersepadu & banyak lagi
Anda boleh mengetahui lebih lanjut mengenai IC ini dengan melalui projek ini Radio FM berasaskan Arduino menggunakan RDA5807.
IC PT2258
PT2258 adalah IC yang dibuat untuk digunakan sebagai Pengawal Volume Elektronik 6 Saluran, IC ini menggunakan teknologi CMOS yang direka khas untuk aplikasi audio-video berbilang saluran.
IC ini menyediakan Antaramuka Kawalan I2C dengan julat pelemahan 0 hingga -79dB pada 1dB / langkah dan hadir dalam pakej DIP atau SOP 20-pin.
Beberapa ciri asas merangkumi-
- 6-Saluran input dan output (Untuk 5.1 Sistem Audio Rumah)
- Alamat I2C yang boleh dipilih (Untuk Aplikasi rantaian Daisy)
- Pemisahan saluran tinggi (Untuk Aplikasi Kebisingan Rendah)
- Nisbah S / N> 100dB
- Voltan operasi adalah 5 hingga 9V
Kami sebelum ini menerangkan mengenai IC ini dalam Projek Kawalan Kelantangan Audio Digital PT2258. Anda boleh menyemak projek itu jika anda ingin mengetahui lebih lanjut mengenai IC ini.
Skematik
Gambarajah litar untuk Radio FM yang dikendalikan oleh Pembantu Google diberikan di bawah:
Komponen Diperlukan
- Pengawal Mikro NodeMCU - 1
- Pengawal Isipadu Digital PT2258 - 1
- Modul Radio RDA5807 FM - 1
- Relay SPDT 6V - 1
- 1n4007 Diod - 1
- Terminal Skru 5mmx2 - 1
- Jack fon kepala 3.5mm - 1
- Penukar Tahap Logik - 1
- Perintang 10K, 5% - 4
- Perintang 150K, 5% - 4
- 100K Perintang, 5% - 2
- Kapasitor 10uF - 6
- Kapasitor 0.1uF - 1
- Jumper Wire - 10
Bagaimana kita Mendapatkan Data dari Pembantu Google?
Gambar di atas memberi anda idea asas proses komunikasi antara Pembantu Google dan NodeMCU.
Pembantu Google mempunyai kuasa untuk mengubah data dalam pelayan Adafruit IO untuk melakukan IFTTT dengan MQTT berfungsi sebagai broker.
Sekiranya ada perubahan data berlaku di sisi pelayan (Adafruit IO), itu dapat dilihat di sisi NodeMCU. Untuk mencapai ini, anda perlu mengikuti arahan yang diberikan di bawah-
Menetapkan Akaun Adafruit untuk Komunikasi
Pertama, buat akaun Adafruit IO. Log masuk ke Adafruit IO dengan bukti kelayakan anda atau Daftar jika anda tidak mempunyai akaun. Kami sebelum ini menggunakan Adafruit IO untuk membina LED terkawal Alexa, automasi rumah Raspberry Pi, dan banyak Projek berasaskan IoT yang lain.
Setelah log masuk ke akaun Adafruit, Klik pada Papan Pemuka, kemudian klik pada Tindakan> Buat Papan Pemuka Baru .
Seterusnya, kami akan menambahkan nama baru & penerangan ringkas mengenai Papan Pemuka baru kami .
Setelah membuat papan pemuka, anda perlu mendapatkan Nama Pengguna dan Kunci Aktif dari akaun anda seperti yang dikehendaki dalam kod Arduino. Anda boleh mendapatkannya dengan mengklik ikon KEY.
Selepas itu, buat tiga blok; satu Toggle Block, satu Gauge Block, satu Text Block.
Blok itu sangat penting, kerana blok ini bertanggungjawab untuk komunikasi antara bantuan google dan NodeMCU.
Untuk membuat blok, anda perlu mengklik tanda + di sudut kanan atas.
Seterusnya, kita akan membuat blok.
Seterusnya, Anda perlu mengatur setiap blok, untuk itu, anda perlu menandakan blok tertentu dan klik Langkah seterusnya
Untuk projek ini, tidak perlu mengubah tetapan apa pun kecuali butang togol.
Teks di butang beralih menggunakan huruf besar, anda perlu menjadikannya huruf kecil dan mengemas kini perubahannya.
Itu sahaja, itu semua perkara yang perlu anda sediakan dalam adafruit IO.
Skrin akhir saya kelihatan seperti ini-
Menubuhkan Broker IFTTT untuk Radio FM
Seperti biasa, Daftar jika anda tidak mempunyai akaun atau Log masuk jika anda sudah mempunyai akaun.
Sekarang, anda perlu membuat Applet. Untuk itu, ikuti langkah di bawah:
Untuk membuat applet, klik pada ikon akaun anda dan klik Buat.
Di layar buat, Klik ikon + selepas jika.
Selepas itu, anda perlu membenarkan akses ke akaun google anda.
Untuk itu, anda perlu mencari Google Assistant di bar carian dan klik pada ikon Google Assistant.
Di Skrin Seterusnya, kita harus memilih pencetus, Ingat, kami membuat tiga blok di Adafruit IO Server, kami perlu membuat pemicu untuk ketiga blok tersebut.
Pertama, Blok Stesen Radio, untuk itu, kita perlu memilih Ucapkan frasa dengan bahan teks .
Pada skrin seterusnya, kita harus menaip apa yang ingin anda katakan & apa yang harus dibalas oleh pembantu google kepada anda.
Kemudian klik pada butang Buat pemicu.
Skrin berikutnya kelihatan seperti ini, kerana anda telah melengkapkan Jika bahagian, masa ia bagi kemudian bahagian, klik + tanda selepas kemudian .
Anda akan disajikan dengan layar seperti gambar di bawah, mencari Adafruit, dan klik pada ikon Adafruit.
Seterusnya, izinkan akaun Adafruit anda dengan IFTTT, kemudian klik Sambung.
Seterusnya, anda perlu mengklik Hantar data ke Adafruit IO.
Kemudian anda akan diberikan dropdown feed yang telah anda buat lebih awal di akaun Adafruit.
Pilih mana-mana dan klik buat tindakan, anda perlu melakukan ini untuk ketiga-tiganya.
Dan dengan itu, menandakan berakhirnya proses IFTTT, skrin applet terakhir saya kelihatan seperti ini,
Kod dan Penjelasan Arduino
Kod Arduino ada untuk menguruskan semua komunikasi antara IC dan komunikasi antara Adafruit IO IFTTT dan WIFI. Kod lengkap untuk Radio Arduino Nano FM ini diberikan pada akhir tutorial ini. Kodnya agak panjang dan kompleks, di sini kami telah menerangkan kod lengkap mengikut baris.
Pertama, kita perlu memasukkan semua perpustakaan yang diperlukan, iaitu:
#sertakan
Kemudian, tentukan SSID dan kata laluan untuk WI-FI, ini adalah SSID dan PASSWORD penghala anda.
const char * ssid = "Android"; // SSID penghala anda const char * password = "12345678"; // Kata Laluan Penghala Anda
Kemudian kami mendefinisikan dua booleans dan variabel, booleans digunakan untuk menahan status komunikasi IC, dan pemboleh ubah volume digunakan untuk mengatur level volume.
bool potStatus; // 1 ketika komunikasi terjalin antara MCU dan ICStool radio bool; // 1 apabila komunikasi terjalin antara MCU dan IC int volume = 15; // tahap kelantangan lalai dengan IC bermula dengan
Kemudian, kami menyediakan pin GPIO bernama Relay_Pin untuk menghidupkan atau mematikan penguat.
#define Relay_Pin D7 // Pin ini digunakan untuk menghidupkan dan mematikan radio
Seterusnya, kita perlu menentukan semua definisi yang diperlukan untuk berkomunikasi dengan Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // gunakan 8883 untuk SSL #define AIO_USERNAME "debashis13" // Gantilah dengan nama pengguna anda #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirPerananArtandaAnda AEPerjaan"
Definisi di bawah FIX_BAND adalah definisi proprietari yang digunakan oleh perpustakaan.
Pernyataan yang ditentukan seterusnya menetapkan kelantangan dalaman modul.
#define FIX_BAND RADIO_BAND_FM // <Band yang akan diselaraskan dengan lakaran ini adalah FM. #define FIX_RADIO_VOLUME 6 /// <Volume lalai modul.
Seterusnya, buat objek yang diperlukan untuk PT2258, RDA5807M, dan WiFiClient.
PT2258 digitalPot; // Radio PT2258 Objek RDA5807M; // RDA5807M Objek WiFiClient klien; // Objek Pelanggan WiFi
Kemudian sediakan kelas klien MQTT dengan memasukkan pelanggan WiFi dan pelayan MQTT dan maklumat log masuk.
Adafruit_MQTT_Mqtt pelanggan (& pelanggan, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Siapkan kelas klien MQTT dengan memasukkan pelanggan WiFi dan pelayan MQTT dan maklumat log masuk.
Maka Kita perlu melanggan Suapan. Apa yang membuat anda bertanya?
Sekiranya beberapa nilai, beberapa parameter berubah di pelayan Adafruit, perubahan akan ditunjukkan di sini.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feed / Radio_Station"); // Kaedah yang digunakan untuk melanggan Feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Kaedah yang digunakan untuk melanggan Suara Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feed / Volume"); // Kaedah yang digunakan untuk melanggan Suapan
Berikut adalah prototaip fungsi untuk fungsi MQTT_connect () .
batal MQTT_connect (); // Prototaip Fungsi untuk MQTT Connect
Kemudian kami memulakan proses persediaan kami. Pada mulanya, kami memulakan komunikasi UART dengan kaedah mula.
Serial.begin (9600); // UART mulakan Serial.println (); // menambah garis tambahan untuk jarak Serial.println (); // menambah garis tambahan untuk jarak Selanjutnya, kami melakukan semua perkara biasa untuk menyambung ke WiFI **************** semua perkara biasa yang diperlukan untuk sambungan WiFi *********************** / Serial.print ("menyambung ke"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, kata laluan); sementara (WiFi.status ()! = WL_CONNECTED) {kelewatan (500); Cetakan bersiri ("."); } Serial.println (""); Serial.println ("WiFi disambungkan"); Serial.println ("Alamat IP:"); Serial.println (WiFi.localIP ()); / **************** semua perkara biasa yang diperlukan untuk sambungan WiFi *********************** /
Seterusnya, panggil kaedah Wire.begin () untuk mewujudkan sambungan I2C & kami memanggil kaedah Wire.setClock () untuk menetapkan frekuensi I2C hingga 100KHz kerana ia adalah kelajuan penuh IC PT2258.
Wire.begin (); // mulakan urutan permulaan I2C Wire.setClock (100000); // menetapkan jam I2C ke 100KHz
Seterusnya, panggil kaedah init () untuk kedua PT2258 dan RDA5807 IC dan tahan status kembali ke booleans yang telah ditentukan sebelumnya.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Seterusnya, periksa sama ada MCU dapat berkomunikasi dengan IC atau tidak. Kami melakukan ini dengan dua kenyataan jika ada .
if (potStatus) {Serial.println ("Dijumpai Peranti PT2258!"); } lain {Serial.println ("Gagal Memulakan PT2258"); } jika (radioStatus) {Serial.println ("Dijumpai Peranti RDA5807M!"); } lain {Serial.println ("Gagal Memulakan RDA5807M"); }
Seterusnya, hubungi kaedah langganan dari perpustakaan MQTT. Kami akan diberitahu oleh pelayan MQTT jika ada perubahan yang berlaku dalam suapan langganan kami.
mqtt.subscribe (& Radio_Station); // Siapkan langganan MQTT untuk suapan Radio_Station mqtt.subscribe (& Toggle_FM); // Sediakan langganan MQTT untuk suapan Toggle_FM mqtt.subscribe (& Volume); // Siapkan langganan MQTT untuk suapan Volume
Seterusnya, kami menetapkan pin Relay sebagai output dan status pin ke RENDAH
pinMode (D7, OUTPUT); digitalWrite (D7, RENDAH);
Seterusnya, tetapkan kelantangan radio yang telah ditentukan, parameter ini menetapkan kelantangan dalaman IC RDA5807, yang menandakan berakhirnya proses penyediaan kami.
radio.setVolume (FIX_RADIO_VOLUME); // seterusnya kita tetapkan normalisasi radio volume radio.setMono (false); // kami tidak mahu cip memberikan radio output mono.setMute (false); // kami tidak mahu cip menjadi sunyi pada mulanya
Kami memulakan gelung dengan memanggil fungsi MQTT_connect () yang mewujudkan sambungan ke pelayan MQTT.
Dalam fungsi penyambungan MQTT, kami mencuba tiga kali untuk membuat sambungan ke pelayan MQTT.
Sekiranya berjaya, kita akan mendapat mesej Kejayaan, kita akan mendapat mesej Ralat.
batal MQTT_connect () {int8_t ret; // 8 bit integer untuk menyimpan percubaan // Berhenti jika sudah disambungkan. jika (mqtt.connected ()) {kembali; } Serial.print ("Menyambung ke MQTT…"); uint8_t mencuba semula = 3; sementara ((ret = mqtt.connect ())! = 0) {// connect akan mengembalikan 0 untuk Serial.println yang disambungkan (mqtt.connectErrorString (ret)); Serial.println ("Mencuba semula sambungan MQTT dalam 5 saat…"); mqtt.disconnect (); kelewatan (5000); // tunggu 5 saat lagi--; if (retries == 0) {// pada dasarnya mati dan tunggu WDT menetapkan semula saya semasa (1); }} Serial.println ("MQTT Disambungkan!"); }
Seterusnya, mulakan dengan membuat penunjuk ke objek Adafruit_MQTT_Subscribe . Kami akan menggunakannya untuk menentukan langganan mana yang diterima.
Adafruit_MQTT_Langgan * langganan;
Seterusnya, kami menunggu mesej langganan.
mqtt.readSubscription (timeInMilliseconds) akan mendengarkan waktu tertentu, untuk sebarang mesej yang datang dari pelayan MQTT.
Sekiranya mendapat mesej sebelum tamat waktu, ia akan membalas dengan penunjuk ke langganan atau hanya akan habis masa dan mengembalikan 0. Sekiranya demikian, ia akan menunggu selama 2 saat.
sementara ((langganan = mqtt.readSubscription (20000)))
Sekiranya tamat masa, pengisian gelung sementara gagal. Sekiranya tidak, kami membandingkan langganan apa dan akan mendapat langganan kami yang diketahui.
Dalam kod ini, kami melakukan ini untuk ketiga-tiga suapan langganan kami.
jika (langganan == & Toggle_FM) jika (langganan == & Radio_Station) jika (langganan == & Isipadu)
Ini adalah tiga parameter utama yang perlu anda fahami di bahagian gelung.
Bahagian kod ini digunakan untuk memantau & menetapkan suapan Toggle_FM .
if (langganan == & Toggle_FM) // adakah itu mesej dari Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // mencetak data Umpan hanya untuk debugging jika (String ((char *) Toggle_FM.lastread) == String ("on")) // kami membandingkan data yang diterima dengan parameter yang diketahui dalam hal ini kami menjangkakan bahawa "on "datang dari pemutusan {// tetapi sebelum kita melakukannya, kita harus menjadikannya rentetan yang menjadikan perbandingan digitalWrite super mudah (D7, TINGGI); // jika kita mendapat rentetan" on "dari pelayan yang kita buat pin D7 TINGGI} jika (String ((char *) Toggle_FM.lastread) == String ("off")) // sekali lagi kita sedang memeriksa rentetan off {digitalWrite (D7, LOW); // jika kita mendapat rentetan "off" dari pelayan yang kami buat pin D7 RENDAH}}
Bahagian kod ini digunakan untuk memantau & menetapkan suapan Radio_Station .
if (langganan == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // dengar kami sedang memeriksa rentetan Big FM {radio.setBandFrequency (FIX_BAND, 9270); // jika syarat di atas benar, kita menetapkan saluran radoi ke 92.7MHz} // Proses yang disebutkan di atas dilanjutkan di bawah jika (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); }}
Bahagian kod ini digunakan untuk memantau & mengatur suapan Volume.
jika (langganan == & Volume) // // dengar kami sedang memeriksa rentetan Volume dan ia adalah nilai integer dalam format string // Kita harus menukarnya kembali ke bilangan bulat untuk mengubah volume dengan bantuan PT2258 IC Serial.print (F ("Mendapat:")); Serial.println ((char *) Volume.lastread); isipadu = atoi ((char *) Volume.lastread); // Kami menggunakan kaedah atoi () untuk menukar penunjuk watak menjadi bilangan bulat = peta (isipadu, 0,100,79,0); // peta (nilai, fromLow, fromHigh, toLow, toHigh) // kerana pt2258 hanya memahami nilai integer dalam dB // kita memetakan nilai 0dB - 79dB menjadi 0% - 100%. digitalPot.setChannelVolume (kelantangan, 0); // setelah semua itu kita menetapkan kelantangan untuk saluran 0 dari PT2258 IC digitalPot.setChannelVolume (kelantangan, 1); // setelah semua itu kita menetapkan volume untuk saluran 1 dari PT2258 IC}}
Menguji Radio FM yang Dikawal Suara menggunakan Arduino
Untuk menguji litar, alat berikut digunakan-
- Pengubah yang mempunyai Ketuk 13-0-13
- Dua pembesar suara 4Ω 20W sebagai beban.
- Telefon untuk menggunakan Pembantu Google.
Dalam artikel sebelumnya, saya telah menunjukkan kepada anda cara membuat Amplifier Audio 2x32 Watt Mudah dengan IC TDA2050, saya akan menggunakannya untuk demonstrasi ini juga, Saya telah merosakkan potensiometer mekanikal dan memendekkan dua plumbum dengan dua kabel pelompat kecil. Sekarang, dengan bantuan dua butang tekan, saya dapat mengubah kelantangan penguat.
Peningkatan Lanjutan
Terdapat banyak penambahbaikan yang boleh dibuat untuk rangkaian ini.
- Terdapat pelbagai masalah kebisingan kerana sumber audio berfungsi di samping NodeMCU, jadi kami perlu menerapkan pelindung tambahan untuk meningkatkan kekebalan bunyi.
- Membina litar keseluruhan ke PCB akan meningkatkan imuniti bunyi.
- Penapis tambahan boleh ditambahkan ke IC ini untuk menghilangkan kebisingan.
Saya harap anda menyukai artikel ini dan mengetahui sesuatu yang baru. Sekiranya anda mempunyai keraguan, anda boleh bertanya dalam komen di bawah atau boleh menggunakan forum kami untuk perbincangan terperinci.