Ардуино - запись звука
Re: Ардуино - запись звука
На сматфоне запустить диктофон в режиме VOX и он будет записывать болтовню УКВистов пока Вас нет дома.
Re: Ардуино - запись звука
olegue тебе же сказали... задача творческая !
На сматфоне запустить диктофон... это не творчество.
shaaimars
звук (в качестве 16 бит 44.1 кГц) ардуина не потянет.
максимум что ардуина потянет - звук (в качестве 10 бит 44.1 кГц).
записывая каждый "сеанс" в отдельный файл на sd-карту - это ардуина потянет.
периодически вытаскивать эти файлы на смартфон через bluetoth - в ардуино нет bluetoth.))
кодек... не пробовал... может и потянет))
по I2S шине передать байты ардуине (?) - в ардуино нет I2S))
1) Как часто можно создавать файлы на sd карте? Если делать это каждые 1-2 секунды, никакого затыка не будет?
если правильно настроить... никакого затыка не будет.
2) Как расчитать, хватит ли аппаратных возможностей конкретного контроллера не только на запись звука по сигналу открытия шумодава, но еще и на передачу данных с sd карты через bluetoth модуль по запросу от смартфона? Собственно это самый главный вопрос, ибо не хочется ошибиться с покупкой ненужного для данного проекта железа.
смотреть надо... в протеусе))
надо понимать что ардуина изначально не расчитана на запись звука... поэтому придётся долго колдовать))
На сматфоне запустить диктофон... это не творчество.
shaaimars
звук (в качестве 16 бит 44.1 кГц) ардуина не потянет.
максимум что ардуина потянет - звук (в качестве 10 бит 44.1 кГц).
записывая каждый "сеанс" в отдельный файл на sd-карту - это ардуина потянет.
периодически вытаскивать эти файлы на смартфон через bluetoth - в ардуино нет bluetoth.))
кодек... не пробовал... может и потянет))
по I2S шине передать байты ардуине (?) - в ардуино нет I2S))
1) Как часто можно создавать файлы на sd карте? Если делать это каждые 1-2 секунды, никакого затыка не будет?
если правильно настроить... никакого затыка не будет.
2) Как расчитать, хватит ли аппаратных возможностей конкретного контроллера не только на запись звука по сигналу открытия шумодава, но еще и на передачу данных с sd карты через bluetoth модуль по запросу от смартфона? Собственно это самый главный вопрос, ибо не хочется ошибиться с покупкой ненужного для данного проекта железа.
смотреть надо... в протеусе))
надо понимать что ардуина изначально не расчитана на запись звука... поэтому придётся долго колдовать))
Re: Ардуино - запись звука
[uquote="roman.com",url="/forum/viewtopic.php?p=4551925#p4551925"]olegue тебе же сказали... задача творческая !
На сматфоне запустить диктофон... это не творчество.[/uquote]
Роман, я внимательно и очень вдумчиво несколько раз перечитал пост уважаемого shaaimars, и написал лишь то что в сухом остатке. А так да, первым желанием было растолковать все как есть, но пока это преждевременно.
На сматфоне запустить диктофон... это не творчество.[/uquote]
Роман, я внимательно и очень вдумчиво несколько раз перечитал пост уважаемого shaaimars, и написал лишь то что в сухом остатке. А так да, первым желанием было растолковать все как есть, но пока это преждевременно.
Re: Ардуино - запись звука
[uquote="olegue",url="/forum/viewtopic.php?p=4551898#p4551898"]На сматфоне запустить диктофон в режиме VOX и он будет записывать болтовню УКВистов пока Вас нет дома.[/uquote]
Такая схема уже частично была реализована, у нее есть много недостатков, которые всплывают при длительном использовании - отсутствие контроля над ОС (которая может просто завершить процесс спустя некоторое время, или зависнуть), большое энергопотребление. Плюс я не уверен, что смогу нормально наладить связь между двумя смартфонами, чтобы с одного на другой перекидывать файлы.
[uquote="roman.com",url="/forum/viewtopic.php?p=4551925#p4551925"]максимум что ардуина потянет - звук (в качестве 10 бит 44.1 кГц).[/uquote]
Это я уже успел узнать. Планируется использовать отдельную плату-кодек, большинство из которых нынче выдают I2S сигнал.... который не поддерживается ардуинами??? Получается, я перепутал ветку форума, и мне нужно брать сразу что-то ардуино-совместимое на основе esp32 или ARM-процессоров?
P.S. Я правильно понимаю, что теоретически реализовать это возможно и на atmega 128, но не имеет смысла ввиду отсутсвия аппаратной поддержки 16 бит и i2s, и легче просто взять что-то помощнее да в сборе со всем необходимым? Но что конкретно? Слишком большой выбор, эх
Такая схема уже частично была реализована, у нее есть много недостатков, которые всплывают при длительном использовании - отсутствие контроля над ОС (которая может просто завершить процесс спустя некоторое время, или зависнуть), большое энергопотребление. Плюс я не уверен, что смогу нормально наладить связь между двумя смартфонами, чтобы с одного на другой перекидывать файлы.
[uquote="roman.com",url="/forum/viewtopic.php?p=4551925#p4551925"]максимум что ардуина потянет - звук (в качестве 10 бит 44.1 кГц).[/uquote]
Это я уже успел узнать. Планируется использовать отдельную плату-кодек, большинство из которых нынче выдают I2S сигнал.... который не поддерживается ардуинами??? Получается, я перепутал ветку форума, и мне нужно брать сразу что-то ардуино-совместимое на основе esp32 или ARM-процессоров?
P.S. Я правильно понимаю, что теоретически реализовать это возможно и на atmega 128, но не имеет смысла ввиду отсутсвия аппаратной поддержки 16 бит и i2s, и легче просто взять что-то помощнее да в сборе со всем необходимым? Но что конкретно? Слишком большой выбор, эх
Re: Ардуино - запись звука
Мой бывший коллега давненько реализовывал подобный проект.
Для получения 16 бит строился АЦП R-2R на выходных портах и использовался внутренний компаратор.
Писал на АСМе, и в решаемой задаче для используемых переменных хватало имеющихся регистров. Это позволило обойтись без пуш/поп при выполнении подпрограмм. А также полностью использовать имеющуюся оперативку под буферы данных.
Позднее к проекту добавился эзернет и "на вырост" была взята мега 128.
Для получения 16 бит строился АЦП R-2R на выходных портах и использовался внутренний компаратор.
Писал на АСМе, и в решаемой задаче для используемых переменных хватало имеющихся регистров. Это позволило обойтись без пуш/поп при выполнении подпрограмм. А также полностью использовать имеющуюся оперативку под буферы данных.
Позднее к проекту добавился эзернет и "на вырост" была взята мега 128.
Re: Ардуино - запись звука
тогда... за понимание ! ))olegue писал(а):я внимательно и очень вдумчиво несколько раз перечитал...
shaaimars писал(а):я не уверен, что смогу нормально наладить связь между двумя смартфонами
больших проблем не вижу...
ну... если надо сжать файл... тогда можно))shaaimars писал(а):Планируется использовать отдельную плату-кодек, большинство из которых нынче выдают I2S сигнал....
хотя для обычной рации можно использовать и простой PCM без сжатия... там же данных не много.
теоретически реализовать это возможно и на atmega 128, и на atmega 328...
atmega 328 лучше - частота выше - 20 мгц против 16 мгц у atmega 128.
а поддержку 16 бит и i2s можно сделать на чём угодно))
но не имеет смысла ввиду низкого быстродейстия и низкого качества звука...
esp32 лучше.
esp32 даёт звук (в качестве 12 бит 44.1 кГц) против звук (в качестве 10 бит 44.1 кГц) у atmega 328...
esp32 - частота выше - 240 мгц и два ядра против 20 мгц у atmega 328.
esp32 энергопотребление в спячке ~2,5 микроампер... не намного больше чем у atmega 328 ~0,1 микроампер...
esp32 есть bluetoth.
и т.д.
хотя не ясно зачем bluetoth... ви-фи работает дальше и быстрей.
у меня всё работает по ви-фи... и управление... и передача звука... и передача файлов... и т.д.
Re: Ардуино - запись звука
shaaimars, Вы будете писать узкополосных УКВистов, позвольте узнать зачем Вам звук 16 бит, да и еще с таким конским сэмплрэйтом 44.1 кгц? Ардуино прекрасно справится с задачей записи на флэшку по SPI звука 8 бит 16кгц. Одна минута займет 8*16*60 =7.6 мБ места. Останется лишь вопрос передачи этих данных в телефон с целью прослушивания.
1. Вариант. Вынимаем флэшку и ставим в телефон. А другую флэшку ставим в устройство записи. Из недостатков: отсутсвтие творчества. Но я думаю, что по факту запуска первой части проекта творческий запал или спадет на нет или будут существенно скоректирован исходя из полученного опыта.
2. Здесь был упомянут Bluetooth. Отлично! Давайте помечтаем! Такой вариант я ранее не рассматривал. Но можно подключить плату HC-06 по UART, и скорость там, ну пускай 115200, мечтать так мечтать. Опустим проблемы сопряжение с телефоном, пускай их как бы нет. Теперь нужно что бы устройство все новые файлы (а точнее, сэмплы) по этому каналу передало в телефон. Намечается какой-то андроид блютуз сокет, ну должнен кто-то управлять этими байтами и заголовками и печь из них файлы.
3. И здесь появлятеся Роман и говорит: Олег, ты ж купил Ethernet Shield W5100 и все коды есть. Когда мы наконец увидим результат, то.е файлы на компе.
Добавлено after 29 minutes 42 seconds:
Ну да, блютуз это конечно не серьезно. Счас я подумаю как толкнуть на выход готовый файл по http или ftp. Это хорошая тема, либо через sim800 либо через esp8266. Оба варианта так себе. Ресурс делить придется если накладка произойдет. В умелых руках получилась бы конфетка, но кому это счас интересно.
1. Вариант. Вынимаем флэшку и ставим в телефон. А другую флэшку ставим в устройство записи. Из недостатков: отсутсвтие творчества. Но я думаю, что по факту запуска первой части проекта творческий запал или спадет на нет или будут существенно скоректирован исходя из полученного опыта.
2. Здесь был упомянут Bluetooth. Отлично! Давайте помечтаем! Такой вариант я ранее не рассматривал. Но можно подключить плату HC-06 по UART, и скорость там, ну пускай 115200, мечтать так мечтать. Опустим проблемы сопряжение с телефоном, пускай их как бы нет. Теперь нужно что бы устройство все новые файлы (а точнее, сэмплы) по этому каналу передало в телефон. Намечается какой-то андроид блютуз сокет, ну должнен кто-то управлять этими байтами и заголовками и печь из них файлы.
3. И здесь появлятеся Роман и говорит: Олег, ты ж купил Ethernet Shield W5100 и все коды есть. Когда мы наконец увидим результат, то.е файлы на компе.
Добавлено after 29 minutes 42 seconds:
Ну да, блютуз это конечно не серьезно. Счас я подумаю как толкнуть на выход готовый файл по http или ftp. Это хорошая тема, либо через sim800 либо через esp8266. Оба варианта так себе. Ресурс делить придется если накладка произойдет. В умелых руках получилась бы конфетка, но кому это счас интересно.
Re: Ардуино - запись звука
[uquote="roman.com",url="/forum/viewtopic.php?p=4552394#p4552394"]ну... если надо сжать файл... тогда можно))[/uquote]
Вроде бы их используют в первую очередь как специальный быстродействующий 16-и-более-битный АЦП для качественной записи звука, ввиду отсутствия такового в esp32 и тем более в мегах. Поправьте меня, если не так.
[uquote="olegue",url="/forum/viewtopic.php?p=4552431#p4552431"]Вы будете писать узкополосных УКВистов, позвольте узнать зачем Вам звук 16 бит, да и еще с таким конским сэмплрэйтом 44.1 кгц?[/uquote]
Чтобы не потерять качество записи. Все же связь, которую я хочу записать, не 8-битная, а обычная аналоговая. Количество занимаемой памяти не имеет значения. Имеет значение лишь то, сможет ли МК все это обработать, и смогут ли мои кривые ручонки все это собрать и запрограммировать в нечто рабочее
[uquote="olegue",url="/forum/viewtopic.php?p=4552431#p4552431"]Ну да, блютуз это конечно не серьезно.[/uquote]
Ой, да я пока что даже не думал об этом. Первоначальная цель - сделать запись звука в автономном устройстве с адекватным потреблением и стабильной работой на протяжении длительного времени. А блютуз или вифи - это на будущее
Вроде бы их используют в первую очередь как специальный быстродействующий 16-и-более-битный АЦП для качественной записи звука, ввиду отсутствия такового в esp32 и тем более в мегах. Поправьте меня, если не так.
[uquote="olegue",url="/forum/viewtopic.php?p=4552431#p4552431"]Вы будете писать узкополосных УКВистов, позвольте узнать зачем Вам звук 16 бит, да и еще с таким конским сэмплрэйтом 44.1 кгц?[/uquote]
Чтобы не потерять качество записи. Все же связь, которую я хочу записать, не 8-битная, а обычная аналоговая. Количество занимаемой памяти не имеет значения. Имеет значение лишь то, сможет ли МК все это обработать, и смогут ли мои кривые ручонки все это собрать и запрограммировать в нечто рабочее
[uquote="olegue",url="/forum/viewtopic.php?p=4552431#p4552431"]Ну да, блютуз это конечно не серьезно.[/uquote]
Ой, да я пока что даже не думал об этом. Первоначальная цель - сделать запись звука в автономном устройстве с адекватным потреблением и стабильной работой на протяжении длительного времени. А блютуз или вифи - это на будущее
Re: Ардуино - запись звука
готовый флэш- диктофон с кнопкой и всего то за 10 баксов, на кнопку посадить сигнал ШП со станции. https://aliexpress.ru/item/32996404674. ... 6931138413

Добавлено after 3 minutes 42 seconds:
и питание вероятно тоже можно со станции ввязть. Питание флэшки 3.3 , вполне вероятно что и общее питания такое же будет.
15 баксов если в пересчете с наших.
Добавлено after 1 minute 37 seconds:
Но с "творчеством" опять беда, Кроме поключения к станции не за што и руки зацепить.
Добавлено after 2 hours 46 minutes 24 seconds:

еще более функциональная игрушка. Доступ к записанным файлам по usb (вероятно по OTG тоже можно), Можно покумекать как передать на удаленное устройство.
Добавлено after 3 minutes 42 seconds:
и питание вероятно тоже можно со станции ввязть. Питание флэшки 3.3 , вполне вероятно что и общее питания такое же будет.
15 баксов если в пересчете с наших.
Добавлено after 1 minute 37 seconds:
Но с "творчеством" опять беда, Кроме поключения к станции не за што и руки зацепить.
Добавлено after 2 hours 46 minutes 24 seconds:
еще более функциональная игрушка. Доступ к записанным файлам по usb (вероятно по OTG тоже можно), Можно покумекать как передать на удаленное устройство.
Re: Ардуино - запись звука
не понял...shaaimars писал(а):Вроде бы их используют в первую очередь как специальный быстродействующий 16-и-более-битный АЦП для качественной записи звука, ввиду отсутствия такового в esp32 и тем более в мегах. Поправьте меня, если не так.
1. звук подаём на любой АЦП. На выходе АЦП получаем PCM.
esp32 даёт звук 12 бит.
atmega328 даёт звук 10 бит.
телефон даёт звук 16 бит.
комп даёт звук 16 бит.
...
есть ещё мини ПК мини ПК даёт звук 16 бит.
но нам надо минимальное потребление... тогда остаётся esp32 или atmega328.
2. далее PCM поступает на блок сжатия... где кодек сжимает звук.
к примеру кодек MP3 сжимает звук в ~10 раз.
только не думаю что это надо для простой рации...
3. а далее пишем на обычную флешку... esp32 или atmega328 сойдёт)).
4. делее слушаем звук с флешки на компе или телефоне... по изернет или ви-фи.
всё просто)) вроде ))
Добавлено after 8 minutes 3 seconds:
с ардуино на комп по протоколу http мы передавали в соседней теме...
фото... аудио... видео...
больше ничего по протоколу http мы не передаём)) причин тому масса...
Re: Ардуино - запись звука
[uquote="roman.com",url="/forum/viewtopic.php?p=4552956#p4552956"]не понял...[/uquote]
https://aliexpress.ru/item/32893187079. ... 5826QdWpz3
https://www.chipdip.ru/product/pcm1808-audio-adc
https://www.chipdip.ru/product/ad1938-codec-v2
https://aliexpress.ru/item/100500649078 ... 4bc1D2zSWk
https://aliexpress.ru/item/100500546719 ... 4bc1D2zSWk
https://aliexpress.ru/item/33003473448. ... a5d9VjkrEw
https://aliexpress.ru/item/32893187079. ... 5826QdWpz3
https://www.chipdip.ru/product/pcm1808-audio-adc
https://www.chipdip.ru/product/ad1938-codec-v2
https://aliexpress.ru/item/100500649078 ... 4bc1D2zSWk
https://aliexpress.ru/item/100500546719 ... 4bc1D2zSWk
https://aliexpress.ru/item/33003473448. ... a5d9VjkrEw
Re: Ардуино - запись звука
ну... с таким ассортиментом )) не вижу проблем.
правда пропадает творчество.

правда пропадает творчество.
Re: Ардуино - запись звука
[uquote="roman.com",url="/forum/viewtopic.php?p=4553196#p4553196"]правда пропадает творчество.
[/uquote]
Ну, я бы поспорил. Даже установить IDE на ноут не смог - пришлось ставить на ПК.
Пока все железки не приехали, но уже возник один маааааленький вопросик - а нужно ли сбрасывать 0.3 вольта разницы между лог уровнями esp32 и моей рацией (которую я очень боюсь спалить)? И если да, то вопрос - что выбрать? На вскидку есть 3 варианта - делитель на резисторах, диод Шоттки, и буферная микросхема - вот только где бы найти такую, которая на выходе даст именно 3 вольта?
Ну, я бы поспорил. Даже установить IDE на ноут не смог - пришлось ставить на ПК.
Пока все железки не приехали, но уже возник один маааааленький вопросик - а нужно ли сбрасывать 0.3 вольта разницы между лог уровнями esp32 и моей рацией (которую я очень боюсь спалить)? И если да, то вопрос - что выбрать? На вскидку есть 3 варианта - делитель на резисторах, диод Шоттки, и буферная микросхема - вот только где бы найти такую, которая на выходе даст именно 3 вольта?
Re: Ардуино - запись звука
делитель на резисторах, диод любой... достаточно.
схему рисовать надо... куда чего подключается.

схему рисовать надо... куда чего подключается.
Re: Ардуино - запись звука
[uquote="roman.com",url="/forum/viewtopic.php?p=4481143#p4481143"]надо ещё потестить... в разных условиях... на разных Wi-Fi...))[/uquote]
через домашний роутер всё работает идеально)) звук идеальный )) 22050 семплов * 16 бит = 352.800 бит/с. бесплатный Wi-Fi... тоже хорошо)) 22050 семплов * 16 бит = 352.800 бит/с. а через 3G... очень плохо... нормально не поговорить)) булькает и зависает... большие потери пакетов... 3G для аудио и видео не подходит... надо 5G...))
хотя для управления умного дома 3G пойдёт.

ещё 3G_MTS работает за NAT (он же шлюз)... он ещё и порты меняет... хотя это не проблема...
проблема в низкой скорости 3G_MTS.

через домашний роутер всё работает идеально)) звук идеальный )) 22050 семплов * 16 бит = 352.800 бит/с. бесплатный Wi-Fi... тоже хорошо)) 22050 семплов * 16 бит = 352.800 бит/с. а через 3G... очень плохо... нормально не поговорить)) булькает и зависает... большие потери пакетов... 3G для аудио и видео не подходит... надо 5G...))
хотя для управления умного дома 3G пойдёт.
ещё 3G_MTS работает за NAT (он же шлюз)... он ещё и порты меняет... хотя это не проблема...
проблема в низкой скорости 3G_MTS.
Re: Ардуино - запись звука
Это, конечно, какая-то жесть.
Вооружившись обрывочными примерами, разномастными библиотеками, в отсутствие нормального дебага в ардуино ide, решил я открыть для себя творческое пространство, так сказать.
Имеем
0) Рацию Yaesu vx-3r с распаянными проводками, а именно аудиовыход на наушники и выход на управляющий транзистор индикатора открытия шумодава.
1) Модуль с аудио АЦП/ЦАП под названием WM8960 (описание платы + даташит по ссылке).
2) Полный аналог платы DevKitC v4, с модулем esp32-wroom 32u (прошу прощения за формальный оффтоп, я все же не знаю куда тыкнуть этот пост, ибо в ветке ARM про ESP всего пара тем)
3) Sd адаптер
Имеем прямые руки и паяльник, фигачим паука из проводов и плат
Пайка проверена, порты не перепутаны, все работает и моргает лампочками
Задача номер раз: записать по открытию шумодава хотя бы 5-секундный аудиофайл в формате WAV
Стратегия: брать куски кода из рабочих примеров для каждой из подзадач (работа с модулем ацп, работа с сд картой, и т.д.)
Модуль ацп проверен на работоспособность с помощью примера от Sparkfuns. Вкратце суть примера - орешь на микрофон и слышишь себя в наушниках
Отсюда были взяты куски по работе с файловой системой и SD картой. Итого имеем следующего Франкенштейна
TL;DR
Дабы не тратить время уважаемых форумчан, скажу вкратце - в примере есть буфер аудиоданных sBuffer, который наполняется данными с i2s_read(), и далее отправляется обратно на i2s_write(). Я попытался его впихнуть на SD карту через fContent.write, на что тот ругнулся, т.к. буфер изначально это массив типа uint16, а файл принимает только байты. Возможных решений много, но если просто изменить тип буфера на uint8, то функция "слышать себя в наушниках" никуда не пропадает и работает прекрасно. Казалось бы, все решено!?
Ага, как бы не так. Вот пример записи какого-то местного FM-радио - https://voca.ro/19Le1GeaxIgM (ГРОМКО!!!)
Вроде что-то слышно, а вроде и нифига не слышно. При этом в наушниках во время записи слышно хорошо!
Картинка этого же файла на audacity.
Начало файла в hex
Туда-сюда, туда-сюда. В чем проблема, так и не понял. Есть идея побитово сравнить данные в буфере и данные на карте, но что-то слишком уж тяжело для меня это сделать (вывод бинарных данных с еспшки это какое-то иезуитство), поэтому обращаюсь сюда. Какой-то алгоритм делает из хороших данных, которые отправляются на АЦП и воспроизводятся в наушниках, плохие. Памагити 
Вооружившись обрывочными примерами, разномастными библиотеками, в отсутствие нормального дебага в ардуино ide, решил я открыть для себя творческое пространство, так сказать.
Имеем
0) Рацию Yaesu vx-3r с распаянными проводками, а именно аудиовыход на наушники и выход на управляющий транзистор индикатора открытия шумодава.
1) Модуль с аудио АЦП/ЦАП под названием WM8960 (описание платы + даташит по ссылке).
2) Полный аналог платы DevKitC v4, с модулем esp32-wroom 32u (прошу прощения за формальный оффтоп, я все же не знаю куда тыкнуть этот пост, ибо в ветке ARM про ESP всего пара тем)
3) Sd адаптер
Имеем прямые руки и паяльник, фигачим паука из проводов и плат
Спойлер
На жпс модуль не обращать внимание, это на будущее (если оно настанет, с таким то прогрессом)
Задача номер раз: записать по открытию шумодава хотя бы 5-секундный аудиофайл в формате WAV
Стратегия: брать куски кода из рабочих примеров для каждой из подзадач (работа с модулем ацп, работа с сд картой, и т.д.)
Модуль ацп проверен на работоспособность с помощью примера от Sparkfuns. Вкратце суть примера - орешь на микрофон и слышишь себя в наушниках
Отсюда были взяты куски по работе с файловой системой и SD картой. Итого имеем следующего Франкенштейна
Спойлер
Код: Выделить всё
#include <Wire.h>
#include <SparkFun_WM8960_Arduino_Library.h>
#include "FS.h"
#include "SD.h"
// Click here to get the library: http://librarymanager/All#SparkFun_WM8960
WM8960 codec;
// Include I2S driver
#include <driver/i2s.h>
// Connections to I2S
#define I2S_WS 25
#define I2S_SD 17
#define I2S_SDO 4
#define I2S_SCK 16
// Use I2S Processor 0
#define I2S_PORT I2S_NUM_0
// Define input buffer length
#define bufferLen 64
uint8_t sBuffer[bufferLen*2];
size_t bytesIn = 0;
size_t bytesOut = 0;
boolean is_recording = false;
int file_num = 0;
byte header[44] = {};
fs::File fContent;
size_t audio_data_size = 0;
int testcounter = 0;
void setup() {
Serial.begin(115200);
Serial.println("Example 8 - I2S Passthough");
pinMode(33, INPUT);
Wire.begin();
if (codec.begin() == false) //Begin communication over I2C
{
Serial.println("The I2S device did not respond. Please check wiring.");
while (1)
; // Freeze
}
Serial.println("I2S device is connected properly.");
codec_setup();
// Set up I2S
i2s_install();
i2s_setpin();
i2s_start(I2S_PORT);
}
void loop() {
// Get I2S data and place in data buffer
esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen, &bytesIn, portMAX_DELAY);
testcounter++;
if (result == ESP_OK) {
// Продолжение записи если флаг = 1
if (is_recording) {
// Запись
audio_data_size += fContent.write(sBuffer, bufferLen*2);
// Если сигнала на запись нет, убираем флаг, прекращаем запись и меняем header
if (digitalRead(33) == 0) {
is_recording = false;
Serial.println("recording ended");
CreateWavHeader(header, audio_data_size);
fContent.seek(0);
fContent.write((const byte *)header, sizeof(header));
fContent.close();
SD.end();
Serial.println("File closed, card demounted succesfully");
}
}
// Если флага записи нет
else {
// Если есть сигнал на запись, создаем файл и ставим флаг на запись
if (digitalRead(33) == 1) {
is_recording = true;
file_num++;
if (!SD.begin()) {
Serial.println("Card Mount Failed");
} else {
Serial.println("Card mounted successfully");
}
fContent = SD.open("/file" + String(file_num, DEC) + ".wav", FILE_WRITE);
fContent.write((const byte *)header, sizeof(header));
Serial.println("file" + String(file_num, DEC) + " file created, recording started");
}
}
// Send what we just received back to the codec
esp_err_t result_w = i2s_write(I2S_PORT, &sBuffer, bytesIn, &bytesOut, portMAX_DELAY);
// If there was an I2S write error, let us know on the serial terminal
if (result_w != ESP_OK) {
Serial.print("I2S write error.");
}
}
// DelayMicroseconds(300); // Only hear to demonstrate how much time you have
// to do things.
// Do not do much in this main loop, or the audio won't pass through correctly.
// With default settings (64 samples in buffer), you can spend up to 300
// microseconds doing something in between passing each buffer of data
// You can tweak the buffer length to get more time if you need it.
// When bufferlength is 64, then you get ~300 microseconds
// When bufferlength is 128, then you get ~600 microseconds
// Note, as you increase bufferlength, then you are increasing latency between
// ADC input to DAC output.
// Latency may or may not be desired, depending on the project.
}
void codec_setup() {
// General setup needed
codec.enableVREF();
codec.enableVMID();
// Setup signal flow to the ADC
codec.enableLMIC();
codec.enableRMIC();
// Connect from INPUT1 to "n" (aka inverting) inputs of PGAs.
codec.connectLMN1();
codec.connectRMN1();
// Disable mutes on PGA inputs (aka INTPUT1)
codec.disableLINMUTE();
codec.disableRINMUTE();
// Set pga volumes
codec.setLINVOLDB(0.00); // Valid options are -17.25dB to +30dB (0.75dB steps)
codec.setRINVOLDB(0.00); // Valid options are -17.25dB to +30dB (0.75dB steps)
// Set input boosts to get inputs 1 to the boost mixers
codec.setLMICBOOST(WM8960_MIC_BOOST_GAIN_0DB);
codec.setRMICBOOST(WM8960_MIC_BOOST_GAIN_0DB);
// Connect from MIC inputs (aka pga output) to boost mixers
codec.connectLMIC2B();
codec.connectRMIC2B();
// Enable boost mixers
codec.enableAINL();
codec.enableAINR();
// Disconnect LB2LO (booster to output mixer (analog bypass)
// For this example, we are going to pass audio throught the ADC and DAC
codec.disableLB2LO();
codec.disableRB2RO();
// Connect from DAC outputs to output mixer
codec.enableLD2LO();
codec.enableRD2RO();
// Set gainstage between booster mixer and output mixer
// For this loopback example, we are going to keep these as low as they go
codec.setLB2LOVOL(WM8960_OUTPUT_MIXER_GAIN_NEG_21DB);
codec.setRB2ROVOL(WM8960_OUTPUT_MIXER_GAIN_NEG_21DB);
// Enable output mixers
codec.enableLOMIX();
codec.enableROMIX();
// CLOCK STUFF, These settings will get you 44.1KHz sample rate, and class-d
// freq at 705.6kHz
codec.enablePLL(); // Needed for class-d amp clock
codec.setPLLPRESCALE(WM8960_PLLPRESCALE_DIV_2);
codec.setSMD(WM8960_PLL_MODE_FRACTIONAL);
codec.setCLKSEL(WM8960_CLKSEL_PLL);
codec.setSYSCLKDIV(WM8960_SYSCLK_DIV_BY_2);
codec.setBCLKDIV(4);
codec.setDCLKDIV(WM8960_DCLKDIV_16);
codec.setPLLN(7);
codec.setPLLK(0x86, 0xC2, 0x26); // PLLK=86C226h
//codec.setADCDIV(0); // Default is 000 (what we need for 44.1KHz)
//codec.setDACDIV(0); // Default is 000 (what we need for 44.1KHz)
codec.setWL(WM8960_WL_16BIT);
codec.enablePeripheralMode();
//codec.enableMasterMode();
//codec.setALRCGPIO(); // Note, should not be changed while ADC is enabled.
// Enable ADCs and DACs
codec.enableAdcLeft();
codec.enableAdcRight();
codec.enableDacLeft();
codec.enableDacRight();
codec.disableDacMute();
//codec.enableLoopBack(); // Loopback sends ADC data directly into DAC
codec.disableLoopBack();
// Default is "soft mute" on, so we must disable mute to make channels active
codec.disableDacMute();
codec.enableHeadphones();
codec.enableOUT3MIX(); // Provides VMID as buffer for headphone ground
Serial.println("Volume set to +0dB");
codec.setHeadphoneVolumeDB(0.00);
Serial.println("Codec Setup complete. Listen to left/right INPUT1 on Headphone outputs.");
}
void i2s_install() {
// Set up I2S Processor configuration
const i2s_driver_config_t i2s_config = {
.mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX),
.sample_rate = 44100,
.bits_per_sample = i2s_bits_per_sample_t(16),
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_STAND_MSB),
.intr_alloc_flags = 0,
.dma_buf_count = 8,
.dma_buf_len = bufferLen,
.use_apll = false,
.tx_desc_auto_clear = false,
.fixed_mclk = 0,
.mclk_multiple = i2s_mclk_multiple_t(I2S_MCLK_MULTIPLE_DEFAULT),
.bits_per_chan = i2s_bits_per_chan_t(I2S_BITS_PER_CHAN_DEFAULT)
};
i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
}
void i2s_setpin() {
// Set I2S pin configuration
const i2s_pin_config_t pin_config = {
.mck_io_num = I2S_PIN_NO_CHANGE,
.bck_io_num = I2S_SCK,
.ws_io_num = I2S_WS,
.data_out_num = I2S_SDO,
.data_in_num = I2S_SD
};
i2s_set_pin(I2S_PORT, &pin_config);
}
void CreateWavHeader(byte *header, int waveDataSize) {
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
unsigned int fileSizeMinus8 = waveDataSize + 44 - 8;
header[4] = (byte)(fileSizeMinus8 & 0xFF);
header[5] = (byte)((fileSizeMinus8 >> 8) & 0xFF);
header[6] = (byte)((fileSizeMinus8 >> 16) & 0xFF);
header[7] = (byte)((fileSizeMinus8 >> 24) & 0xFF);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = 0x10; // linear PCM
header[17] = 0x00;
header[18] = 0x00;
header[19] = 0x00;
header[20] = 0x01; // linear PCM
header[21] = 0x00;
header[22] = 0x02; // stereo
header[23] = 0x00;
header[24] = 0x44; // sampling rate 44100
header[25] = 0xAC;
header[26] = 0x00;
header[27] = 0x00;
header[28] = 0x10; // Byte/sec = 44100x2x2 = 176400
header[29] = 0xB1;
header[30] = 0x02;
header[31] = 0x00;
header[32] = 0x04; // 16bit stereo
header[33] = 0x00;
header[34] = 0x10; // 16bit
header[35] = 0x00;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte)(waveDataSize & 0xFF);
header[41] = (byte)((waveDataSize >> 8) & 0xFF);
header[42] = (byte)((waveDataSize >> 16) & 0xFF);
header[43] = (byte)((waveDataSize >> 24) & 0xFF);
}Дабы не тратить время уважаемых форумчан, скажу вкратце - в примере есть буфер аудиоданных sBuffer, который наполняется данными с i2s_read(), и далее отправляется обратно на i2s_write(). Я попытался его впихнуть на SD карту через fContent.write, на что тот ругнулся, т.к. буфер изначально это массив типа uint16, а файл принимает только байты. Возможных решений много, но если просто изменить тип буфера на uint8, то функция "слышать себя в наушниках" никуда не пропадает и работает прекрасно. Казалось бы, все решено!?
Ага, как бы не так. Вот пример записи какого-то местного FM-радио - https://voca.ro/19Le1GeaxIgM (ГРОМКО!!!)
Вроде что-то слышно, а вроде и нифига не слышно. При этом в наушниках во время записи слышно хорошо!
Картинка этого же файла на audacity.
Спойлер

Спойлер
Первые 3 строки с переводом в asciiКод: Выделить всё
52 49 46 46 a4 64 21 00 57 41 56 45 66 6d 74 20
R I F F d ! W A V E f m t
10 00 00 00 01 00 02 00 44 ac 00 00 10 b1 02 00
D
04 00 10 00 64 61 74 61 80 64 21 00 16 00 01 80
d a t a d !
16 80 00 80 13 00 00 80 12 00 03 80 0b 00 01 00
03 00 04 00 f8 ff 01 00 f3 ff 02 80 f2 ff 02 80
f0 7f 01 80 ee ff 03 00 f0 ff 01 00 f2 7f 04 80
fa ff 03 80 f9 7f 03 80 f9 7f 02 80 f7 ff 00 80
f6 7f 03 80 f4 7f 01 80 f4 7f 05 80 f5 ff 00 00Re: Ардуино - запись звука
чем помочь ?)) там всё на готовых библиотеках...
кто будет разбираться в библиотеках ?

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

кто будет разбираться в библиотеках ?
и ваще... у меня всё заточено под интернет))
лучше подключить рацию к интернету и писать на комп... он же сервер))
причём на компе жесткий диск... терабайт)) устанешь писать))
и да... ESP32 это позволяет...
и да... никаких выходов шумодава не требуется... делает проще - ESP32 непрерывно цифрует звук или шум с рации... когда появляется звук и пропадает шум - автоматом включается запись... всё))
Re: Ардуино - запись звука
В общем, все заработало. Пока не понимаю причины, но задача номер раз выполнена
[uquote="roman.com",url="/forum/viewtopic.php?p=4574794#p4574794"]лучше подключить рацию к интернету и писать на комп... он же сервер))
причём на компе жесткий диск... терабайт)) устанешь писать))[/uquote]
Планируется автономное устройство
[uquote="roman.com",url="/forum/viewtopic.php?p=4574794#p4574794"]лучше подключить рацию к интернету и писать на комп... он же сервер))
причём на компе жесткий диск... терабайт)) устанешь писать))[/uquote]
Планируется автономное устройство
Зачем изобретать колесо, если есть готовый выход?и да... никаких выходов шумодава не требуется... делает проще - ESP32 непрерывно цифрует звук или шум с рации...
Re: Ардуино - запись звука
у меня тот же вопрос))shaaimars писал(а):Зачем изобретать колесо, если есть готовый выход?
купил готовый диктофон... в виде флешки))
кнопочку нажал - говоришь... в ПК вставил - слушаешь... сейчас такой фигня... навалом))
Добавлено after 3 minutes 42 seconds:
а давайте подключим рацию к интернету !
будем записывать звук с рации и передавать запись на комп... всё по той же рации... вместо модема ))
есть готовые рации DMR которые работают как модем... но они дорогие... от 500 баксов))
дешевле сделать самому... из обычной аналоговой.
вот это уже прикольно будет))
Добавлено after 38 minutes 45 seconds:
а что у нас с потовой передачей звука ?
-через 3G работает плохо...
через бесплатный Wi-Fi надо ещё протестить... в разных местах... ))
сейчас бесплатный Wi-Fi есть во многих местах города... в парках... в метро... и т.д.