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

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

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

Сообщение olegue »

Нагуглил вот такой видос. Ардуино запись звука с исходниками.
https://www.youtube.com/watch?v=E9LKPFY3GGI&t=184s

Повторил. Все работает. И вполне устраивает.
Но хотелось бы немножко допилить код. Не буду валить в кучу все свои хотелки.
Поэтому начну с самого необходимого.

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

и , кстати, почему пишет недостаок памяти если занято всего 38%?

Можно ли нерадикальными способами втиснуть код 8кб? И, тяжко ли переписать этот код скажем, на СИ, отказавшись совсем от Ардуино, может быть использование среды ардуино здесь неоправдано. Или может кто-то видел готовый проект на СИ для avr?


код прилагаю:
Вложения
Arduino Audio Recorder V.1-20160524.txt
(7.75 КБ) 256 скачиваний
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

Не получится,надо SRAM минимум 2 кб
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1614
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

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

Сообщение 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
codenamehawk
Вымогатель припоя
Сообщения: 527
Зарегистрирован: Вт фев 09, 2010 17:52:26

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

Сообщение codenamehawk »

[uquote="olegue",url="/forum/viewtopic.php?p=4238837#p4238837"]кстати, почему пишет недостаок памяти если занято всего 38%?[/uquote]
Вы случаем не по своей картинке читаете?
Это относится не к этой памяти, читайте до конца.
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение 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%
У меня тоже самое пишет
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1614
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

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

Сообщение VNS »

[uquote="Novice user",url="/forum/viewtopic.php?p=4238977#p4238977"]А к какой?[/uquote]
К другой… :) К меге328, у которой на борту 32Кб… программа весит (согласно картинке), более 10Кб… ТС хочет её впихнуть в мегу8, у которой на борту 8Кб… вот он и хочет прогу уменьшить чтобы влезла в мегу8. И да все переменные тоже не влезут (без переделки), так как имеют более 1Кб SRAM. :roll:
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

Я про атмегу8 понял

Но при компиляции под 328-ю мегу возникает данная ошибка-"недостаточно памяти",хотя она занята на 38 % памяти программы и 85% RAM,так отчего ошибка?

Кстати,в arduino 1.0.5 данной строчки "недостаточно памяти" для атмега328 нет,а вот в 1.8.10 есть...
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

Какая ошибка то ? В первом сообщение нет ошибки.
В 1.0.5 просто не выводилось это предупреждение наверное.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение 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, которые управляют Рек/Стопом. меня смущает. Скорее всего это и есть запись на флэшку
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1614
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

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

Сообщение VNS »

[uquote="olegue",url="/forum/viewtopic.php?p=4239177#p4239177"]Объясните такую тему[/uquote]
Я данный язык не знаю… :dont_know: если бы написано было на АВ, тогда бы подсказал, а так увы. :roll:

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

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

Сообщение olegue »

просто говорят что Ардуино - это для детворы.
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1614
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

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

Сообщение VNS »

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

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

Сообщение olegue »

я глубоко в тему по ка не влезал. И вообще хотел обойтись без детального анализа того что происходит в коде. Думал ограничиться лишь готовым инструментов, слегка заточив под себя функцию записи.
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

без анализа - это наугад меняя код ?

>if (paused==1) {exit(0);} /* если была пауза выходим из цикла loop */
куда выходим ? у нас что то снаружи loop есть ?

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

[uquote="olegue",url="/forum/viewtopic.php?p=4239190#p4239190"]просто говорят что Ардуино - это для детворы.[/uquote]
ага, но так же никто не говорит, что Ардуино - это для обработки звука, для меги328 (особенно не выходя за рамки ардуино) это, скажем так, впритык :))
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение olegue »

Morroc писал(а): как реализуется конечный автомат, без этого в большинстве случаев невозможно написать что то более менее годное в сотни строк, пригодится (можно прерывания от таймера изучить как альтернативный вариант)
я сразу понял что без прерываний тут никак. Но думал на халяву проскочить получиттся. Не получилось.
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

я написал как без прерываний ) millis() + КА, никаких delay и длинных циклов внутри loop и это не под конкретную ситуацию вариант, а общепринятый для средней сложности задач
Последний раз редактировалось Morroc Вт май 31, 2022 11:21:24, всего редактировалось 1 раз.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Я, конечно, ретроград, но получить эффективный компактный код можно на асме. И про time_to_market не будем, ладно? Мы ведь любители, а не индусские говнокодеры на зарплате - абы работало хоть как-нибудь, да спихнуть побыстрее.
Изображение
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

Именно потому что мы любители нафига ковыряться в асме если на данный момент его не знаешь ? МК сейчас жирные, а если мало всегда есть еще жирнее, тем более в данном случае затык совершенно не в этом.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение olegue »

Morroc, тогда объясните в двух словах про сброс буфера на флэшку и операции РЕК/СТОП. Они же влияют на буфер?
Допустим я нажимаю на РЕК - пошла запись, вслед за этим буфер начинает заполнялся и идет по мере необходимости сброс на флэшку. Затем я нажимаю Стоп, операция сброса продолжается, так как режим SPI не шибко быстрый. Но не дождавшись окончания записи, вновь нажимаю РЕК. Что в данном случает будет происходить?
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение 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()
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Ответить

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