- RDA5807M IC
- IC PT2258
- Schematyczny
- Wymagane składniki
- W jaki sposób pobieramy dane z Asystenta Google?
- Założenie konta Adafruit do komunikacji
- Utworzenie brokera IFTTT dla radia FM
- Kod i wyjaśnienie Arduino
- Testowanie sterowanego głosem radia FM za pomocą Arduino
- Dalsze ulepszenia
W dzisiejszych czasach większość z nas lubi słuchać muzyki za pomocą smartfonów. Ale kilka lat temu tak się nie stało, w tamtym czasie radia FM były pierwszym wyborem do słuchania muzyki, podcastów, wiadomości i innych. W dzisiejszych czasach nikt nie słucha radia w poszukiwaniu muzyki, wiadomości i innych, a babcia i dziadek są wyjątkiem.
Tak więc, aby nieco ożywić dawną świetność radia FM, w tym projekcie zamierzam zbudować sterowane głosem radio FM za pomocą Google Assistance i popularnego układu scalonego superheterodynowego odbiornika RDA5870M.
Sprawdź również nasze poprzednie obwody radiowe FM:
- Radio FM oparte na Arduino
- Radio FM sterowane smartfonem za pomocą Arduino
- Prosty obwód nadajnika FM
- Jak zbudować obwód nadajnika FM
RDA5807M IC
RDA5807M to bardzo nowoczesny jednoukładowy stereofoniczny tuner radiowy FM z w pełni zintegrowanym syntezatorem, selektywnością IF, RDS / RBDS i dekoderem MPX, który obsługuje zakres częstotliwości od 50 MHz do 115 MHz. Jest to bardzo tani, jednoukładowy układ scalony odbiornika FM, który do działania wymaga bardzo niewielu elementów zewnętrznych. Ten układ scalony wykorzystuje interfejs I2C do komunikacji z dowolnym urządzeniem nadrzędnym, więc wszystkie te funkcje sprawiają, że jest on bardzo odpowiedni dla urządzeń przenośnych.
Ten układ scalony ma wewnętrzny procesor dźwięku, który odpowiada za jego doskonałą jakość dźwięku.
Niektóre z podstawowych funkcji obejmują:
- Obsługa światowych pasm częstotliwości
- Wsparcie dla RDS / RBDS
- Cyfrowy tuner z niskim IF
- W pełni zintegrowany cyfrowy syntezator częstotliwości
- Cyfrowa automatyczna regulacja wzmocnienia (AGC)
- Wzmocnienie basów
- Bezpośrednio obsługuje obciążenie rezystancyjne 32Ω
- Zintegrowany regulator LDO i nie tylko
Możesz dowiedzieć się więcej o tym układzie scalonym, przechodząc przez ten projekt Radio FM oparte na Arduino przy użyciu RDA5807.
IC PT2258
PT2258 to układ scalony przeznaczony do użytku jako 6-kanałowy elektroniczny regulator głośności, ten układ scalony wykorzystuje technologię CMOS specjalnie zaprojektowaną do wielokanałowych aplikacji audio-wideo.
Ten układ scalony zapewnia interfejs sterowania I2C z zakresem tłumienia od 0 do -79 dB przy 1 dB / krok i jest dostarczany w 20-pinowej obudowie DIP lub SOP.
Niektóre podstawowe funkcje obejmują:
- 6 kanałów wejściowych i wyjściowych (dla domowych systemów audio 5.1)
- Wybierany adres I2C (dla aplikacji łańcuchowej)
- Wysoka separacja kanałów (do zastosowań o niskim poziomie hałasu)
- Stosunek S / N> 100dB
- Napięcie robocze wynosi od 5 do 9 V.
Wcześniej wyjaśniliśmy ten układ scalony w projekcie PT2258 Digital Audio Volume Control Project. Możesz sprawdzić ten projekt, jeśli chcesz dowiedzieć się więcej o tym układzie scalonym.
Schematyczny
Schemat obwodu dla radia FM sterowanego przez Asystenta Google przedstawiono poniżej:
Wymagane składniki
- Mikrokontroler NodeMCU - 1
- Cyfrowy regulator głośności PT2258 - 1
- RDA5807 Moduł radiowy FM - 1
- Przekaźnik SPDT 6V - 1
- Dioda 1n4007 - 1
- Zacisk śrubowy 5mmx2 - 1
- Gniazdo słuchawkowe 3,5 mm - 1
- Konwerter poziomów logicznych - 1
- Rezystor 10 K, 5% - 4
- Rezystor 150 K, 5% - 4
- Rezystor 100 K, 5% - 2
- Kondensator 10uF - 6
- Kondensator 0,1 uF - 1
- Przewód połączeniowy - 10
W jaki sposób pobieramy dane z Asystenta Google?
Powyższy obraz daje podstawowe pojęcie o procesie komunikacji między Asystentem Google a NodeMCU.
Asystent Google ma uprawnienia do modyfikowania danych na serwerze IO Adafruit, aby IFTTT z MQTT działał jako broker.
Jeśli jakakolwiek zmiana danych nastąpi po stronie serwera (Adafruit IO), zostanie to odzwierciedlone po stronie NodeMCU. Aby to osiągnąć, musisz postępować zgodnie z instrukcjami podanymi poniżej-
Założenie konta Adafruit do komunikacji
Najpierw załóż konto Adafruit IO. Zaloguj się do Adafruit IO za pomocą swoich danych logowania lub Zarejestruj się, jeśli nie masz konta. Wcześniej używaliśmy Adafruit IO do tworzenia kontrolowanych przez Alexę diod LED, automatyki domowej Raspberry Pi i wielu innych projektów opartych na IoT.
Po zalogowaniu się do konta Adafruit, Kliknij Pulpity, a następnie kliknij Akcja> Utwórz nowy pulpit nawigacyjny .
Następnie dodamy nową nazwę i krótki opis naszego nowego panelu.
Po utworzeniu pulpitu nawigacyjnego musisz pobrać nazwę użytkownika i aktywny klucz ze swojego konta, tak jak jest to wymagane w kodzie Arduino. Możesz to uzyskać, klikając ikonę KLUCZA.
Następnie wykonaj trzy bloki; jeden blok przełączający, jeden blok wzorcowy, jeden blok tekstowy.
Bloki są bardzo ważne, ponieważ są odpowiedzialne za komunikację między pomocą Google a NodeMCU.
Aby utworzyć blok, musisz kliknąć znak + w prawym górnym rogu.
Następnie zrobimy bloki.
Następnie musisz ustawić każdy blok, w tym celu musisz zaznaczyć konkretny blok i kliknąć Następny krok.
W przypadku tego projektu nie ma potrzeby zmiany żadnych ustawień poza przyciskiem przełączania.
Tekst na przycisku przełączania jest pisany wielkimi literami, musisz uczynić go małą literą i zaktualizować zmiany.
To wszystko, to wszystko, co musisz skonfigurować w IO adafruit.
Mój ostatni ekran wygląda tak
Utworzenie brokera IFTTT dla radia FM
Jak zawsze, Zarejestruj się, jeśli nie masz konta, lub Zaloguj się, jeśli masz już konto.
Teraz musisz utworzyć aplet. W tym celu wykonaj poniższe czynności:
Aby utworzyć aplet, kliknij ikonę swojego konta i kliknij Utwórz.
Na ekranie tworzenia kliknij ikonę + za if.
Następnie musisz zezwolić na dostęp do swojego konta Google.
W tym celu musisz wyszukać Asystenta Google na pasku wyszukiwania i kliknąć ikonę Asystenta Google.
Na następnym ekranie musimy wybrać wyzwalacz, Pamiętaj, że utworzyliśmy trzy bloki na serwerze we / wy Adafruit, musimy wprowadzić wyzwalacze dla tych trzech bloków.
Najpierw blok stacji radiowej, w tym celu musimy wybrać Powiedz frazę ze składnikiem tekstowym .
Na następnym ekranie musimy wpisać, co chcesz powiedzieć i czym ma odpowiedzieć asystent Google.
Następnie kliknij przycisk Utwórz wyzwalacz.
Następny ekran wygląda mniej więcej tak, ponieważ ukończyłeś część Jeśli , czas na drugą część, kliknij znak + po tym .
Zostanie wyświetlony ekran podobny do poniższego obrazu, wyszukaj Adafruit i kliknij ikonę Adafruit.
Następnie autoryzuj swoje konto Adafruit za pomocą IFTTT, a następnie kliknij Połącz.
Następnie musisz kliknąć Wyślij dane do Adafruit IO.
Następnie pojawi się lista rozwijana kanałów, które utworzyłeś wcześniej na koncie Adafruit.
Wybierz dowolną i kliknij akcję tworzenia, musisz to zrobić dla wszystkich trzech.
Oznacza to koniec procesu IFTTT, mój końcowy ekran apletu wygląda następująco:
Kod i wyjaśnienie Arduino
Kod Arduino służy do zarządzania całą komunikacją między układem scalonym oraz komunikacją między Adafruit IO IFTTT a WIFI. Pełny kod tego radia Arduino Nano FM znajduje się na końcu tego samouczka. Kod jest trochę długi i złożony, tutaj wyjaśniliśmy cały kod wiersz po wierszu.
Najpierw musimy uwzględnić wszystkie wymagane biblioteki, są to:
#zawierać
Następnie zdefiniuj SSID i hasło do Wi-Fi, to jest SSID i HASŁO routera.
const char * ssid = "Android"; // SSID routera const char * password = "12345678"; // Hasło routera
Następnie definiujemy dwie wartości logiczne i zmienną, wartości logiczne są używane do przechowywania statusu komunikacji układów scalonych, a zmienna głośności służy do ustawiania poziomu głośności.
bool potStatus; // 1, gdy zostanie nawiązana komunikacja między MCU a IC bool radioStatus; // 1, gdy nawiązana jest komunikacja między MCU a IC int volume = 15; // domyślny poziom głośności z układem scalonym zaczyna się od
Następnie ustawiliśmy pin GPIO o nazwie Relay_Pin, aby włączyć lub wyłączyć wzmacniacz.
#define Relay_Pin D7 // Ten pin służy do włączania i wyłączania radia
Następnie musimy zdefiniować wszystkie niezbędne definicje do komunikacji z Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // użyj 8883 dla SSL #define AIO_USERNAME "debashis13" // Zastąp go swoją nazwą użytkownika #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lhEPEirno Zastąp kluczem swojego projektup"
Poniższe definicje FIX_BAND jest zastrzeżoną definicją używaną przez bibliotekę.
Kolejna zdefiniowana instrukcja określa wewnętrzną objętość modułu.
#define FIX_BAND RADIO_BAND_FM // <Pasmo będzie nastrojone według tego szkicu to FM. #define FIX_RADIO_VOLUME 6 /// <Domyślna głośność modułu.
Następnie utwórz wymagane obiekty dla PT2258, RDA5807M i WiFiClient.
PT2258 digitalPot; // PT2258 Object RDA5807M radio; // RDA5807M Object WiFiClient klient; // Obiekt WiFiClient
Następnie skonfiguruj klasę klienta MQTT, przekazując klienta WiFi i serwer MQTT oraz dane logowania.
Adafruit_MQTT_Client mqtt (& klient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Skonfiguruj klasę klienta MQTT, przekazując klienta WiFi i serwer MQTT oraz dane logowania.
Następnie musimy zasubskrybować kanał. Co to sprawia, że możesz zapytać?
Jeśli jakieś wartości, niektóre parametry zmienią się na serwerze Adafruit, zmiany zostaną tutaj odzwierciedlone.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Metody używane do subskrybowania kanału Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Metody używane do subskrybowania kanału Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Metody używane do subskrybowania źródła
Poniżej znajduje się prototyp funkcji dla funkcji MQTT_connect () .
void MQTT_connect (); // Prototyp funkcji dla MQTT Connect
Następnie rozpoczynamy proces konfiguracji. Najpierw rozpoczynamy komunikację UART metodą begin.
Serial.begin (9600); // UART początek Serial.println (); // dodaje dodatkową linię na odstęp Serial.println (); // dodaje dodatkową linię na odstępy Następnie robimy wszystko, co zwykle, aby połączyć się z WiFI **************** wszystkie typowe rzeczy wymagane do połączenia Wi-Fi *********************** / Serial.print („łączenie się z”); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, hasło); while (WiFi.status ()! = WL_CONNECTED) {opóźnienie (500); Serial.print („.”); } Serial.println („”); Serial.println („Połączono z siecią Wi-Fi”); Serial.println ("adres IP:"); Serial.println (WiFi.localIP ()); / **************** wszystkie zwykłe rzeczy wymagane do połączenia Wi-Fi *********************** /
Następnie wywołaj metodę Wire.begin () w celu utworzenia instancji połączenia I2C i wywołaj metodę Wire.setClock () , aby ustawić częstotliwość I2C na 100 kHz, ponieważ jest to pełna prędkość układu scalonego PT2258.
Wire.begin (); // rozpocznij sekwencję startową I2C Wire.setClock (100000); // ustawienie zegara I2C na 100KHz
Następnie wywołaj metodę init () zarówno dla układu scalonego PT2258, jak i RDA5807 i zachowaj status powrotu do wcześniej zdefiniowanych wartości logicznych.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Następnie sprawdź, czy MCU był w stanie komunikować się z IC, czy nie. Robimy to za pomocą dwóch instrukcji if else .
if (potStatus) {Serial.println ("Znaleziono urządzenie PT2258!"); } else {Serial.println ("Nie udało się zainicjować PT2258"); } if (radioStatus) {Serial.println ("Znaleziono urządzenie RDA5807M!"); } else {Serial.println ("Nie udało się zainicjować RDA5807M"); }
Następnie wywołaj metodę subscribe z biblioteki MQTT. Zostaniemy powiadomieni przez serwer MQTT, jeśli nastąpią jakiekolwiek zmiany w naszych subskrybowanych kanałach.
mqtt.subscribe (& Radio_Station); // Konfiguracja subskrypcji MQTT dla kanału Radio_Station mqtt.subscribe (& Toggle_FM); // Skonfiguruj subskrypcję MQTT dla kanału Toggle_FM mqtt.subscribe (& Volume); // Skonfiguruj subskrypcję MQTT dla kanału zbiorczego
Następnie ustawiamy pin przekaźnika jako wyjście, a stan pinu na LOW
pinMode (D7, WYJŚCIE); digitalWrite (D7, LOW);
Następnie ustaw z góry określoną głośność radia, ten parametr ustawia wewnętrzną głośność układu scalonego RDA5807, co oznacza koniec naszego procesu konfiguracji.
radio.setVolume (FIX_RADIO_VOLUME); // następnie ustawiamy normalizację głośności radia radio.setMono (false); // nie chcemy, aby chip dawał wyjście monofoniczne radio.setMute (false); // nie chcemy, aby chip był wyciszony na początku
Pętlę rozpoczynamy od wywołania funkcji MQTT_connect (), która nawiązuje połączenie z serwerem MQTT.
W funkcji połączenia MQTT próbujemy trzykrotnie nawiązać połączenie z serwerem MQTT.
Jeśli się powiedzie, otrzymamy komunikat o powodzeniu, w przeciwnym razie otrzymamy komunikat o błędzie.
void MQTT_connect () {int8_t ret; // 8-bitowa liczba całkowita do przechowywania ponownych prób // Zatrzymaj, jeśli jest już połączona. if (mqtt.connected ()) {powrót; } Serial.print ("Łączenie z MQTT…"); uint8_t retries = 3; while ((ret = mqtt.connect ())! = 0) {// connect zwróci 0 dla połączonego Serial.println (mqtt.connectErrorString (ret)); Serial.println ("Ponawianie połączenia MQTT za 5 sekund…"); mqtt.disconnect (); opóźnienie (5000); // czekaj 5 sekund ponawia--; if (retries == 0) {// w zasadzie zgiń i poczekaj, aż WDT zresetuje mnie while (1); }} Serial.println ("Połączono z MQTT!"); }
Następnie zacznij od utworzenia wskaźnika do obiektu Adafruit_MQTT_Subscribe . Wykorzystamy to do określenia, która subskrypcja została odebrana.
Subskrypcja Adafruit_MQTT_Subscribe *;
Następnie czekamy na wiadomość subskrypcyjną.
mqtt.readSubscription (timeInMilliseconds) będzie nasłuchiwać przez pewien czas wszelkich wiadomości przychodzących z serwera MQTT.
Jeśli otrzyma wiadomość przed upływem limitu czasu, odpowie wskaźnikiem subskrypcji lub po prostu przekroczy limit czasu i zwróci 0. W takim przypadku będzie czekał 2 sekundy.
while ((subskrypcja = mqtt.readSubscription (20000)))
W przypadku wystąpienia przekroczenia czasu przerwy, podczas gdy pętla napełnienia zawiedzie. Jeśli nie, porównamy subskrypcję i otrzymamy nasze znane subskrypcje.
W tym kodzie robimy to dla wszystkich trzech naszych subskrybowanych kanałów.
if (subskrypcja == & Toggle_FM) if (subskrypcja == & Radio_Station) if (subskrypcja == & wolumen)
To były główne trzy parametry, które musisz zrozumieć w sekcji pętli.
Ta sekcja kodu służy do monitorowania i ustawiania kanału Toggle_FM .
if (subskrypcja == & Toggle_FM) // czy jest to wiadomość z kanału Toggle_FM {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // wydrukuj dane z kanału tylko do debugowania if (String ((char *) Toggle_FM.lastread) == String ("on")) // porównujemy otrzymane dane ze znanym parametrem, w tym przypadku oczekujemy, że "on "pochodzi z serwera {// ale zanim to zrobimy, musimy uczynić z niego ciąg, który sprawia, że porównanie jest bardzo łatwe digitalWrite (D7, HIGH); // jeśli otrzymamy ciąg" on "z serwera, który tworzymy pin D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // ponownie sprawdzamy ciąg znaków off {digitalWrite (D7, LOW); // jeśli otrzymamy "off" ciąg z serwera, dla którego pin D7 jest LOW}}
Ta sekcja kodu służy do monitorowania i ustawiania źródła sygnału Radio_Station .
if (subskrypcja == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // słyszymy, że sprawdzamy ciąg Big FM {radio.setBandFrequency (FIX_BAND, 9270); // jeśli powyższy warunek jest spełniony, ustawiamy kanał radoi na 92,7 MHz} // Powyższy proces jest kontynuowany poniżej 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); }}
Ta sekcja kodu służy do monitorowania i ustawiania źródła głośności.
if (subscription == & Volume) // // słuchamy, czy szukamy napisu Volume i jest to wartość całkowita w formacie string // Musimy ją przekonwertować z powrotem na liczbę całkowitą, aby zmienić głośność za pomocą PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Używamy metody atoi () do konwersji wskaźnika znakowego na liczbę całkowitą volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // ponieważ pt2258 rozumie tylko wartości całkowite w dB // mapujemy wartość 0dB - 79dB na 0% - 100%. digitalPot.setChannelVolume (głośność, 0); // w końcu ustawiamy głośność dla kanału 0 układu scalonego PT2258 digitalPot.setChannelVolume (volume, 1); // po tym wszystkim ustawiamy głośność dla kanału 1 układu scalonego PT2258}}
Testowanie sterowanego głosem radia FM za pomocą Arduino
Do testowania obwodu wykorzystano następującą aparaturę:
- Transformator z zaczepem 13-0-13
- Dwa głośniki 4Ω 20W jako obciążenie.
- Telefon do korzystania z Asystenta Google.
W poprzednim artykule pokazałem, jak zrobić prosty wzmacniacz audio 2x32 W z układem scalonym TDA2050, wykorzystam go również do tej demonstracji, Zepsułem potencjometr mechaniczny i zwarłem dwa przewody dwoma małymi przewodami rozruchowymi. Teraz za pomocą dwóch przycisków mogłem zmieniać głośność wzmacniacza.
Dalsze ulepszenia
Istnieje wiele dalszych ulepszeń, które można wprowadzić do tego obwodu.
- Występują różne problemy z szumami, ponieważ źródło dźwięku działa obok NodeMCU, więc musimy zaimplementować dodatkowe ekranowanie, aby poprawić odporność na szum.
- Podłączenie całego obwodu do PCB poprawi odporność na zakłócenia.
- Do tego układu scalonego można dodać dodatkowe filtry, aby wyeliminować szum.
Mam nadzieję, że spodobał Ci się ten artykuł i nauczyłeś się z niego czegoś nowego. Jeśli masz jakiekolwiek wątpliwości, możesz zapytać w komentarzach poniżej lub skorzystać z naszych forów w celu szczegółowej dyskusji.