- RDA5807M IC
- IC PT2258
- Şematik
- Gerekli Bileşenler
- Google Asistan'dan Nasıl Veri Alıyoruz?
- İletişim için Adafruit Hesabı Oluşturmak
- FM Radyo için bir IFTTT Aracısı Kurma
- Arduino Kodu ve Açıklaması
- Arduino kullanarak Ses Kontrollü FM Radyoyu Test Etme
- Daha Fazla Geliştirme
Günümüzde çoğumuz akıllı telefonlarımızla müzik dinlemeyi seviyoruz. Ancak birkaç yıl önce durum böyle değildi, o zamanlar FM radyoları müzik, podcast, haber ve diğerlerini dinlemek için ilk tercihti. Bugünlerde kimse müzik, haber ve diğerleri için radyo dinlemiyor, büyükanne ve büyükbaba bir istisna.
FM radyonun eski ihtişamını biraz canlandırmak için, bu projede, Google Assistance ve popüler RDA5870M Superheterodyne Receiver IC kullanarak ses kontrollü bir FM radyo oluşturacağım .
Ayrıca, önceki FM radyo devrelerimizi de kontrol edin:
- Arduino Tabanlı FM Radyo
- Arduino ile Akıllı Telefon Kontrollü FM Radyo
- Basit FM Verici Devresi
- FM Verici Devresi Nasıl Oluşturulur
RDA5807M IC
RDA5807M, tamamen entegre bir synthesizer, IF seçiciliği, RDS / RBDS ve 50MHz ila 115MHz frekans aralığını destekleyen MPX kod çözücüye sahip çok modern bir tek çipli FM stereo radyo alıcısıdır. İşlevsel olarak çalışması için çok az harici bileşen gerektiren çok ucuz bir tek çipli FM alıcı IC'dir. Bu IC, herhangi bir ana cihazla iletişim kurmak için I2C arayüzünü kullanır, bu nedenle tüm bu özellik onu taşınabilir cihazlar için çok uygun hale getirir.
Bu IC, mükemmel ses kalitesinden sorumlu olan dahili bir Ses İşlemcisine sahiptir.
Temel özelliklerden bazıları şunlardır:
- Dünya çapında frekans bantları için destek
- RDS / RBDS desteği
- Dijital düşük IF tuner
- Tam entegre dijital frekans sentezleyici
- Dijital otomatik kazanç kontrolü (AGC)
- Bas Kuvvetlendirme
- Doğrudan 32Ω direnç yüklemesini destekler
- Entegre LDO regülatörü ve daha fazlası
Bu IC hakkında daha fazla bilgi edinmek için RDA5807'yi kullanarak Arduino tabanlı FM Radyo projesini inceleyebilirsiniz.
IC PT2258
PT2258, 6 Kanallı Elektronik Ses Kontrolörü olarak kullanılmak üzere yapılmış bir IC'dir , bu IC, çok kanallı ses-video uygulamaları için özel olarak tasarlanmış CMOS teknolojisini kullanır.
Bu IC, 1dB / adımda 0 ila -79dB zayıflama aralığına sahip bir I2C Kontrol Arayüzü sağlar ve 20 pimli bir DIP veya SOP paketi içinde gelir.
Temel özelliklerden bazıları şunlardır:
- 6-Giriş ve çıkış kanalları (5.1 Ev Ses Sistemleri İçin)
- Seçilebilir I2C adresi (Papatya zinciri Uygulaması için)
- Yüksek Kanal Ayrımı (Düşük Gürültülü Uygulama İçin)
- S / N oranı> 100dB
- Çalışma voltajı 5 ila 9V'dur
Bu IC hakkında daha önce PT2258 Dijital Ses Seviyesi Kontrol Projesinde açıklamıştık. Bu IC hakkında daha fazla bilgi edinmek istiyorsanız o projeyi kontrol edebilirsiniz.
Şematik
Google Asistan Kontrollü FM Radyo için devre şeması aşağıda verilmiştir:
Gerekli Bileşenler
- NodeMCU Mikrodenetleyici - 1
- PT2258 Dijital Ses Kontrol Cihazı - 1
- RDA5807 FM Radyo Modülü - 1
- SPDT Röle 6V - 1
- 1n4007 Diyot - 1
- Vidalı Klemens 5mmx2 - 1
- 3.5mm Kulaklık Jakı - 1
- Mantık Seviyesi Dönüştürücü - 1
- 10K Direnç,% 5 - 4
- 150K Direnç,% 5 - 4
- 100K Direnç,% 5 - 2
- 10 uF Kapasitör - 6
- 0.1 uF Kapasitör - 1
- Atlama Teli - 10
Google Asistan'dan Nasıl Veri Alıyoruz?
Yukarıdaki görüntü size Google Asistan ile NodeMCU arasındaki iletişim süreci hakkında temel fikir verir.
Google Asistan, MQTT ile IFTTT'nin aracı olarak çalıştığını yapmak için Adafruit IO sunucusundaki verileri değiştirme yetkisine sahiptir.
Sunucu tarafında (Adafruit IO) herhangi bir veri değişikliği meydana gelirse, bu NodeMCU tarafında yansıtılır. Bunu başarmak için aşağıda verilen talimatı izlemeniz gerekir.
İletişim için Adafruit Hesabı Oluşturmak
İlk önce bir Adafruit IO hesabı oluşturun. Adafruit IO'ya kimlik bilgilerinizle giriş yapın veya bir hesabınız yoksa kaydolun. Daha önce Alexa kontrollü LED, Raspberry Pi ev otomasyonu ve diğer birçok IoT tabanlı Projeyi oluşturmak için Adafruit IO'yu kullandık.
Adafruit hesabına giriş yaptıktan sonra, Gösterge Tabloları'na tıklayın , ardından Eylem> Yeni Gösterge Tablosu Oluştur'a tıklayın .
Sonra, yeni bir ad ve yeni Gösterge Panomuzun kısa bir açıklamasını ekleyeceğiz .
Kontrol panelini oluşturduktan sonra, Arduino kodunda gerektiği gibi hesabınızdan Kullanıcı Adı ve Aktif Anahtarı almanız gerekir. ANAHTAR simgesine tıklayarak bunu elde edebilirsiniz.
Bundan sonra üç blok yapın; bir Geçiş Bloğu, bir Gösterge Bloğu, bir Metin Bloğu.
Bu bloklar, google yardımı ile NodeMCU arasındaki iletişimden sorumlu olduğu için bloklar çok önemlidir.
Blok yapmak için sağ üst köşedeki + işaretine tıklamanız gerekir.
Sonra, blokları yapacağız.
Ardından, her bloğu ayarlamanız gerekir, bunun için belirli bir bloğu işaretlemeniz ve Sonraki adım'ı tıklamanız gerekir .
Bu proje için geçiş butonu dışında herhangi bir ayarı değiştirmeye gerek yoktur.
Durumlu düğme metin olduğu büyük harflerle, bunu bir yapmak gerekir küçük harf ve değişiklikleri güncellemek.
İşte bu, adafruit IO'da ayarlamanız gereken her şey.
Son ekranım şuna benziyor.
FM Radyo için bir IFTTT Aracısı Kurma
Her zaman olduğu gibi Kaydol Bir hesabınız yoksa yoksa Giriş Yap Zaten bir hesabınız varsa.
Şimdi bir Applet oluşturmanız gerekiyor. Bunun için aşağıdaki adımları izleyin:
Bir uygulama yapmak için, hesap simgenize tıklayın ve Oluştur'a tıklayın.
Oluşturma ekranında, if'den sonra + simgesine tıklayın.
Bundan sonra, gereken erişime izin sizin için google hesabına.
Bunun için arama çubuğunda Google Asistan'ı aramanız ve Google Asistan simgesine tıklamanız gerekir.
Sonraki Ekranda bir tetikleyici seçmeliyiz, Unutmayın, Adafruit IO Server'da üç blok yaptık , bu üç blok için orada tetikleyiciler yapmamız gerekiyor .
Öncelikle, Radyo İstasyon Bloğu, bunun için, Metin içerikli bir cümle söyle'yi seçmemiz gerekir .
Bir sonraki ekranda ne söylemek istediğinizi ve google asistanın size ne yanıt vermesi gerektiğini yazmamız gerekiyor.
Ardından Tetikleyici oluştur düğmesine tıklayın.
Eğer tamamlamış sonraki ekran şuna benzer olursa bölümünü için 's zaman sonra , kısmen tıklayın + sonra işaretini sonra .
Aşağıdaki görsel gibi bir ekran karşınıza çıkacak, Adafruit'i arayacak ve Adafruit ikonuna tıklayacaksınız.
Ardından, Adafruit hesabınızı IFTTT ile yetkilendirin ve ardından Bağlan'a tıklayın .
Ardından, Adafruit IO'ya veri gönder'e tıklamanız gerekir .
Ardından, daha önce Adafruit hesabında oluşturduğunuz beslemelerin bir açılır listesi sunulacak .
Herhangi birini seçin ve eylem oluştur'a tıklayın , bunu üçü için de yapmanız gerekir.
Ve bununla, IFTTT sürecinin sonunu işaret ediyor, son uygulama ekranım şöyle görünüyor
Arduino Kodu ve Açıklaması
Arduino kodu, IC ile Adafruit IO IFTTT ve WIFI arasındaki iletişim arasındaki tüm iletişimi yönetmek için oradadır. Bu Arduino Nano FM Radyosu için tam kod bu eğitimin sonunda verilmiştir. Kod biraz uzun ve karmaşıktır, burada kodun tamamını satır satır açıkladık.
İlk olarak, gerekli tüm kitaplıkları eklememiz gerekiyor, bunlar:
#Dahil etmek
Ardından, WI-FI için SSID ve parolayı tanımlayın; bu, yönlendiricinizin SSID'si ve ŞİFRESİ'dir.
const char * ssid = "Android"; // Yönlendiricinizin SSID'si const char * password = "12345678"; // Yönlendiricinizin Şifresi
Daha sonra iki boole ve bir değişken tanımlıyoruz, boole'lar IC'lerin iletişim durumunu tutmak için kullanılır ve hacim değişkeni ses seviyesini ayarlamak için kullanılır.
bool potStatus; // 1 MCU ile IC bool radioStatus arasında iletişim kurulduğunda; // 1 MCU ile IC arasında iletişim kurulduğunda int volume = 15; // IC ile varsayılan ses seviyesi şu şekilde başlar:
Ardından, amplifikatörü açmak veya kapatmak için Relay_Pin adında bir GPIO pini kurduk .
#define Relay_Pin D7 // Bu pin, radyoyu açmak ve kapatmak için kullanılır
Daha sonra, Adafruit IO ile iletişim kurmak için gerekli tüm tanımları tanımlamamız gerekiyor.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // SSL için 8883 kullanın #define AIO_USERNAME "debashis13" // Kullanıcı adınızı #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp1fYhc55QB1lEPEirnoFp'nizle değiştirin"
Aşağıdaki tanımlar FIX_BAND , kütüphane tarafından kullanılan özel bir tanımdır.
Bir sonraki tanımlanan ifade, modülün iç hacmini belirler.
#define FIX_BAND RADIO_BAND_FM // <Bu taslakla ayarlanacak bant FM'dir. #define FIX_RADIO_VOLUME 6 /// <Modülün varsayılan hacmi.
Ardından, PT2258, RDA5807M ve WiFiClient için gerekli nesneleri yapın.
PT2258 digitalPot; // PT2258 Object RDA5807M radyo; // RDA5807M Nesnesi WiFiClient istemcisi; // WiFiClient Nesnesi
Ardından WiFi istemcisini ve MQTT sunucusunu ve oturum açma ayrıntılarını ileterek MQTT istemci sınıfını ayarlayın.
Adafruit_MQTT_Client mqtt (& müşteri, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// WiFi istemcisini ve MQTT sunucusunu ve oturum açma ayrıntılarını ileterek MQTT istemci sınıfını kurun.
O zaman bir Beslemeye abone olmamız gerekir. Bu size ne sormanızı sağlar?
Adafruit sunucusunda bazı değerler, bazı parametreler değişirse, değişiklikler buraya yansıtılacaktır.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Bir Yayına abone olmak için kullanılan yöntemler Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Bir Yayına abone olmak için kullanılan yöntemler Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Bir Feed'e abone olmak için kullanılan yöntemler
MQTT_connect () işlevi için işlev prototipi aşağıdadır .
void MQTT_connect (); // MQTT Connect için İşlev Prototipi
Ardından kurulum sürecimize başlıyoruz. İlk olarak, başlangıç yöntemi ile UART iletişimini başlatıyoruz.
Serial.begin (9600); // UART Serial.println () ile başlar; // Serial.println () aralanması için bir ek bir satır ekler; // İleri aralanması için bir ek bir satır ekler, biz her zamanki şey WiFI bağlanmak için do **************** bir WiFi bağlantısı için gerekli tüm olağan şeyler *********************** / Serial.print ("bağlanma"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, şifre); while (WiFi.status ()! = WL_CONNECTED) {gecikme (500); Seri.baskı ("."); } Serial.println (""); Serial.println ("WiFi bağlı"); Serial.println ("IP adresi:"); Serial.println (WiFi.localIP ()); / **************** bir WiFi bağlantısı için gerekli tüm olağan şeyler *********************** /
Daha sonra, çağrı Wire.begin () I2C bağlantısı örneğini yöntemini & dediğimiz Wire.setClock () o PT2258 IC tam hız var olarak 100KHz için I2C frekansını düzeltmek için yöntem.
Wire.begin (); // I2C başlatma dizisine başlayın Wire.setClock (100000); // I2C saatini 100KHz'e ayarlama
Ardından, hem PT2258 hem de RDA5807 IC için init () yöntemini çağırın ve dönüş durumunu önceden tanımlanan boole'lere tutun.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Ardından, MCU'nun IC ile iletişim kurup kuramadığını kontrol edin. Bunu iki if else ifadesiyle yapıyoruz.
if (potStatus) {Serial.println ("PT2258 Aygıtı Bulundu!"); } else {Serial.println ("PT2258 Başlatılamadı"); } if (radioStatus) {Serial.println ("RDA5807M Cihazı Bulundu!"); } else {Serial.println ("RDA5807M Başlatılamadı"); }
Ardından, MQTT kitaplığından abone olma yöntemini çağırın. Abone olduğumuz yayınlarımızda herhangi bir değişiklik olursa, MQTT sunucusu tarafından bilgilendirileceksiniz.
mqtt.subscribe (& Radio_Station); // Radio_Station beslemesi için MQTT aboneliğini kurun mqtt.subscribe (& Toggle_FM); // Toggle_FM beslemesi için MQTT aboneliğini kurun mqtt.subscribe (& Volume); // Volume feed için MQTT aboneliğini ayarlayın
Ardından, Röle pinini çıkış olarak ve pin durumunu LOW olarak ayarladık.
pinMode (D7, ÇIKIŞ); digitalWrite (D7, DÜŞÜK);
Ardından, önceden belirlenmiş bir radyo sesi ayarlayın, bu parametre, kurulum sürecimizin sonunu işaret eden RDA5807 IC'nin dahili ses düzeyini ayarlar.
radio.setVolume (FIX_RADIO_VOLUME); // sonra radyo ses seviyesini normalize ediyoruz radio.setMono (false); // çipin mono çıktı radio.setMute (false) vermesini istemiyoruz; // çipin başlangıçta sessiz kalmasını istemiyoruz
MQTT sunucusuyla bağlantı kuran MQTT_connect () işlevini çağırarak döngüyü başlatıyoruz.
MQTT bağlantı işlevinde, MQTT sunucusuna bağlantı kurmayı üç kez deniyoruz.
Başarılı olursa, Başarı mesajı alırız, aksi takdirde bir Hata mesajı alırız.
void MQTT_connect () {int8_t ret; // Yeniden denemeleri saklamak için 8 bitlik tamsayı // Zaten bağlıysa dur. eğer (mqtt.connected ()) {dönüş; } Serial.print ("MQTT'ye Bağlanıyor…"); uint8_t denemeler = 3; while ((ret = mqtt.connect ())! = 0) {// bağlan, bağlı Serial.println için 0 döndürür (mqtt.connectErrorString (ret)); Serial.println ("MQTT bağlantısı 5 saniye içinde yeniden deneniyor…"); mqtt.disconnect (); gecikme (5000); // 5 saniye bekle yeniden denemeler--; if (retries == 0) {// temelde ölür ve (1) iken WDT'nin beni sıfırlamasını bekler; }} Serial.println ("MQTT Bağlandı!"); }
Ardından, bir Adafruit_MQTT_Subscribe nesnesine bir işaretçi oluşturarak başlayın. Bunu hangi aboneliğin alındığını belirlemek için kullanacağız.
Adafruit_MQTT_Subscribe * aboneliği;
Ardından, bir abonelik mesajı bekliyoruz.
mqtt.readSubscription (timeInMilliseconds) , MQTT sunucusundan gelen herhangi bir mesaj için belirli bir süre dinleyecektir.
Zaman aşımından önce bir mesaj alırsa, aboneliğe bir işaretçi ile cevap verecektir veya sadece zaman aşımına uğrayacak ve 0 dönecektir. Bu durumda, 2 San.
while ((abonelik = mqtt.readSubscription (20000)))
Bir zaman aşımı olursa, while döngüsü doldurma işlemi başarısız olur. Değilse, hangi aboneliği karşılaştırırız ve bilinen aboneliklerimizi alırız.
Bu kodda, bunu abone olduğumuz üç beslememiz için yapıyoruz.
if (subscription == & Toggle_FM) if (subscription == & Radio_Station) if (subscription == & Volume)
Bunlar, döngü bölümünde anlamanız gereken ana üç parametredir.
Kodun bu bölümü Toggle_FM beslemesini izlemek ve ayarlamak için kullanılır.
eğer (abonelik == & Toggle_FM) // Toggle_FM Beslemesinden bir mesaj mı {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // Feed verilerini yalnızca hata ayıklama için yazdır if (String ((char *) Toggle_FM.lastread) == String ("on")) // alınan verileri bilinen bir parametre ile karşılaştırırız bu durumda "on "sunucudan geliyor {// ama bunu yapmadan önce, karşılaştırmayı süper kolay hale getiren bir dize yapmalıyız digitalWrite (D7, HIGH); // yaptığımız sunucudan bir" on "dizesi alırsak D7 pini HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // yine dizeyi kontrol ediyoruz off {digitalWrite (D7, LOW); // eğer bir sunucudan "off" dizesi D7 pinini DÜŞÜK yapıyoruz}}
Kodun bu bölümü Radio_Station beslemesini izlemek ve ayarlamak için kullanılır.
eğer (abonelik == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // Big FM dizisini kontrol ettiğimizi duydum {radio.setBandFrequency (FIX_BAND, 9270); // yukarıdaki koşul doğruysa, radoi kanalını 92,7MHz olarak ayarlıyoruz} // Yukarıda belirtilen işlem aşağıda devam eder if (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); }}
Kodun bu bölümü, Hacim beslemesini izlemek ve ayarlamak için kullanılır.
if (subscription == & Volume) // // Volume dizesini kontrol ettiğimizi duydum ve bu bir dizge biçiminde bir tamsayı değeri // PT2258'in yardımıyla hacmi değiştirmek için onu bir tamsayıya geri dönüştürmeliyiz IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); hacim = atoi ((karakter *) Volume.lastread); // Bir karakter göstericisini tam sayıya dönüştürmek için atoi () metodunu kullanıyoruz volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // pt2258 yalnızca dB cinsinden tam sayı değerlerini anladığından // 0dB - 79dB değerini% 0 -% 100 olarak eşleştiriyoruz. digitalPot.setChannelVolume (hacim, 0); // hepsinden sonra PT2258 IC digitalPot.setChannelVolume (volume, 1) kanal 0 için ses seviyesini ayarlıyoruz; // tüm bunlardan sonra PT2258 IC'nin 1. kanalı için ses seviyesini ayarlıyoruz}}
Arduino kullanarak Ses Kontrollü FM Radyoyu Test Etme
Devreyi test etmek için aşağıdaki aparat kullanıldı:
- 13-0-13 Tapa sahip bir transformatör
- Yük olarak iki adet 4Ω 20W hoparlör.
- Google Asistan'ı kullanmak için telefon.
Önceki bir makalede, TDA2050 IC ile Basit 2x32 Watt Ses Amplifikatörünün nasıl yapılacağını göstermiştim, bunu bu gösteri için de kullanacağım, Mekanik potansiyometreyi bozdum ve iki ucu iki küçük atlama kablosuyla kısa devre yaptım. Şimdi, iki düğme yardımıyla amplifikatörün sesini değiştirebildim.
Daha Fazla Geliştirme
Bu devrede yapılabilecek daha birçok geliştirme var.
- NodeMCU'nun yanında bir ses kaynağı çalıştığı için çeşitli gürültü sorunları vardır, bu nedenle gürültü bağışıklığını iyileştirmek için ek koruma uygulamamız gerekir.
- Genel devreyi bir PCB'ye kurmak gürültü bağışıklığını artıracaktır.
- Gürültüyü ortadan kaldırmak için bu IC'ye ek filtreler eklenebilir.
Umarım bu makaleyi beğenmiş ve ondan yeni bir şeyler öğrenmişsindir. Herhangi bir şüpheniz varsa, aşağıdaki yorumlarda sorabilir veya detaylı tartışma için forumlarımızı kullanabilirsiniz.