Сегодня мы обсудим процесс разработки, изготовления, прошивки и наладки радиоприёмника, которым можно управлять по каналу WiFi на диапазон 98...108 МГц. Назван он в честь месяца августа. Так я традиционно (в честь месяцев) называю все мои конструкции радиоприёмников, которые выходят из под моей руки. Называть в честь женщин, наоборот, плохая примета. Шутка.
Радиоприёмник собран на базе ESP8266, которая отвечает за управление радиоприёмником, и модуле RDA5807M, который отвечает за радиоприём. Конструкция и схемотехника радиоприёмника просты, но его разработка оказалась очень сложной, что вышло в долгое ненаписание статей. Так что сейчас устраняю данный пробел.
Начнём с конструктивных особенностей. У радиоприёмника, как вы увидели по фотографиям, нет ни дисплея, ни шкалы настройки, ни ручек и кнопок управления громкостью и настройки длины волны приёма. Имеется лишь кнопка включения питания и индикатор питания из синего светодиода. Также конечно имеется MicroUSB-разъём питания и зарядки радиоприёмника, решётка из отверстий, за которыми стоит динамик, а также, конечно, телескопическая выдвижная антенна (хотелось сделать внутреннюю антенну из витков монтажного провода, но приём получался паршивый).
Стенки радиоприёмника изготовлены и склеены суперклеем из ДВП-плиток, покрытых прозрачным лаком. Передняя и задняя панели напечатаны на 3D-принтере из PLA-пластика и, конечно, доработаны напильником, шкуркой и паяльником. Без этого (из-за усадки) никак. Передняя панель закреплена на винтах. Задняя панель закреплена также на винтах, но при этом гайки с внутренней стороны приклеены суперклеем с помощью держателей, также распечатанных на 3D-принтере, что вы увидите ниже на фотографиях внутреннего вида.
На передней панели с внутренней стороны закреплены плата радиоприёмника и динамик, у левой стенки закреплёна на винте телескопическая антенна. Также на передней панели приклеен на термоклей светодиод для индикации питания. На задней панели закреплены на держателях аккумулятор 18650 (держатели для аккумулятора распечатаны отдельно на 3D-принтере и приклеены суперклеем) и плата контроля зарядки аккумулятора, которые, конечно, для надёжности дополнительно закреплены на термоклей. Также на задней панели закреплены два винта для подсоединения питания к плате радиоприёмника и выключатель питания.
Радиоприёмник работаем следующим образом: питание 3,7 В с аккумулятора 18650 через плату контроля заряда DA1 TP4056 поступает на модуль DD1 ESP8266, который, как говорилось ранее, отвечает за управление модулем радиоприёмника DD2 RDA5807M по интерфейсу I2C. Также питание 3,7 В поступает на модуль стабилизатора напряжения DD4, который далее питает модуль DD2 стабилизированным питанием 3,3 В. Сигнал с антенны поступает на усилитель радиочастоты, выполненный на транзисторе VT1 КТ315, который также питается от аккумулятора. После усилителя радиочастоты сигнал поступает на модуль DD2, где преобразовывается в аудиосигнал, который через оксидный конденсатор C3 и через делитель R3R4 поступает на вход модуля DD3 усилителя звуковой частоты D-класса PAM8403, который усиливает аудиосигнал и затем подаёт его на динамик. Светодиод LED1 отвечает за индикацию питания, при этом питается через резистор R5.
Какие комментарии могу сказать о схеме радиоприёмника и направления его доработки. Модуль RDA5807M имеет слабое усиление сигнала радиочастоты, поэтому был добавлен в схему усилитель радиочастоты, что позволило улучшить качество приёма. Также рекомендуется применять длинную телескопическую антенну. Хотелось её, конечно, как говорилось выше, сделать её внутренней, но это не даёт нужного качества приёма. Для питания модуля RDA5807M применено отдельное питание от стабилизатора питания на 3,3 В. Модуль RDA5807M не запитан от ESP8266, потому что стабилизатор на самой ESP8266, как оказалось, не может тянуть одновременно питание самой ESP8266 и модуля RDA5807M. В результате в предыдущих попытках модуль ESP8266 вышел из строя, который, конечно, пришлось заменить на новый. Делитель встроен в схему и подобран так, чтобы на вход модуля PAM8403 поступал аудиосигнал нужного уровня (без делителя динамик очень сильно орёт и захлёбывается от большого уровня входного сигнала). Также пришлось подбирать подходящий модуль PAM8403. Новые версии модулей создавали очень сильные шумы по питанию, что создавало очень большие проблемы приёму сигнала. Старые версии модулей таких проблем не имеют. Так что в радиоприёмник встроен модуль пятилетней давности из моего личного склада радиокомпонентов. Для устранения таких проблем впредь рекомендую ставить усилитель AB-класса, например на микросхеме TDA2003, на который у меня уже есть статья, либо какай-нибудь другой усилитель звуковой частоты.
В результате получилась компактная конструкция радиоприёмника, которым можно управлять, даже к нему ни прикасаясь после включения.
Ниже представлена код прошивки радиоприёмника, написанный в Arduino IDE:
#include <radio.h> //Библиотека для работы с радиомодулями
#include <RDA5807M.h> //библиотека для работы с RDA5807M
#include <ESP8266WiFi.h> //Библиотека для работы с WiFi
#include <ESP8266WebServer.h> //Библиотека для работы с WiFi-сервером
//Константа рабочего диапазона (FM)
#define FIX_BAND RADIO_BAND_FM
#define FIX_STATION 9240 //Константа стартовой радиостанции
#define FIX_VOLUME 1 //Константа стартовой громкости
//Константа максимального
//уровня громкости
#define MAX_VOLUME 15
#define NUM_STATION 29 //Константа количества радиостанций
char* Ssid = "August_01"; //Переменная логина подключаемой сети
char* Password = "Trestiany"; //Переменная пароля подключаемой сети
//Переменная начала HTML-страницы
String Start_Html = "<html><head><title>August-1</title></head><body bgcolor=\"blue\">";
//Переменная заголовка HTML-страницы
String Name_Html = "<center><b><font color = \"white\" size = 12>Radio \"August-1\"</font></b>\<br><b><font color = \"white\" size = 6>Control window</font></b></center><hr>";
//Переменная начала обозначения частоты
String Freq_Html_S = "<p align = \"center\"><font color = \"white\" size = 5>Frequency: ";
String Freq_Html = "92.4"; //Переменная обозначения частоты
//Переменная конца обозначения частоты
String Freq_Html_E = " MHz</font></p>";
//Переменная начала
//обозначения громкости
String Vol_Html_S = "<p align = \"center\"><font color = \"white\" size = 5>
Volume: ";
String Vol_Html = "1"; //Переменная обозначения громкости
//Переменная конца
//обозначения громкости
String Vol_Html_E = "</font></p>";
//Переменная кнопки переключения
//на следующую станцию
String Button_Next_Html = "<p align = \"center\"><a href = \"\Next\"><button style=\"width: 205; height: 26\">\Next station</button></a></p>";
//Переменная кнопки переключения
//на предыдущую станцию
String Button_Back_Html = "<p align = \"center\"><a href = \"\Back\"><button style=\"width: 205; height: 26\">\Back station</button></a></p>";
//Переменная кнопки
//прибавления громкости
String Button_Plus_Html = "<p align = \"center\"><a href = \"\Plus\"><button style=\"width: 205; height: 26\">\Plus volume</button></a></p>";
//Переменная кнопки убавления громкости
String Button_Minus_Html = "<p align = \"center\"><a href = \"\Minus\"><button style=\"width: 205; height: 26\">\Minus volume</button></a></p>";
//Переменная конца HTML-страницы
String End_Html = "<hr><p align = \"center\"><font color = \"white\" size = 4>Kasianov Viktor, 2023 year</font></p></body></html>";
//Массив списка станций
uint16_t Radio_Station[NUM_STATION] = {9240, 9280, 9350, 9390, 9470, 9640, 9680, 9760, 9800, 9860, 9910, 9950, 10000, 10040, 10090, 10140, 10190, 10240, 10290,
10340, 10390, 10450, 10490, 10540, 10590, 10640, 10690, 10740, 10780};
uint8_t Station; //Переменная переключения станций
uint8_t Vol = FIX_VOLUME; //Переменная уровня громкости
ESP8266WebServer server(80); //Подключение к 80 порту сети
RDA5807M radio; //Подключение радиомодуля
//Функция перевода числового значения
//частоты в строковую
String S_Freq(uint16_t Freq){
String Result; //Итоговая переменная
//конвертации значения
uint16_t Cel; //Переменная целой части числа
uint16_t Drob; //Переменная дробной части числа
Drob = (Freq / 10) % 10; //Получение дробной части числа
Cel = Freq / 100; //Получение целой части числа
//Конвертация числа в строку
Result = String(Cel) + "." + String(Drob);
return Result; //Возврат результата конвертации
}
//Функция обработчика запроса на
//поиск следующей станции
void Next_Req(){
//Переключение на следующий
//номер станции
if(Station == (NUM_STATION - 1)){Station = 0;}
else{Station++;}
//Преобразование нового
//значения частоты
Freq_Html = S_Freq(Radio_Station[Station]);
//Установка приёма новой частоты
radio.setBandFrequency(FIX_BAND, Radio_Station[Station]);
Home_Requests(); //Обработка основного запроса
}
//Функция обработчика запроса
//на поиск предыдущей станции
void Back_Req(){
//Переключение на предыдущий
//номер станции
if(Station == 0){Station = NUM_STATION - 1;}
else{Station--;}
//Преобразование нового
//значения частоты
Freq_Html = S_Freq(Radio_Station[Station]);
//Установка приёма новой частоты
radio.setBandFrequency(FIX_BAND, Radio_Station[Station]);
Home_Requests(); //Обработка основного запроса
}
//Функция обработчика запроса
//на прибавление громкости
void Plus_Req(){
//Если текущая громкость
//меньше максимальной
if(Vol < MAX_VOLUME){
Vol++; //Прибавить громкость
//Преобразование нового
//значения громкости
Vol_Html = String(Vol);
radio.setVolume(Vol); //Установка новой громкости
}
Home_Requests(); //Обработка основного запроса
}
//Функция обработчика запроса
//на убавление громкости
void Minus_Req(){
//Если текущая громкость
//больше минимальной
if(Vol > 0){
Vol--; //Убавить громкость
//Преобразование нового
//значения громкости
Vol_Html = String(Vol);
radio.setVolume(Vol); //Установка новой громкости
}
Home_Requests(); //Обработка основного запроса
}
//Функция обработчика основного запроса
void Home_Requests(){
//Формирование страницы
String Res = Start_Html + Name_Html + Freq_Html_S + Freq_Html + Freq_Html_E +
\Vol_Html_S + Vol_Html + Vol_Html_E + Button_Next_Html + Button_Back_Html + \
Button_Plus_Html + Button_Minus_Html + End_Html;
server.send(200, "text/html", Res); //Выдача страницы на WiFi-сервер
}
//Функция запуска WiFi
void Start_WiFi(){
WiFi.mode(WIFI_STA); //Переход работы в режим клиента
//Запуск WiFi с подключаемыми
//логином и паролем
WiFi.begin(Ssid, Password);
//Пока не произошло подключения по WiFi
while(WiFi.status() != WL_CONNECTED){
delay(500); //Делать задержку в половину секунды
}
//Настройка WiFi-сервера на работу с
//обработчиком основного запроса
server.on("/", Home_Requests);
//Настройка WiFi-сервера на работу с
//обработчиком запроса на
//поиск следующей станции
server.on("/Next", Next_Req);
//Настройка WiFi-сервера на работу с
//обработчиком запроса на поиск
//предыдущей станции
server.on("/Back", Back_Req);
//Настройка WiFi-сервера на работу с
//обработчиком запроса на
//прибавление громкости
server.on("/Plus", Plus_Req);
//Настройка WiFi-сервера на работу с
//обработчиком запроса на
//убавление громкости
server.on("/Minus", Minus_Req);
server.begin(); //Запуск WiFi-сервера
Serial.println(""); //Вывод пустой строки
//Вывод сообщения о запуске
//WiFi-сервера
Serial.println("Start WiFi.");
Serial.print("Local IP:"); //Вывод IP-адреса радиоприёмника
Serial.println(WiFi.localIP());
}
//Функция запуска радиомодуля
void Start_Radio(){
if(!radio.initWire(Wire)){ //Если радиомодуль не подключен
//Вывести сообщение о его
//не подключении
Serial.println("No radio chip found.");
delay(4000); //Произвести задержку в 4 секунды
};
//Запуск приёмника с 1-й станции
radio.setBandFrequency(FIX_BAND, FIX_STATION);
//Запуск приёмника с 1-го
//уровня громкости
radio.setVolume(FIX_VOLUME);
radio.setMono(false); //Запуск радиомодуля в стереорежиме
//Запуск радиомодуля с
//включённым звуком
radio.setMute(false);
}
//Функция стартовых настроек
void setup(){
//Установка скорости обмена
//по USART 115200
Serial.begin(115200);
Serial.println("Start ESP8266."); //Сообщение о запуске ESP8266
Start_WiFi(); //Запуск WiFi
Start_Radio(); //Запуск радиомодуля
//Инициализация светодиода
//нормального запуска радиоприёмника
pinMode(LED_BUILTIN, OUTPUT);
//Включить светодиод нормального
//запуска радиоприёмника
if(radio.initWire(Wire)) digitalWrite(LED_BUILTIN, LOW);
}
//Функция основного цикла
void loop(){
server.handleClient(); //Обработка WiFi-сервером клиента
}
В константу "#define NUM_STATION 29" записывается количество прописанных радиостанций, в массив "uint16_t Radio_Station[NUM_STATION]" записываются частоты станций (в данной прошивке прописаны частоты радиостанций для Нижегородской области), в константу "#define FIX_STATION 9240" прописывается частота стартовой радиостанции, а в переменной "String Freq_Html = "92.4";" прописывается её строковое значение. В константу "#define FIX_VOLUME 1" прописывается стартовое значение громкости. В переменные
"char* Ssid = "August_01";" и "char* Password = "Trestiany";" прописываются наименование и пароль вашей точки доступа соответственно.
В прошивку встроен HTML-код странички управления радиоприёмником через web-браузер.
<html>
<head>
<title>August-1</title>
</head>
<body bgcolor="blue">
<center>
<b><font color = "white" size = 12>Radio "August-1"</font></b>
<br>
<b><font color = "white" size = 6>Control window</font></b>
</center>
<hr>
<p align = "center"><font color = "white" size = 5>Frequency: 92.4 MHz</font></p>
<p align = "center"><font color = "white" size = 5>Volume: 1</font></p>
<p align = "center"><a href = "\Next"><button style="width: 205; height: 26">Next station</button></a></p>
<p align = "center"><a href = "\Back"><button style="width: 205; height: 26">Back station</button></a></p>
<p align = "center"><a href = "\Plus"><button style="width: 205; height: 26">Plus volume</button></a></p>
<p align = "center"><a href = "\Minus"><button style="width: 205; height: 26">Minus volume</button></a></p>
<hr>
<p align = "center"><font color = "white" size = 4>Kasianov Viktor, 2023 year</font></p>
</body>
</html>
Как прошить ESP8266 описано во множестве статей интернет-сети, копипастить их не буду. Могу сказать лишь то, что во время подключения ESP8266 к компьютеру на плату радиоприёмника подавать питание с аккумулятора нивкоем случае нельзя! Это может грозить выводом из строя составных частей радиоприёмника!
После прошивки при подаче питания сначала загорается светодиод индикации питания:
На смартфоне создаём точку доступа с именем и паролем, которые были заданы в прошивке, и включаем её. После через некоторое время загорается светодиод на модуле ESP8266, который сигнализирует об успешном подключении модуля к WiFi-сети и нормальной связи модуля с модулем RDA5807M по интерфейсу I2C. В мониторе COM-порта на скорости 115200 бод при нормальном режиме работы будет выведена такая информация:
Start ESP8266.
Start WiFi.
Local IP: "Текущий IP-адрес ESP8266"
В случае отсутствия связи с модулем RDA5807M будет добавлена строка:
No radio chip found.
Также если выводимая информация в монитор порта будет отличатся, то это будет говорить о плохой работе составных частей радиоприёмника.
После нормального подключения к смартфону по WiFi, переходим в браузер на смартфоне, где вбиваем IP-адрес радиоприёмника, который можно узнать через настройки смартфона подключённых к точке доступа или через монитор порта.
При этом будет выведена такая web-страничка управления радиоприёмником:
Интерфейс странички интуитивно понятен и не требует объяснений. На страничке имеются кнопки управления громкостью и переключения радиостанций, а также информация о частоте принимаемой радиостанции и установленной громкостью звучания.
Также для управления данным приёмником мной было написано приложение под андроид в среде MIT App Inventor 2.
Интерфейс главного окна почти полностью повторяет интерфейс web-странички. Сюда добавлена кнопка управления голосовыми командами
"Voice Command". При нажатии на неё нужно сказать одну из следующих команд:
- "Переключить на следующую станцию";
- "Переключить на предыдущую станцию";
- "Прибавить громкость";
- "Убавить громкость";
После правильного произнесения одной из команд радиоприёмник выполнит её, при этом приложении голосом сигнализирует об выполнении. Но данная функция работает только при подключенном мобильном интернете.
Кнопка "Restart App" требуется только для при ведения в стартовое положение приложения без выхода из него при перезапуске радиоприёмника.
При нажатии на кнопку "Settings" мы переходим в настройки приложения:
В первую строку вводится по образцу IP-адрес радиоприёмника, во вторую строку вводится стартовое значение громкости радиоприёмника, прописанное в прошивке. В третью строку последовательно через нажатие кнопки "Add" вводятся частоты радиостанций, прописанные в прошивке. Для их последовательного стирания используется кнопка "Delete". Для просмотра введённых в приложение станций нужно нажать на кнопку "Station List". При этом мы перейдём в окно отображения списка введённых в приложение радиостанций.
В приложение можно ввести не больше 30 станций. Из окон настройки можно выйти, нажав кнопку "Back", при этом все настройки сохранятся в памяти смартфона. Настройка приложения делается единожды после установки на смартфон.
Хотел бы привести код приложения из MIT App Inventor 2, но это удлинило бы и усложнило бы написание данной статьи. Поэтому я просто прикреплю ссылку на мой диск в конце статьи, где будут все исходники проекта. Там можно более подробно ознакомится с моим проектом, чем описано в этой статье. Как пользоваться MIT App Inventor 2 есть куча статей и видео в интернете. Я лично изучал по видео из youtube очень хорошего человека. Плейлист с его уроками закреплён ниже:
По итогу получился очень интересный проект радиоприёмника, управляемого по WiFi, хотя и достаточно сложный. При этом данный проект имеет итог в виде готового изделия, которое выходит простым в изготовлении и отладке, а также не бьёт сильно по карману, в отличии от других проектов. Также, в отличие от интернет-радиоприёмников, не зависит от интернета, кроме некоторых функций, не затрагивая удобство эксплуатации. Желаю удачного повторения и изготовления подобных радиоприёмников.
Удачного всем дня и новогодних выходных!
Ссылка на мой диск с проектом: