RadioRadar - Радиоэлектроника, даташиты, схемы

https://www.radioradar.net/radiofan/miscellaneous/tone_block_wi_fi_web_interface.html

Темброблок с Wi-Fi ДУ через Web-интерфейс

В статье приводится описание темброблока с беспроводным Wi-Fi управлением через web-интерфейс (WebUI). Он обеспечивает электронную регулировку громкости и тембра. Основное назначение данного устройства - использование в ламповых УМЗЧ с бестрансформаторным питанием с целью обеспечения максимальной безопасности в ходе эксплуатации. Однако этот регулятор может быть с успехом применён в составе любого предварительного или оконечного усилителя ЗЧ для повышения техникоэргономических показателей. Функционально темброблок состоит из модулей обработки звука и управления. Основой первого является доступная микросхема аудиопроцессора TDA7449 [1]. Второй реализован на сборке NodeMCU v3 на основе микроконтроллера (МК) ESP8266. Управление аудиопроцессором осуществляется по шине I2C.

 

Основные параметры микросхемы TDA7449

Число стереофонических входов ......................... 2

Число стереофонических выходов .......................1

Номинальноевыходное напряжение, В..................1

Максимально допустимое входное напряжение, В..........2

Коэффициентусиления (регулируемый с шагом 2 дБ), дБ...................0...30

Глубина регулирования тембра с шагом 2 дБ на НЧ и ВЧ, дБ.......................±14

Интервал регулировки громкости (с шагом 1 дБ), дБ .....................-47...0

Интервал регулировки (с шагом 1 дБ) независимых канальных аттенюаторов, дБ ...........................79

Независимое отключение каналов (функция MUTE) КНИ в звуковом диапазоне частот (типовое значение), % .....................0,01

Отношение сигнал/шум при номинальном уровне сигнала, дБ .....................106

Разделение каналов на частоте 1 кГц, дБ ...............90

Входное сопротивление, кОм................100

Минимальное сопротивление нагрузки, кОм ............... 2

Напряжение питания, В................... 6...10,2

Потребляемый ток, мА .............7

 

Микросхема имеет корпусное исполнение DIP20. Принцип управления аудиопроцессором заключается в последовательной передаче по шине I2C номера функции (команды) и значения параметра. Различают инкрементный и прямой способ управления. В первом случае значения всех параметров должны быть переданы последовательно с автоматическим приращением номера функции, во втором случае передаётся только один требуемый параметр с указанием номера функции. Обычно используется второй способ, как более гибкий и оперативный. Более подробно об этом можно прочитать в [1].

Изпараметров микросхемы TDA7449 следует, что управление уровнем громкости возможно либо в интервале -47...0дБ с использованием канальных аттенюаторов для регулирования баланса (классическая схема), либо в интервале -79...0 дБ с независимым регулированием уровней громкости левого и правого каналов. Конечно, в классическом варианте можно также воспользоваться функцией изменения коэффициента усиления, что добавит 30 дБ к интервалу регулировки громкости, но такое решение существенно усложнит программную часть. Целесообразно использовать эту функцию по назначению - для адаптации с различными типами источников сигнала. В данном случае выбран второй вариант с программным ограничением глубины регулирования громкости -60...0 дБ. Такой диапазон является достаточным для бытовой аппаратуры, в частности, для ламповых УМЗЧ. При необходимости его можно изменить в ту или другую сторону. Отметим, что конструктивные решения с независимыми канальными регуляторами громкости встречаются и в классической аудиотехнике (например, отечественная радиола "Элегия-106").

Внешний вид интерфейса управления темброблоком показан на рис. 1. Он имеет регуляторы уровней громкости левого (L) и правого (R) каналов, тембра НЧ (Bass) и ВЧ (Hi), а также дополнительные элементы (чекбоксы) режимов связанного управления громкостью (BIND) и оперативного отключения каналов (MUTE). Установленные значения параметров сохраняются в энергонезависимой памяти МК.

Внешний вид интерфейса управления темброблоком

Рис. 1. Внешний вид интерфейса управления темброблоком

 

Основные принципы создания WebUI беспроводного ДУ с применением NodeMCU v3 (ESP-12E Module) подробно изложены в [2]. Модуль поддерживает протокол беспроводного обмена данными Wi-Fi 802.11 b/g/n в режимах "Точка доступа" или "Клиент". Для программирования можно использовать широко распространённую IDE Arduino.

При этом в IDE Arduino требуется зайти в меню "Настройки" и в поле ввода "Дополнительные ссылки для менеджера плат" ввести URL: http:// arduino.esp8266.com/stable/package_ esp8266com_index.json (адрес можно скопировать из комментариев в исходном файле .ino прилагаемого проекта). Далее, в меню "Инструменты - Менеджер плат" выбрать и установить скрипты ESP8266 by ESP8266 Community актуальной версии. И наконец, выбрать в меню "Инструменты" пункт Плата NodeMCU 1.0 (ESP-12E Module) и соответствующий COM-порт, ввести текст программы, скомпилировать и загрузить в модуль. Подробности работы с NodeMCU в среде Arduino приведены в [3].

МК ESP8266 способен не только управлять внешними устройствами, согласно заложенному алгоритму, и служить точкой доступа сети Wi-Fi, но и выполнять роль веб-сервера, формирующего web-интерфейс и обрабатывающего запросы от внешних устройств с последующим исполнением.

В коде программы приведены достаточно подробные комментарии, поэтому рассмотрим только основные моменты его реализации. Для полного понимания проекта требуются знания как IDE Arduino, так и основ языков html и JavaScript.

В начале программы, как обычно, загружаются необходимые библиотеки ESP8266Wi-Fi.h, WiFiClient.h, ESP8266WebServer.h, которые обеспечивают работу с МК ESP8266 в режиме точки доступа и в роли веб-сервера. Wire.h служит для реализации обмена данными по шине I2C, а EEPROM.h, как понятно из названия, - для организации хранения данных в энергонезависимой памяти. После импорта библиотек определяются константы STASSID (ID точки доступа), STAPSK (пароль доступа, может являться пустой строкой). Константы I2C_SLAVE_ADDRESS - адрес TDA7449 на шине I2C, равный 0x44, LOCALPORT - локальный порт HTTP, выводы I2C SDA_PIN (4 или D2) и SCL_PIN (5 или D1), GAIN - коэффициент усиления предусилителя (0 дБ) и VOL_0 - уровень громкости по умолчанию (0 дБ).

Переменные com и sub типа int предназначены соответственно для передачи номера команды и значения параметра. Переменные b, m типа boolean служат флагами режимов BIND и MUTE. Конфигурация IP веб-сервера задаётся с помощью класса IPAddress (local_IP, subnet, gateway). Назначение остальных переменных будет разъяснено далее, по мере необходимости. Сервер, прослушивающий назначенный локальный порт, создаётся с помощью инструкции ESP8266 WebServer server(LOCALPORT).

Объявленная далее процедура wireWrite(int c, int sc) является основой для передачи данных по шине I2C. Ее аргументами являются номер команды и значение параметра этой команды. Процесс передачи инициируется методом Wire.beginTransmission(I2C_SLAVE_ADDRESS), затем методом Wire.write последовательно передаются данные (команда и значение параметра). Передача данных завершается методом Wire.endTransmission().

Далее следует объявление обработчиков (handler'ов) запросов к серверу. Обработчик handleRoot() обеспечивает генерацию html-кода главной страницы при обращении по корневому адресу. Строковая переменная idx_page содержит html-код страницы, определяемый далее в процедуре setup().

Запрос от html-страницы на управление принимается веб-сервером с помощью обработчика событий handleSet(). Внутри этого обработчика локальной строковой переменной parm присваивается значение аргумента запроса p, который определяет номер команды (регулирование громкости, тембра НЧ/ВЧ и др.). От второго аргумента запроса зависит величина выбранного параметра. Получение значения любого аргумента запроса к серверу осуществляется с помощью метода server.arg(). В зависимости от значения аргумента p переменной com присваивается номер команды в соответствии с [1] (7/6 - громкость левого/правого канала (ЛК/ПК), 4/5 - тембр НЧ/ВЧ). Переменная sub принимает значение, определяемое вторым аргументом.

В процессе управления значение, полученное от визуального элемента контроля веб-интерфейса и переданное серверу в качестве второго аргумента, должно быть пересчитано в значение, "понятное" аудиопроцессору и соответствующее списку команд [1]. Каждой функции управления соответствует свой алгоритм пересчёта. Этот алгоритм может быть реализован как на стороне клиента (JavaScript на веб-странице), так и на стороне сервера. Классическим подходом считается возложение операций основных вычислений на сервер, что используется и в данном случае. Для установки уровня громкости полученное значение вычитается из 60 (максимальный уровень в дБ), так как при возрастании этого значения аудиопроцессор уменьшает громкость (т. е. фактически он принимает величину уровня затухания). Для регулирования тембра используется таблица пересчёта, содержащаяся в функции levelCalc(int lev), которая возвращает числовое значение для передачи микросхеме TDA7449, соответствующее уровню коррекции lev в дБ.

При получении со стороны клиента аргумента mute=true переменная m также принимает значение true, а переменная sub=120. При этом (или большем) значении параметра затухания аудиопроцессор включает режим MUTE. Аналогично, при получении аргумента bind=true, переменной b присваивается такое же значение, и уровень громкости ПК устанавливается равным ранее принятому и сохранённому значению уровня ЛК.

Загрузка данных в микросхему TDA7449 осуществляется через вызов процедуры wireWrite(com, sub), описанной ранее. При каждом изменении любого параметра в EEPROM записывается его вычисленное значение, готовое к прямой загрузке в TDA7449. За это отвечает секция, помеченная комментарием //запись в EEPROM реальных значений параметров. Для хранения данных в EEPROM отведена область в 20 байт, из которых используется 17. В байтах 0-3 и 4-7 хранятся значения коррекции тембра НЧ (bass) и ВЧ (hi), 8-11 и 12-15 - уровни громкости правого (vol2) и левого (vol1) каналов соответственно. Бит 0 и бит 1 16-го байта отведены для записи состояний флагов bind и mute. Значения sub=120 в режиме MUTE не записываются, поскольку ранее сохранённые значения используются при выходе из этого режима. Для идентификации режима MUTE используется только соответствующий флаг. Правый канал переводится в этот режим вслед за левым после сохранения данных.

При выходе из режима MUTE однократно выполняется секция, помеченная комментарием //возврат из режима mute. Для этого удобно использовать отдельный флаг r, который устанавливается одновременно c mute=false и сбрасывается по выполнению требуемых инструкций. В указанной секции считываются сохранённые значения уровней громкости каналов vol1 и vol2, формирование переменной content для передачи данных на сторону клиента (в веб-интерфейс) и их загрузка в аудиопроцессор DA1.

Передача данных на сторону клиента осуществляется в формате JSON [4]. Данные в этом формате передаются парами "параметр":значение. Помимо простоты и гибкости (стандарт позволяет передавать и сложные структуры данных), этот формат исключительно удобен для визуального восприятия и анализа. Наряду с XML, он широко используется для сетевого обмена данными. Полностью сформированная строка выглядит так: {"vol1":ab,"vol2":cd, "bass":ef, "hi":gh, "b":x, "m":y}, где ab, cd, ef, gh - целочисленные значения соответствующих параметров; x, y - бинарные флаги BIND и MUTE (равные 0 или 1). Часть параметров в строке может отсутствовать.

Обработчик handleGet() предназначен для считывания из памяти и отправки значений всех сохранённых параметров по запросу клиента и используется при начальной загрузке или обновлении страницы. Поскольку в EEPROM хранятся "сырые" данные, при формировании строковой переменной content формата JSON производится их обратное преобразование для визуального представления на элементах контроля интерфейса. Расчёт положений регуляторов тембра происходит через вызов функции rCalc(int lev).

В процедуре setup() производятся следующие настройки (все инструкции описаны в комментариях):

- инициализация последовательного порта;

- "подтяжка" входов SDA/SCL (является необходимым условием работы шины I2C);

- назначение входов SDA/SCL (данная инструкция является необязательной, так как используется стандартная конфигурация);

- инициализация шины I2C и проверка подключения аудиопроцессора к этой шине;

- установка начальных значений коэффициента усиления и уровня громкости;

- инициализация EEPROM, считывание сохранённых значений параметров и передача их в аудиопроцессор;

- настройка режима точки доступа с определённым IP, а также конфигурирование веб-сервера.

Сообщения о ходе выполнения программы выводятся в консоль. Проверка наличия устройства с заданным адресом I2C_SLAVE_ADDRESS на шине I2C производится циклически с интервалом 0,5 с. Этот процесс сопровождается миганием интегрированного светодиодного индикатора. Постоянное свечение индикатора свидетельствует об успешном завершении процедуры инициализации.

С помощью метода server.on() назначаются обработчики запросов по конкретным URL. Так, инструкция server. on("/", handleRoot) отвечает за вызов обработчика handleRoot() при обращении к корневому URL. Инструкции server.on("/get", handleGet), server.on("/set", handleSet) назначают обработчики запросов /get и /set соответственно. Оператор server.begin() запускает веб-сервер с указанными параметрами. Макрос F при назначении переменной idx_page предписывает загрузку содержимого этой переменной во флэш-память с целью экономии объёма ОЗУ HTML-код в отформатированном удобочитаемом виде с комментариями приведён в файле index.htm. "Чистый" html-код, помещаемый в переменную idx_page, приведён в файле _index.htm.

В секции <script> определяется ряд функций JavaScript:loadParms(), vol1(), vol2(), bass(), hi(), _bind(), mute(). Назначение этих функций понятно из названий, они вызываются по определённым событиям элементов html-страницы, как описано далее. Для обмена данными между сервером и клиентом (html-страницей) используется технология AJAX [5], не требующая обновления страницы. Она реализуется посредством классаXMLHttpRequest() [6]. Запрос формируется методом open() с указанием типа запроса ('GET'), URL и режима выполнения (true, асинхронно).

Возможны два принципиально разных подхода к способу обработки, согласно которому должны формироваться аргументы запроса: а) для каждого элемента управления создавать свой обработчик; б) создать один общий обработчик с условным ветвлением по аргументам. В данном случае выбран второй способ. Поэтому, как уже отмечалось, аргументы запроса к серверу передаются следующим образом: set?p=abc&name=xyz, где set - имя адресного скрипта (обработчика на стороне сервера); p - тип передаваемого параметра; abc - значение типа параметра из следующего списка (в скобках указана расшифровка); v1 (volume L), v2 (volume 2), bs (bass), h (hi), b (bind), m (mute); name - наименование параметра, может принимать значения соответственно: voll, vol2, bass, hi, bind, mute; xyz - значение передаваемого параметра.

Свойство XMLHttpRequest.onready statechange содержит обработчик события readystatechange, наступающего при изменении свойства readyState запроса. Callback-функция запускается асинхронно из потока пользовательского интерфейса: xhttp.onreadystate change=function(){ }. Критерием успешного выполнения запроса является логическая конъюнкция условий this.readyState == xhttp.DONE && this.status == 200. Возвращаемые сервером в формате JSON данные подвергаются парсингу (процесс автоматического сбора данных и их структурирования) методом JSON.parse(). Полученные значения присваиваются соответствующим визуальным html-элементам. Отправка запроса производится посредством метода send().

После секции <script> следует таблица каскадных стилей <style>, определяющая визуальное представление элементов и их взаимное расположение. Метод вёрстки страницы - блочный, на основе элементов <div>. На странице размещаются следующие визуальные элементы управления (id указаны в скобках):

- слайдеры регулировки громкости левого и правого каналов (vol1, vol2);

- слайдеры коррекции тембра НЧ/ВЧ (bass, hi);

- индикаторы уровня громкости левого и правого каналов (vind1, vind2);

- индикаторы величины коррекции тембра НЧ/ВЧ (bind, hind);

- чекбоксы включения режимов BIND и MUTE (_bind, mute).

Обработчики действий для перечисленных активных элементов определяются методом onchange. Единицей измерения при индикации всех уровней является децибелл.

Функция loadParms() вызывается по завершении загрузки страницы (событие onload элемента body) и служит установке начальных значений всех визуальных элементов управления. С её помощью формируется запрос к обработчику handleGet() сервера.

Функции vol1, vol2, bass, hi связаны с обработчиками изменения положения соответствующих регуляторов громкости и тембра, определённых тегами <input type='range' ____>. Функции _bind и mute служат для обработки событий чекбоксов включения режимов BIND и MUTE. При установленном флаге BIND регулятору громкости правого ПК присваивается свойство disabled. При этом он остаётся видимым, но изменяет цвет и становится недоступен для управления. Регулировка громкости производится только слайдером ЛК, уровни громкости каналов выравниваются. Это сделано для удобства пользования. Аналогично, при включённом режиме MUTE свойство disabled устанавливается для обоих регуляторов громкости. Заданный уровень громкости для каждого канала сохраняется и восстанавливается при отключении режима MUTE.

Схема темброблока

Рис. 2. Схема темброблока

 

Рассмотрим теперь схему темброблока, показанную на рис. 2. Напомним, что при проектировании устройств на основе NodeMCU v3 необходимо руководствоваться его схемой [7] и принципами, изложенными в [2, 8, 9]. Аудиопроцессор TDA7449 используется в типовом включении. Входной сигнал ЛК и ПК через конденсаторы C3, C4 поступает на выводы 9 (L_IN2) и 6 (R_IN2). Эти входы используются после включения по умолчанию. Элементы C5-C10и R2, R3 обеспечивают необходимую тонкоррекцию. Подробно о расчёте их номиналов можно прочитать в [1]. Управляющие сигналы SDA/SCL поступают от модуля A1 на соответствующие входы DA1. Согласование уровней питания и шины I2C у микросхемы TDA7449 встроенное, необходимо лишь обеспечить "подтяжку" управляющих выходов A1 к внутренней шине питания +3 В, что осуществляется программным способом. Выходные сигналы ЛК и ПК снимаются с выводов 5 (L_OUT) и 4 (R_OUT) через конденсаторы C11, C12.

Ёмкость этих конденсаторов выбрана исходя из входного сопротивления УМЗЧ не менее 50 кОм. Для других значений этого сопротивления ёмкость C11, C12 следует пересчитать. Питание устройства осуществляется от интегрального стабилизатора DA2.

При необходимости темброблок можно дополнить функциями коммутации входов и выбора типа источника сигнала с программной подстройкой коэффициента усиления. Процесс пользования устройством несложен. После включения выбирают в списке доступных устройств Wi-Fi точку доступа с именем, определённым константой STASSID (например, TONECORE), и подключаются к ней. При необходимости вводят пароль. В адресной строке браузера набират IP-адрес, заданный нами в константе IPAddress local_IP с указанием локального порта localPort (разделяя их двоеточнием, например, 192.168.1.1:8080). В окне браузера отображается интерфейс управления. Пользуясь его элементами, определяют режим работы темброблока.

Правильно собранное устройство начинает работать сразу. Налаживание сводится к настройке желаемых параметров подключения точки доступа: STASSID, STAPSK, IPAddress, localPort.

Конструкция устройства может быть произвольная. Необходимо обеспечить наиболее компактное размещение его элементов с целью минимизации длины проводов шины I2C и исключения помех по цепям питания. Микросхемы DA1, DA2 с сопутствующими элементами установлены на монтажной плате размерами 40x50 мм с шагом отверстий 2,54 мм. Печатная плата не разрабатывалась. Соединение разъёмов XS1-XS4 с разделительными конденсаторами производится экранированными проводами. Темброблок может быть внешнего исполнения или интегрирован непосредственно в УМЗЧ. Во втором случае разъёмы XS3, XS4 рекомендуется исключить. Соединение штырьевых выводов модуля NodeMCU с DA1 производится стандартными проводниками длиной до 20 см с разъёмами серии BLS из комплекта для Arduino. Паяные соединения выполняются гибким многожильным монтажным проводом, например МГТФ0,12. Питание устройства осуществляется от нестаби-лизированного источника напряжением 10,5...15 В с допустимым током нагрузки не менее 0,3 А. При напряжении питания более 14 В микросхему DA2 рекомендуется установить на дополнительный теплоотвод с площадью поверхности 10...15 см2, поскольку ток, потребляемый модулем А1, может достигать 170 мА, и мощность, рассеиваемая этой микросхемой, может приблизиться к максимально допустимой без применения теплоотвода - 1 Вт.

Детали. Модуль A1 - NodeMCU v3 (LoLin), микросхема DA1 - TDA7449. Интегральный стабилизатор DA2 - L7808CV с выходным напряжением +8 В или аналогичный. Допустимо использовать также стабилизаторы из серий 7806, 7809 с выходным напряжением +6 В или +9 В в корпусах TO-220 (FP). Все постоянные резисторы - С2-33Н или МЛТ Конденсатор C2 - К50-35, К50-68, все остальные - К10-17б или аналогичные импортные. Разъёмы XS1-XS4 - гнездовые RCA ("тюльпан") позолоченные.

Литература

1. TDA7449. Tone control digitally controlled audio processor - URL: https://pdf1.alldata sheet.com/datasheet-pdf/view/25187/STMI CROELECTRONICS/TDA7449.tml (18.06.21).

2. Панкратьев Д. Web-интерфейс Wi-Fi ДУ на модуле NodeMCU. - Радио, 2020, № 12, с. 44-47.

3. Arduino IDE для ESP8266. - URL: https://esp8266.ru/arduino-ide-esp8266/ (18.06.21).

4. JSON. - URL: https://ru.wikipedia. org/wiki/JSON (18.06.21).

5. AJAX. - URL: https://ru.wikipedia. org/wiki/AJAX (18.06.21).

6. XMLHttpRequest. - URL: https://learn. javascript.ru/xmlhttprequest (18.06.21).

7. NODE MCU ESP12. - URL: https:// www. elect ronicwings.com/public/ images/user_images/images/ NodeMCU/NodeMCU%20Development%20 Boards/NO D EMCU_D EVKIT_SC H .png (18.06.21).

8. NodeMCU GPIO with Arduino IDE. - URL: https: //www. elect ro nicwings.com/ nodemcu/nodemcu-gpio-with-arduino-ide (18.06.21).

9. Using ESP8266 GPIO0/GPIO2/GPIO15 pins. - URL: https://www.forward.com.au/ pfod/ESP8266/GPIOpins/index.html (18.06.21).

Автор: Д. Панкратьев, г. Ташкент, Узбекистан