Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн ноя 21, 2022 16:16:52



for (xRX=0; xRX<RX_len; xRX++) {
din_byte_wavr[xRX] = (byte) RX_int[xRX];//int > din(динамик)
};

//Запись аудиоданных в выходной буфер линии передачи данных.
RX_line.write(din_byte_wavr, 0, RX_len);//RX_len

Роман можете ли сделать буферизованый вывод, а не по 1 пакету?

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

Пн ноя 21, 2022 21:56:03

вывод и так буферизованный...
выше писал... все пакеты накапливаются в сокете... нафига ещё один делать буфер...

поставь задержку и жди пока пакеты накопятся в сокете... сколько надо столько и сделай...

допустим надо 1 секунду...

останавливаем поток и ждём 1 секунду....

if (flag_bufer == 0) {
// флаг буфер
flag_bufer = 1;
//останавливаем поток на 1 с.
//ждём пока накопятся пакеты в буфере сокета...
try {Thread.sleep(1000);} catch (Exception e){}
};
Udp.txt
(18.01 KiB) Скачиваний: 44

а тем временем... наша ардуина уже во всю передаёт пакеты... по Интернету)) 10 Мбит/с
схема.jpg
(91.86 KiB) Скачиваний: 45

схема_тест.jpg
(123.74 KiB) Скачиваний: 44

скорость ардуины до 10 Мбит/с ! Карл ! )))
это тебе не смешные 115200 сериала ))
:))
вот что могучий Ассемблер с ардуиной делает ))
:idea:
надо ещё добавить в ардуину MII интерфейс... скорость увеличится ещё почти в два раза))
:tea:

правда всё это без учёта контрольный сумм...
-IP заголовка
-UDP пакета
-Ethernet пакета
-про шифрование я вообще молчу))
:tea:

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

Вт ноя 22, 2022 12:28:45

ясно , но у меня нету 10мбит

Добавлено after 13 minutes 29 seconds:
не , такой буфер не прокатит, это лишь отрочка воспроизвдения

Я бы хотело буфер который бы работал в два потока,
необошльшая пауза в начале, сбор пакетов в массив1, потом воспроизвдение массива1 и одновременный сбор массива2, что-то подобии того как сделао в ардуино для сброса на флэшку.

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

Вт ноя 22, 2022 15:57:40

olegue писал(а):необошльшая пауза в начале, сбор пакетов в массив1, потом воспроизвдение массива1 и одновременный сбор массива2, что-то подобии того как сделао в ардуино для сброса на флэшку.

возьми код из ардуины...

ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready

if (bufWrite == 0) { // флаг выбор буфера 0
//buf00[bufByteCount] = ADCH;
buf00[bufByteCount] = bufByteCount;
}
if (bufWrite == 1) { // флаг выбор буфера 1
//buf01[bufByteCount] = ADCH;
buf01[bufByteCount] = bufByteCount;
}

bufByteCount++; // счёт буфер

if (bufByteCount == 256 && bufWrite == 0) { // если 256 и флаг выбор буфера 0
bufByteCount = 0;
bufWrite = 1; // флаг выбор буфера 1
myGsm.write(buf00, 256); // буфер 0 полный. Передача буфера 0.
}
if (bufByteCount == 256 && bufWrite == 1) { // если 256 и флаг выбор буфера 1
bufByteCount = 0;
bufWrite = 0; // флаг выбор буфера 0
myGsm.write(buf01, 256); // буфер 1 полный. Передача буфера 1.
}

}

и вставь его в яву...

if (bufWrite == 0) { // флаг выбор буфера 0
//buf00[bufByteCount] = ADCH;
//buf00[bufByteCount] = bufByteCount;
for (xRX=0; xRX<RX_len; xRX++) {
buf00[xRX + st_buf00] = (byte) RX_int[xRX];//int > din(динамик)
};
st_buf00 = RX_len; // счёт буфер
}
if (bufWrite == 1) { // флаг выбор буфера 1
//buf01[bufByteCount] = ADCH;
//buf01[bufByteCount] = bufByteCount;
for (xRX=0; xRX<RX_len; xRX++) {
buf01[xRX + st_buf01] = (byte) RX_int[xRX];//int > din(динамик)
};
st_buf01 = RX_len; // счёт буфер
}

bufByteCount++; // счёт буфер

if (bufByteCount == 2 && bufWrite == 0) { // если 256 и флаг выбор буфера 0
bufByteCount = 0;
bufWrite = 1; // флаг выбор буфера 1
st_buf00 = 0; // счёт буфер
//myGsm.write(buf00, 256); // буфер 0 полный. Передача буфера 0 в модуль.
RX_line.write(buf00, 0, 2048);// буфер 0 полный. Передача буфера 0 в плеер ява.
}
if (bufByteCount == 2 && bufWrite == 1) { // если 256 и флаг выбор буфера 1
bufByteCount = 0;
bufWrite = 0; // флаг выбор буфера 0
st_buf01 = 0; // счёт буфер
//myGsm.write(buf01, 256); // буфер 1 полный. Передача буфера 1 в модуль.
RX_line.write(buf01, 0, 2048);// буфер 1 полный. Передача буфера 1 в плеер ява.
}
Udp.txt
(20.07 KiB) Скачиваний: 53

вместо таймера - сокет...
вместо модуля - плеер...

када прилетает пакет срабатывает прерывание сокета (точнее срабатывает прерывание процессора компа... который запихивает все входящие пакеты в буфер сокета)

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

можно передавать UDP пакеты по 1024 байт...
можно передавать UDP пакеты по 1 байту...

только никто по одному байту не передаёт))
минимальный размер UDP пакета 18 байт...
если размер UDP пакета меньше 18 байт то роутер выдаст ошибку.

если передавать по 1 байту
1 байт.
то модуль допишет 17 байт за тебя автоматом ))
00000000000000000
на выходе модуля получим те же 18 байт
100000000000000000

только нафига всё это надо... мне например вообще не понятно...

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

вместо того что бы заниматься всякой ерундой... уже который день)) со всякими буферами... лучше бы настроил свой модуль... чтоб он не терял пакеты и байты... тогда всё будет хорошо))
:tea:

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

Вт ноя 22, 2022 17:08:17

Код:
   if (bufByteCount == 2 && bufWrite == 0) { // если 256 и флаг выбор буфера 0
       bufByteCount = 0;
       bufWrite = 1; // флаг выбор буфера 1
       st_buf00 = 0;              // счёт буфер
       //myGsm.write(buf00, 256); // буфер 0 полный. Передача буфера 0.
       RX_line.write(buf00, 0, 10240);//
      }
      if (bufByteCount == 2 && bufWrite == 1) { // если 256 и флаг выбор буфера 1
       bufByteCount = 0;
       bufWrite = 0; // флаг выбор буфера 0
       st_buf01 = 0;              // счёт буфер
       //myGsm.write(buf01, 256); // буфер 1 полный. Передача буфера 1.
       RX_line.write(buf01, 0, 10240);//
      }


Такой буфер я тоже сделал, только у Вас получилось более компактно и красиво.
Только вот пока RX-line не проиграет один буфер второй не начнет наполнятся.

я говорил про фоновое наполнение буфера2 в момент проигрыша буфера1
в данном коде такое не происходит. В итоге я , конечно запустил этот код и он ожидаемо отработал равнопериодными затыками с частой формирования буферов

roman.com писал(а):только нафига всё это надо... мне например вообще не понятно...

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


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

на 10мбит канале такой проблемы и в помине не будет.

Короче, вопрос такой. Как сделать нормальную буферизацию? Я немного почитал по яву, и в ней можно создавать независимые потоки thread. но как это сделать пока не разобрался.

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

Вт ноя 22, 2022 18:13:08

olegue писал(а):пока RX-line не проиграет один буфер второй не начнет наполнятся.

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

на 10мбит канале такой проблемы и в помине не будет.

ещё раз... повторим пройденое))

1.
скорость канала нас не волнует.
115200 или 10 мбит... главное чтоб звук успевал передаваться))
8 бит х 8 кгц = 64 кбит - достаточно.

буферизация нужна из-за джиттера.

https://ru.wikipedia.org/wiki/Джиттер

к примеру скайп.
пакеты идут с разной задержкой... несколько миллисекунд...
Skype_ (1).jpg
(203.43 KiB) Скачиваний: 32

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

а сколько у тебя задержка ? пол часа ? )) ну тогда добавь задержку на пол часа...
:)))

Добавлено after 10 minutes 19 seconds:
Я немного почитал по яву, и в ней можно создавать независимые потоки thread. но как это сделать пока не разобрался.

очень просто))

в любом месте программы (после main) добавь поток...

в самодельном скайпе куча потоков)) звук... видео... текст... данные... всё в отдельных потоках... чтоб не пересекались))
особенно звук с микрофона и звук на динамик не должны пересекаться...


создадим да потока в яве... в дополнение к главному потоку (main):

////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////поток 1 TX_wav:
Thread Thready_1 = new Thread(new Runnable()
{
public void run() // поток 1
{


// сюда пишем свой код...


} //run()
});//Thread(new Runnable()
Thready_1.start(); // start поток 1
////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////поток 2 RX_wav:
Thread Thready_2 = new Thread(new Runnable()
{
public void run() // поток 2
{


// сюда пишем свой код...


} //run()
});//Thread(new Runnable()
Thready_2.start(); // start поток 2
////////////////////////////////////////////////////////////////////////////////

итого: у нас 3 потока в яве...
-(main)
-поток 1
-поток 2
:tea:

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

ура !!! )) у нас появилась ещё одна головная боль !
:)))

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

Вт ноя 22, 2022 22:11:43

roman.com писал(а):115200 или 10 мбит... главное чтоб звук успевал передаваться))
8 бит х 8 кгц = 64 кбит - достаточно.


согласен, но что-то идет не так. Вероятно придется вернуться о исследованию модуля и канала.

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

Вт ноя 22, 2022 23:59:11

первая умная мысль)) все нормальные люди начинают с настройки радиоканала... а потом уже передают...
мой_1.jpg
(233.59 KiB) Скачиваний: 37


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

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

1.
загружаем в изернет модуль пакет... команда 0x24
2.
загружаем команду передачи SEND... команда 0x01
3.
читаем статус... ответ 0x01
читаем статус... ответ 0x01
читаем статус... ответ 0x01
читаем статус... ответ 0x00 (по окончании передачи статус меняется на 0х00)
после этого можно загружать в изернет модуль следующий пакет.
4.
переходим к пункту 1.

примерно вот так работает изернет модуль))

у тебя должно быть примерно так же... только у тебя другие команды...
:tea:

можно проверить скорость модуля...
передаём 1 пакет/c - смотрим анализатор - нормально))
передаём 10 пакет/c - смотрим анализатор - нормально))
передаём 100 пакет/c - смотрим анализатор - потеря байт...
всё ясно))
:tea:

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

Ср ноя 23, 2022 10:51:49

немного офтоп

https://github.com/tabatsky/NetworkingA ... /Main.java

перебираю тут в учебных целях код
вот этот код компилируется нормально, но не "видит" микрофон
Посмотрите пож у себя.

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

Ср ноя 23, 2022 14:23:35

import java.io.OutputStream;
import java.net.ServerSocket;
это для TCP...

нормальные люди передают звук по UDP...))

import java.net.DatagramPacket;
import java.net.DatagramSocket;
это для UDP...

долго ковыряться... проще по новой написать))

микрофон...

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

Сб ноя 26, 2022 00:19:36

где наш звук ?))
схема_тест.jpg
(117.29 KiB) Скачиваний: 55

159 пак/с * 20 байт = 3000 байт/с.

а для передачи звука надо 8000 байт/с.

надо немного подкрутить программу... поднять скорость в 3 раза... и можно уже передавать звук ))
:tea:

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

Пн ноя 28, 2022 16:05:10

нету звука!
Тема какая-то беспросветная!

может попытаться с esp по wifi передать звук попробовать, а потом уже к sim800 вернуться.

Добавлено after 55 minutes 15 seconds:
попробую тправить через Serial в Esp01 и принять по wifi. по крайней мере сериал справлвяется с потоком 64кбит.

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

Пн ноя 28, 2022 18:34:09

olegue писал(а):Тема какая-то беспросветная!

:))
это потому что ты всё делаешь не последовательно...
сначала надо настроить радио канал... измерить скорость... и добиться стабильной работы... а потом уже всё остальное...

а я сразу сказал что надо начинать с Ethernet... на худой конец WiFi...
:tea:

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

Вт ноя 29, 2022 12:00:41

roman.com, у Вас есть программа чтения потокового аудио с ком порта компьюетра?

Добавлено after 39 seconds:
может быь на Яве что-то писали уже?

Добавлено after 1 minute 17 seconds:
цель- узнать нормально ли в через компорт течет поток 64кбс

Добавлено after 38 minutes 17 seconds:
olegue писал(а):Тема какая-то беспросветная!

:))
это потому что ты всё делаешь не последовательно...


то что я делаю это все по своему и так как себе представляю, - это совершенно нормальное явление. иначе бы и не о чем было поговорить.

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

Вт ноя 29, 2022 14:50:40

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

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

Вт ноя 29, 2022 15:05:00

тут компорт как бы промежуточное звено.

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

Вт ноя 29, 2022 16:49:16

у меня тоже есть промежуточное звено)) и не одно... ))

добавим в наш самодельный изернет модуль вывод INT... сделаем как в заводском модуле))
открываем протеус... смотрим...
1. загрузка байт в модуль... сработал вывод INT...
2. загрузка байт в модуль завершена... сработал вывод INT...
3. передача байт по интернету завершена... сработал вывод INT...
протеут_0.jpg
(20.05 KiB) Скачиваний: 30

тестируй свою ардуину в протеусе... очень удобно))
ардуина в протеусе)).jpg
(96.96 KiB) Скачиваний: 31

:tea:

Добавлено after 31 minute 55 seconds:
далее.. поднимаем скорость))
а как поднять скорость ?
самый простой вариант - увеличить UDP пакет...
в прошлый раз передавали по 18 байт...
в UDP пакете есть ещё заголовок 42 байт + преамбула 8 байт + межпакетный интервал 12 байт... выше писал))
по 18 байт
схема_тест.jpg
(117.29 KiB) Скачиваний: 28

получили скорость 150 пак/с * 20 байт = 3000 байт/с. (грубо)

увеличим пакет до 50 байт...
протеус_1.jpg
(21.95 KiB) Скачиваний: 28

проверяем...
схема.jpg
(114.75 KiB) Скачиваний: 37

получили скорость 102 пак/с * 50 байт = 5100 байт/с.

а для передачи звука надо 8000 байт/с.

аааа ! )) чуть-чуть не хватает))
:))

можно ещё увеличить пакет... до максимального 1472 байта...
но проблема в том что ОЗУ ATmega8 больше ~ 100 байт не помещается)) в нашей конкретной схеме...
значит надо или менять схему... и брать вместо ATmega8 например ATmega328
ОЗУ ATmega328 в два раза больше ))

Добавлено after 4 minutes 53 seconds:
а шо делать ?
:dont_know:
разбираем подробно... смотрим протеус...))
-оцифровка ADC - 70 микросекунд ))
-таймер ... ~ ... меньше 1 мс
-передача по SPI - 2 мс
-расчёт CRC32 - 8 мс

больше всего времени тратится на расчёт CRC32...
надо эту часть программы оптимизировать))
:tea:

Добавлено after 8 minutes 43 seconds:
далее...
CRC32 - это 4 байта...
для правильного расчёта CRC32 надо выровнять пакет UDP - сделать кратным 4... тогда всё нормально))
CRC32.jpg
(104.76 KiB) Скачиваний: 37

а как посчитать CRC32 если пакет UDP - не кратный 4 ?
ээээ... вот в этой части мы застряли... ))
:roll:

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

Пт дек 02, 2022 01:01:20

немного подкрутили программку...
теперь быстрей считаем CRC32 - 7 мс вместо 8 мс ))
получили скорость 116 пак/с * 50 байт = 5800 байт/с.
схема_5800.jpg
(138.4 KiB) Скачиваний: 37

а для передачи звука надо 8000 байт/с.

аааа ! )) чуть-чуть не хватает))
:))
но главное мы сделали другое...
:roll:
roman.com писал(а):а как посчитать CRC32 если пакет UDP - не кратный 4 ?
ээээ... вот в этой части мы застряли... ))

очень просто)) делать столько интераций буфера CRC32 сколько байт в пакете ))
буфер CRC32.jpg
(19.13 KiB) Скачиваний: 37

теперь мы передаём пакеты любой длины... и быстрее на 10 % ))
замечательно))
:tea:

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

Ср дек 21, 2022 20:11:24

да, я был почти у цели!

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

Чт дек 22, 2022 10:17:51

надо было начинать с Ethernet... там скорость стабильная и пакеты не теряются))
:tea:
Ответить