Страница 1 из 36
Ардуино - запись звука
Добавлено: Пн май 30, 2022 13:47:16
olegue
Нагуглил вот такой видос. Ардуино запись звука с исходниками.
https://www.youtube.com/watch?v=E9LKPFY3GGI&t=184s
Повторил. Все работает. И вполне устраивает.
Но хотелось бы немножко допилить код. Не буду валить в кучу все свои хотелки.
Поэтому начну с самого необходимого.
Я хочу запихнуть в ардуино на базе Atmega8, поэтому мне нужно сократить код
при компиляции даже выдает вот это, но устройство работает.
и , кстати, почему пишет недостаок памяти если занято всего 38%?
Можно ли нерадикальными способами втиснуть код 8кб? И, тяжко ли переписать этот код скажем, на СИ, отказавшись совсем от Ардуино, может быть использование среды ардуино здесь неоправдано. Или может кто-то видел готовый проект на СИ для avr?
код прилагаю:
Re: Ардуино - запись звука
Добавлено: Пн май 30, 2022 14:32:49
Novice user
Не получится,надо SRAM минимум 2 кб
Re: Ардуино - запись звука
Добавлено: Пн май 30, 2022 16:31:44
VNS
[uquote="olegue",url="/forum/viewtopic.php?p=4238837#p4238837"]Или может кто-то видел готовый проект на СИ для avr?[/uquote]
https://hubstub.ru/programming/116-zapi ... kartu.html
http://we.easyelectronics.ru/AVR/zapis-zvuka.html
Re: Ардуино - запись звука
Добавлено: Пн май 30, 2022 17:47:20
codenamehawk
[uquote="olegue",url="/forum/viewtopic.php?p=4238837#p4238837"]кстати, почему пишет недостаок памяти если занято всего 38%?[/uquote]
Вы случаем не по своей картинке читаете?
Это относится не к этой памяти, читайте до конца.
Re: Ардуино - запись звука
Добавлено: Пн май 30, 2022 18:35:11
Novice user
[uquote="codenamehawk",url="/forum/viewtopic.php?p=4238958#p4238958"][uquote="olegue",url="/forum/viewtopic.php?p=4238837#p4238837"]кстати, почему пишет недостаок памяти если занято всего 38%?[/uquote]
Вы случаем не по своей картинке читаете?
Это относится не к этой памяти, читайте до конца.[/uquote]
А к какой?
SRAM занято всего 85%
У меня тоже самое пишет
Re: Ардуино - запись звука
Добавлено: Пн май 30, 2022 19:26:48
VNS
[uquote="Novice user",url="/forum/viewtopic.php?p=4238977#p4238977"]А к какой?[/uquote]
К другой…

К меге328, у которой на борту 32Кб… программа весит (согласно картинке), более 10Кб… ТС хочет её впихнуть в мегу8, у которой на борту 8Кб… вот он и хочет прогу уменьшить чтобы влезла в мегу8. И да все переменные тоже не влезут (без переделки), так как имеют более 1Кб SRAM.

Re: Ардуино - запись звука
Добавлено: Пн май 30, 2022 19:47:32
Novice user
Я про атмегу8 понял
Но при компиляции под 328-ю мегу возникает данная ошибка-"недостаточно памяти",хотя она занята на 38 % памяти программы и 85% RAM,так отчего ошибка?
Кстати,в arduino 1.0.5 данной строчки "недостаточно памяти" для атмега328 нет,а вот в 1.8.10 есть...
Re: Ардуино - запись звука
Добавлено: Пн май 30, 2022 23:58:15
Morroc
Какая ошибка то ? В первом сообщение нет ошибки.
В 1.0.5 просто не выводилось это предупреждение наверное.
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 09:01:17
olegue
ну более менее понятно
VNS, спасибо за ссылки , буду смотреть. Правда там меги 16 и 36, ну это ничгео. Тоже годится.
Объясните такую тему
Вот код и скетча, т.е основаня его часть там где loop
Код: Выделить всё
void loop() { // THIS RUNS LOTS!
if (digitalRead(btnStart) == LOW && recPressed == 0) {
/* Записываем в RecordNumber, значение из ячейки №0 EEPROM, и прибавляем 1. */
RecordNumber = EEPROM.read(0) + 1;
/* Записываем в ячейку №0 EEPROM, увеличенное значение RecordNumber. */
EEPROM.write(0, RecordNumber);
/* Для конвертации из byte в char / из RecordNumber в NameRecord */
String str; //declaring string.
str = String(RecordNumber); //converting integer into a string.
str.toCharArray(NameRecord, 4); //passing the value of the string to the character array.
StartRec(); // launch StartRec method
}
else if (digitalRead(btnStart) == HIGH && recPressed == 1){
for (int i = 0; i <= 250; i++) { /*ждем секунду*/
if (digitalRead(btnStart) == LOW){paused=1;break;} /*есил была зафиксирована пауза выходим из ожидания (из цикла фо) */
delay(10);
}
if (paused==1) {exit(0);} /* если была пауза выходим из цикла loop */
StopRec(); // launch StopRec method
paused=0;
/*
После окончания записи, в памяти контроллера остаются данные.
И за этого следующая запись бывает качеством хуже.
Поэтому (Делаем программную перезагрузку).
*/
((void (*)())0x0000)(); /* Делаем программную перезагрузку - Arduino */
}
[b] 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;
}[/b]
}
в какой момнет происходит запись на флшку? У меня получается, что если пауза между Стопом и НачаломЗаписи короткая, то на данные на флэшку не успевают записать. Так и должнобыть?
Добавлено after 3 minutes 43 seconds:
Код немного переделан, я настроил все для одной кнопки. т.е если нажата то идет запись, отпущена - стоп. А что бы определить что нужно сделать стоп я измеряю паузу (пытаюсь измерить) . Если пауза менее 2.5сек,то запись не прекращается. Вот такая задумка. Ну это к тому что я полагаю,что запись за флэшку идет уже после Стопа.
Где-то я тут наверно не правл.
Добавлено after 2 minutes 25 seconds:
if (paused==1) {exit(0);} /* если была пауза выходим из цикла loop */
в этомй строке я хотел бы попасть вверх цикла loop, но, вероятно , чтото идет не так.
Добавлено after 18 minutes 18 seconds:
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;
}
вот этот кусок за пределами if, которые управляют Рек/Стопом. меня смущает. Скорее всего это и есть запись на флэшку
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 09:01:18
VNS
[uquote="olegue",url="/forum/viewtopic.php?p=4239177#p4239177"]Объясните такую тему[/uquote]
Я данный язык не знаю…

если бы написано было на АВ, тогда бы подсказал, а так увы.
а по ссылкам там разве не описан алгоритм? Сам не читал…

Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 09:17:05
olegue
просто говорят что Ардуино - это для детворы.
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 09:26:40
VNS
Я иногда использую ардуину как удобную готовую плату… а алгоритм пишу на АВ и заливаю прошивку как в обычный МК через программатор (без использования загрузчика)… так что ардуину используют многие…

Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 09:56:41
olegue
я глубоко в тему по ка не влезал. И вообще хотел обойтись без детального анализа того что происходит в коде. Думал ограничиться лишь готовым инструментов, слегка заточив под себя функцию записи.
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 10:43:20
Morroc
без анализа - это наугад меняя код ?
>if (paused==1) {exit(0);} /* если была пауза выходим из цикла loop */
куда выходим ? у нас что то снаружи loop есть ?
выделенное жирным выше это запись на флэшку и должно выполняться в неблокирующем коде (т.е. писать как только буфер заполнится данными), а вы туда влепили блокирующий цикл с delay(), изучите тему использования millis() и как реализуется конечный автомат, без этого в большинстве случаев невозможно написать что то более менее годное в сотни строк, пригодится (можно прерывания от таймера изучить как альтернативный вариант)
[uquote="olegue",url="/forum/viewtopic.php?p=4239190#p4239190"]просто говорят что Ардуино - это для детворы.[/uquote]
ага, но так же никто не говорит, что Ардуино - это для обработки звука, для меги328 (особенно не выходя за рамки ардуино) это, скажем так, впритык

Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 11:02:54
olegue
Morroc писал(а): как реализуется конечный автомат, без этого в большинстве случаев невозможно написать что то более менее годное в сотни строк, пригодится (можно прерывания от таймера изучить как альтернативный вариант)
я сразу понял что без прерываний тут никак. Но думал на халяву проскочить получиттся. Не получилось.
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 11:19:30
Morroc
я написал как без прерываний ) millis() + КА, никаких delay и длинных циклов внутри loop и это не под конкретную ситуацию вариант, а общепринятый для средней сложности задач
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 11:21:23
Jack_A
Я, конечно, ретроград, но получить эффективный компактный код можно на асме. И про time_to_market не будем, ладно? Мы ведь любители, а не индусские говнокодеры на зарплате - абы работало хоть как-нибудь, да спихнуть побыстрее.
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 11:23:16
Morroc
Именно потому что мы любители нафига ковыряться в асме если на данный момент его не знаешь ? МК сейчас жирные, а если мало всегда есть еще жирнее, тем более в данном случае затык совершенно не в этом.
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 11:27:45
olegue
Morroc, тогда объясните в двух словах про сброс буфера на флэшку и операции РЕК/СТОП. Они же влияют на буфер?
Допустим я нажимаю на РЕК - пошла запись, вслед за этим буфер начинает заполнялся и идет по мере необходимости сброс на флэшку. Затем я нажимаю Стоп, операция сброса продолжается, так как режим SPI не шибко быстрый. Но не дождавшись окончания записи, вновь нажимаю РЕК. Что в данном случает будет происходить?
Re: Ардуино - запись звука
Добавлено: Вт май 31, 2022 11:43:43
Morroc
[uquote="olegue",url="/forum/viewtopic.php?p=4239240#p4239240"]Morroc, тогда объясните в двух словах про сброс буфера на флэшку и операции РЕК/СТОП. Они же влияют на буфер?[/uquote]
сброс буфера rec.flush, rec.close или при заполнении буфера 512 байт
[uquote="olegue",url="/forum/viewtopic.php?p=4239240#p4239240"]Допустим я нажимаю на РЕК - пошла запись, вслед за этим буфер начинает заполнялся и идет по мере необходимости сброс на флэшку[/uquote]
да. вы видите в коде где это происходит и почему в loop нельзя делать паузы ?
[uquote="olegue",url="/forum/viewtopic.php?p=4239240#p4239240"]Затем я нажимаю Стоп, операция сброса продолжается, так как режим SPI не шибко быстрый. Но не дождавшись окончания записи, вновь нажимаю РЕК. Что в данном случает будет происходить?[/uquote]
я думаю вы не успеется таким образом добиться сбоя если алгоритм корректно написан, но на всякий случай можно добавить паузу (не ковырял SdFat, там может и нет ничего фонового на прерываниях и все делается непосредственными вызовами методов, тогда такой проблемы и вовсе нет)
если Стоп не успеет отработаться каким то образом до нажатия Рек, то предыдущий файл будет запорот
просто напишите свою доработку без delay и долгих циклов в loop, например с использованием millis()