- IC RDA5807M
- IC PT2258
- Skema
- Komponen Diperlukan
- Bagaimana kami Mendapatkan Data dari Asisten Google?
- Menyiapkan Akun Adafruit untuk Komunikasi
- Menyiapkan Broker IFTTT untuk Radio FM
- Kode dan Penjelasan Arduino
- Menguji Radio FM yang Dikendalikan Suara menggunakan Arduino
- Peningkatan Lebih Lanjut
Saat ini, kebanyakan dari kita suka mendengarkan musik, dengan smartphone. Namun beberapa tahun yang lalu tidak demikian halnya, pada saat itu radio FM menjadi pilihan pertama untuk mendengarkan musik, podcast, berita, dan lain-lain. Saat ini tidak ada yang mendengarkan radio untuk musik, berita, dan lain-lain, kecuali nenek dan kakek.
Jadi, untuk sedikit menghidupkan kembali kejayaan radio FM lama, dalam proyek ini, saya akan membangun radio FM yang dikendalikan suara menggunakan Google Assistance dan IC Penerima Superheterodyne RDA5870M yang populer .
Juga, periksa sirkuit radio FM kami sebelumnya:
- Radio FM Berbasis Arduino
- Radio FM Terkendali Ponsel Pintar menggunakan Arduino
- Sirkuit Pemancar FM Sederhana
- Bagaimana Membangun Sirkuit Pemancar FM
IC RDA5807M
RDA5807M adalah tuner radio FM stereo chip tunggal yang sangat modern dengan synthesizer terintegrasi penuh, selektivitas IF, RDS / RBDS, dan dekoder MPX yang mendukung rentang frekuensi 50MHz hingga 115MHz. Ini adalah IC penerima FM chip tunggal yang sangat murah yang hanya memerlukan sedikit komponen eksternal untuk beroperasi secara fungsional. IC ini menggunakan antarmuka I2C untuk berkomunikasi dengan perangkat master apa pun, sehingga semua fitur ini membuatnya sangat cocok untuk perangkat portabel.
IC ini memiliki Prosesor Audio internal yang bertanggung jawab atas kualitas audio yang bagus.
Beberapa fitur dasar meliputi-
- Dukungan untuk pita frekuensi di seluruh dunia
- Dukungan untuk RDS / RBDS
- Tuner IF rendah digital
- Synthesizer frekuensi digital terintegrasi penuh
- Kontrol penguatan otomatis digital (AGC)
- Penguat bass
- Secara langsung mendukung pemuatan resistansi 32Ω
- Regulator LDO terintegrasi & lainnya
Anda dapat mempelajari lebih lanjut tentang IC ini dengan melalui proyek ini Radio FM berbasis Arduino menggunakan RDA5807.
IC PT2258
PT2258 adalah IC yang dibuat untuk digunakan sebagai Pengontrol Volume Elektronik 6-Channel, IC ini menggunakan teknologi CMOS yang dirancang khusus untuk aplikasi audio-video multi-channel.
IC ini menyediakan Antarmuka Kontrol I2C dengan rentang atenuasi 0 hingga -79dB pada 1dB / langkah dan hadir dalam paket DIP atau SOP 20-pin.
Beberapa fitur dasar meliputi-
- 6-Saluran input dan output (Untuk Sistem Audio Rumah 5.1)
- Alamat I2C yang dapat dipilih (Untuk Aplikasi Daisy-chain)
- Pemisahan Saluran Tinggi (Untuk Aplikasi Kebisingan Rendah)
- Rasio S / N> 100dB
- Tegangan operasi adalah 5 hingga 9V
Kami sebelumnya menjelaskan tentang IC ini di Proyek Kontrol Volume Audio Digital PT2258. Anda dapat memeriksa proyek itu jika Anda ingin tahu lebih banyak tentang IC ini.
Skema
Diagram sirkuit untuk Radio FM Terkendali Asisten Google diberikan di bawah ini:
Komponen Diperlukan
- Mikrokontroler NodeMCU - 1
- PT2258 Digital Volume Controller - 1
- Modul Radio RDA5807 FM - 1
- Relai SPDT 6V - 1
- 1n4007 Diode - 1
- Terminal Sekrup 5mmx2 - 1
- Jack Headphone 3.5mm - 1
- Pengonversi Tingkat Logika - 1
- Resistor 10K, 5% - 4
- Resistor 150K, 5% - 4
- Resistor 100K, 5% - 2
- Kapasitor 10uF - 6
- Kapasitor 0.1uF - 1
- Kawat Jumper - 10
Bagaimana kami Mendapatkan Data dari Asisten Google?
Gambar di atas memberi Anda ide dasar tentang proses komunikasi antara Asisten Google dan NodeMCU.
Asisten Google memiliki kewenangan untuk mengubah data di server Adafruit IO untuk melakukan IFTTT dengan MQTT bekerja sebagai broker.
Jika ada perubahan data yang terjadi di sisi server (Adafruit IO), itu tercermin di sisi NodeMCU. Untuk mencapai ini, Anda harus mengikuti instruksi yang diberikan di bawah ini-
Menyiapkan Akun Adafruit untuk Komunikasi
Pertama, buat akun Adafruit IO. Masuk ke Adafruit IO dengan kredensial Anda atau Daftar jika Anda tidak memiliki akun. Kami sebelumnya menggunakan Adafruit IO untuk membangun LED yang dikendalikan Alexa, otomatisasi rumah Raspberry Pi, dan banyak Proyek berbasis IoT lainnya.
Setelah masuk ke akun Adafruit, Klik pada Dashboards, lalu klik Action> Create a New Dashboard .
Selanjutnya, kami akan menambahkan nama baru & deskripsi singkat tentang Dasbor baru kami .
Setelah Anda membuat dasbor, Anda perlu mendapatkan Nama Pengguna dan Kunci Aktif dari akun Anda seperti yang diperlukan dalam kode Arduino. Anda bisa mendapatkannya dengan mengklik ikon KUNCI.
Setelah itu buat tiga balok; satu Toggle Block, satu Gauge Block, satu Text Block.
Blok sangat penting, karena blok ini bertanggung jawab untuk komunikasi antara bantuan Google dan NodeMCU.
Untuk membuat blok, Anda perlu mengklik tanda + di pojok kanan atas.
Selanjutnya, kita akan membuat blok.
Selanjutnya, Anda perlu mengatur setiap blok, untuk itu, Anda perlu mencentang blok tertentu dan klik Langkah berikutnya.
Untuk proyek ini, tidak perlu mengubah pengaturan apa pun kecuali tombol sakelar.
Teks di tombol sakelar menggunakan huruf kapital, Anda harus membuatnya menjadi huruf kecil dan memperbarui perubahannya.
Itu saja, itu semua yang perlu Anda siapkan di adafruit IO.
Layar terakhir saya terlihat seperti ini-
Menyiapkan Broker IFTTT untuk Radio FM
Seperti biasa, Daftar jika Anda tidak memiliki akun atau Masuk jika Anda sudah memiliki akun.
Sekarang, Anda perlu membuat Applet. Untuk itu, ikuti langkah-langkah di bawah ini:
Untuk membuat applet, klik ikon akun Anda dan klik Buat.
Di layar buat, klik ikon + setelah if.
Setelah itu, Anda perlu mengizinkan akses ke akun Google Anda .
Untuk itu, Anda perlu mencari Asisten Google di bilah pencarian dan mengklik ikon Asisten Google.
Di Layar Berikutnya, kita harus memilih pemicu, Ingat, kita membuat tiga blok di Adafruit IO Server, kita perlu membuat di sana pemicu untuk ketiga blok itu.
Pertama, Blok Stasiun Radio, untuk itu kita perlu memilih Ucapkan frase dengan bahan teks .
Di layar berikutnya, kita harus mengetik apa yang ingin Anda katakan & dengan apa asisten google harus membalas Anda.
Kemudian klik tombol Buat pemicu.
Layar berikutnya terlihat seperti ini, karena Anda telah menyelesaikan bagian If , saatnya untuk bagian kemudian , klik tanda + setelah itu .
Anda akan disajikan layar seperti gambar di bawah ini, cari Adafruit, dan klik ikon Adafruit.
Selanjutnya, otorisasi akun Adafruit Anda dengan IFTTT, lalu klik Hubungkan.
Selanjutnya, Anda harus mengklik Kirim data ke Adafruit IO.
Kemudian Anda akan disajikan dengan dropdown feed yang telah Anda buat sebelumnya di akun Adafruit.
Pilih salah satu dan klik buat tindakan, Anda perlu melakukan ini untuk ketiganya.
Dan dengan itu, menandai akhir dari proses IFTTT, layar applet terakhir saya terlihat seperti ini,
Kode dan Penjelasan Arduino
Kode Arduino ada untuk mengatur semua komunikasi antara IC dan komunikasi antara Adafruit IO IFTTT dan WIFI. Kode lengkap untuk Radio FM Arduino Nano ini diberikan di akhir tutorial ini. Kodenya agak panjang dan rumit, disini kami telah menjelaskan kode lengkap baris demi baris.
Pertama, kita perlu memasukkan semua pustaka yang diperlukan, yaitu:
#include
Kemudian, tentukan SSID dan kata sandi untuk WI-FI, ini adalah SSID dan PASSWORD router Anda.
const char * ssid = "Android"; // SSID router Anda const char * password = "12345678"; // Kata Sandi Router Anda
Kemudian kami mendefinisikan dua boolean dan variabel, boolean digunakan untuk menyimpan status komunikasi IC, dan variabel volume digunakan untuk mengatur level volume.
bool potStatus; // 1 ketika komunikasi terjalin antara MCU dan IC bool radioStatus; // 1 ketika komunikasi terjalin antara MCU dan IC int volume = 15; // tingkat volume default dengan IC dimulai dengan
Kemudian, kami menyiapkan pin GPIO bernama Relay_Pin untuk menghidupkan atau mematikan amplifier.
#define Relay_Pin D7 // Pin ini digunakan untuk menghidupkan dan mematikan radio
Selanjutnya, kita perlu mendefinisikan 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" // Ganti dengan nama pengguna Anda #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp" // Ganti Key Auth
Definisi di bawah FIX_BAND adalah definisi kepemilikan yang digunakan oleh pustaka.
Pernyataan terdefinisi berikutnya menetapkan volume internal modul.
#define FIX_BAND RADIO_BAND_FM // <Band yang akan disetel oleh sketsa ini adalah FM. #define FIX_RADIO_VOLUME 6 /// <Volume default modul.
Selanjutnya, buat objek yang diperlukan untuk PT2258, RDA5807M, dan WiFiClient.
PT2258 digitalPot; // Radio PT2258 Object RDA5807M; // RDA5807M Objek WiFiClient klien; // Objek WiFiClient
Kemudian atur kelas klien MQTT dengan meneruskan klien WiFi dan server MQTT dan detail login.
Adafruit_MQTT_Client mqtt (& klien, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Siapkan kelas klien MQTT dengan memasukkan klien WiFi dan server MQTT dan detail login.
Kemudian kita perlu berlangganan Feed. Apa yang membuat Anda mungkin bertanya?
Jika beberapa nilai, beberapa parameter berubah di server Adafruit, perubahan tersebut akan tercermin di sini.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Metode yang digunakan untuk berlangganan Feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Metode yang digunakan untuk berlangganan Feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Metode yang digunakan untuk berlangganan Feed
Di bawah ini adalah prototipe fungsi untuk fungsi MQTT_connect () .
void MQTT_connect (); // Prototipe Fungsi untuk MQTT Connect
Kemudian kami memulai proses penyiapan kami. Pertama, kami memulai komunikasi UART dengan metode mulai.
Serial.begin (9600); // UART mulai Serial.println (); // menambahkan baris ekstra untuk spasi Serial.println (); // menambahkan baris ekstra untuk spasi Selanjutnya, kita melakukan semua hal yang biasa untuk terhubung ke WiFI **************** semua hal biasa yang diperlukan untuk koneksi WiFi *********************** / Serial.print ("menyambung ke"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, kata sandi); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi tersambung"); Serial.println ("alamat IP:"); Serial.println (WiFi.localIP ()); / **************** semua hal biasa yang diperlukan untuk koneksi WiFi *********************** /
Selanjutnya, panggil metode Wire.begin () untuk membuat instance koneksi I2C & kami memanggil metode Wire.setClock () untuk memperbaiki frekuensi I2C ke 100KHz karena ini adalah kecepatan penuh IC PT2258.
Wire.begin (); // mulai urutan awal I2C Wire.setClock (100000); // mengatur jam I2C ke 100KHz
Selanjutnya, panggil metode init () untuk PT2258 dan IC RDA5807 dan tahan status pengembalian ke boolean yang ditentukan sebelumnya.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Selanjutnya, periksa apakah MCU dapat berkomunikasi dengan IC atau tidak. Kami melakukan ini dengan dua pernyataan jika lain .
if (potStatus) {Serial.println ("Ditemukan Perangkat PT2258!"); } else {Serial.println ("Gagal Memulai PT2258"); } if (radioStatus) {Serial.println ("Found RDA5807M Device!"); } else {Serial.println ("Gagal Memulai RDA5807M"); }
Selanjutnya, panggil metode berlangganan dari perpustakaan MQTT. Kami akan diberitahu oleh server MQTT jika ada perubahan yang terjadi pada feed langganan kami.
mqtt.subscribe (& Radio_Station); // Siapkan langganan MQTT untuk umpan Radio_Station mqtt.subscribe (& Toggle_FM); // Siapkan langganan MQTT untuk umpan Toggle_FM mqtt.subscribe (& Volume); // Siapkan langganan MQTT untuk umpan Volume
Selanjutnya, kami mengatur pin Relay sebagai output dan status pin ke LOW
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Selanjutnya, setel volume radio yang telah ditentukan, parameter ini menyetel volume internal IC RDA5807, yang menandai akhir dari proses penyiapan kami.
radio.setVolume (FIX_RADIO_VOLUME); // selanjutnya kita menyetel normalisasi volume radio radio.setMono (false); // kami tidak ingin chip memberikan mono output radio.setMute (false); // kami tidak ingin chip menjadi diam di awal
Kami memulai loop dengan memanggil fungsi MQTT_connect () yang membuat koneksi ke server MQTT.
Dalam fungsi koneksi MQTT, kami mencoba tiga kali untuk membuat koneksi ke server MQTT.
Jika berhasil, kita mendapat pesan Sukses kalau tidak kita akan mendapatkan pesan Error.
batal MQTT_connect () {int8_t ret; // 8 bit integer untuk menyimpan percobaan ulang // Berhenti jika sudah terhubung. jika (mqtt.connected ()) {return; } Serial.print ("Menghubungkan ke MQTT…"); uint8_t coba lagi = 3; while ((ret = mqtt.connect ())! = 0) {// connect akan mengembalikan 0 untuk Serial.println yang terhubung (mqtt.connectErrorString (ret)); Serial.println ("Mencoba kembali koneksi MQTT dalam 5 detik…"); mqtt.disconnect (); penundaan (5000); // tunggu 5 detik coba lagi--; if (retries == 0) {// pada dasarnya mati dan tunggu WDT menyetel ulang saya sementara (1); }} Serial.println ("MQTT Connected!"); }
Selanjutnya, mulailah dengan membuat penunjuk ke objek Adafruit_MQTT_Subscribe . Kami akan menggunakan ini untuk menentukan langganan mana yang diterima.
Berlangganan Adafruit_MQTT_Subscribe *;
Selanjutnya, kami menunggu pesan berlangganan.
mqtt.readSubscription (timeInMilliseconds) akan mendengarkan waktu tertentu, untuk setiap pesan yang datang dari server MQTT.
Jika mendapat pesan sebelum batas waktu, ia akan membalas dengan penunjuk ke langganan atau hanya akan waktu habis dan kembali 0. Dalam hal ini, akan menunggu selama 2 detik.
while ((subscription = mqtt.readSubscription (20000)))
Jika terjadi batas waktu, pengisian loop while gagal. Jika tidak, kami membandingkan langganan apa dan akan mendapatkan langganan kami yang diketahui.
Dalam kode ini, kami melakukan ini untuk ketiga feed langganan kami.
if (langganan == & Toggle_FM) if (langganan == & Radio_Station) if (langganan == & Volume)
Ini adalah tiga parameter utama yang perlu Anda pahami di bagian loop.
Bagian kode ini digunakan untuk memantau & mengatur feed Toggle_FM .
if (subscription == & Toggle_FM) // apakah itu pesan dari Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // cetak data Feed hanya untuk debugging if (String ((char *) Toggle_FM.lastread) == String ("on")) // kita membandingkan data yang diterima dengan parameter yang diketahui dalam hal ini kita mengharapkan "on "berasal dari server {// tetapi sebelum kita melakukannya, kita harus membuatnya menjadi string yang membuat perbandingan digitalWrite (D7, HIGH) menjadi super mudah; // jika kita mendapatkan string" on "dari server yang kita buat pin D7 TINGGI} if (String ((char *) Toggle_FM.lastread) == String ("off")) // sekali lagi kita memeriksa string off {digitalWrite (D7, LOW); // jika kita mendapatkan "off" string dari server kita membuat pin D7 LOW}}
Bagian kode ini digunakan untuk memantau & mengatur feed 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 kita memeriksa string Big FM {radio.setBandFrequency (FIX_BAND, 9270); // jika kondisi di atas benar kita atur 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); } jika (String ((char *) Radio_Station.lastread) == String ("Radio Mirchi")) {radio.setBandFrequency (FIX_BAND, 9830); }}
Bagian kode ini digunakan untuk memantau & mengatur feed Volume.
if (subscription == & Volume) // // dengar kita memeriksa Volume string dan itu adalah nilai integer dalam format string // Kita harus mengubahnya kembali menjadi integer untuk mengubah volume dengan bantuan PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Kami menggunakan metode atoi () untuk mengubah penunjuk karakter menjadi integer volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // karena pt2258 hanya memahami nilai integer dalam dB // kita memetakan nilai 0dB - 79dB ke 0% - 100%. digitalPot.setChannelVolume (volume, 0); // setelah semua itu kita mengatur volume untuk saluran 0 dari PT2258 IC digitalPot.setChannelVolume (volume, 1); // setelah semua itu kita setting volume untuk channel 1 dari IC PT2258}}
Menguji Radio FM yang Dikendalikan Suara menggunakan Arduino
Untuk menguji sirkuit, peralatan berikut digunakan-
- Trafo yang memiliki Tap 13-0-13
- Dua speaker 4Ω 20W sebagai beban.
- Ponsel untuk menggunakan Asisten Google.
Pada artikel sebelumnya, saya telah menunjukkan kepada Anda cara membuat Amplifier Audio 2x32 Watt Sederhana dengan IC TDA2050, saya akan menggunakannya untuk demonstrasi ini juga, Saya telah mengacaukan potensiometer mekanis dan menyingkat dua kabel dengan dua kabel jumper kecil. Sekarang, dengan bantuan dua tombol tekan, saya dapat mengubah volume amplifier.
Peningkatan Lebih Lanjut
Ada banyak peningkatan lebih lanjut yang dapat dilakukan pada sirkuit ini.
- Ada berbagai masalah kebisingan karena sumber audio berfungsi di samping NodeMCU, jadi kami perlu menerapkan perisai tambahan untuk meningkatkan kekebalan kebisingan.
- Membangun sirkuit keseluruhan ke PCB akan meningkatkan kekebalan kebisingan.
- Filter tambahan dapat ditambahkan ke IC ini untuk menghilangkan noise.
Saya harap Anda menyukai artikel ini dan mempelajari sesuatu yang baru darinya. Jika Anda ragu, Anda dapat bertanya di komentar di bawah atau dapat menggunakan forum kami untuk diskusi terperinci.