Академия гитарной электроники: IR плеер на ADAU 1701 - Академия гитарной электроники

Перейти к содержимому

  • 3 Страниц +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

IR плеер на ADAU 1701

Опрос: IR плеер на ADAU 1701

Интересна ли тема по DSP?

Вы не можете видеть результаты проса пока не проголосуете.
Голосовать Гости не могут голосовать

#31 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 13 марта 2020 - 22:47

Просмотр сообщенияy_moroz (27 января 2020 - 20:10) писал:

Смущает это немного, так как, согласно даташиту, если ничего не грузить в чип, то сигнал должен с первого входа попадать на третий выход.

Здравствуйте. Нашел ответ, т.к. сам пытаюсь передать значения в ADAU по I2C.
Ядро DSP по умолчанию отключено.
Регистр 2076 (0x081C) имеет значение включения по умолчанию 0x00 0x00.
Необходимо записать 0x00 0x1C в регистр управления ядром (адрес 2076 или 0x081C), чтобы пропустить звук.

ССылка

Спойлер


В продолжении данной тематики "Гитарный процессор своими руками на ADAU 1452"

0

#32 Пользователь офлайн   Halvalife 

  • Малопай
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 14 марта 2020 - 15:59

Не совсем по теме, но все же аудио и адау - http://tataylino.com...-with-adau1701/
Проект цифрового микшера, пока только в сигма студио (не знаю насколько там все правильно). Жаль не дошло до реализаци в железе (а возможно и дошло, но чел не выложил). Может кто то доработает?
0

#33 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 20 марта 2020 - 11:29

Halvalife, У ADAU 1701 двух канальный вход и 4 выхода, без применения дополнительных АЦП и/или ЦАП (к примеру PCM 1804/08 и PCM 5102/04) не сделать многоканальный микшер. Скорее всего этот проект так и реализован.

Проект на tataylino.com не доделан, не сформирована конфигурация чипа.

Но я сделал свою мини версию микшера. АЦП PCM 1808, ЦАП PCM 5102 (китай)
Один вход через спикосим (ADAU 1701), второй подобие AUX с эквалайзером (PCM 1808).
Выхода DIG0, DIG1 на PCM 5102.
Проект
Прикрепленное изображение: ADAU1701_Mixer.jpg Прикрепленное изображение: ADAU1701_Mixer_config.jpg
Фото сборки
Спойлер

0

#34 Пользователь офлайн   Halvalife 

  • Малопай
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 20 марта 2020 - 18:10

А рекордера многодорожечного нету проекта (каналов на 8 с записью на сд карту)?
0

#35 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 20 марта 2020 - 22:11

Halvalife, Извините, чего нет - того нет) Это уже посерьезнее и без внешнего MCU не обойтись. Я просто показал, что микшер с обработкой сделать очень просто, особенно из готовых модулей. Но всё таки для обработки лучше брать 1452, т.к. в данном проекте пришлось поджаться по коэффициентам в FIR фильтре что-бы влезть в 1024 инструкций.

P.S. Только сейчас заметил частоты на эквалайзеры сбросились по дефолту.
Спойлер

0

#36 Пользователь офлайн   intext 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 27 марта 2020 - 21:56

Пытался разобраться в том, как же производить запись в еепром так, чтобы аудиопроцессор продолжал работать, но разобраться так и не получилось. Собственно вопрос, как записывать одновременно 4 байта в память, и важно ли в каких ячейках памяти это будет записано (не считая те ячейки, которые отвечают за работу самого аудиопроцессора (имеется ввиду работа только с ячейками памяти подпадающими под определение PROGRAM RAM DATA следуя написанному на страница 28 даташита))

Если быть точным, не понятно как выглядит и работает структура данных в еепром. Я правильно понимаю что у нас есть три блока, один отвечает за работу самого процессора, а два других - это PROGRAM DATA и PARAM DATA, первый отвечает за те блоки, которые мы добавили в сигма студии, а второй за параметры, которые меняются в этом блоке (например шаг прибавления громкости). Мои рассуждения верны?

Кто-то, из присутствующих в теме, пытался записывать данные в память через микроконтроллер?

Написал рабочий код для изменения параметров разных блоков из сигма студии.
Так выглядит проект в сигма студии:
Изображение
Если через кнопку (в студии) Export System Files выгрузить весь проект, то можно в мельчайших подробностях рассмотреть каждый регистр ADAU.

Например так выглядит блок микшера:
Cell Name         = S Mixer1 //название компонента
Parameter Name    = SingleCtrlMixerNEW19401 //его имя в сигма студии
Parameter Address = 0 //адрес по которому хранятся его параметры (громкость), указано в десятичном формате, то есть эквивалент в 16ричном 0x0000
Parameter Value   = 1.99526226520538 //наше значение громкости
Parameter Data : //тоже самое значение в формате 5.23 (о нём позже)
0x00, 0xFF, 0x64, 0xC1


Теперь сам код для загрузки этого добра в процессор (для отработки брал ардуину):
#include <Wire.h> //библиотека для работы с интерфейсом i2c в ардуино, использует железный, а не софтварный I2C
#define EEPROM_ADDRESS 0x34 //адрес АДАУ
uint32_t param_vol = 0x00FF64C1; //те самые параметры 0x00, 0xFF, 0x64, 0xC1, просто переделаны в 32х битный формат
void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.println("Write byte to EEPROM memory...");
  Wire.beginTransmission(EEPROM_ADDRESS); //говорим с каким устройством желаем говорить, в нашем случае адрес 0x34 указан выше
  Wire.write(0x0000 >> 8); //MSB, сдвигаем на 8 бит
  Wire.write(0x0000 & 0xFF); //LSB указываем конец
  /* Далее мы последовательно "отрезаем" от переменной не нужный кусок и записываем его, потом со следущим куском
      Следующие 4 записи эквиваленты этим 4м записям:
      Wire.write(0x00); 
      Wire.write(0xFF);
      Wire.write(0x64);
      Wire.write(0xC1);
*/
  Wire.write((param_vol & 0xFF000000) >> 24); 
  Wire.write((param_vol & 0xFF0000) >> 16);
  Wire.write((param_vol & 0xFF00) >> 8);
  Wire.write((param_vol & 0xFF));
  Wire.endTransmission(); //заканчиваем передачу данных
}

void loop() {

}


После выполнения программы у нас увеличится громкость до 6дБ, если, кончено, до этого в памяти небыло записано такое же значение.

Теперь подробнее про формат 5.23, или как самому считать Parameter Data:
Спойлер


Вроде из базовых вещей - всё, сам только-только разобрался, но если вопросы будут - задавайте, постараюсь ответить.

Сообщение отредактировал intext: 27 марта 2020 - 21:58

0

#37 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 25 мая 2020 - 17:31

Спасибо intext, за помощь.

Изучив данные из SigmaStudio, пришел к следующему.
Формат 5.23 применительно к уровню громкости, вычисляется по Linear Gain = 10^(dB/20)
Допустим уровень задаем -10dB тогда 10^(dB/20)=> 10^(-10/20)=10^(-0.5) = 0,3162278‬
Формат Data 28.0 это 2^23 = 8 388 608;
Далее переводим 0,3162278 * 8 388 608 = 2 652 711
Переводим в 16-ю систему 287A27 отсюда запись в DataHex будет 0x00287A27

Данные коэффициента сразу записаны в 5.23 (от 1,0 до -1,0)
допустим 0.00545001 тогда в формате 28 это 0.00545001 * 8 388 608 = 45 717,9 округляем до целого 45 718
И переводим в Hex где первые 00 это "0." => 00 00 B2 96.

***
Добавлю. Формат записи и формирования отрицательных значений.

С отрицательным -0.006459951 => -0.006459951 * 8 388 608 = Data 28.0: -54190
Теперь -0.006459951 - 254 (т.к. byte 255) => -254.006459951 * 8 388 608 = - 2 130 760 622 + 2 147 483 648 (float) = 16 723 026 переводим в hex => FF 2C 52
Формат записи где 0x0F это знак "-" и далее FF 2C 52.

Пришел к этому от обратной записи.
Перевел из 16й в 10ю допустим 0x0FD224DD (отбрасываем 0F) D224DD(HEX) -> 13771997(DEC);
(13771997 - 2 147 483 648 (float)) / 8 388 608 (где 2^23) = -254,35825002193450927734375 + 254 (оставляем дробную часть) = - 0,35825002193450927734375 (Data 5.23)

Добавил альтернативную программку на С++ для получения коэффициентов, без сторонних библиотек и не надо ставить net framework. И весит меньше =)
Расчет на всю длину семплов, т.е. сколько есть в файле *wav столько и будет коэффициентов.

В архиве WAVtoFIR.exe и impulse.wav. Запускаете еxe файл, получаете таблицу коэффициентов в файле impulse.txt
Спойлер


****
Сделал внешнее управление громкостью ADAU1701 по I2C с помощью энкодера TYPE2.
Регулировка от -58дБ до +6дБ.
Подключение ARDUINO - SDA, SCL, GND.
Подключение энкодера - CLK 7, DT 8, SW 9.

Блок громкости должен стоять первым в проекте, т.к. адресации

Param Address: 0x0000
Bytes: 4096
Param Data:
0x00, 0x80, 0x00, 0x00, - значения громкости
0x00, 0x00, 0x0D, 0x6F, - значения импульса
0x00, 0x00, 0x15, 0xF4,
0x00, 0x00, 0x12, 0x06,
...

Как выяснил одну особенность, новые значения можно добавлять не зависимо от проекта в SigmaStudio.

Прикрепленный файл  My_sketch_ADAU1701_encVol.zip (12,76К)
Количество загрузок:311

***
Сделал загрузку готовых таблиц импульсов на основе таблиц получаемого файла *.params
Применен энкодер - влево импульс №1, вправо импульс №2. Долгое нажатие (удержание импульс №3). Кратковременное нажатие - громкость в 0дБ.
Регулировка громкости по адресу 0х03AC, т.к. с адреса 0х0000 по 0х03AB - находится 940 отсчетов импульса.

Попытки обработать коэффициенты и послать на запись провалились т.к. чип Atmel328p и ARDUINO IDE (вывод значения) плохо работают с float, а точнее только 6-7 знаков типа -1.01, и округляет до десятой. И всё что я переводил в переменную dword было не достоверно. Пришел к выводу, что лучше сделать на готовых таблицах.

В архиве файл проекта и скетч Arduino и библиотека энкодера GyverEncoder.
P.S. Скетч можно переделать на кнопки.

Прикрепленный файл  My_sketch_2_ADAU1701.zip (44,52К)
Количество загрузок:318

***
Для STM32F103
энкодер
#define CLK PA7
#define DT PB11
#define SW PA4

//SDA PB7
//SCL PB6
Забыл в коде выше, в циклах, закомментировать строчки вывода в монитор порта. Без них переключение между импульсами, без задержек.

***
В ходе тестов заметил, что звучание одного и того же импульса различается, на STM32 и AtMega 328p, иногда не значительно, а иногда разительно.
Сделал тест прогнал через три импульса, сначала STM32 потом Atmel.

Прикрепленное изображение: STM32vsArduino.jpg

Прикрепленный файл  Arduino_vs_STM32.mp3 (1,89МБ)
Количество загрузок:288

Заметна разница, или у меня что-то со слухом, или цифра не такая уж достоверная (хотя этого быть не может :0), ведь значения FIR идентичны.

******
Сделал загрузку параметров непосредственно в ADAU1701 без использования EEPROM.
Загрузка начальной конфигурации происходит последовательно, блоками, в файле ADAU1701_config.h
Управление энкодером:
Поворот - изменение громкости;
Нажатие и поворот - переключение между импульсами.
Импульсы представлены в виде таблиц сформированных SigmaStudio в файле *.params.
Прикрепленный файл  My_sketch_ADAU1701_encVol_no_EEPROM.zip (115,82К)
Количество загрузок:327

Спойлер

Сообщение отредактировал Fester: 25 мая 2020 - 17:37

1

#38 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 04 августа 2020 - 22:06

**************************************
Всем привет! Продолжаю постить свои длинные простыни :wink:
В личке у меня спрашивали о возможности получении коэффициентов с помощью МК, вообщем вот результат.
Прикрепленное изображение: Получение коэфф. STM32F103.jpg
В коде (под спойлером) старался закомментировать как можно подробнее. Использовал STM32F103 и SD card c лежащим в корне файлом impulse.wav моно 48кГц 24 бит.
Спойлер


Данный код получения коэффициентов нецелесообразно использовать, касаемо отправки значений из wav файла напрямую в ADAU, т.к. wav файл содержит эти самые значения например 24 бит каждые 3 байта последовательно для моно или по 2 байта для 16 битного, стерео не рассматриваем там поочередно, но это не применительно к импульсам. И соответственно нужно байтовым массивом последовательно отправлять каждые три байта в ADAU загружая в область Param отвечающая за FIR.

Хочется добавить, ранее выложенный код также работает и с STM32 и ESP32.
Достаточно внести небольшие изменения:
1. Подключить медленную библиотеку SlowSoftI2CMaster
2. Изменить строчку на
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1, (byte*)FIR1 );

3. Изменить строчки в файле ADAU1701_config.h на
  
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PROGRAM_ADDR_IC_1, PROGRAM_SIZE_IC_1, (byte*)Program_Data_IC_1 );
SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1, (byte*)Param_Data_IC_1 );

Хочется спросить у людей и постояльцев данного форума:
1. Выкладывать подобные наработки или прекратить постить быдлокод?
2. А также хочется узнать, проще и быстрее получить законченный девайс на основе готовых таблиц FIR хранимых на SD карте допустим выбрав десяток и залитых в МК с последующим перебором, и выводом на экранчик на подобии представленного нашим форумчанином y_moroz. Так как я уперся в ресурсы ATMEGA 328p, и пришлось переходить на STM32f103, но это очень не удобно, т.к. если захочется поменять импульс необходимо с помощью SigmaStudio получить новую таблицу импульса для последующей загрузке/замене его на SD карте.
Еще как вариант реализовать плеер импульсов на ESP32 с выбором импульсов через wifi/bluetooth на пример с телефона, не тыкая в прибор, на приборе можно задублировать органы управления например энкодер (пробовал сделать и кое-какие наработки есть)
Или идти по еще более сложному и долгому пути и реализовать прибор с заливкой нового импульса из wav файла как это реализовано в коммерческих проектах.
Вообщем я на распутье, и от этого сильно зависит аппаратная часть.
0

#39 Пользователь офлайн   Yetti 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 05 августа 2020 - 13:34

Просмотр сообщенияFester (04 августа 2020 - 22:06) писал:

Хочется спросить у людей и постояльцев данного форума:
1. Выкладывать подобные наработки или прекратить постить быдлокод?

по-моему, когда человек делится с комьюнити своими наработками, это всегда похвально. всегда восхищался теми, кто находит время и силы для таких подарков пользователям.
если у вас есть желание и возможность - делитесь. пусть оно будет здесь, ведь кто-то может захотеть пройти такой путь, и у него уже будет возможность перенять ваш опыт.
насчет "быдло-кода", я подозреваю, что даже если вы его таковым считаете, то врядли написание кода в стиле "быдло" является специальным, скорее это недостаток опыта/знаний, который в процессе обучаемости исправляется. если у кого-то имеется претензия, то welcome, конструктивная критика всегда хорошо. как и обмен опытом. все мы здесь на форуме для этого.
любой код - это код. если человек читает ваш код и считает его плохим - пусть напишет лучше и представит общественности свою версию.

Цитата

... Еще как вариант реализовать плеер импульсов на ESP32 с выбором импульсов через wifi/bluetooth на пример с телефона, не тыкая в прибор...

варианты реализации с wifi/BT, безусловно, интересен в современном мире, но возможность крутить ручки все же, на мой взгляд, отбрасывать не стоит. ну мало ли что (нет возможности использовать тлф, например, здесь и сейчас), поэтому

Цитата

... задублировать органы управления...

мне видится хорошим тоном (и, я полагаю, на аппаратном уровне это не сильно усложняет схему. в конце-концов hardware он такой, не нужно - не устанавливай, главное, чтобы когда нужно - было куда)

ну и на последок по вашему последнему:

Цитата

...идти по еще более сложному и долгому пути и реализовать прибор с заливкой нового импульса из wav файла как это реализовано в коммерческих проектах.

этого, кроме вас вам никто не скажет. сделать сразу комбайн "как у шифтов" или "амт" - круто. но если на это уйдет пара лет по 20 мин вечерами, то можно потерять интерес и никогда не дойти до финала.
я бы двигался постепенно, наращивая функциональность (удобство, сложность и т.п.), но никому ничего не навязываю. слежу за вашими изысканиями с интересом, потому и решил тут написать вам пару слов в поддержку
0

#40 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 05 августа 2020 - 21:05

Yetti, Спасибо, данная тема не многих затронула (судя по сообщениям в ветке), вот и начал задаваться вопросами "о тщетности", нужно ли оно вообще, учитывая что данный форум в основном направлен на аналоговые девайсы.

Цитата

я бы двигался постепенно, наращивая функциональность (удобство, сложность и т.п.)
Да собственно я так и делаю, но если переписать прошивку добавив новые возможности это относительно просто, то переделать готовое устройство будет посложнее, и придется проектировать его по сути с нуля. Тут скорее желание сделать что-то полезное и поделится с людьми, т.к. у меня уже есть устройство в первом посте. Но всегда хочется чего-то большего. =)
0

#41 Пользователь офлайн   intext 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 06 августа 2020 - 15:01

Если оставаться в рамках ArduinoIDE, то стоить выбирать ESP32 из-за огромнейшего свободного пространства под программы (и даже его можно суметь занять полностью). Если реализовывать все на STM32, то выбор ArduinoIDE крайне неэффективен и стоит смотреть в сторону более взрослых решений по типу STM32CubeIDE + CMSIS.

Помимо этого стоит учесть что разработка под андроид ведется на Java, однако если использовать такую вещь как AppInventor, то понимание процессов упрощается, но в силу того что этот сервис работает крайне нестабильно, а так же учитывая "размер" более-менее простого приложения с десятком кнопок, стоит, все же, смотреть в сторону Java и Android Studio.

Если есть необходимость увеличить кол-во портов ввода/вывода, то стоит использовать что-то наподобие MCP23008 или MCP23017.

Старайтесь избегать использования float и double на микроконтроллерах, без встроенного блока обработки данных с плавающей точкой. Если использовать дробные типы данных на той же UNO, то размер скетча растет моментально.
0

#42 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 30 августа 2020 - 19:12

Цитата

более взрослых решений по типу STM32CubeIDE + CMSIS
intext, Я пока не могу на HALе, не говоря уже о CMSIS и тем более LL, я как и многие кто заинтересован данной темой, были бы благодарны если бы Вы переписали скетч My_sketch_ADAU1701_encVol_no_EEPROM.zip на CMSIS.

Цитата

стоит, все же, смотреть в сторону Java и Android Studio

Я не собирался писать под Android, можно реализовать гораздо проще на html, вызвав страницу настраиваемых параметров через wifi.

Цитата

Если есть необходимость увеличить кол-во портов ввода/вывода, то стоит использовать что-то наподобие MCP23008 или MCP23017.

Нет, необходимости такой нет что на AVR что на STM32/ESP32, там IO предостаточно тем более для девайса с двумя-тремя органами управления.

Цитата

Старайтесь избегать использования float и double на микроконтроллерах
да это так, но есть пути обхода в преобразовании левой и правой части в целочисленное. Отсюда я написал выше, что нет смысла вычислять коэффициенты из wav, проще сразу загонять массив блоком в ADAU.

Запись конфигурации чипа ADAU1701 MCU STM32 с импульсом, с использованием библиотеки SlowSoftI2CMaster.
Спойлер


***
Пилим потихоньку. Залил видео на трубу. Доступ по ссылке.
IR player guitar
IR player bass
Добавил функции вывода на дисплей уровня громкости и регистрацию пикового значения входного сигнала.

А пока я пыхтя пилю данный девайс :) , китайцы выпустили дешевый IR плеер Cuvave CUBE BABY

******************

В общем пока остановился на таком варианте (решил сделать стерео версию :) ) - накидал схемку, печатную плату решил заказать у китайцев, по мне так проще (переходы 0,7/0,3, дорожки от 0,3мм). Кнопки не использую, но зарезервировал выводы, чтоб было т.к. я очень не постоянен :D

Прикрепленное изображение: ADAU1701_IRPv1_bottom.jpg Прикрепленное изображение: ADAU1701_IRPv1_top.jpg

Прикрепленный файл  ADAU1701_&_ESP-32_2ch_shematic.pdf (378,37К)
Количество загрузок:420

Сообщение отредактировал Fester: 30 августа 2020 - 19:14

1

#43 Пользователь офлайн   Yetti 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 31 августа 2020 - 11:18

Просмотр сообщенияFester (30 августа 2020 - 19:12) писал:

печатную плату решил заказать у китайцев, по мне так проще (переходы 0,7/0,3, дорожки от 0,3мм)

Fester, если вы заказывали у китайцев с запасом и будут лишние - можно вписаться и прикупить одну для повторения и экспериментов?
0

#44 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 31 августа 2020 - 11:35

Просмотр сообщенияYetti (31 августа 2020 - 11:18) писал:

Fester, если вы заказывали у китайцев с запасом и будут лишние - можно вписаться и прикупить одну для повторения и экспериментов?

Дело в том, что в заказанных платах есть маленький косячок, без этого похоже никуда, 20 ножка DD2 притянута к земле как и у DD1, это адресация i2c. Я впоследствии это поправил, и на плате придется отрезать дорожку от земли и сделать перемычку между 18-20. В добавок надо оттестить плату и схематику, возможно придется изменять номиналы, ну и если Вас это не смущает, а также такая разводка и джеки 6,3 то почему бы и нет.
0

#45 Пользователь офлайн   Yetti 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 31 августа 2020 - 12:52

Просмотр сообщенияFester (31 августа 2020 - 11:35) писал:

надо оттестить плату и схематику, возможно придется изменять номиналы, ну и если Вас это не смущает, а также такая разводка и джеки 6,3 то почему бы и нет.

Fester, не смущает. паять я умею и люблю, да и не вижу никакого криминала в исправлениях на плате. отладка она такая
0

#46 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 10 сентября 2020 - 18:18

Здравствуйте.
Взялся за реализацию SD карты. Вот код побитовой записи из wav файла
  const uint16_t len = 3044; //(1000*3) + 44 - длина массива для 1000 отсчетов с заголовком для 24бит wav файла
  uint8_t wave[len];
  int32_t fir_coeff, fir_buff; // массив значений коэффициентов в формате Data 5.23 с плавающей точкой, и массив байтовых значений для проверки трех байт из wav файла
  //float fir_coeff_float; // переменная значений коэффициентов в формате Data 5.23 с плавающей точкой
  Serial.printf("Reading file: %s\n", path);
  File file = fs.open(path);
  if (!file) {
    Serial.println("Failed to open file for reading");
    return;
  }

  if (file) {
    Serial.print("Размер файла: ");
    Serial.print(file.size()); //выводим размер файла
    Serial.println(" байт");
    for (uint16_t i = 0; i < len; i++) // читаем из файла
    {
      wave[i] = file.read(); //записываем в массив весь файл wav целиком для последующего вывода информации в монитор порта
    }
    uint8_t audioFormat =  wave[23] << 8 |  wave[22]; //склеиваем два байта отвечающих за количество каналов. Моно = 1, Стерео = 2
    if (audioFormat = 1) {
      Serial.println("Количество каналов: Моно");
    }
    else Serial.println("Количество каналов: Стерео");
    uint16_t samplerate =  wave[27] << 24 | wave[26] << 16 | wave[25] << 8 | wave[24]; //склеиваем четыре байта отвечающих за частоту дискретизации. 8кГц, 44,1кГц и т.д.
    Serial.print("Частота дискретизации: ");
    Serial.println(samplerate);
    uint8_t bitsPerSample =  wave[35] << 8 |  wave[34]; //склеиваем два байта отвечающих за количество бит в сэмпле. 8 бит, 16 бит и т.д.
    Serial.print("Количество бит в сэмпле: ");
    Serial.println(bitsPerSample);
    uint16_t samples_count = (myFile.size() - 44) * 8 / bitsPerSample; // подсчет количества сэмплов в wav файле
    Serial.print("Количество сэмплов: ");
    Serial.println(samples_count);

    // close the file:
    file.close();
  } else {
    // если файл нельзя открыть, печатаем ошибку
    Serial.println("error opening impulse.wav");
  }

  /*Закомментированная секция вывода значений коэффициентов в формате Data 5.23 с плавающей точкой в монитор порта*/
  //  Serial.println("Write fir coefficient for impulse.wav:"); // секция вывода значений коэффициентов в формате Data 5.23 с плавающей точкой
  //  for (uint16_t i = 0; i < len - 44; i = i+3){ //пропускаем заголовок в 44 байта и считываем с секции data
  //      fir_coeff = wave[46+i] << 16 | wave[45+i] << 8 | wave[44+i]; //записываем в массив по три байта
  //      if (fir_coeff > 8388608){ //проверка отрицательного значения
  //        fir_coeff = fir_coeff - 16777216; // перевод в формат Data 28.0
  //        fir_coeff_float = (float)fir_coeff / 8388608; // перевод в формат Data 5.23
  //        }
  //      else //Serial.println(fir_coeff); //вывод значений в формате Data 28.0
  //           fir_coeff_float = (float)fir_coeff / 8388608; // перевод в формат Data 5.23
  //           Serial.println(fir_coeff_float, 5); //вывод значений в формате Data 5.23
  //    }

  Serial.println("Write data for impulse.wav:");
  if (!si.i2c_start((DEVICE_ADDR_IC_1) | I2C_WRITE)) { // где DEVICE_ADDR_IC_1 - адрес ADAU 0x68
    Serial.println("I2C device busy for SD");
    return;
  }
  uint8_t addressLowByte = 0x0000 & 0xff;   //запись младшего байта адреса 0x0000 секции Param
  uint8_t addressHighByte = (0x0000 >> 8);  //запись старшего байта адреса 0x0000 секции Param
  si.i2c_write(addressHighByte);
  si.i2c_write(addressLowByte);

  for (uint16_t i = 0; i < len - 44; i = i + 3) { //пропускаем заголовок в 44 байта и считываем с секции data
    fir_buff = wave[46 + i] << 16 | wave[45 + i] << 8 | wave[44 + i]; //записываем в массив по три байта
    if (fir_buff > 8388608) { //проверка отрицательного значения
      si.i2c_write(255); //если отрицательное добавляем к записи значение FF
      Serial.print(255, HEX); //добавляем 0F
    }
    else {
      si.i2c_write(0); //если положительное добавляем к записи значение 0
      Serial.print(0, HEX);
    }
      si.i2c_write(wave[46 + i]); //write data 3 byte
      si.i2c_write(wave[45 + i]); //write data 2 byte
      si.i2c_write(wave[44 + i]); //write data 1 byte
      Serial.print(wave[46 + i], HEX);
      Serial.print(wave[45 + i], HEX);
      Serial.println(wave[44 + i], HEX); //вывод битовых значений в HEX формате
  }
  }

Открываю файл из папки №3 функцией
 read_wave_SD (SD_MMC, "/3/impulse.wav"); 

Склеиваю по 3 байта и проверяю положительное или отрицательное значение, и соответственно посылаю начиная от младшего к старшему байту добавляя FF(255) если отрицательное и 0 если положительное. Вот так всё просто. Код отработал всё работает. Кому не нужно может убрать закомментированную сецию вывода значений коэффициентов в формате Data 5.23 с плавающей точкой в монитор порта, как и все выводы в монитор порта Serial.print(). По сути сам код в цикле ;)

for (uint16_t i = 0; i < len - 44; i = i + 3){}

0

#47 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 16 октября 2020 - 17:43

Собрал и поменял некоторые номиналы, отрегулировал по уровням, поправил маленькие ошибки.
Новая схема устройства. Ток потребления всего устройства - 420 мА.

Фото
Спойлер


Записал видео как мог. Не записал реализацию переключения импульсов по WiFi, считывание с карты SD, отображение критического уровня входного сигнала. Вторая колонка не подключена, поэтому по правому каналу не слышно изменений в звуке, но код работает, для меня стало проблемой как это всё показать на видео, чем реализовать :).

DIY проект IR плеера на ADAU1701 и ESP32. Сборка и отладка на плате готового проекта, реализация двух каналов плеера.

В планах добить код реализации переключения по WiFi на оба канала. Сейчас реализовано запись на один канал, при наличии файла импульса на SD карте. Еще не определился - или оставить запись общего импульса на оба канала, или считывать из разных папок на левый и правый канал соответственно.

P.S. TDA2822 оказалась очень громкой :) пришлось давить уровень по входу через делитель, а также немного шумной (собственный уровень шумов - "шипит"), при игре незаметно, шум слышно только в паузах. В линейный выход всё идеально.

*****
Еще немного погонял, ловит WiFi устойчиво, читает SD карту, дописал код теперь пишет поочередно в чипы из папок левого и правого канала.
В коде поправил значение порога входного сигнала, убрал диод D6 и резистор R68, конденсатор C83 по входу IO35, теперь работает четко.

Прикрепленный файл  ADAU1701_&_ESP-32_2ch_shematic_correct.pdf (339,86К)
Количество загрузок:325

Проект KiCad
Прикрепленный файл  ADAU1701 2ch_project.zip (211,31К)
Количество загрузок:207

Код переваливший за 1к строк, не считая битовых данных импульсов и прошивок чипов :)
Прикрепленный файл  ADAU1701_noEEPROM_ESP32_2Display_SD_WiFi.zip (66,1К)
Количество загрузок:238

Используемые библиотеки в коде
Прикрепленный файл  Используемые библиотеки.zip (2,76МБ)
Количество загрузок:227

Единственное что нужно, это прописать в полях кода название и пароль WiFi сети, и прошить ESP32.
const char* ssid = "***"; // ssid вашей сети WiFi
const char* password = "***"; // password вашей сети WiFi

В данном коде реализация WiFi ТОЛЬКО на левый канал (т.е. запись в чип DD1), в планах доделать на два канала и красиво оформить страничку, пока она оформлена как на картинке, если кто-нибудь поможет с этим буду только рад.

Страничка выбора импульса
Прикрепленное изображение: WiFi подключение.jpg

Остались печатные платы из поста #42 в количестве 4х штук (одна за Yetti :) ) кому интересно пишите в личку.

***
Структура папок и файлов на SD карте:
Left_impulse\impulseL.wav
Right_impulse\impulseR.wav
Импульсы в формате - моно, 24 bit, 48kHz (также работают и 44,1 kHz), должны быть размещены по данному пути и иметь соответственно выше приведенные имена.

Считывание с SD карты происходит по двойному нажатию энкодера.
Изменение импульсов и соответственно выбора канала, происходит по однократному нажатию, повторное нажатие - выход на основной экран.
6

#48 Пользователь офлайн   intext 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 20 октября 2020 - 18:40

Получилось очень круто! И сколько весит этот монстр на 1к строк?
0

#49 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 19 ноября 2020 - 17:50

*
Популярное сообщение!

Спасибо, ну если быть точнее то 1230 строк и 13 страниц инклюдов )

Скетч использует 887226 байт (67%) памяти устройства. Всего доступно 1310720 байт.
Глобальные переменные используют 39560 байт (12%) динамической памяти, оставляя 288120 байт для локальных переменных. Максимум: 327680 байт.

Я думаю еще десяток другой импульсов влезет легко). Это если SPI flash оставить на 4 мб, если поменять на 16 мб то я даже не представляю сколько поместится всего. :) Отличный получился проект для экспериментов.

****
Полностью убрал часть платы под антенной, а не только заливку земли как ранее.(Спасибо Yetti)

Проект KiCad
Прикрепленный файл  ADAU1701 2ch_project.zip (233,72К)
Количество загрузок:212

Проект сделан под корпус B023, с размерами 120x100x35мм. Для корпуса G0473 с размерами 119х93.5х34.0мм, необходимо править файл ADAU1701_IRPv1.kicad_pcb

*****
Привет всем.
Дописал функцию управления двумя каналами по WiFi - WiFi_connect();
Записал видео, первые 25 секунд показана реализация регистрации повышенного входного уровня выше 1,8 В.

ADAU1701 IRplayer ESP32 WiFi control

Необходимые библиотеки можно скачать выше, ссылка на код внизу.

Прикрепленный файл  ADAU1701_noEEPROM_ESP32_2Display_SD_WiFi.zip (67,62К)
Количество загрузок:203

На этом пока всё, надеюсь данная тема найдет желающих что-то улучшить, оптимизировать код и т.п.

***
ред. от 19.11.20г.
Попробовал переписать код под "мягкую" точку доступа, как заверяет разработчик "soft access point", и результат меня не устроил. Да сеть поднимается четко и сигнал хороший (хотя и в режиме клиента тоже неплохо), да получше чем в режиме клиента, и нет доступа из сети Интернет через роутер что плюс.
НО! МК начал генерировать сигнал в аудиотракт (стрекот) с частотой около 2Гц, что в корпусе что без - безрезультатно. Для данного режима вероятно необходимо разделять гальванически линию питания МК от основной.

Прикрепленное изображение: 01.jpg Прикрепленное изображение: 02.jpg Прикрепленное изображение: 03.jpg

И было решено переписать код под Bluetooth связь, как альтернатива беспроводной связи без привязки к wifi роутеру.
Проверил - всё отлично, помех в аудио тракт нет.
Код прошивки ESP32.

Прикрепленный файл  ADAU1701_noEEPROM_ESP32_2Display_SD_BT.zip (63,26К)
Количество загрузок:223

Написал программу для смартфона под андроид.
Прикрепленное изображение: Screenshot_IR_player_remote_control.jpg

Файл *.apk.
Прикрепленный файл  IR_player_remote_control.zip (2,94МБ)
Количество загрузок:256
10

#50 Пользователь офлайн   sporow 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 06 мая 2021 - 13:58

Привет!) Не подскажите где детали брали, чтоб его реализовать.
0

#51 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 07 мая 2021 - 07:26

Просмотр сообщенияsporow (06 мая 2021 - 13:58) писал:

Привет!) Не подскажите где детали брали, чтоб его реализовать.

Да, за последний год ситуация поменялась не в лучшую сторону. Я старался закладывать не дорогие компоненты, брал почти всё с алиэкспресс, нареканий нет. ESP32 и ADAU1701 в цене выросли не так сильно как STM32.
0

#52 Пользователь офлайн   sporow 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 07 мая 2021 - 12:28

Просмотр сообщенияFester (07 мая 2021 - 07:26) писал:

Да, за последний год ситуация поменялась не в лучшую сторону. Я старался закладывать не дорогие компоненты, брал почти всё с алиэкспресс, нареканий нет. ESP32 и ADAU1701 в цене выросли не так сильно как STM32.

Скинь ссылками где что брал.
0

#53 Пользователь офлайн   Torbjorn 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 07 мая 2021 - 12:56

Fester, а реально ли упростить проект до применения ESP-12, если заюзать дисплей с I2C подключением? Чисто спортивный интерес.
0

#54 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 07 мая 2021 - 21:36

Просмотр сообщенияsporow (07 мая 2021 - 12:28) писал:

Скинь ссылками где что брал.

Так они могут быть мертвыми, да и много их, это не пять минут займет) Найти всё не трудно, Вы попробуйте поискать, а если что не найдете пишите в личку, я поищу и скину ссылку.
Вот основные
https://aliexpress.r...2899182878.html
https://aliexpress.r...2967214308.html
https://aliexpress.r...3020488828.html
https://aliexpress.r...1338961994.html

Просмотр сообщенияTorbjorn (07 мая 2021 - 12:56) писал:

Fester, а реально ли упростить проект до применения ESP-12, если заюзать дисплей с I2C подключением? Чисто спортивный интерес.

Да, вполне можно только 1мб будет маловато, да и может настать тот момент что сеть отвалится, как это часто бывает при заполнении памяти у ESP8266. Ну если учесть дисплей, сд карту (получение из wav), сеть, памяти хватит только на пару-тройку импульсов, если вообще хватит :D и не придется вешать отдельно spi flash.
Хм..., а i2c я не нашел у esp12 "- Интерфейсы SDIO 1.1/2.0, SPI, UART;" Хотя в NodeMCU - Интерфейсы SPI, I2C и I2S. Данные разнятся где 1Мб, а где 4Мб (ESP-12E). https://static.chipd...OC001140960.pdf
0

#55 Пользователь офлайн   Torbjorn 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 07 мая 2021 - 21:52

Просмотр сообщенияFester сказал:

Данные разнятся где 1Мб, а где 4Мб (ESP-12E).

Fester, я покупал E, F и S. У всех одинаковая 4 МБ память. Отличаются только железные мелочи, типа геометрии pcb-антенны и контактных пинов, и наличия/отсутствия пинов прямого доступа к флеши.

Просмотр сообщенияFester сказал:

Хм..., а i2c я не нашел у esp12

Есть же:
Спойлер

На всякий случай можно по лейауту платы свериться с даташитом на ESP8266
0

#56 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 07 мая 2021 - 21:58

Я ошибся, они переназначаемые, так что вполне можно)
https://www.mikrocon...s_Australia.pdf
4.2.2. SPI Flash
Current ESP8266EX chip SPI interface supports external Flash, a theoretical maximum support to 16 MB
of SPI flash. At present, the module is 4MB of external SPI Flash.
Recommendations Flash Capacity: 1 MB-16MB.
P.S. Пока писал ответ не увидел ранее)
0

#57 Пользователь офлайн   Torbjorn 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 10 мая 2021 - 08:34

С оглядкой на мои нужды, хороший и ультрабюджетный вариант - это одна adau, esp12, одноразрядный семисегментный индикатор, энкодер и потенциометр вольюм. И всё это безобразие в корпусе типа "сникерс"
1

#58 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 10 мая 2021 - 18:37

Torbjorn, А если ультрабюджетный тогда зачем одноразрядный семисегментный индикатор ? :) Энкодера с метками на корпусе вполне нормально как у CabZona. Схема есть, исходный код тоже, чуток переделать и вполне осуществимо.
Я рад что тема ожила :thanks:
2

#59 Пользователь офлайн   Torbjorn 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 11 мая 2021 - 01:41

Просмотр сообщенияFester сказал:

Torbjorn, А если ультрабюджетный тогда зачем одноразрядный семисегментный индикатор ?

Да скорее как элемент дизайна. Хотя, солидарен, если уж удешевлять конструкцию, то рациональнее все задачи по индикации переложить на приложение в смартфоне.

Похоже, китайцы наладили производство клонов ADAU. Самый дешёвый оригинал на arrow стоит $5.36, а на али полно предложений по $3.75.
0

#60 Пользователь офлайн   Fester 

  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Отправлено 07 июля 2021 - 20:01

В качестве новости. :) Китайцы выпустили достойный плеер импульсов, в дополнение к своей линейке педалей. Может и в режиме стерео.

Прикрепленное изображение: FLAMMA FS07.jpg

FLAMMA FS07
Магазин
0

Поделиться темой:


  • 3 Страниц +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей

Спасибо админам и создателям форума, которые развивали ресурс вплоть до мая 2022 года: Kanistra, Nazarett, Satriani, Плохиш, Тяп !