- RDA5807M IC
- IC PT2258
- Схематично
- Необходими компоненти
- Как получаваме данни от Google Assistant?
- Създаване на акаунт в Adafruit за комуникация
- Създаване на IFTTT брокер за FM радио
- Код на Arduino и обяснение
- Тестване на гласово контролирано FM радио с помощта на Arduino
- По-нататъшно подобрение
В днешно време повечето от нас обичат да слушат музика със своите смартфони. Но преди няколко години това не беше така, по това време FM радиото беше първият избор за слушане на музика, подкасти, новини и други. В днешно време никой не слуша радиото за музика, новини и други, като баба и дядо са изключение.
И така, за да възродя малко старата слава на FM радиото, в този проект ще изградя гласово контролирано FM радио с помощта на Google Assistance и популярната RDA5870M Superheterodyne IC приемник.
Също така проверете нашите предишни FM радио вериги:
- FM радио, базирано на Arduino
- FM радио, контролирано от смарт телефон, използващо Arduino
- Обикновена схема на FM предавател
- Как да изградим верига на FM предавател
RDA5807M IC
RDA5807M е много модерен FM чип стерео радио тунер с напълно интегриран синтезатор, IF селективност, RDS / RBDS и MPX декодер, който поддържа честотния диапазон от 50MHz до 115MHz. Това е много евтин IC с един чип FM приемник, който изисква много малко външни компоненти за функционална работа. Този IC използва интерфейса I2C за комуникация с всяко главно устройство, така че цялата тази функция го прави много подходящ за преносими устройства.
Тази интегрална схема има вътрешен аудио процесор, който е отговорен за страхотното качество на звука.
Някои от основните характеристики включват -
- Поддръжка за световни честотни ленти
- Поддръжка за RDS / RBDS
- Цифров тунер с нисък коефициент на честота
- Напълно интегриран дигитален честотен синтезатор
- Цифров автоматичен контрол на усилването (AGC)
- Усилване на басите
- Директно поддържа 32Ω съпротивление натоварване
- Вграден LDO регулатор и др
Можете да научите повече за тази интегрална схема, като преминете през този проект, базиран на Arduino FM радио, използвайки RDA5807.
IC PT2258
PT2258 е интегрална схема, създадена да се използва като 6-канален електронен контролер на звука, тази интегрална схема използва CMOS технология, специално проектирана за многоканални аудио-видео приложения.
Този IC осигурява интерфейс за управление I2C с обхват на затихване от 0 до -79dB при 1dB / стъпка и се предлага в 20-пинов DIP или SOP пакет.
Някои от основните функции включват -
- 6-входни и изходни канали (за 5.1 домашни аудио системи)
- Избираем I2C адрес (за приложение на Daisy-chain)
- Разделяне на високи канали (за приложение с ниско ниво на шум)
- S / N съотношение> 100dB
- Работното напрежение е от 5 до 9V
По-рано обяснихме за тази интегрална схема в проекта за контрол на силата на звука PT2258 Digital Audio. Можете да проверите този проект, ако искате да научите повече за тази интегрална схема.
Схематично
Схемата на веригата за FM асистент контролирано FM радио е дадена по-долу:
Необходими компоненти
- Микроконтролер NodeMCU - 1
- PT2258 Цифров контролер на силата на звука - 1
- RDA5807 FM радиомодул - 1
- SPDT реле 6V - 1
- 1n4007 Диод - 1
- Винтова клема 5mmx2 - 1
- 3,5 мм жак за слушалки - 1
- Преобразувател на логически нива - 1
- 10K резистор, 5% - 4
- 150K резистор, 5% - 4
- 100K резистор, 5% - 2
- Кондензатор 10uF - 6
- Кондензатор 0.1uF - 1
- Jumper Wire - 10
Как получаваме данни от Google Assistant?
Горното изображение ви дава основната идея за комуникационния процес между Google Assistant и NodeMCU.
Google Assistant има право да променя данните в сървъра на Adafruit IO, за да направи IFTTT с MQTT да работи като брокер.
Ако настъпи някаква промяна на данните от страна на сървъра (Adafruit IO), това се отразява от страната NodeMCU. За да постигнете това, трябва да следвате инструкциите, дадени по-долу -
Създаване на акаунт в Adafruit за комуникация
Първо направете акаунт в Adafruit IO. Влезте в Adafruit IO с вашите идентификационни данни или се регистрирайте, ако нямате акаунт. Преди това използвахме Adafruit IO за изграждане на контролиран от Alexa светодиод, домашна автоматизация на Raspberry Pi и много други проекти, базирани на IoT.
След като влезете в акаунта на Adafruit, Кликнете върху Табла за управление, след това върху Действие> Създаване на ново табло за управление .
След това ще добавим ново име и кратко описание на новото табло за управление.
След като създадете таблото за управление, трябва да вземете потребителското име и активния ключ от акаунта си, както се изисква в кода на Arduino. Можете да го получите, като кликнете върху иконата KEY.
След това направете три блока; един превключващ блок, един измервателен блок, един текстов блок.
Блоковете са много важни, тъй като тези блокове отговарят за комуникацията между помощта на Google и NodeMCU.
За да направите блок, трябва да щракнете върху знака + в горния десен ъгъл.
След това ще направим блоковете.
След това трябва да настроите всеки блок, за това трябва да маркирате определен блок и да щракнете върху Напред.
За този проект не е необходимо да променяте каквито и да било настройки, освен бутона за превключване.
Текстът в бутона за превключване е с главни букви, трябва да го направите малка буква и да актуализирате промените.
Това е, това са всички неща, които трябва да настроите в адафрут IO.
Последният ми екран изглежда така-
Създаване на IFTTT брокер за FM радио
Както винаги, регистрирайте се, ако нямате акаунт, или влезте, ако вече имате акаунт.
Сега трябва да създадете аплет. За това следвайте стъпките по-долу:
За да направите аплет, щракнете върху иконата на вашия акаунт и щракнете върху Създаване.
В екрана за създаване щракнете върху иконата + след ако.
След това трябва да разрешите достъп до вашия акаунт в Google.
За това трябва да потърсите Google Assistant в лентата за търсене и да кликнете върху иконата на Google Assistant.
В следващия екран трябва да изберем спусък, Не забравяйте, че направихме три блока в сървъра Adafruit IO, трябва да направим тригери за тези три блока.
Първо, блокът на радиостанцията, за това трябва да изберете Кажете фраза с текстова съставка .
На следващия екран трябва да напишем какво искате да кажете и с какво трябва да ви отговори асистентът на Google.
След това кликнете върху бутона Създаване на задействане.
Следващият екран изглежда нещо подобно, тъй като сте завършили частта Ако е време за тогавашната част, щракнете върху знака + след това .
Ще ви бъде представен екран като изображението по-долу, потърсете Adafruit и кликнете върху иконата Adafruit.
След това упълномощете акаунта си в Adafruit с IFTTT, след което щракнете върху Свързване.
След това трябва да кликнете върху Изпращане на данни към Adafruit IO.
След това ще ви се покаже падащо меню с емисии, които сте създали по-рано в акаунта на Adafruit.
Изберете някой и кликнете върху създаване на действие, което трябва да направите и за трите.
И с това, отбелязва края на процеса IFTTT, последният ми екран на аплета изглежда така,
Код на Arduino и обяснение
Кодът на Arduino е там, за да управлява цялата комуникация между IC и комуникацията между Adafruit IO IFTTT и WIFI. Пълният код за това радио Arduino Nano FM е даден в края на този урок. Кодът е малко дълъг и сложен, тук обяснихме пълния код ред по ред.
Първо, трябва да включим всички необходими библиотеки, те са:
#include
След това дефинирайте SSID и паролата за WI-FI, това е SSID и ПАРОЛАТА на вашия рутер.
const char * ssid = "Android"; // SSID на вашия рутер const char * password = "12345678"; // Парола на вашия рутер
След това дефинираме две булеви значения и променлива, булевите се използват за задържане на комуникационния статус на интегралните схеми, а променливата за обем се използва за задаване на нивото на звука.
bool potStatus; // 1, когато се установи комуникация между MCU и IC bool radioStatus; // 1, когато се установи комуникация между MCU и IC обем = 15; // нивото на звука по подразбиране с IC започва с
След това настроихме GPIO щифт на име Relay_Pin, за да включите или изключите усилвателя.
#define Relay_Pin D7 // Този щифт се използва за включване и изключване на радиото
След това трябва да дефинираме всички необходими дефиниции за комуникация с Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // използвайте 8883 за SSL #define AIO_USERNAME "debashis13" // Заменете го с вашето потребителско име #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFrefnoFPF" Замяна на вашия ключ с Project RefrOnFFF1PEPhirnoF
Дефинициите по-долу FIX_BAND са собствена дефиниция, използвана от библиотеката.
Следващият дефиниран оператор задава вътрешния обем на модула.
#define FIX_BAND RADIO_BAND_FM // <Лентата ще бъде настроена от тази скица е FM. #define FIX_RADIO_VOLUME 6 /// <Обем по подразбиране на модула.
След това направете необходимите обекти за PT2258, RDA5807M и WiFiClient.
PT2258 digitalPot; // PT2258 Обект RDA5807M радио; // RDA5807M обект WiFiClient клиент; // WiFiClient обект
След това настройте клиентския клас MQTT, като предадете WiFi клиента и MQTT сървъра и данните за вход.
Adafruit_MQTT_Client mqtt (& клиент, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Настройте клиентския клас MQTT, като предадете WiFi клиента и MQTT сървъра и данните за вход.
След това трябва да се абонираме за емисия. Какво ви кара да питате?
Ако някои стойности, някои параметри се променят в сървъра на Adafruit, промените ще бъдат отразени тук.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ емисии / Radio_Station"); // Методи, използвани за абониране за емисия Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Методи, използвани за абониране за емисия Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Методи, използвани за абониране за емисия
По-долу е прототипът на функцията за функцията MQTT_connect () .
void MQTT_connect (); // Прототип на функция за MQTT Connect
След това започваме процеса на настройка. Отначало стартираме UART комуникацията с метода begin.
Serial.begin (9600); // UART започва Serial.println (); // добавя допълнителен ред за интервал Serial.println (); // добавя допълнителен ред за интервал След това правим всичко обичайно, за да се свържем с WiFI **************** всички обичайни неща, необходими за WiFi връзка *********************** / Serial.print ("свързване към"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, парола); докато (WiFi.status ()! = WL_CONNECTED) {закъснение (500); Serial.print ("."); } Serial.println (""); Serial.println („WiFi свързан“); Serial.println ("IP адрес:"); Serial.println (WiFi.localIP ()); / **************** всички обичайни неща, необходими за WiFi връзка *********************** /
След това извикайте метода Wire.begin () , за да създадете екземпляр на I2C връзка и ние извикваме метода Wire.setClock () , за да фиксираме I2C честотата до 100KHz, тъй като това е пълната скорост на PT2258 IC.
Wire.begin (); // стартиране на началната последователност на I2C Wire.setClock (100000); // настройка на I2C часовника на 100KHz
След това извикайте метода init () както за PT2258, така и за RDA5807 IC и задръжте състоянието на връщане в предварително дефинираните булеви числа.
potStatus = digitalPot.init (); radioStatus = radio.init ();
След това проверете дали MCU е успял да комуникира с IC или не. Правим това с две, ако не други твърдения.
if (potStatus) {Serial.println ("Намерено устройство PT2258!"); } else {Serial.println ("Неуспешно иницииране на PT2258"); } if (radioStatus) {Serial.println ("Намерено устройство RDA5807M!"); } else {Serial.println ("Неуспешно стартиране на RDA5807M"); }
След това извикайте метода на абонамент от библиотеката MQTT. Ще бъдем уведомени от сървъра на MQTT, ако се случи някаква промяна в нашите абонирани емисии.
mqtt.subscribe (& Radio_Station); // Настройка на MQTT абонамент за емисия на Radio_Station mqtt.subscribe (& Toggle_FM); // Настройване на MQTT абонамент за Toggle_FM feed mqtt.subscribe (& Volume); // Настройване на MQTT абонамент за Volume feed
След това задаваме релейния щифт като изход и състоянието на щифта на LOW
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
След това задайте предварително определен обем на радиото, този параметър задава вътрешния обем на RDA5807 IC, което отбелязва края на нашия процес на настройка.
radio.setVolume (FIX_RADIO_VOLUME); // следващото задаваме нормализиращия обем на радиото radio.setMono (false); // не искаме чипът да дава моно изход radio.setMute (false); // не искаме чипът да заглушава при стартиране
Стартираме цикъла, като извикаме функцията MQTT_connect (), която установява връзка със сървъра MQTT.
Във функцията за свързване MQTT се опитваме три пъти да осъществим връзка с MQTT сървъра.
Ако успее, получаваме съобщение за успех, в противен случай ще получим съобщение за грешка.
void MQTT_connect () {int8_t ret; // 8-битово цяло число за съхраняване на опитите // Спиране, ако вече е свързано. if (mqtt.connected ()) {return; } Serial.print ("Свързване към MQTT…"); uint8_t опитва = 3; while ((ret = mqtt.connect ())! = 0) {// connect ще върне 0 за свързан Serial.println (mqtt.connectErrorString (ret)); Serial.println ("Повторен опит за MQTT връзка след 5 секунди…"); mqtt.disconnect (); забавяне (5000); // изчакайте 5 секунди опити--; if (retries == 0) {// основно умирам и чакам WDT да ме нулира докато (1); }} Serial.println („MQTT свързан!“); }
След това започнете, като създадете указател към обект Adafruit_MQTT_Subscribe . Ще използваме това, за да определим кой абонамент е получен.
Абонамент Adafruit_MQTT_Subscribe *;
След това чакаме съобщение за абонамент.
mqtt.readSubscription (timeInMilliseconds) ще слуша определено време за всички съобщения, идващи от MQTT сървъра.
Ако получи съобщение преди таймаут, той ще отговори с указател към абонамента или просто ще изтече и ще върне 0. В този случай ще изчака 2 секунди.
докато ((абонамент = mqtt.readSubscription (20000)))
Ако настъпи време за изчакване, запълването на цикъл while е неуспешно. Ако не, сравняваме какъв абонамент и ще получим известните ни абонаменти.
В този код правим това и за трите ни абонирани емисии.
if (абонамент == & Toggle_FM) if (абонамент == & Radio_Station) if (абонамент == & Volume)
Това бяха основните три параметъра, които трябва да разберете в цикъла.
Този раздел на кода се използва за наблюдение и задаване на Toggle_FM емисия.
if (абонамент == & Toggle_FM) // дали това е съобщение от Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // отпечатваме данните на Feed само за отстраняване на грешки, ако (String ((char *) Toggle_FM.lastread) == String ("on")) // сравняваме получените данни с известен параметър, в този случай очакваме, че „on "идва от sever {// но преди да го направим, трябва да го направим низ, което прави сравнението супер лесно digitalWrite (D7, HIGH); // ако получим низ" on "от сървъра, който правим ПИН D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // отново проверяваме за низа off {digitalWrite (D7, LOW); // ако получим "изключен" низ от сървъра правим D7 щифт НИСКО}}
Този раздел на кода се използва за наблюдение и задаване на емисията Radio_Station .
if (абонамент == & Radio_Station) {Serial.print (F ("Получих:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // чуваме, че проверяваме за низа Big FM {radio.setBandFrequency (FIX_BAND, 9270); // ако горното условие е вярно, ние задаваме канала radoi на 92,7MHz} // Гореспоменатият процес продължава по-долу 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); }}
Този раздел на кода се използва за наблюдение и настройка на подаването на сила на звука.
if (абонамент == & Volume) // // чуваме, че проверяваме за низа Volume и това е цяла стойност във формат на низ // Трябва да го преобразуваме обратно в цяло число, за да променим силата на звука с помощта на PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); обем = atoi ((char *) Volume.lastread); // Използваме метода atoi () за преобразуване на указател на символ в цяло число том = карта (обем, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // тъй като pt2258 разбира само целочислени стойности в dB // ние преобразуваме стойността 0dB - 79dB на 0% - 100%. digitalPot.setChannelVolume (обем, 0); // след всичко, което задаваме силата на звука за канала 0 на PT2258 IC digitalPot.setChannelVolume (обем, 1); // след всичко това настройваме силата на звука за канал 1 на IC PT2258}}
Тестване на гласово контролирано FM радио с помощта на Arduino
За тестване на веригата беше използван следният апарат -
- Трансформатор, който има кран 13-0-13
- Два 4Ω 20W високоговорителя като товар.
- Телефон, за да използвате Google Assistant.
В предишна статия ви показах как да направите обикновен аудио усилвател 2x32 вата с TDA2050 IC, ще го използвам и за тази демонстрация, Разредил съм механичния потенциометър и съм закъсал два проводника с два малки джъмперни кабела. Сега, с помощта на два бутона, успях да променя силата на звука на усилвателя.
По-нататъшно подобрение
Има много допълнителни подобрения, които могат да бъдат направени в тази схема.
- Има различни проблеми с шума, тъй като до NodeMCU работи аудио източник, така че трябва да внедрим допълнително екраниране, за да подобрим имунитета срещу шум.
- Изграждането на цялостната схема към печатни платки ще подобри имунитета срещу шум.
- Към тази интегрална схема могат да се добавят допълнителни филтри за премахване на шума.
Надявам се тази статия да ви е харесала и да сте научили нещо ново от нея. Ако имате някакви съмнения, можете да попитате в коментарите по-долу или да използвате нашите форуми за подробна дискусия.