• Скидка по промокоду FORUM_CHIPSTUDIO продолжает работать в магазине.

Reflex 2.0 CLI + ESP32 WiFi

Евгений

Administrator
Команда форума
В качестве примера применения интерфейса командной строки (CLI) модулей Reflex 2.0 / 3.0 предлагаем проект управления по WiFi с помощью модуля ESP32. Во вложении есть pdf-версия данного описания.

1730970989960.png


Что понадобится
1) Модуль Reflex 2.0 или Reflex 3.0
2) Модуль ESP32 (объем flash-памяти от 4 Мбайт)
3) Arduino IDE

Arduino IDE
1) Скачайте Arduino IDE (https://www.arduino.cc/en/software)
2) Установите поддержку модулей ESP32: https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html
3) Установите библиотеки: AsyncTCP, ESPAsyncWebServer, ESPmDNS, Arduino_JSON. Обратите внимание: существует несколько аналогичных библиотек с немного отличающимися названиями; библиотеки должны называться именно так, как указано.
4) Выберите схему разделов (меню Tools – partition scheme) ESP32: No OTA (large APP). В зависимости от модуля, набор и названия схем разделов могут быть разными. Необходимо, чтобы на приложение отводилось не менее 2 Мбайт и присутствовал раздел NVS.
5) Откройте скетч и загрузите его в модуль.

Проект ChipStudio
На блоке контроллера активируйте интерфейс командной строки (CLI). Подключите к линии CLI контроллера блоки, которыми нужно управлять по сети WiFi посредством ESP32.
Внимание: сделать веб-интерфейс универсальным, подходящим под любой проект ChipStudio невозможно. С целью обобщения различных вариантов наборов регулировок и, на сколько это возможно, избавления пользователей от правки непосредственно кода веб-страницы управления содержимое веб-страницы управления формируется динамически на основе проекта ChipStudio, исходя из названий и количества значений таблиц данных блоков регулировок. Таким образом, все блоки регулировок, не имеющие в названиях «Vol», «Single», «Nx», с таблицей данных не менее 3-х значений отображаются в виде слайдеров. Блок, имеющий в названии «Nx», отображается в виде группы элементов «radio buttons», формирующих селектор. Названия позиций селектора и их соответствие значениям в таблице данных проекта ChipStudio задается в исходном коде ПО для ESP32. Селектор может быть только один. Все настройки распознавания проекта ChipStudio можно изменить в исходном коде ПО для ESP32.
Если к ESP32 не подключен модуль Reflex, содержимое проекта ChipStudio для веб-страницы управления сформировано не будет и раздел проекта ChipStudio будет пустым.

Подключение ESP32 к модулю Reflex




Reflex 2.0
Reflex 3.0
ESP32 UART_TX – 32
RX – GPIO21
RX – разъем Rpi 10 контакт
ESP32 UART_RX – 33
TX – GPIO20
TX – разъем Rpi 8 контакт
ESP32 GND
GND
GND

Внимание: убедитесь, что питание на модули ESP32 и Reflex подается одновременно, либо на модуль Reflex питание подается раньше, чем на модуль ESP32.

Настройка сети WiFi
При первом включении создается WiFi-сеть «ReflexConfig», без пароля подключитесь к ней. Чтобы подключиться к устройству, в адресной строке браузера наберите «reflex.local» (без кавычек). Для такого подключения необходимо, чтобы браузер / ОС поддерживали mDNS и эта поддержка была активирована. Если браузер / ОС не поддерживают mDNS, к устройству можно подключиться, введя в адресную строку браузера IP-адрес устройства. Его можно узнать, просканировав сеть с помощью программы сканирования IP адресов.
При подключении к устройству отобразится страница настройки WiFi-сети. Введите название WiFi-сети, в которой будет использоваться устройство, и пароль к ней. Нажмите «Save» для сохранения настроек. При следующем включении устройство будет работать в режиме управления модулем Reflex. Для изменения настроек WiFi-сети при отключенном питании нужно GPIO35 модуля ESP32 соединить с контактом 3V3, затем включить модуль.

1730971326750.png



Управление модулем Reflex
После настройки WiFi-сети устройство будет работать в режиме управления модулем Reflex. Чтобы подключиться к устройству, в адресной строке браузера наберите «reflex.local» (без кавычек). Управляющее устройство — смартфон, планшет, ПК и т. д. — и модуль Reflex совместно с модулем ESP32 должны быть подключены к одной сети WiFi. При подключении к устройству отобразится страница управления.
Страницу управления можно разделить на 3 области:
1) область управления регулировками проекта ChipStudio — ChipStudio project. Она формируется на основе загруженного в модуль Reflex проекта ChipStudio. Количество и названия слайдеров соответствуют блокам регулировок проекта ChipStudio, которые подходят под определенные условия (описаны выше). Названия позиций селектора задаются в исходном коде ПО для ESP32.
2) область управления воспроизведением — Play control. Это управление плеером, запущенным на хост-устройстве; оно аналогично нажатию соответствующих кнопок на самом модуле Reflex.
3) область отображения информации о модуле Reflex — красная область внизу страницы. Здесь отображаются название модуля Reflex, заданное пользователем, и текущие характеристики аудиопотока: частота и разрядность.

1730971401346.png



Отображение элементов страницы может отличаться в зависимости от используемого браузера.

Файлы исходного кода ПО для ESP32
Исходный код ПО для ESP32 состоит из нескольких файлов.
«AppConfig.cpp», «AppConfig.h» — приложение для настройки WiFi-сети.
«AppControl.cpp», «AppControl.h» — приложение для управления модулем Reflex.
«AudioFreqs.cpp», «AudioFreqs.h» — содержат перечень частот аудиопотока для отображения на странице управления.
«ChipStudioProject.cpp», «ChipStudioProject.h» — реализация управления проектом ChipStudio, загруженным в модуль Reflex; надстройка над «CLIport.cpp», реализующая команды CLI, относящиеся к ChipStudio («CS+»).
«CLICommands.cpp», «CLICommands.h» — содержат команды интерфейса командной строки (CLI).
«CLIport.cpp», «CLIport.h» — реализация интерфейса командной строки: отправка команд; прием ответа.
«Config.h» — содержит настройки ПО.
«Reflex_WiFi.ino» — файл скетча среды Arduino IDE.
«ServerConfig.cpp», «ServerConfig.h» — содержат разметку, стили, скрипт для страницы приложения по настройки WiFi-сети.
«ServerControl.cpp», «ServerControl.h» — содержат разметку, стили, скрипт для страницы приложения по управлению модулем Reflex.
«SoundCard.cpp», «SoundCard.h» — надстройка над «CLIport.cpp», реализующая команды CLI, относящиеся к аудиокарте («AUDIO+»).
«UserSettings.cpp», «UserSettings.h» — реализация записи / чтения пользовательских настроек (WiFi-сеть).


Настройки ПО
Файл «Config.h» содержит настройки ПО, которые пользователь может изменить по своему усмотрению.
CONFIG_GPIO — номер вывода ESP32 для выбора режима настройки WiFi-сети.
IP_ADDR_VIA_SERIAL0 — если строка не закомментирована, в порт Serial0 будет выводиться IP-адрес устройства.
APP_CTRL_MDNS_NAME — имя устройства для обращения в адресной строке браузера с использованием mDNS («указанное_имя.local») в режиме управления модулем Reflex.
APP_CONF_MDNS_NAME — имя устройства для обращения в адресной строке браузера с использованием mDNS («указанное_имя.local») в режиме настройки WiFi-сети.
CONFIG_WIFI_NET — название WiFi-сети устройства в режиме настройки.
CLI_UART_NUM — номер UART модуля ESP32, который будет использоваться для интерфейса командной строки (CLI).
CLI_UART_TX — номер вывода GPIO модуля ESP32, соответствующего линии UART_TX.
CLI_UART_RX — номер вывода GPIO модуля ESP32, соответствующего линии UART_RX.
AUDIO_POLL_PERIOD — период опроса частоты и разрядности аудиокарты.
SERIAL0_LOG — если строка не закомментирована, в порт Serial0 будет выводиться отладочная информация.
LOG_BAUDRATE — скорость передачи данных порта Serial0.
BOD_DISABLE — если строка не закомментирована, у модуля ESP32 будет отключен монитор питания.


Настройки распознавания проекта ChipStudio
const char MuxBlock[] = "Nx"; — подстрока в названии блока регулировок, по которой идентифицируется мультиплексор; на его основе формируется селектор на странице управления.
const char* MuxItems[] = { "USB", "ANALOG", "TOSLINK", "RCA", }; — названия позиций селектора, отображаемые на странице управления; количество позиций должно соответствовать значению MuxValuesCount.
uint8_t MuxValues[] = { 0, 1, 2, 3, }; — значения позиций селектора, равные номерам соответствующих значений в таблице данных мультиплексора проекта DSP; количество значений должно соответствовать значению MuxValuesCount.
const uint8_t MuxValuesCount = 4; — количество значений таблицы данных мультиплексора проекта DSP.
const char* NotEqualBlocks[] = { "Vol", "Single", MuxBlock, }; — подстроки в названии блока регулировок, по которым определяется, что если название не содержит таких подстрок, то данный блок будет отображаться на странице управления как слайдер.
const uint8_t NotEqualBlocksCount = 3; — количество подстрок в NotEqualBlocks[].
const uint8_t MinEqualValues = 3; — минимальное количество значений в таблице данных блока, необходимое, чтобы он отображался на странице управления как слайдер.
 

Вложения

Vitalii

Well-known member
Здравствуйте.
Сюда тоже напишу.
Подскажите пожалуйста, любой модуль ESP32 можно использовать? Или есть ограничения?
Я имею ввиду, модель, год, прошивка и т. д.
 

Дюжбан

Well-known member
Это вы круто придумали! ) Именно веб.приложение штука.
Надо бы объеденить с этим)
20241107_182556.jpg
 

Vitalii

Well-known member
Здравствуйте. Отличные ссылки. С телефона заходил и не понял. А с пк зашел и стразу перевод страницы.
 

Евгений

Administrator
Команда форума
Странно. Мой МСК IP не пускает. Евгений посмотрите пжл вопрос про адрес EEPROM на ADAU1701.
У всех микросхем eeprom памяти адрес одинаковый 0x50 + добавляются состояния адресных линий, на модуле они подключены все к gnd, таким образом, адрес 0x50.
 

sPave

Well-known member
У всех микросхем eeprom памяти адрес одинаковый 0x50 + добавляются состояния адресных линий, на модуле они подключены все к gnd, таким образом, адрес 0x50.
Есть скетч, который успешно отправляет регистры вкл\выкл Mute:

Param Address: 0x001B
0x00, 0x80, 0x00, 0x00

Param Address: 0x001B
0x00, 0x00, 0x00, 0x00


Добавил дублирование этих же регистров в EEPROM. При первом запуска работает, как надо, после перезапуска ADAU не поднимается. Очевидно, программу в EEPROM ломаю. Можете сказать какой-то секрет записи в EEPROM? Понимаю, что нужно целиком перезаписывать EEPROM, но м.б. не обязательно.
#include <Wire.h>
#define ADAU1701_I2C_ADDR 0x34 // I2C-адрес ADAU1701
#define EEPROM_I2C_ADDR 0x50 // I2C-адрес EEPROM
#define MUTE_REG_ADDR 0x001B // Адрес регистра MuteNoSlewAlg2mute
// Настройка подтягивающих резисторов и переназначение пинов для I2C
#define I2C_SCL_PIN 16
#define I2C_SDA_PIN 17
void setup() {
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN); // Инициализация I2C с заданными пинами
Serial.begin(115200);
}
void writeRegisterToADAU1701(uint16_t regAddr, uint8_t* data, uint8_t len) {
Wire.beginTransmission(ADAU1701_I2C_ADDR);
Wire.write((regAddr >> 8) & 0xFF); // Старший байт адреса
Wire.write(regAddr & 0xFF); // Младший байт адреса
for (uint8_t i = 0; i < len; i++) {
Wire.write(data);
}
Wire.endTransmission();
}
void writeDataToEEPROM(uint8_t* data, uint8_t len) {
Wire.beginTransmission(EEPROM_I2C_ADDR);
for (uint8_t i = 0; i < len; i++) {
Wire.write(data);
}
Wire.endTransmission();
delay(10); // Небольшая задержка для завершения записи в EEPROM
}
void loop() {
// Включаем Mute
uint8_t muteOnData[4] = {0x00, 0x80, 0x00, 0x00}; // Данные для включения Mute
writeRegisterToADAU1701(MUTE_REG_ADDR, muteOnData, 4);
writeDataToEEPROM(muteOnData, 4); // Запись тех же данных в EEPROM
Serial.println("Mute включен и записан в EEPROM.");
delay(5000);
// Выключаем Mute
uint8_t muteOffData[4] = {0x00, 0x00, 0x00, 0x00}; // Данные для выключения Mute
writeRegisterToADAU1701(MUTE_REG_ADDR, muteOffData, 4);
writeDataToEEPROM(muteOffData, 4); // Запись тех же данных в EEPROM
Serial.println("Mute выключен и записан в EEPROM.");
delay(5000);
}
 
Последнее редактирование:

Евгений

Administrator
Команда форума
Есть скетч, который успешно отправляет регистры вкл\выкл Mute:
Доработали ПО, получилось добиться нужного результата?
В представленном вами коде есть ошибки, из-за которых этот код в принципе не может работать, как задумано.
 

sPave

Well-known member
Доработали ПО, получилось добиться нужного результата?
В представленном вами коде есть ошибки, из-за которых этот код в принципе не может работать, как задумано.
На этой неудаче пока оставил эту часть проекта, занялся MICBIAS'ом в 1761.
По текущим соображениям, нужно смотреть лог. анализатором, что Сигма Линк шлет по факту в момент этой команды Mute.
А что за ошибку нашли, научите пжл.
 

Евгений

Administrator
Команда форума
А что за ошибку нашли, научите пжл.
1) В функциях записи строки:
C:
for (uint8_t i = 0; i < len; i++)
    Wire.write(data);
Здесь len-ное количество раз пишется одно и то же значение.
Должно быть
C:
for (uint8_t i = 0; i < len; i++)
   Wire.write(data[i]);
2) Неверно выполняется запись в EEPROM. Должно быть: адрес микросхемы на шине I2C - адрес памяти в микросхеме, по которому выполняется запись (количество байт зависит от объема памяти микросхемы) - данные. Адреса памяти в микросхеме нет, поэтому первые значения микросхема воспринимает как внутренний адрес, а оставшиеся как данные. Лучше значение адреса и массив данных разделять.
Для Ардуино разве нет готовой библиотеки для работы с микросхемами EEPROM?

Не по коду:
3)
Еще, вроде, нужно записывать в EEPROM не как попало, а в какую-то сервисную часть, иначе прошивка ломается.
Конечно.

4) Запись / чтение в / из EEPROM можно выполнять только после загрузки проекта ADAU1701.
 

sPave

Well-known member
Для Ардуино разве нет готовой библиотеки для работы с микросхемами EEPROM?
Встречал, что-то готовое под 1701 на ГитХабе, но не смог найти. Нужно лучше поискать.
4) Запись / чтение в / из EEPROM можно выполнять только после загрузки проекта ADAU1701.
Не совсем понял. Редактировать отдельные регистры не получится и нужно только целиком перезаписывать программу в EEPROM?
 

Евгений

Administrator
Команда форума
Редактировать отдельные регистры не получится и нужно только целиком перезаписывать программу в EEPROM?
Речь от том, что на шине I2C инициировать операцию может только одно устройство. Поэтому нужно подождать, когда ADAU1701 считает из памяти свою конфигурацию и больше не будет к ней (к памяти) обращаться. Только после этого с микросхемой памяти можно работать.

нужно только целиком перезаписывать программу в EEPROM?
Нет. В EEPROM можно писать и по байтам, стирание перед записью не требуется.

Что вы хотите сделать? Зачем в эту память что-то писать?
 

sPave

Well-known member
Зачем в эту память что-то писать?
Нужно восстанавливать после включения устройства громкость и выбор источника - аналог. вход или Bluetooth. Хотя, может и лучше, что бы EPS32 хранил настройки и записывал в 1701 при включении. Так правильнее, как думаете?
 

Евгений

Administrator
Команда форума
Нужно восстанавливать после включения устройства громкость и выбор источника - аналог. вход или Bluetooth.
Как организованы органы управления, на базе самого ADAU1701? Если так, то у ADAU1701 для этого есть специальная функция сохранения состояния регулировок в микросхему памяти, называется Write Back, Сам ею никогда не пользовался. Возможно - это то, что вам нужно.

Хотя, может и лучше, что бы EPS32 хранил настройки и записывал в 1701 при включении.
Если регулировку выполняет EPS32, то, на мой взгляд, лучше, чтобы он и сохранял их у себя и не трогал "чужую" память вообще. Иначе после каждого изменения проекта для ADAU1701 придется проверять занятый объем в микросхеме памяти и править код для EPS32 - изменять адреса записи. И вообще как-то это "некрасиво". Лучше максимально разграничивать "обязанности" и делать так, чтобы в идеале сопрягаемые модули вообще не зависели друг от друга. Т.е. если завтра понадобиться вместо EPS32 сделать управление на другом модуле / контроллере / плате и т.д., на модуле ADAU1701 в идеале не должно меняться ничего; а новый контроллер вообще не должен знать, как работает модуль ADAU1701, и пользоваться его ресурсами. При этом на новом контроллере, например, вы захотите добавить новый функционал и больший объем памяти (а, может, и тип памяти изменится) и т.д. Т.е. в идеале все блоки / функциональные узлы должны быть независимы друг от друга.
 

Vitalii

Well-known member
Нужно восстанавливать после включения устройства громкость и выбор источника - аналог. вход или Bluetooth. Хотя, может и лучше, что бы EPS32 хранил настройки и записывал в 1701 при включении. Так правильнее, как думаете?
Приветствую. Я тоже думаю что в ESP32 лучше все хранить. А другим модулями у него только спрашивать и брать данные. Как с сервера.
 
Верх