Ардуино - запись звука

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

как мне эти байты упаковать в пакеты отправить через sim800 и принять потом как угодно.
Реклама
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

как эти байты упаковать в пакеты отправить через sim800... я без понятия))
я спросил как у тебя работает интернет... чтоб было понятней... но ответа так и не услышал...
Реклама
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

Роман, вот финальная часть моего (нашего) рекордера из этой темы

Код: Выделить всё

ISR(TIMER2_COMPA_vect) {

ADMUX = 0x61; // set ADC to read pin A1, ADLAR to 1 (left adjust)
  sbi(ADCSRA, ADSC); // start ADC sample
  while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
  recByteCount++; // increment sample counter
  bufByteCount++;
  if (bufByteCount == 128 && bufWrite == 0) {
    bufByteCount = 0;
    bufWrite = 1;
  } else if (bufByteCount == 128 & bufWrite == 1) {
    bufByteCount = 0;
    bufWrite = 0;
  }

  if (bufWrite == 0) {
    buf00[bufByteCount] = ADCH;
  }
  if (bufWrite == 1) {
    buf01[bufByteCount] = ADCH;
  }
Здесь ADCH пишется в буфер потому что на флэшку закидываем

Как передать ADCH на комп? По UART?

таймер лопатит же на частоте 16кгц задавая битрейт

Код: Выделить всё

void Setup_timer2() {

  TCCR2B = _BV(CS21);  // Timer2 Clock Prescaler to : 8
  TCCR2A = _BV(WGM21); // Interupt frequency  = 16MHz / (8 x 125 + 1) = 16000Hz
  OCR2A = 125; // Compare Match register set to 125 (было 90) Перешл на 16кгц

}
мне с этой же частотой в сериал гнать результат преобразования АЦП?

Код: Выделить всё

Serial.println(ADCH);
Или отправлять в сериал по 512 байт и тогда думать как их правильно складывать на стороне ПК?
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

olegue писал(а):мне с этой же частотой в сериал гнать результат преобразования АЦП?
да.
olegue писал(а):Или отправлять в сериал по 512 байт и тогда думать как их правильно складывать на стороне ПК?
лучше отправлять по 1 байту.




ISR(TIMER2_COMPA_vect) {

ADMUX = 0x61; // set ADC to read pin A1, ADLAR to 1 (left adjust)
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready


Serial.println(ADCH);


recByteCount++; // increment sample counter
bufByteCount++;
if (bufByteCount == 128 && bufWrite == 0) {
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 128 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}

if (bufWrite == 0) {
buf00[bufByteCount] = ADCH;
}
if (bufWrite == 1) {
buf01[bufByteCount] = ADCH;
}


порядок такой:

1-настройка АЦП.
ADMUX = 0x61; // set ADC to read pin A1, ADLAR to 1 (left adjust)
2-запуск преобразования АЦП.
sbi(ADCSRA, ADSC); // start ADC sample
3-ждём окончания преобразования АЦП.
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
4-как только преобразование закончится сразу отправляем 1 байт в сериал.
Serial.println(ADCH);

*вместо Serial.println(ADCH); можно написать просто UDR = ADCH;
UDR - это регистр сериал. Как только мы записываем в регистр UDR данные, то сериал автоматически переходит в режим передачи 1 байта.

Но прежде чем гнать данные по сериалу надо сначала настроить скорость сериала.

А какая нам нужна скорость ?
Считаем:
16кгц это частота семплов. Или 16.000 байт/c.
сериал - это один байт: 1 стартовый бит + 8 бит данных + 1 стоповый бит = 10 бит.
сериал.jpg
(13.22 КБ) 37 скачиваний
а нам надо гнать 16.000 байт/c.
значит минимальная скорость сериала должна быть 16.000 х 10 = 160.000 бит/с. (или 160 кбит/c)

что бы сериал нормально работал (без ошибок) скорость сериала должна быть в полтора раза (а лучше в 2 раза) больше...
т.е. нам нужна скорость 250.000 бит/c. (или 250 кбит/c)

Ардуина поддерживает скорость 250 кбит/c ?

Максимальная скорость сериала зависит от кварца...
В Ардуино стоит кварц 16 МГц...

Открываем даташит...
скорость сериала.jpg
(81.42 КБ) 35 скачиваний
да, с кварцем 16 МГц максимальная скорость сериала 1 Мбит/с. (а в режиме удвоенной скорости 2 Mбит/с).

значит на 250 кбит/c должно работать нормально))
:)
правда... с такой высокой скоростью по сериалу мы ещё не передавали )) надо проверить на практике...
:roll:
када делали радиоуправление...
https://www.radiokot.ru/forum/viewtopic ... 8&t=185219
мы гнали по сериалу со скоростью в несколько раз меньше))
https://www.radiokot.ru/forum/download/ ... ?id=356834
это потому что у нас не было кварца 16 МГц... приходилось снижать скорость))
:dont_know:

а теперь самый главный вопрос... подключение к ПК... ))
на ПК мы можем запустить программу "терминал" и посмотреть наши байты... 16.000 байт/c.
правда в терминале почему то нет скорости 250 кбит/c...
терминал.jpg
(61.15 КБ) 48 скачиваний
странно... :dont_know:

а теперь самый главный вопрос... мы хотим просто посмотреть данные на ПК ?
8)
или послушать звук на ПК ?
:music:

если мы хотим послушать звук на ПК... то у меня нет программ для ПК которые воспроизводят звук по сериалу ))

у меня все программы на ПК работают по Ethernet (или Wi-Fi)... короче только по Интернету...
по сериалу они не работают))
:tea:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

Тогда какокй вывод? Как послушать звук на компьютере?
Реклама
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

чтоб послушать звук на компьютере... надо найти/купить/собрать/украсть (нужное подчеркнуть :))) ) Ethernet модуль...
для него программы есть.
:tea:
или найти/купить/собрать/украсть Wi-Fi модуль...
правда для Wi-Fi модуля у меня программ нет... но там всё просто... Wi-Fi модуль по умолчанию работает через обычный сериал))
:tea:
я купил на Али Ethernet модуль W5500... 250 руб/штука ))
через него можно гнать на ПК всё что угодно... аудио... видео... данные... модуль работает стабильно...))
:roll:
ещё собираю самодельный модуль для Ардуино...
https://www.radiokot.ru/forum/viewtopic ... 1#p4312241
но процесс этот не быстрый))
потому что мне никто не помогает...
:dont_know:
Реклама
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

нельзя ли использвоать в качестве wifi модуля esp-01?

Добавлено after 1 minute 44 seconds:
но как я пониммаю что если скорость сериала маленькая , а wifi esp-01 будет подключено через сериал то опять те же грабли с недостаточной пропускной способностью сериала. Правильно понимаю?

Добавлено after 9 minutes 38 seconds:
здесь человек решает как принять и озвучить по UART звук 8кгц 16бит . Меня кстати, 8 кгц тоже устраивает, вполне разборчиво.

Добавлено after 18 seconds:
https://www.cyberforum.ru/csharp-net/thread2377310.html
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

olegue писал(а):нельзя ли использвоать в качестве wifi модуля esp-01?
теоретически... можно))
:roll:
olegue писал(а):но как я пониммаю что если скорость сериала маленькая , а wifi esp-01 будет подключено через сериал то опять те же грабли с недостаточной пропускной способностью сериала. Правильно понимаю?
правильно))

esp-01 собран на базе ESP8266..

в инете много статей по esp-01
https://3d-diy.ru/wiki/arduino-moduli/w ... ul-esp-01/

по умолчанию esp-01 работает по сериал 9600
но в настройках (через АТ-команды) можно менять скорость... плоть до 115200... кажись... не помню)) надо смотреть инструкцию...
в инете много инструкций к esp-01...
:roll:

https://www.cyberforum.ru/csharp-net/thread2377310.html
да... можно передавать звук по сериалу на ПК... через COM...
но для этого надо написать программу на ПК...
например для Windows (пакет .NET) есть есть класс SerialPort.
проблема в том что я не пишу в .NET )) я пишу в Java.
в Java тоже есть класс... но не с завода... а самодельный )) кем то написанная библиотека...
проблема в том что я не пользуюсь сериалом)) у меня всё заточено под Интернет.
:roll:
Последний раз редактировалось roman.com Вт ноя 01, 2022 18:44:31, всего редактировалось 1 раз.
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

только вот что-то я не догоняю где я компе приму данные переданные через wifi?

Добавлено after 1 minute 36 seconds:
там же , в сериале, так что ли?
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

1.
подключаем Wi-Fi модуль к Ардуино по сериал.
Wi-Fi.jpg
(65.09 КБ) 40 скачиваний
всё управление Wi-Fi модулем и передача данных (звука) идёт по сериал.

2.
Wi-Fi модуль подключается к ПК...
-если в ПК есть встроенный Wi-Fi (в любом ноутбуке есть Wi-Fi) то подключаемся напрямую к ПК...
-если в ПК нет встроенный Wi-Fi (ПК) то подключаемся к ПК через Wi-Fi роутер...

3.
olegue писал(а):где я компе приму данные переданные через wifi?
принимать данные на компе можно с помощью любой программы...
https://www.radiokot.ru/forum/viewtopic ... 7&start=42

-например в обычном браузере...
https://www.radiokot.ru/forum/download/ ... ?id=386448
-или в обычном плеере...
https://www.radiokot.ru/forum/download/ ... ?id=386473
-или самодельной программе...
https://radiokot.ru/forum/download/file.php?id=376916
...
и т.д.
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

ничего не понимаю
допустим связка Атмега(Ардуина)+esp01 по UART.
на еsp01 по UART данные я отпавил допустим, не раз это делал. А как эти данные теперь отправить на комп.
С датчиков , например температуры, я отправлял данные посредством http запросов например на сервер, там же их и принимал.

А теперь когда у меня поток байт идет как его отправить на сервер. http уже не годится. Значит надо как-то сразу напрямую в порт
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

во-первых скорость...
olegue писал(а):wifi esp-01 будет подключено через сериал то опять те же грабли с недостаточной пропускной способностью сериала. Правильно понимаю?
обычно Ардуино работает по сериалу максимум 115200... что явно мало))
поэтому я давно уже отказался от сериала и перешёл на SPI !!!
у меня всё работает по SPI... радио... интернет... экраны... и т.д.

https://www.radiokot.ru/forum/download/ ... ?id=356834

поэтому у меня нет никаких проблем со скоростью))

в ардуино SPI работает на скорости 4 Мбит/с (при удвоенной скорости 8 Мбит/с) !!!
советую тебе тоже переходить на SPI ))
:tea:

во-вторых...
olegue писал(а):допустим связка Атмега(Ардуина)+esp01 по UART.
на еsp01 по UART данные я отпавил допустим, не раз это делал. А как эти данные теперь отправить на комп.
тут вариантов много...))

например так:
1- делаем свой сервер Атмега(Ардуина)+esp01 по UART.
2- подключаемся к своему серверу обычным браузером... или плеером... и слушаем музыку))
:music:
наш самодельный сервер Атмега(Ардуина)+esp01 по UART... будет работать точно так же как обычный сервер в интернете.
:tea:

другой вариант (как думаю я):
1- Атмега(Ардуина)+W5500 по SPI... просто передаёт данные на комп...
2- комп просто принимает данные и воспроизводит звук))
:music:
для этого у меня есть самодельная программа.))

только с Ардуино принимать звук я не пробовал... принимал только разные данные...
надо будет попробовать принимать и звук с Ардуины))
думаю это сделать не сложно... Главное что скорость SPI это позволяет))
:tea:

нормальные Wi-Fi модули тоже работают по SPI...
например ESP32 работают по SPI... до 80 Мбит/с !!! ... кажись)) точно не помню... надо уточнить))
знаю что к ESP32 по SPI можно подключить всё что угодно))

экран... по SPI... до 10 Мбит/с
lcd.jpg
(49.79 КБ) 36 скачиваний
экраны.jpg
(51.33 КБ) 29 скачиваний
флешки по SPI... до 10 Мбит/с
флешка.jpg
(66.1 КБ) 33 скачивания
радио... по SPI... до 10 Мбит/с
радио.jpg
(61.83 КБ) 40 скачиваний
и даже камеры))
камеры.jpg
(72.02 КБ) 33 скачивания
...
короче всё что угодно... по SPI... работает намного быстрее))
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

roman.com писал(а):2- комп просто принимает данные и воспроизводит звук))
я к сожалению , не знаком с этим способом приема данных
давайте поподробнее.
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

Ок. Разбираюсь.

Хотел бы вернутся к старому Uart. что если меня устроит, скажем даже не 8 кгц, а 6 или даже 5кгц. Реально ли что бы передать такой звук на скорости 115200?
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

поподробнее.))

1. берём комп.
комп.jpg
(22.34 КБ) 38 скачиваний
2. качаем программу "Server"
Server_TCP.rar
(6.92 КБ) 55 скачиваний
3. запускаем файл Server_TCP.jar... на экране компа появляется вот такое окно...
окно.jpg
(37.42 КБ) 38 скачиваний
4. берём Атмега(Ардуина)+esp01
Ардуино_ESP_01.jpg
(50.39 КБ) 32 скачивания
5. с помощью Атмега(Ардуина)+esp01 по UART подключаемся к компу...
точно так же как ты подключался и отправлял данные посредством http запросов на сервер.
Только теперь в роли сервера будет твой комп))
в настройках своей Атмега(Ардуина)+esp01 не забудь измень IP адрес сервера (куда ты раньше отправлял данные) на IP адрес своего компа ))
комп_Ардуино_ESP_01.jpg
(39.64 КБ) 37 скачиваний
6. Теперь все данные что ты отправляешь с помощью Атмега(Ардуина)+esp01 по UART... теперь будут отображаться в окне твоего компа ))
всё)) вот так вот просто всё работает.
точно так же можно передавать и звук...
:tea:

Программа "Server" это аналог программы "терминал" ))
Только программа "терминал" работает по сериалу...
А программа "Server" работает по Интернету...
Вот и вся разница))

Надеюсь очень подробно объяснил))
olegue писал(а):Хотел бы вернутся к старому Uart. что если меня устроит, скажем даже не 8 кгц, а 6 или даже 5кгц. Реально ли что бы передать такой звук на скорости 115200?
считаем...

8 кгц это частота семплов. Или 8.000 байт/c.
сериал - это один байт: 1 стартовый бит + 8 бит данных + 1 стоповый бит = 10 бит.

значит минимальная скорость сериала должна быть 8.000 х 10 = 80.000 бит/с. (или 80 кбит/c)

что бы сериал нормально работал (без ошибок) скорость сериала должна быть в полтора раза (а лучше в 2 раза) больше...
т.е. 115200 пойдёт))
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

можно начать с небольших битрейтов, а потом повышать. я записал несколько образцов 5, 6, 7, 8 и даже 4. До 5 кгц вполне нормально речь разбирается, только вот это речь диктора. Где то читал , что применив специальное кодирование можно даже 2кгц разборчивый звук получить.
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

olegue писал(а):применив специальное кодирование можно даже 2кгц разборчивый звук получить.
Например в телефонной связи обычно используется частота семплов 8 кГц.
Поток соответственно 8 бит ч 8 семплов = 64 кбит/c.
Голос слышно хорошо.

Не знаю что имеется видду под словом "кодирование"))
Возможно имеется ввиду "сжатие"... с помощью разных кодеков.

В цифровых рациях есть сжатие... с помощью разных кодеков.
https://www.youtube.com/watch?v=nOYVoR3B2hY
В сотовых телефонах тоже есть сжатие... с помощью разных кодеков.
https://www.youtube.com/watch?v=nOYVoR3B2hY
Везде есть сжатие... с помощью разных кодеков.))

Но это всё только чтобы уменьшить объём флешки или уменьшить скорость передачи... бит/c.

А в студиях звукозаписи сжатие не используют)) Там качество наивысшее... )) но это уже отдельный вопрос...
:roll:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

roman.com писал(а):6. Теперь все данные что ты отправляешь с помощью Атмега(Ардуина)+esp01 по UART... теперь будут отображаться в окне твоего компа ))
всё)) вот так вот просто всё работает.
точно так же можно передавать и звук...
ничего не понял.
Ардуина работает с ESP по uart - это понятно и передает ей какие то данные (байты), но
но ESP Работает счас у меня с сервером по http, ,
вот:

Код: Выделить всё

   HTTPClient http;    //Объявить объект класса HttpClient
    http.begin(client, "http://********.lh1.in/input.php"); 
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    String httpRequestData = "a="+String(i); 
    int httpCode = http.POST(httpRequestData);  
т.е на сервер есть файл input.php. который парсит данные переменной а

Роман, можно еще подробнее. Как передать байты в вашу программу server_tcp.jar. Яву поставил, программу запустил.
roman.com
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

во-первых...
для начала подключись к программе "Server" с помощью браузера...

открываем любой браузер и пишем IP адрес компа (на котором работает программа "Server").
какой IP твоего компа ? IP своего компа я знаю - 192.168.0.100
поэтому я пишу в браузере IP своего компа - 192.168.0.100 и мой браузер подключился программе "Server".
Server.jpg
(46.19 КБ) 42 скачивания
во-вторых...
весь код твоей программы я не видел...
но для начала в строке адреса сервера (куда ты передаёшь данные)

http.begin(client, "http://********.lh1.in/input.php");

укажи IP адрес своего компа...
какой IP твоего компа ? IP своего компа я знаю - 192.168.0.100

http.begin(client, "http://192.168.0.100"); - это IP адрес моего кома)) твой я не знаю...
Ответить

Вернуться в «AVR»