- RDA5807M IC
- IC PT2258
- Схема
- Необходимые компоненты
- Как мы получаем данные от Google Assistant?
- Настройка учетной записи Adafruit для общения
- Настройка брокера IFTTT для FM-радио
- Код и объяснение Arduino
- Тестирование FM-радио с голосовым управлением с помощью Arduino
- Дальнейшее улучшение
В настоящее время большинству из нас нравится слушать музыку со своими смартфонами. Но несколько лет назад это было не так, в то время FM-радио были первым выбором для прослушивания музыки, подкастов, новостей и прочего. Сейчас радио никто не слушает ради музыки, новостей и прочего, бабушка и дедушка составляют исключение.
Итак, чтобы немного возродить былую славу FM-радио, в этом проекте я собираюсь создать FM-радио с голосовым управлением с помощью Google Assistance и популярной ИС супергетеродинного приемника RDA5870M.
Также проверьте наши предыдущие схемы FM-радио:
- FM-радио на базе Arduino
- FM-радио, управляемое смартфоном, с использованием Arduino
- Схема простого FM-передатчика
- Как построить схему FM-передатчика
RDA5807M IC
RDA5807M - это очень современный однокристальный FM-радиотюнер с полностью интегрированным синтезатором, селективностью по ПЧ, RDS / RBDS и декодером MPX, который поддерживает диапазон частот от 50 до 115 МГц. Это очень дешевая однокристальная микросхема FM-приемника, для функциональной работы которой требуется очень мало внешних компонентов. Эта микросхема использует интерфейс I2C для связи с любым ведущим устройством, поэтому вся эта функция делает ее очень подходящей для портативных устройств.
Эта микросхема имеет внутренний аудиопроцессор, который отвечает за отличное качество звука.
Некоторые из основных функций включают:
- Поддержка диапазонов частот по всему миру
- Поддержка RDS / RBDS
- Цифровой тюнер с низкой ПЧ
- Полностью интегрированный цифровой синтезатор частоты
- Цифровая автоматическая регулировка усиления (AGC)
- Усиление басов
- Прямая поддержка нагрузки с сопротивлением 32 Ом
- Встроенный регулятор LDO и многое другое
Вы можете узнать больше об этой микросхеме, пройдя через этот проект FM-радио на базе Arduino с использованием RDA5807.
IC PT2258
PT2258 - это ИС, предназначенная для использования в качестве 6-канального электронного регулятора громкости, в этой ИС используется технология CMOS, специально разработанная для многоканальных аудио-видео приложений.
Эта микросхема обеспечивает интерфейс управления I2C с диапазоном ослабления от 0 до -79 дБ при 1 дБ / шаг и поставляется в 20-контактном корпусе DIP или SOP.
Некоторые из основных функций включают:
- 6 входных и выходных каналов (для домашних аудиосистем 5.1)
- Выбираемый адрес I2C (для гирляндного подключения)
- Высокое разделение каналов (для приложений с низким уровнем шума)
- Отношение сигнал / шум> 100 дБ
- Рабочее напряжение от 5 до 9 В
Мы ранее объясняли об этой ИС в проекте PT2258 Digital Audio Volume Control Project. Вы можете проверить этот проект, если хотите узнать больше об этой ИС.
Схема
Принципиальная схема FM-радио, управляемого Google Assistant, приведена ниже:
Необходимые компоненты
- Микроконтроллер NodeMCU - 1
- Цифровой регулятор громкости PT2258 - 1
- Радиомодуль RDA5807 FM - 1
- Реле SPDT 6В - 1
- 1n4007 Диод - 1
- Винтовой зажим 5ммx2 - 1
- Разъем для наушников 3,5 мм - 1
- Конвертер логического уровня - 1
- Резистор 10 кОм, 5% - 4
- Резистор 150К, 5% - 4
- Резистор 100К, 5% - 2
- Конденсатор 10 мкФ - 6
- Конденсатор 0,1 мкФ - 1
- Перемычка - 10
Как мы получаем данные от Google Assistant?
Изображение выше дает вам общее представление о процессе связи между Google Assistant и NodeMCU.
Google Assistant имеет право изменять данные на сервере ввода-вывода Adafruit, чтобы IFTTT с MQTT работал в качестве брокера.
Если какое-либо изменение данных происходит на стороне сервера (Adafruit IO), это отражается на стороне NodeMCU. Для этого вам необходимо следовать инструкциям, приведенным ниже:
Настройка учетной записи Adafruit для общения
Сначала создайте учетную запись Adafruit IO. Войдите в Adafruit IO со своими учетными данными или зарегистрируйтесь, если у вас нет учетной записи. Ранее мы использовали Adafruit IO для создания светодиодов с управлением Alexa, домашней автоматизации Raspberry Pi и многих других проектов на основе Интернета вещей.
После входа в учетную запись Adafruit, Нажмите « Панели мониторинга», затем нажмите « Действие»> «Создать новую панель мониторинга» .
Затем мы собираемся добавить новое имя и краткое описание нашей новой панели инструментов.
После того, как вы создали панель управления, вам необходимо получить имя пользователя и активный ключ из вашей учетной записи, как это требуется в коде Arduino. Вы можете получить это, нажав на значок КЛЮЧ.
После этого сделайте три блока; один блок переключения, один индикаторный блок, один текстовый блок.
Блоки очень важны, так как эти блоки отвечают за связь между помощником Google и NodeMCU.
Чтобы создать блок, вам нужно нажать на знак + в правом верхнем углу.
Далее мы собираемся сделать блоки.
Далее вам необходимо настроить каждый блок, для этого вам нужно поставить галочку напротив определенного блока и нажать Next step.
Для этого проекта нет необходимости изменять какие-либо настройки, кроме кнопки-переключателя.
Текст в переключателе - заглавными буквами, вам нужно сделать его маленькой буквой и обновить изменения.
Вот и все, это все, что вам нужно настроить в Adafruit IO.
Мой последний экран выглядит так:
Настройка брокера IFTTT для FM-радио
Как всегда, Регистрация, если у вас нет учетной записи или войдите в систему, если Вы уже зарегистрированы.
Теперь вам нужно создать апплет. Для этого выполните следующие действия:
Чтобы создать апплет, щелкните значок своей учетной записи и нажмите «Создать».
На экране создания щелкните значок + после if.
После этого вам необходимо разрешить доступ к своей учетной записи Google.
Для этого вам нужно найти Google Assistant в строке поиска и щелкнуть значок Google Assistant.
На следующем экране мы должны выбрать триггер, Помните, что мы создали три блока на сервере ввода-вывода Adafruit, нам нужно создать триггеры для этих трех блоков.
Во-первых, блок радиостанции, для этого нам нужно выбрать Произнести фразу с текстовым ингредиентом .
На следующем экране мы должны ввести, что вы хотите сказать, и что помощник Google должен вам ответить.
Затем нажмите кнопку « Создать триггер».
Следующий экран выглядит примерно так, как вы закончили If часть, пришло время для то части, нажмите + знак после затем .
Вам будет представлен экран, подобный изображению ниже, выполните поиск Adafruit и щелкните значок Adafruit.
Затем авторизуйте свою учетную запись Adafruit с помощью IFTTT, затем нажмите « Подключиться».
Затем вам нужно нажать Отправить данные в Adafruit IO.
Затем вам будет представлен раскрывающийся список каналов, которые вы создали ранее в учетной записи Adafruit.
Выберите любой и нажмите « Создать действие», вам нужно сделать это для всех трех.
И с этим, знаменует конец процесса IFTTT, мой последний экран апплета выглядит так:
Код и объяснение Arduino
Код Arduino предназначен для управления всей связью между IC и связью между Adafruit IO IFTTT и WIFI. Полный код для этого Arduino Nano FM Radio приведен в конце этого руководства. Код немного длинноват и сложен, здесь мы объяснили весь код построчно.
Во-первых, нам нужно включить все необходимые библиотеки, это:
#включают
Затем определите SSID и пароль для WI-FI, это SSID и ПАРОЛЬ вашего маршрутизатора.
const char * ssid = "Android"; // SSID вашего роутера const char * password = "12345678"; // Пароль вашего роутера
Затем мы определяем два логических значения и переменную, логические значения используются для хранения состояния связи ИС, а переменная громкости используется для установки уровня громкости.
bool potStatus; // 1, если установлена связь между MCU и IC bool radioStatus; // 1, когда связь установлена между MCU и IC int volume = 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_Qyal47xo1fYhc55QB1lEPEirno" Project Authentication //
Приведенные ниже определения FIX_BAND - это собственное определение, используемое библиотекой.
Следующий определенный оператор устанавливает внутренний объем модуля.
#define FIX_BAND RADIO_BAND_FM // <Диапазон, который будет настроен этим скетчем, - FM. #define FIX_RADIO_VOLUME 6 /// <Объем модуля по умолчанию.
Затем создайте необходимые объекты для PT2258, RDA5807M и WiFiClient.
PT2258 digitalPot; // Радиомодуль объекта PT2258 RDA5807M; // RDA5807M Объект WiFiClient client; // Объект 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 "/ feeds / 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 begin 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 на 100 кГц, поскольку это полная скорость PT2258 IC.
Wire.begin (); // начинаем стартовую последовательность I2C Wire.setClock (100000); // установка частоты I2C на 100 кГц
Затем вызовите метод init () для PT2258 и RDA5807 IC и сохраните статус возврата в ранее определенных логических значениях.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Затем проверьте, смог ли MCU связаться с IC или нет. Мы делаем это с помощью двух операторов if else .
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 mqtt.subscribe (& Volume); // Настраиваем подписку MQTT для Volume Feed
Затем мы устанавливаем контакт реле как выход, а состояние контакта - LOW.
pinMode (D7, ВЫХОД); digitalWrite (D7, LOW);
Затем установите предопределенную громкость радио, этот параметр устанавливает внутренний объем микросхемы RDA5807, что знаменует конец нашего процесса настройки.
radio.setVolume (FIX_RADIO_VOLUME); // далее устанавливаем нормализацию громкости радио radio.setMono (false); // мы не хотим, чтобы чип выдавал монофонический вывод radio.setMute (false); // мы не хотим, чтобы чип отключался при запуске
Мы начинаем цикл с вызова функции MQTT_connect (), которая устанавливает соединение с сервером MQTT.
В функции MQTT connect мы трижды пытаемся установить соединение с сервером MQTT.
В случае успеха мы получаем сообщение об успешном выполнении, иначе мы получим сообщение об ошибке.
void MQTT_connect () {int8_t ret; // 8-битное целое число для сохранения повторных попыток // Остановить, если уже подключено. если (mqtt.connected ()) {возврат; } Serial.print («Подключение к MQTT…»); uint8_t retries = 3; while ((ret = mqtt.connect ())! = 0) {// connect вернет 0 для подключенного Serial.println (mqtt.connectErrorString (ret)); Serial.println ("Повторная попытка соединения MQTT через 5 секунд…"); mqtt.disconnect (); задержка (5000); // ждать 5 секунд retries--; if (retries == 0) {// в основном умираем и ждем, пока WDT сбросит меня while (1); }} Serial.println («MQTT подключен!»); }
Затем начните с создания указателя на объект Adafruit_MQTT_Subscribe . Мы будем использовать это, чтобы определить, какая подписка была получена.
Adafruit_MQTT_Subscribe * подписка;
Далее ждем сообщения о подписке.
mqtt.readSubscription (timeInMilliseconds) будет прослушивать в определенное время любые сообщения, поступающие с сервера MQTT.
Если он получит сообщение до истечения тайм-аута, он ответит указателем на подписку или просто завершит тайм-аут и вернет 0. В этом случае он будет ждать 2 секунды.
while ((подписка = mqtt.readSubscription (20000)))
Если возникает тайм - аут, то во время заполнения контура не удается. Если нет, мы сравниваем, какая подписка, и получим наши известные подписки.
В этом коде мы делаем это для всех трех наших подписных каналов.
if (подписка == & Toggle_FM) if (subscription == & Radio_Station) if (subscription == & Volume)
Это были три основных параметра, которые вам нужно понять в разделе цикла.
Этот раздел кода используется для отслеживания и настройки ленты Toggle_FM .
if (subscription == & Toggle_FM) // это сообщение из ленты Toggle_FM {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // выводим данные Feed только для отладки if (String ((char *) Toggle_FM.lastread) == String ("on")) // мы сравниваем полученные данные с известным параметром, в этом случае мы ожидаем, что "on "поступает с сервера {// но прежде чем мы это сделаем, мы должны сделать его строкой, что упростит сравнение digitalWrite (D7, HIGH); // если мы получим строку" on "от сервера, который мы делаем вывод D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // снова мы проверяем отключение строки {digitalWrite (D7, LOW); // если мы получаем "off" строка с сервера, мы делаем вывод D7 LOW}}
Этот раздел кода используется для мониторинга и настройки канала Radio_Station .
если (подписка == & 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,7 МГц} // Вышеупомянутый процесс продолжается ниже 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); }}
Этот раздел кода используется для отслеживания и установки подачи Volume.
if (subscription == & Volume) // // слышим, что мы проверяем строку Volume, и это целочисленное значение в строковом формате // Мы должны преобразовать его обратно в целое число, чтобы изменить громкость с помощью PT2258 IC Serial.print (F ("Получил:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Мы используем метод atoi () для преобразования символьного указателя в целое число volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // поскольку pt2258 понимает только целочисленные значения в дБ // мы сопоставляем значение 0 дБ - 79 дБ с 0% до 100%. digitalPot.setChannelVolume (объем, 0); // после всего этого мы устанавливаем громкость для канала 0 микросхемы PT2258 digitalPot.setChannelVolume (volume, 1); // после всего этого мы устанавливаем громкость для канала 1 микросхемы PT2258}}
Тестирование FM-радио с голосовым управлением с помощью Arduino
Для тестирования схемы использовалось следующее оборудование:
- Трансформатор с отводом 13-0-13
- Два динамика 4 Ом по 20 Вт в качестве нагрузки.
- Телефон для использования Google Assistant.
В предыдущей статье я показал вам, как сделать простой усилитель звука 2x32 Вт с микросхемой TDA2050, я также собираюсь использовать его для этой демонстрации, Я не переставил механический потенциометр и закоротил два провода двумя небольшими перемычками. Теперь с помощью двух кнопок я смог изменить громкость усилителя.
Дальнейшее улучшение
В эту схему можно внести много дополнительных улучшений.
- Существуют различные проблемы с шумом, потому что источник звука работает рядом с NodeMCU, поэтому нам необходимо реализовать дополнительное экранирование для повышения помехоустойчивости.
- Построение всей схемы на печатной плате улучшит помехозащищенность.
- К этой ИС можно добавить дополнительные фильтры для устранения шума.
Надеюсь, вам понравилась эта статья и вы узнали из нее что-то новое. Если у вас есть сомнения, вы можете задать вопрос в комментариях ниже или воспользоваться нашим форумом для подробного обсуждения.