- RDA5807M ІС
- IC PT2258
- Схематична
- Потрібні компоненти
- Як ми отримуємо дані від Google Assistant?
- Створення рахунку Adafruit для спілкування
- Налаштування брокера IFTTT для FM-радіо
- Код Arduino та пояснення
- Тестування голосового FM-радіо з використанням Arduino
- Подальше вдосконалення
Сьогодні більшість із нас любить слухати музику за допомогою своїх смартфонів. Але кілька років тому це було не так, на той момент FM-радіо були першим вибором для прослуховування музики, подкастів, новин та інших. В наш час ніхто не слухає радіо для музики, новин та інших, бабуся та дідусь - виняток.
Отже, щоб трохи відродити стару славу FM-радіо, у цьому проекті я збираюся створити FM-радіо з голосовим управлінням за допомогою Google Assistance та популярної мікросхеми приймача супергетеродинних RDA5870M.
Також перевірте наші попередні схеми FM-радіо:
- FM-радіо на базі Arduino
- FM-радіо, кероване смарт-телефоном за допомогою Arduino
- Простий ланцюг FM-передавача
- Як побудувати схему FM-передавача
RDA5807M ІС
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. Ви можете перевірити цей проект, якщо хочете дізнатись більше про цю ІС.
Схематична
Схема електричної мережі для керованого Google Assistant FM-радіо наведена нижче:
Потрібні компоненти
- Мікроконтролер NodeMCU - 1
- PT2258 Цифровий контролер гучності - 1
- RDA5807 FM-радіомодуль - 1
- Реле SPDT 6В - 1
- 1n4007 Діод - 1
- Гвинтова клема 5ммx2 - 1
- 3,5-мм роз'єм для навушників - 1
- Перетворювач логічного рівня - 1
- 10K резистор, 5% - 4
- Резистор 150 К, 5% - 4
- 100K резистор, 5% - 2
- Конденсатор 10 мкФ - 6
- Конденсатор 0,1 мкФ - 1
- Дріт перемички - 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. Ви можете отримати це, натиснувши на піктограму КЛЮЧ.
Після цього зробіть три блоки; один блок перемикання, один блок вимірювальних приладів, один блок тексту.
Блоки дуже важливі, оскільки ці блоки відповідають за зв'язок між допомогою Google і NodeMCU.
Щоб зробити блок, потрібно натиснути на знак + у верхньому правому куті.
Далі ми будемо робити блоки.
Далі, вам потрібно налаштувати кожен блок, для цього вам потрібно встановити галочку на певному блоці та натиснути Далі.
Для цього проекту немає необхідності змінювати будь-які налаштування, крім кнопки перемикання.
Текст у кнопці перемикання написано великими літерами, вам потрібно зробити це маленькою літерою та оновити зміни.
Ось і все, це все, що вам потрібно налаштувати в IO Adafruit.
Мій останній екран виглядає так-
Налаштування брокера IFTTT для FM-радіо
Як завжди, Зареєструйтесь, якщо у вас немає облікового запису, або Увійдіть, якщо у вас вже є обліковий запис.
Тепер вам потрібно створити аплет. Для цього виконайте наведені нижче дії.
Щоб зробити аплет, клацніть на піктограму вашого облікового запису та натисніть Створити.
На екрані створення натисніть кнопку + після того, як.
Після цього вам потрібно дозволити доступ до свого облікового запису Google.
Для цього вам потрібно знайти Google Assistant у рядку пошуку та натиснути на піктограму Google Assistant.
На наступному екрані ми повинні вибрати тригер, Пам’ятайте, ми зробили три блоки на сервері Adafruit IO, нам потрібно зробити там тригери для цих трьох блоків.
По-перше, Блок радіостанції, для цього нам потрібно вибрати Скажи фразу з текстовим інгредієнтом .
На наступному екрані ми повинні ввести, що ви хочете сказати, і що повинен відповісти вам асистент Google.
Потім натисніть кнопку Створити тригер.
Наступний екран виглядає приблизно так, оскільки ви закінчили частину " Якщо" , настав час для тодішньої частини, натисніть після цього знак +.
Вам буде представлений екран, як на зображенні нижче, знайдіть Adafruit і натисніть на значок Adafruit.
Далі авторизуйте свій акаунт Adafruit за допомогою IFTTT, а потім натисніть « Підключитися».
Далі вам потрібно натиснути Надіслати дані на Adafruit IO.
Тоді вам буде показано спадне меню, яке ви створили раніше в обліковому записі Adafruit.
Виберіть будь-який і натисніть на створити дію, це потрібно зробити для всіх трьох.
І тим самим, це закінчує процес IFTTT, мій останній екран аплету виглядає так,
Код Arduino та пояснення
Код Arduino призначений для управління всім зв'язком між ІС та зв'язком між Adafruit IO IFTTT та WIFI. Повний код цього FM-радіо Arduino Nano подано в кінці цього посібника. Код трохи довгий і складний, тут ми пояснили повний код рядок за рядком.
По-перше, нам потрібно включити всі необхідні бібліотеки, це:
#включати
Потім визначте 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; // рівень гучності за замовчуванням з ІС починається з
Потім ми встановили штифт 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_Qyal47xo1fYhc55QB1lEPEirnoFefnoFOffFnoFPrEFnoFOffOfOffOfOffOfOffOfOfOffOfOffOfOfOrnoFrOffOfOff
Наведені нижче визначення FIX_BAND - це власне визначення, що використовується бібліотекою.
Наступний визначений оператор встановлює внутрішній обсяг модуля.
#define FIX_BAND RADIO_BAND_FM // <Діапазон буде налаштований за цим ескізом FM. #define FIX_RADIO_VOLUME 6 /// <Обсяг модуля за замовчуванням.
Далі створіть необхідні об’єкти для PT2258, RDA5807M та WiFiClient.
PT2258 digitalPot; // PT2258 Object 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 "/ 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 **************** всі звичні речі, необхідні для з’єднання Wi-Fi *********************** / Serial.print ("підключення до"); Serial.println (ssid); Режим Wi-Fi. (WIFI_STA); WiFi.begin (ssid, пароль); while (WiFi.status ()! = WL_CONNECTED) {затримка (500); Serial.print ("."); } Serial.println (""); Serial.println ("Wi-Fi підключений"); Serial.println ("IP-адреса:"); Serial.println (WiFi.localIP ()); / **************** всі звичайні речі, необхідні для з’єднання WiFi *********************** /
Далі, викликаємо метод Wire.begin (), щоб створити екземпляр з'єднання I2C, і ми викликаємо метод Wire.setClock (), щоб зафіксувати частоту I2C до 100 кГц, оскільки це повна швидкість мікросхеми PT2258.
Wire.begin (); // починаємо стартову послідовність I2C Wire.setClock (100000); // встановлення годинника I2C на 100 кГц
Далі, викличте метод init () як для PT2258, так і для RDA5807 IC і утримуйте статус повернення в раніше визначені логічні значення.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Далі перевірте, чи MCU зміг зв’язатися з ІС чи ні. Ми робимо це з двома твердженнями if 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 для обсягу стрічок
Далі ми встановлюємо релейний штифт як вихідний, а статус виводу - НИЗЬКИЙ
pinMode (D7, ВИХІД); digitalWrite (D7, LOW);
Далі, встановіть заздалегідь визначену гучність радіо, цей параметр встановлює внутрішню гучність мікросхеми RDA5807, що означає кінець нашого процесу налаштування.
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 сек.
while ((передплата = mqtt.readSubscription (20000)))
Якщо виникає тайм - аут, то у час заповнення контуру не вдається. Якщо ні, ми порівнюємо яку підписку та отримаємо наші відомі підписки.
У цьому коді ми робимо це для всіх трьох наших підписаних каналів.
if (передплата == & Toggle_FM) if (передплата == & Radio_Station) if (передплата == & Volume)
Це були основні три параметри, які ви повинні розуміти в розділі циклу.
Цей розділ коду використовується для моніторингу та встановлення стрічки Toggle_FM .
if (subscription == & Toggle_FM) // це повідомлення із стрічки Toggle_FM {Serial.print (F ("Отримано:")); Serial.println ((char *) Toggle_FM.lastread); // друкуємо дані каналу лише для налагодження, якщо (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,7 МГц} // Згаданий процес продовжується нижче, якщо (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 (subscription == & Volume) // // чуємо, ми перевіряємо рядок Volume, і це ціле значення у форматі рядка // Нам потрібно перетворити його назад у ціле число, щоб змінити гучність за допомогою PT2258 IC Serial.print (F ("Отримав:")); Serial.println ((char *) Volume.lastread); обсяг = atoi ((char *) Volume.lastread); // Ми використовуємо метод atoi () для перетворення вказівника символу на ціле число volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // оскільки pt2258 розуміє лише цілі значення в дБ // ми відображаємо значення 0dB - 79dB до 0% - 100%. digitalPot.setChannelVolume (гучність, 0); // після всього, що ми встановлюємо гучність для каналу 0 мікросхеми PT2258 IC digitalPot.setChannelVolume (гучність, 1); // після всього, що ми встановлюємо гучність для каналу 1 мікросхеми PT2258}}
Тестування голосового FM-радіо з використанням Arduino
Для тестування схеми використовували наступний прилад -
- Трансформатор з краном 13-0-13
- Два динаміки потужністю 4 Ом 20 Вт як навантаження.
- Телефон для використання Google Assistant.
У попередній статті я показав вам, як зробити простий підсилювач звуку 2x32 Вт з мікросхемою TDA2050, я також використаю це для цієї демонстрації, Я розлаштував механічний потенціометр і замикав два провідники двома маленькими перемичними кабелями. Тепер за допомогою двох кнопок я зміг змінити гучність підсилювача.
Подальше вдосконалення
Існує багато подальших вдосконалень, які можна внести в цю схему.
- Існують різні проблеми із шумом, оскільки поряд із NodeMCU працює джерело звуку, тому нам потрібно застосувати додаткове екранування для поліпшення завадостійкості.
- Побудова загальної схеми до друкованої плати покращить захист від шуму.
- До цього мікросхеми можуть бути додані додаткові фільтри для усунення шуму.
Сподіваюся, вам сподобалась ця стаття і ви дізналися з неї щось нове. Якщо у вас є якісь сумніви, ви можете запитати в коментарях нижче або скористатися нашими форумами для детального обговорення.