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

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

Ср ноя 16, 2022 17:59:22

потеря байт.jpg
(201 KiB) Скачиваний: 22

olegue писал(а):может просто не пролазит в в канал UART 115200+ GPRS?

может буфер UART 115200+ GPRS переполняется и не успевает передавать байты... что мало вероятно))
это можно проверить отдельно...
начиная с простой проверки скорости GPRS...

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

да в принципе всё можно проверить отдельно...
:tea:

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

Ср ноя 16, 2022 18:18:48

Код:
 


TCCR2B = _BV(CS21);  // Timer2 Clock Prescaler to :
TCCR2B = _BV(CS20);  // Timer2 Clock Prescaler to : 32
TCCR2A = _BV(WGM21); // Interupt frequency  = 16MHz / (32 x 125 + 1) = 4000Hz
OCR2A = 125; // Compare Match register set to 125  Перешл на 4кгц




снижаю частоту дискретизации до 4000гц. Все тоже самое. Ну если уж 4кгц не пролазить.... но должно же.

Добавлено after 14 minutes 26 seconds:
Кстати брал симку другого оператора, более надежного и качественного. Но тоже ничего не изменилось.

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

Ср ноя 16, 2022 18:30:42

дело не в симке... а в твоём модуле... или глючной библиотеки ардуино))

код
ISR(TIMER2_COMPA_vect) {
//ADMUX = 0x60; // set ADC to read pin A0, 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

myGsm.write(ADCH);
}


что это ?
myGsm.write(buf00, 512);
-передача модулю Gsm буфера buf00 номер 00 размером 512 байт;

или так
if ((micros()-timerHour)>125){ /// 8 КГЦ
myGsm.write(char(1));
myGsm.write(char(2));
myGsm.write(char(3));
myGsm.write(char(4));
myGsm.write(char(5));
myGsm.write(char(6));
myGsm.write(char(7));
myGsm.write(char(9));
myGsm.write(char(0));
timerHour=micros();
}

что это ?
myGsm.write(char(1));
-передача модулю Gsm одного байта с номером 1,2,3,...

и в первом и во втором случае мы теряем байты...
сами пакеты проходят без потерь... теряются только сами байты в пакете...
:roll:
скорее всего кто-то тормозит))
:)))
или библиотека myGsm.write(char(1)); тормозит))
или сам модуль тормозит))
а может они оба тормозят))

к примеру када делали управление... мы использовали радио модули...
1. записываем данные во внутренний буфер модуля... по одному байту.
2. передаём команду SEND радио модулю
3. после получения команды SEND радио модуль передаёт в эфир данные из своего внутреннего буфера.
4. ждём пока радио модуль передаст в эфир данные из своего внутреннего буфера.
5. после этого загружаем новые данные во внутренний буфер модуля... по одному байту.

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

тут ключевое слово ЖДЁМ пока радио модуль передаст в эфир данные из своего внутреннего буфера.
если загрузить новые данные во внутренний буфер модуля... не дождавшись отправки предыдущего пакета... то будет плохо))
потеряем пакет... или потеряем данные... короче что то мы полюбому потеряем )) в зависимости от ситуации))
в наших модулях есть вывод INT... который сообщает нашему МК что данные отправлены и можно загружать новые данные.
в нашей схеме МК никогда не загрузит новые данные пока радио модуль не отправит предыдущие данные.
поэтому в нашей схеме глюков быть не может)) от слова совсем))
:tea:
а как работает твоя библиотека...
myGsm.write(char(1));
я без понятия))
:dont_know:

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

Ср ноя 16, 2022 18:50:08

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

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

Ср ноя 16, 2022 19:04:38

в другой схеме мы просто посчитали сколько требуется времени модулю для отправки данных...
и даже измерили))
https://www.radiokot.ru/forum/download/ ... ?id=386327
расчёты подтвердились))
тоже самое с изернет модулями... в них тоже есть вывод INT или (альтернативно) регистр статуса - он нам сообщает когда закончится передача...
https://www.radiokot.ru/forum/download/ ... ?id=315796
короче... радио и изернет работают одинаково.
затем мы тупо добавили delay_ms(1); перед отправкой следующих данных...
:)))
есть подозрение что ы слишком быстро отправляешь данные своему модулю... твой модуль их не успевает передавать))
ну добавь delay_ms(1); в свой модуль... может поможет))

if ((micros()-timerHour)>125){ /// 8 КГЦ
myGsm.write(char(0));
delay_ms(1);
myGsm.write(char(1));
delay_ms(1);
myGsm.write(char(2));
delay_ms(1);
myGsm.write(char(3));
delay_ms(1);
myGsm.write(char(4));
delay_ms(1);
myGsm.write(char(5));
delay_ms(1);
myGsm.write(char(6));
delay_ms(1);
myGsm.write(char(7));
delay_ms(1);
myGsm.write(char(8));
delay_ms(1);
timerHour=micros();
}

как-то так))

Добавлено after 1 minute 52 seconds:
Если есть примерный набросок кода отправки через регистры, то я мог бы попробовать.

у тебя популярный модуль sim800...
неужели никто до тебя этого не делал ? ))
я бы проверил... у меня нет такого модуля... да и вообще... не нравится мне GSM ))

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

Ср ноя 16, 2022 19:04:59

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


Есть для прозрачного режим sim800 такая настройка

AT+CIPCCFG=5,2,1024,1,0,1460,50

CIPCCFG:
(NmRetry:3-8),(WaitTm:2-10),(SendSz:1-1460),(esc:0,1) ,(Rxmode:0,1),
(RxSize:50-1460),(Rxtimer:20-1000)

Parameters
<NmRetry> Number of retries to be made for an IP packet.
<WaitTm> Number of 100ms intervals to wait for serial input before
sending the packet.
<SendSz> Size in bytes of data block to be received from serial port
before sending.
<esc> Whether turn on the escape sequence, default is TRUE.
0 Turn off the escape sequence
1 Turn on the escape sequence
<Rxmode> Whether to set time interval during output data from serial
port.
0 output data to serial port without interval
1 output data to serial port within <Rxtimer> interval.
<RxSize> Output data length for each time, default value is 1460.
<Rxtimer> Time interval (ms) to wait for serial port to output data
again. Default value: 50ms


Только в этом случае, если ждать 50мс после каждого пакета как будет достигнута синхронизация потоков передающей и приемной стороны.
На мой розум, скорость передающего потока может быть любой, поток накапливается в буфере на приемной стороне и оттуда воспрозиводиться с заданым сэмплрейтом. Или в жизни не так?

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

Ср ноя 16, 2022 19:59:48

что там происходит в реальной жизни... никто толком не знает))
GPRS протокол загадочный))
1.jpg
(66.5 KiB) Скачиваний: 26

опять AT команды...))

AT+CIPCCFG=5,2,1024,1,0,1460,50

CIPCCFG:
(NmRetry:3-8),(WaitTm:2-10),(SendSz:1-1460),(esc:0,1) ,(Rxmode:0,1),
(RxSize:50-1460),(Rxtimer:20-1000)

Параметры
<NmRetry> Количество повторных попыток, которые необходимо выполнить для IP-пакета.
<WaitTm> Количество интервалов в 100 мс для ожидания последовательного ввода перед
отправкой пакета.
<SendSz> Размер в байтах блока данных, который должен быть получен с последовательного порта
перед отправкой.
<esc> Независимо от того, включена ли escape-последовательность, значение по умолчанию равно TRUE.
0 Отключите escape-последовательность
1 Включите escape-последовательность
<<Режим Rx> Следует ли устанавливать временной интервал при выводе данных с последовательного
порта.
0 вывод данных на последовательный порт без интервала
1 выводите данные на последовательный порт в течение интервала <Rx timer>.
<<Размер Rx> Длина выходных данных для каждого времени, значение по умолчанию равно 1460.
<<Таймер Rx> Интервал времени (мс) для ожидания повторного вывода данных последовательным портом
. Значение по умолчанию: 50 мс

мда... тут прозрачным режим и не пахнет))

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

куча таймеров... не понятно зачем...
автоматическая повторная передача... NmRetry:3-8 у нас тоже было... мы её отключили... совсем))
наш модуль тупо отправляет пакеты и всё...
за контроль доставки у нас отвечает МК.
:roll:
фиг его знает что тут можно отключить... я бы всё отключил))
:tea:

Добавлено after 26 minutes 46 seconds:
olegue писал(а):скорость передающего потока может быть любой, поток накапливается в буфере на приемной стороне и оттуда воспрозиводиться с заданым сэмплрейтом. Или в жизни не так?

всё так

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

с какой скоростью передаём 8 кгц таймера ?
8000 байт/c.

сколько пакетов передаём при 1024 байта в пакете ?
8000 / 1024 байта = 7,8125 пак/c.

сколько времени между пакетами ?
128 мс

если ждать 50мс после каждого пакета... то ничего страшного))
при условии что сами пакеты передаются достаточно быстро))
:tea:

а какая у нас скорость Интернета ?
допустим 10 Мбит/c.
или 1.250.000 байт/с. или грубо 1 Мбайт/c.

сколько времени передаётся один пакет 1024 байта ?
1 Мбайт/c / 1024 байта ~ 1 мс
))

итого:
8 пак/c.
1 мс передаётся один пакет.

итого:
1 мс передаётся один пакет.
127 мс временя между пакетами.
1 мс передаётся один пакет.
127 мс временя между пакетами.
1 мс передаётся один пакет.
127 мс временя между пакетами.
1 мс передаётся один пакет.
127 мс временя между пакетами.

если ждать 50мс после каждого пакета... то ничего страшного))

1 мс передаётся один пакет.
50мс ждать после каждого пакета...
77 мс временя между пакетами.
1 мс передаётся один пакет.
50мс ждать после каждого пакета...
77 мс временя между пакетами.
1 мс передаётся один пакет.
50мс ждать после каждого пакета...
77 мс временя между пакетами.

при скорости Интернета 10 Мбит/c.
при стабильной скорости 10 Мбит/c.))
:tea:

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

Ср ноя 16, 2022 20:43:17

olegue писал(а):у тебя популярный модуль sim800...
неужели никто до тебя этого не делал ? ))


ну я тоже делаю это с ощущением что это какая-то дичь и до меня такой фигней никто не занимался.
В интернете ничего не нашел на эту тему. Но погуглить еще раз наверно не помешало бы. Здесь довольно популярный форум, но люди как-то вяло реагируют на эту тему, вижу что файлы скачиваются не одному разу, но никто ничгео не постит.
В основном сим используют для передачи температуры в 90% случаев. Я уж сильно заморочился. И если мне удастся это сделать я буду думать как мне это применить, благо что в голове идей хватает. С реализацией этих идей вот только проблема.

Добавлено after 3 minutes:
Когда

Добавлено after 2 minutes 7 seconds:
olegue писал(а):может буфер UART 115200+ GPRS переполняется и не успевает передавать байты... что мало вероятно)


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

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

Чт ноя 17, 2022 00:17:29

olegue писал(а):это какая-то дичь и до меня такой фигней никто не занимался.

это нормально))

ты можешь для начала всё отключить (всякие таймеры и ADC и т.д.) и просто для начала протестировать свой модуль ?
а потом уже думать что делать... ускорять... замедлять.. .и т.д.
))

чистый голый тест модуля.))

тест 1.
проверка максимальной скорости передачи пакетов модуля sim800.

//Код:
// берём две переменные.
unsigned int x = 0; // x - счёт
unsigned int st_pak = 0; // st_pak - счётчик пакетов

//отправляем в бесконечном цикле пакеты... на максимальной скорости))
while(true)
{

//передача модулю Gsm 1024 байт с номером пакета st_pak
//когда в буфере модуля накопится 1024 байт модуль автоматом их передаст по сети (SendSz:1024)
for (x=0; x<1024; x ++)
{
myGsm.write(st_pak); // st_pak - счётчик пакетов
};

// st_pak - счётчик пакетов
st_pak ++;
// st_pak - счётчик пакетов MAX = 255
if (st_pak == 255) {st_pak = 0;};

};
//Код END

в анализаторе трафика мы увидим пакеты... их количество... время между пакетами... и т.д.
в яве все пакеты может не увидим... ява принимает максимум до 5000 пак/c.... зависит от компа...
зато в анализаторе мы увидим все пакеты)) без исключения))

тест 2.
проверка реальной скорости передачи пакетов модуля sim800.

//Код:
// берём две переменные.
unsigned int x = 0; // x - счёт
unsigned int st_pak = 0; // st_pak - счётчик пакетов

//отправляем в бесконечном цикле пакеты... на реальной скорости))
while(true)
{

//передача модулю Gsm 1024 байт с номером пакета st_pak
//когда в буфере модуля накопится 1024 байт модуль автоматом их передаст по сети (SendSz:1024)
for (x=0; x<1024; x ++)
{
myGsm.write(st_pak); // st_pak - счётчик пакетов
};

//после передачи пакета ждём 50 мс перед отправкой следующего пакета. (Rxtimer:50)
delay_ms(50);

// st_pak - счётчик пакетов
st_pak ++;
// st_pak - счётчик пакетов MAX = 255
if (st_pak == 255) {st_pak = 0;};

};
//Код END

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

пакет 0.
000000000000000000000000000..........
пакет 1.
111111111111111111111111111..........
пакет 2.
2222222222222222222222222222......
пакет 3.
33333333333333333333333333333....
и т.д.

а обязательно устанавливать задержку delay_ms(50); ?
а что будет есть меньше или больше ? 10...100 ?
и т.д.

<<Таймер Rx> Интервал времени (мс) для ожидания повторного вывода данных последовательным портом
. Значение по умолчанию: 50 мс

а почему у нас в настройках стоит 50 мс ? мы же можем поставить 20 мс
(Rxtimer:20-1000)
:dont_know:
и т.д.

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

а мой МК (читай ардуина) фигарит 10 Мбит/c.)) 14.000 пак/c.
МК_14000.jpg
(184.93 KiB) Скачиваний: 22

на самом деле мой МК (читай ардуина) фигарит 18.000 пак/c... но приходится ограничивать... потому что мой Wi-Fi роутер за моим МК (читай ардуина) не поспевает !
мой МК (читай ардуина) смог обогнать мой Wi-Fi роутер !))
:o
:)))
а у твоего модуля какая скорость ?
:tea:

Добавлено after 1 hour 29 minutes 29 seconds:
olegue писал(а):до этого я делал все что бы ускорить отправку, счас попробую ее замедлить. Это хороший план!

а может лучше написать нормальный код ? ))

где твой код...
:roll:
TCCR2B = _BV(CS21); // Timer2 Clock Prescaler to :
TCCR2B = _BV(CS20); // Timer2 Clock Prescaler to : 32
TCCR2A = _BV(WGM21); // Interupt frequency = 16MHz / (32 x 125 + 1) = 4000Hz
OCR2A = 125; // Compare Match register set to 125 Перешл на 4кгц
допустим)) 4кгц


ISR(TIMER2_COMPA_vect) {
//ADMUX = 0x60; // set ADC to read pin A0, 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
myGsm.write(ADCH);
}
не правильно.

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;
}
опять не правильно.

if (recByteCount % 256 == 128 ) //&& recPressed == 1)
{
//rec.write(buf00, 128); // save buf01 to card

Serial.write(buf00, 128);

recByteSaved += 128;
}


if (recByteCount % 256 == 0)// && recPressed == 1)
{
//rec.write(buf01, 128); // save buf02 to card

Serial.write(buf01, 128);

recByteSaved += 128;
}


// }
опять не правильно.
----------
1.
пишем буфер 0.
if (bufWrite == 0) {
buf00[bufByteCount] = ADCH;
}
2.
//када буфер 0 заполнится передаём буфер модулю.
myGsm.write(buf00, 512);
3.
пишем буфер 1.
if (bufWrite == 1) {
buf01[bufByteCount] = ADCH;
}
4.
//када буфер 1 заполнится передаём буфер модулю.
myGsm.write(buf01, 512);
5.
переходим к пункту 1.
----------
уже лучше))
осталось посчитать тайминги...
выше писали что нельзя передавать модулю буфер чаще чем через 50 мс.
и тут куча вопросов... аж 3 штуки))
-а за сколько у нас запишется буфер 0 и 1 ?
-а за сколько мы передадим модулю буфер по сериалу ?
-а за сколько модуль передаст буфер по сети ?
ответив на эти вопросы мы узнаем... будет это работать или нет))
:tea:
-а за сколько у нас запишется буфер 0 и 1 ?
таймер пишет 4000 байт в секунду.
буфер 512 байт запишется за 512 / 4000 = 0,128 с или 128 мс.
у нас есть вагон времени !))
:tea:
-а за сколько мы передадим модулю буфер по сериалу ?
сериал 115200 байт/с.
с учётом накладных расходов... ~102400 байт/с.
буфер 512 байт мы передадим модулю за 512 / 102400 = 0,005 с или 5 мс.
у нас есть вагон времени !))
:tea:
-а за сколько модуль передаст буфер по сети ?
х.з. )) зависит от скорости сети... GPRS...
ну допустим те же ~102400 байт/с.
буфер 512 байт модуль передаст по сети за 512 / 102400 = 0,005 с или 5 мс.
у нас есть вагон времени !))
:tea:
итого:
128 мс. запись буфера.
из них:
5 мс. передача по сериалу.
5 мс. передача по сети.
итого:
128 мс. - 5 мс. - 5 мс. = 118 мс. у нас осталось в запасе свободного времени)) можем ещё что-нибудь сделать))
сбегать заварить чай))
:tea:

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

Чт ноя 17, 2022 12:44:59

Код:

if ((millis()-timerHour)>3)
{
 
   for (int x=0; x<1024; x ++){
      myGsm.write(st_pak); // st_pak - счётчик пакетов
    };
  // st_pak - счётчик пакетов
  st_pak ++;
  // st_pak - счётчик пакетов MAX = 255
  if (st_pak == 255) {st_pak = 0;}
  timerHour=millis();
    }


Добавлено after 2 minutes 3 seconds:
ставил таймер на 1, 3, 5, 10, 20
Вложения
Java 1ms.txt
(109.03 KiB) Скачиваний: 43
Java 20ms.txt
(55 KiB) Скачиваний: 36
Java 3ms.txt
(105 KiB) Скачиваний: 42

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

Чт ноя 17, 2022 16:13:53

все не правильно... потеря байт и пакетов...

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

где полный код ардуины ?

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

Чт ноя 17, 2022 16:37:01

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

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

Чт ноя 17, 2022 17:34:34

ух... как у вас всё трудно))

попробуем простой тест модуля
ардуина.txt
(5.55 KiB) Скачиваний: 42

в яве мы увидим все пакеты... по порядку...

пакет 0. 1024 байт
000000000000000000000000000..........
пакет 1. 1024 байт
111111111111111111111111111..........
пакет 2. 1024 байт
2222222222222222222222222222......
и т.д.

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

Пт ноя 18, 2022 00:54:10

в этом куске кода
Код:
if (recByteCount % 1024 == 512 && recPressed == 1) {

       rec.write(buf00, 512);  // save buf01 to card

       recByteSaved += 512;

     }

     if (recByteCount % 1024 == 0 && recPressed == 1) {

       rec.write(buf01, 512);  // save buf02 to card

       recByteSaved += 512;

     }


не работал buf00 совсем

а в этом куске

Код:
ISR(TIMER2_COMPA_vect) {
//ADMUX = 0x60; // 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
  //Serial.println(recByteCount);
  bufByteCount++;
  if (bufByteCount == 512 && bufWrite == 0) {
   
    bufByteCount = 0;
    bufWrite = 1;
  } else if (bufByteCount == 512 & bufWrite == 1) {
   
    bufByteCount = 0;
    bufWrite = 0;
  }


был пеперепутан бинарый оператор & c логическим &&

я переделал код , заработали оба буфера, появился нормлаьный звук на сериале на скорости 115200

но код придется переделать , потому что в последнем куске в буфер пишется 511 байт вместо 512

Как это все работало на флэшке просто не могу себе представить!
Вложения
CoolTerm Capture 2022-11-18 00-40-35.rar
(124.84 KiB) Скачиваний: 33

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

Пт ноя 18, 2022 10:47:35

модуль проверили ? можно писать буфер ?))

что за странная конструкция ? ))
----------
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
recByteCount++; // increment sample counter
bufByteCount++; // флаг выбор буфера 0,1
if (bufByteCount == 256 && bufWrite == 0) { // если 256 и буф=0
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 256 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}


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

//myGsm.write(ADCH); // ОТПРАВЛЯЕМ ОП 1 БАЙТУ. ТАК ХОТЬ КАК-ТО ПОЛУЧАЕМ РАЛИЧИМЫЙ ЗВУК

}
----------
лучше так...
----------
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;
}
if (bufWrite == 1) { // флаг выбор буфера 1
buf01[bufByteCount] = ADCH;
}

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.
}

}
----------
в каждый буфер будет записано по 256 байт начиная с 0 байта.
после записи буфер будет передан модулю.

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

Пт ноя 18, 2022 13:30:31

Код:
[b]лучше так.[/b]..
----------
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;
}
if (bufWrite == 1) { // флаг выбор буфера 1
buf01[bufByteCount] = ADCH;
}

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.
}

}


в Serial данные идут хорошо. В sim800 счас буду проверять

а это нормально если прямо из функции прерывания таймера отправлять данные? Может быть лучше перенести функцию отправки данных в процедуру loop?

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

Пт ноя 18, 2022 14:26:30

полный код ардуины
ардуина.txt
(6.52 KiB) Скачиваний: 31

olegue писал(а):а это нормально если прямо из функции прерывания таймера отправлять данные?

:dont_know:
я не знаю как работает библиотека myGsm.write(buf01, 256);
я не работаю с библиотеками ардуино))

а вообще отправлять данные прямо из прерывания - это нормально.
но только через регистры сериала UDR...
сериал у микроконтроллеров AVR аппаратный... он не влияет на работу программы...
при записи байта в регистр UDR сериал автоматом переходит к передачи байта... а программа (прерывание) продолжает свою работу в обычном режиме.
но это только в нормальных программах))
а как работает твоя библиотека myGsm.write(buf01, 256); я без понятия ))

более того... у сериала есть своё прерывание...
к примеру вот тут
https://www.radiokot.ru/forum/viewtopic ... 8&t=185219
тут мы передавали по сериалу...
https://www.radiokot.ru/forum/download/ ... ?id=386349
видно что сериал не влияет на работу основной программы...
https://www.radiokot.ru/forum/download/ ... ?id=356621
а тут мы передавали сразу по двум сериалам... ))
https://www.radiokot.ru/forum/download/ ... ?id=356834
видно что даже два сериал не влияет на работу основной программы...
https://www.radiokot.ru/forum/download/ ... ?id=356885
у каждого сериала своё независимое прерывание...
и т.д. и т.п.

главное посчитать тайминги...
остальное мелочи))
:tea:
Может быть лучше перенести функцию отправки данных в процедуру loop?

можно перенести в loop...
добавить в loop прерывание сериала...
какие проблемы ?))
:tea:

смею предположить что в библиотека myGsm.write(buf01, 256); работает через прерывание сериала... иначе как библиотека сможет передать целый буфер ?
значит в программе ардуины у нас уже есть прерывание сериала - в библиотеки myGsm.write(buf01, 256);
значит делать функцию отправки данных в процедуре loop и своё прерывание... нет смысла))
:tea:

итого:
1. в таймере записываем буфер buf00: 1...2...3...4...5...6...7...8...
2. передаём буфер myGsm.write(buf00, 256): 1,2,3,4,5,6,7,8...
3. в таймере записываем буфер buf01: 1...2...3...4...5...6...7...8...
4. передаём буфер myGsm.write(buf01, 256): 1,2,3,4,5,6,7,8...

на выходе сериала получаем готовые пакеты по 256 байт:
1,2,3,4,5,6,7,8...........1,2,3,4,5,6,7,8...........1,2,3,4,5,6,7,8...........
:tea:

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

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

Сб ноя 19, 2022 11:03:33

Написал небольшой скрипт в PowerShell Для разделения wav файла на пакеты по 1кб и отправки их на udp server


алгоритм совсем простой и не учитывает последние байты не кратные 1023, но это не суть и не критично

Так вот, Роман, Ваш java плейер регирует на эти данные так же как и на данные отправленные с модуля sim800, т.е первые 1.5 сек - нормлаьно , потом начинает рвать поток и тут уже канал не причем. Передаю в пределах одного компа. В тоже время когда открываю файл java.txt и слушаю его в Magik Forse то все прекрасно. Один в один!!!
А вот плейер глючит. Выкладываю файл для PowerShell - возможно Вам будет интересно попробовать.

открыть PowerShell под аднминистратором и запустить таким образом ./StreamAudioFile.ps1
ну и какой нить wav файл указать , настроив тайминг пакетов согласно сэмплрейту
16кгц - 64мс
8гкц - 125 мс
расширение .txt добавленное для того что бы здесь запостить
Вложения
StreamAudioFile.ps1.txt
(961 байт) Скачиваний: 28

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

Сб ноя 19, 2022 11:53:03

никада не работал с PowerShell... понятия не имею как это работает...
библиотеки винды .NET ещё не пробовал))
olegue писал(а):Ваш java плейер регирует на эти данные так же как и на данные отправленные с модуля sim800, т.е первые 1.5 сек - нормлаьно , потом начинает рвать поток и тут уже канал не причем.

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

я отправляю пакеты на роутер... а роутер отправляет пакеты обратно.
я вижу в анализаторе все пакеты... сколько ушло... сколько пришло... с какой скоростью... с каким интервалом идут пакеты...
а так же вижу содержимое пакетов...
а так же могу записать содержимое пакетов в wav файл и проиграть на проигрывателе...
wav.jpg
(199.58 KiB) Скачиваний: 26

роутер.jpg
(186.09 KiB) Скачиваний: 27

а читать wav файлы... 18-02-06.WAV... и отправлять по сети... умеет и ява плеер... он же скайп))

olegue писал(а):Написал небольшой скрипт в PowerShell Для разделения wav файла на пакеты по 1кб и отправки их на udp server

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

ты видишь что отправляет и принимает твой PowerShell ?
я свой ява плеер... он же скайп... вижу со всех сторон))
:tea:

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

Вс ноя 20, 2022 14:32:33

ну ? ты свой модуль уже настроил ?

тест...

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.
}

}

на выходе получаем пакеты... с пронумерованными байтами... по 256 байт в пакете... начиная с нулевого:
0,1,2,3,4,5,6,7,8...........0,1,2,3,4,5,6,7,8...........0,1,2,3,4,5,6,7,8...........
:tea:

Добавлено after 7 minutes 55 seconds:
пока ты настраиваешь свой модуль... я уже всё соберу на ардуино ))

берём 3 штуки ардуино
ардуино.jpg
(53.28 KiB) Скачиваний: 26

паяем по такой схеме
схема.jpg
(104.66 KiB) Скачиваний: 24

подключаем к роутеру
тест.jpg
(126.11 KiB) Скачиваний: 24

работает ! ))
скорость в тестовом режиме 14.000 пак/c.
:))
осталось немного подкрутить программу... и можно передавать звук... по Интернету.
:tea:
Ответить