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

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

Вт май 31, 2022 19:37:17

в коде есть такая строка
Код:
rec.open(NameRecord, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */


в итого на флэшке вижу вот это

1
2
...
10
11
12
....
125
короче непорядок. Хотел бы добавить (вместо часов, экрана, и веб-радио) расширение файла wav и нули спереди цифр

т.е
0001.wav
0002.wav
.....
0354.wav

Что не получается. Начинается это все с этого
Код:
char NameRecord[4]; /* Имя нового - записываемого файла на SD-карту. */
byte RecordNumber; /* Номер записи - храним в EEPROM. в диапазоне 0..255. */


потом идет вот это

Код:
 
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.
   


неужели нельзя str объявить вначале, зачем его объявлять в цикле loop() ? (непоняточка)
вот эти все конвертации кажутся мне подозрительными, неужели нельзя как-то проще сформировать имя файла?

ну и заканчивается все это здесь

Код:
void writeWavHeader() { // write out original WAV header to file

  recByteSaved = 0;
  // rec.open("rec00000.wav", O_CREAT | O_TRUNC | O_RDWR);
  rec.open(NameRecord, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */

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

Вт май 31, 2022 19:46:58

Novice user писал(а):а запись сектора должен идти непрерывно?

нет.
писать/читать в сектора можно произвольно.
мы сами выбираем адрес сектора... в какой сектор будем писать/читать...
olegue писал(а):А как влияет на это все тип файловой системы в которую отформатирована флэшка?

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

а чтобы после наших издевательств мы могли вставить флешку в ПК и прочитать что мы там записали... нам нужно писать на флешку не просто по секторам... а писать согласно файловой системе... FAT32... FAT16... и т.д.)) а для этого надо писать отдельную функцию - работа с файловой системой...

https://cxem.net/mc/mc435.php


но мне и не нужно писать/читать флешки с ПК.)) Поэтому я и не писал функции работа с файловой системой...
а просто писать/читать на флешку картинки и звук... и даже видео... можно и без файловой системы))

я так и сделал))

тупо взял ATmega8 и подключил к ней флешку и Ethernet модуль...
сижу... пишу с ПК на флешку... картинки и звук и видео...
сижу... читаю с флешки на ПК... картинки и звук и видео...
картинки.jpg
(135.68 KiB) Скачиваний: 44

звук.jpg
(187.65 KiB) Скачиваний: 41

видео.jpg
(179.99 KiB) Скачиваний: 40

и т.д.
:tea:

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

Вт май 31, 2022 21:38:22

http://pic.rkniga.ru/shemotehnika/ustro ... f877a.html
вот еще нарыл,читаем значение АЦП и сразу пишем на флешку (в один сектор)
достал из полки платку атмега328+микросд,буду пробовать

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

Вт май 31, 2022 22:02:10

в моём примере пишем на флешку буфер целиком... сразу по 512 байт

//////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// TX_microSD:
void TX_microSD(unsigned long x)
{
/////////////////////// crc bufer_microSD[512]:
crc=0xFFFF;
for (b=0;b<510;b=b+2) {
bcrc=bufer_microSD[b]; bcrc=(bcrc<<8)|bufer_microSD[b+1]; fcrc();
};
bufer_microSD[510]=(crc>>8); // crc
bufer_microSD[511]=crc; // crc
///////////////////////////////////////////////
PORTB.0=0; // SS microSD
/////////////////////// запись Data:
tx3=0x58; SPI3(); // 01xx xxxx + Номер команды - CMD24
tx3=(x>>24); SPI3(); // адрес
tx3=(x>>16); SPI3(); // адрес
tx3=(x>>8); SPI3(); // адрес
tx3=x; SPI3(); // адрес
tx3=0x00; SPI3(); // 0000 0000. CRC - 0
// ответ R1: 0000 0000 - команда microSD принята
tx3=0xFF; SPI3(); // задержка 1 байт 0xFF
tx3=0xFF; SPI3(); // STATUS R1 0000 0000
//////////////////////////////////////////////////////////////////////////////// метка:
tx3=0xFE; SPI3(); // 0xFE метка для команды - CMD24
//////////////////////
for (a=0; a<512; a++) {
tx3=bufer_microSD[a]; SPI3(); // bufer > microSD
};
////////////////////
tx3=0x00; SPI3(); // CRC - 0
tx3=0x00; SPI3(); // CRC - 0
/////////////////////////////////////////////////////////// ответ - данные приняты 0xE5:
tx3=0xFF; SPI3(); // SPI пустой
/////////////////////////////////////////////////// ждём окончания записи... OUT = 0xFF:
while ( (x1 != 0xFF) && (tm_microSD != 255) ) {
tx3=0xFF; SPI3(); x1=rx3; // MOSI 0x00 > MOSI 0xFF // -цикл 34...53
tm_microSD++;
};
//////////////
if (tm_microSD == 255) { // таймаут microSD:
error_microSD_EEPROM |= 0b00010000; // 0001 0000 - error microSD_TX
};
tm_microSD = 0; // сброс таймаут tm_microSD.
////////////////////////////////////////////////////////////////
PORTB.0=1; // SS microSD
////////////////////////////////////////////////////////////////////////////////////////
// microSD - ток = 0 mA.


но никто не запрещает читать значение АЦП и сразу писать на флешку )) по одному байту...


//////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// TX_microSD:
void TX_microSD(unsigned long x)
{
/////////////////////// crc bufer_microSD[512]:
crc=0xFFFF;
for (b=0;b<510;b=b+2) {
bcrc=bufer_microSD[b]; bcrc=(bcrc<<8)|bufer_microSD[b+1]; fcrc();
};
bufer_microSD[510]=(crc>>8); // crc
bufer_microSD[511]=crc; // crc
///////////////////////////////////////////////
PORTB.0=0; // SS microSD
/////////////////////// запись Data:
tx3=0x58; SPI3(); // 01xx xxxx + Номер команды - CMD24
tx3=(x>>24); SPI3(); // адрес
tx3=(x>>16); SPI3(); // адрес
tx3=(x>>8); SPI3(); // адрес
tx3=x; SPI3(); // адрес
tx3=0x00; SPI3(); // 0000 0000. CRC - 0
// ответ R1: 0000 0000 - команда microSD принята
tx3=0xFF; SPI3(); // задержка 1 байт 0xFF
tx3=0xFF; SPI3(); // STATUS R1 0000 0000
//////////////////////////////////////////////////////////////////////////////// метка:
tx3=0xFE; SPI3(); // 0xFE метка для команды - CMD24
//////////////////////
for (a=0; a<512; a++) {
tx3=ADC; SPI3(); // ADC > microSD
};
////////////////////
tx3=0x00; SPI3(); // CRC - 0
tx3=0x00; SPI3(); // CRC - 0
/////////////////////////////////////////////////////////// ответ - данные приняты 0xE5:
tx3=0xFF; SPI3(); // SPI пустой
/////////////////////////////////////////////////// ждём окончания записи... OUT = 0xFF:
while ( (x1 != 0xFF) && (tm_microSD != 255) ) {
tx3=0xFF; SPI3(); x1=rx3; // MOSI 0x00 > MOSI 0xFF // -цикл 34...53
tm_microSD++;
};
//////////////
if (tm_microSD == 255) { // таймаут microSD:
error_microSD_EEPROM |= 0b00010000; // 0001 0000 - error microSD_TX
};
tm_microSD = 0; // сброс таймаут tm_microSD.
////////////////////////////////////////////////////////////////
PORTB.0=1; // SS microSD
////////////////////////////////////////////////////////////////////////////////////////
// microSD - ток = 0 mA.

и т.д. и т.п. ))
:tea:

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

Вт май 31, 2022 22:15:19

В том то и дело что для диктофона на атмега8 с буфером(=массивом) надо 2 буфера по 512 байт-пока в первый буфер записываем значения АЦП (сигнал с микрофона) второй буфер пишем на флешку,когда заполнится первый буфер пишем значения АЦП во второй буфер,а первый пишем на флешку и так по кругу (я про исходник из 1 поста),но у атмега8 SRAM всего 1 кб,так что такой вариант думаю не получится,вот и подумал-что если данные АЦП писать сразу на флешку,когда сектор заполнится переходим в след сектор-получится?

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

Вт май 31, 2022 22:17:10

когда сектор заполнится переходим в след сектор...

для этого опять вызываем функцию записи...

while(пока нажата кнопка "запись")
{
//указываем следующий сектор для записи... 0,1,2,3,4,5,6,7...
x++;
//затем вызываем функцию записи
TX_microSD(x);
}

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

Вт май 31, 2022 22:26:17

если данные АЦП писать сразу на флешку,когда сектор заполнится переходим в след сектор-получится?

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

понаберут восьмых мег на 20р дешевле, потом мозг ломают себе и окружающим :))

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

Вт май 31, 2022 22:42:49

Код:
 String str;  //declaring string.
    //
   str = String(RecordNumber); //converting integer into a string.
   str.concat(".wav");
   
   str.toCharArray(filename, sizeof(filename));


расширение файла добавил, осталось нули спереди пристроить.

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

Вт май 31, 2022 22:52:22

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

во вторых... всё немного интересней))

как работает флешка ?

судя по описаниям... и показаниям прибора (!)... флешка работает так же как SSD накопитель в ПК ))

1.
у флешки есть своя собственная встроенная энергозависимая память... буфер SRAM на 512 байт.
2.
у флешки есть своя собственная встроенный энергонезависимая память ROM на 4 Гбайт.

Как происходит запись на флешку ?

1.
при записи на флешку все данные сначала записываются в буфер SRAM на 512 байт.
2.
после команды "запись" флешка перезаписывает все данные из буфера SRAM на 512 байт в память ROM на 4 Гбайт.

откуда я это знаю ? ))

потому что только после команды "запись" потребляемый ток подскакивает с ~0 mA до 7 mA.
т.е. флешка потребляет ток только в момент записи данных из буфера SRAM на 512 байт в память ROM на 4 Гбайт.
вот откуда я это знаю))
:)

поэтому мы спокойно можем начала писать данные ADC в буфер SRAM на 512 байт.
а потом, когда буфер SRAM на 512 байт заполнится, флешка по команде перезапишет данные из буфера SRAM на 512 байт в буфер ROM на 4 Гбайт.
:tea:

но тут другая проблема... самая главная))
а сколько время записи флешки ? За сколько флешка по команде перезапишет данные из буфера SRAM на 512 байт в буфер ROM на 4 Гбайт ?
судя по приборам... десятки миллисекунд !!!
это значит что мы должны сидеть и ждать...... пока флешка перезапишет данные из буфера SRAM на 512 байт в буфер ROM на 4 Гбайт... И получается что в это самое время мы не можем ничего писать на флешку... :shock:

вооооотттт.... )))

или всё таки можем ? ))
:))

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

Вт май 31, 2022 22:54:08

ну дык, что-то типа
Код:
while (str.length() < 4)
{
str = "0" + str;
}


перед wav, разумеется.
Последний раз редактировалось Martian Вт май 31, 2022 22:57:10, всего редактировалось 2 раз(а).

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

Вт май 31, 2022 22:55:35

Код:
else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 0) {
timer1 = millis();
timer1on = 1;
}
else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 1 && (millis() - timer1) > 2000) {
StopRec();


да, уж. Действительно, все довольно просто!
увидели что запрошена остановка - запустили таймер
увидели что запрошена остановка и таймер отщелкал 2 сек - запустили остановку

КРУТО!


Morroc, есть вопросик. Все отлично, но.... срабатывает только 1 раз. Второй раз, т.е вторая пауза уже не срабатывает.

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

Вт май 31, 2022 23:00:44

потому что где-то, наверное, надо timer1on снова обнулить

Добавлено after 1 minute 57 seconds:
наверное, после StopRec()

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

Вт май 31, 2022 23:28:21

ну дык, что-то типа
Код:
while (str.length() < 4)
{
str = "0" + str;
}


перед wav, разумеется.


Код:
   str = String(RecordNumber); //converting integer into a string.
   while (str.length() < 4)
    {
    str = "0" + str;
      }
   str.concat(".wav");
   str.toCharArray(filename, sizeof(filename));


Безупречно! Спасибо!

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

Вт май 31, 2022 23:31:18

первый мой код для ардуино ))
filename размер не забудьте увеличить, он теперь должен быть 8

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

Вт май 31, 2022 23:38:47

потому что где-то, наверное, надо timer1on снова обнулить

Добавлено after 1 minute 57 seconds:
наверное, после StopRec()


Да, сам понимаю, что вот где-то всунуть нужно обнуление.

А почему после StopRec() ? По идее до StopRec() в данном режиме программа не должна доходить.

Добавлено after 1 minute 19 seconds:
первый мой код для ардуино ))
filename размер не забудьте увеличить, он теперь должен быть 8


8 - было , "сьелась" последняя буква в расширении поставил 12 из расчета 8+3 плюс точка.

Добавлено after 1 minute 12 seconds:
почему сьелась не стал разбираться. Надо с паузой порешать.

Добавлено after 3 minutes 11 seconds:
в Ардиино Иде отладки нету?

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

Вт май 31, 2022 23:40:47

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

я понадеялся, что это ((void (*)())0x0000)(); /* Делаем программную перезагрузку - Arduino */ сработает, оно после StopRec(); должно быть - есть ? не рестартит ?

По идее до StopRec() в данном режиме программа не должна доходить.

это когда кнопку отжали, а потом снова нажали раньше 2 сек ? т.е. завершения записи не было ?
тут да, надо добавить еще что то такое

else if (digitalRead(btnStart) == LOW && recPressed == 1 && timer1on == 1) {
timer1on = 0;
}

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

так вроде этого и не хватало в 8й меге, нам же два таких буфера надо, а успеет ли буфер флэшки побафтно принимать и умеет ли SDFat такое я хз, если с нуля все писать, то может и получится
Последний раз редактировалось Morroc Вт май 31, 2022 23:48:47, всего редактировалось 1 раз.

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

Вт май 31, 2022 23:46:18

Morroc писал(а):не рестартит ?


рестартит!, я думал что за светомузыка после оставнова

Morroc писал(а):это когда кнопку отжали, а потом снова нажали раньше 2 сек ? т.е. завершения записи не было ?


нет, завершгения записи не было. И так мно раз может быть

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

Вт май 31, 2022 23:49:55

ага, не хватает обработки состояния того, что выше постом, нужно добавить

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

Вт май 31, 2022 23:57:16

Morroc писал(а):тут да, надо добавить еще что то такое

else if (digitalRead(btnStart) == LOW && recPressed == 1 && timer1on == 1) {
timer1on = 0;
}


Код:
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.
   while (str.length() < 4)
    {
    str = "0" + str;
      }
   str.concat(".wav");
   str.toCharArray(filename, sizeof(filename));
    /*str.toCharArray(NameRecord, 4); //passing the value of the string to the character array.*/
    StartRec(); // launch StartRec method
    timer1on = 0;
  }
  else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 0)
    {
      timer1 = millis();
      timer1on = 1;
    }
    else if (digitalRead(btnStart) == LOW && recPressed == 1 && timer1on == 1) {
    timer1on = 0; 
    }
   
  else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 1 && (millis() - timer1) > 2000)
  {
    StopRec(); // launch StopRec method
    /*         Поэтому (Делаем программную перезагрузку). */
    ((void (*)())0x0000)(); /* Делаем программную перезагрузку - Arduino */
  }
 
  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;
  }
}


Идеально работает!!!! Плюс нули спереди и wav в конце! Это- Победа!

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

Ср июн 01, 2022 01:23:33

Martian писал(а):первый мой код для ардуино ))

вот так люди попадают в секту свидетелей ардуино ))
:))
Morroc писал(а):нам же два таких буфера надо,

У ATmega8 есть 1024 байт. Нам хватит одного буфера 512 байт ))

зачем нужен буфер ? для буферизации потокового аудио))

так все делают))
например когда вы смотрите видео на Ютуб про своих любимых котят обратите внимание на две полоски снизу...
серая полоска - это буфер аудио/видео потока.
красная полоска - это текущий поток аудио/видео карты ПК.
буферизация.jpg
(38.89 KiB) Скачиваний: 35

мы сделаем так же на ATmega8 ))

1. пишем данные ADC в буфер ATmega8 размером 512 байт.
2. когда буфер ATmega8 размером 512 байт заполнится, мы передаём 512 байт в буфер флешки SRAM на 512 байт. И передаём команду записи. Флешка перезаписывает все данные из буфера SRAM на 512 байт в память ROM на 4 Гбайт.
3. а пока флешка перезаписывает все данные из буфера SRAM на 512 байт в память ROM на 4 Гбайт, мы в это время продолжаем писать данные ADC в освободившейся буфер ATmega8 размером 512 байт.

замечательно))
:tea:

Добавлено after 24 minutes:
olegue писал(а): Это- Победа!

ура !))
:beer:
теперь переходим к интересному)) просто писать на флешку... скучно)) будем писать на SSD в ПК ))
сделаем самодельный... Скайп !))

как работает Skype от Microsoft Corporation мы знаем
Skype_Microsoft_Corporation.jpg
(163.29 KiB) Скачиваний: 39

сделаем самодельный Skype... от Roman_Corporation ))
Skype_Roman_Corporation.jpg
(186.09 KiB) Скачиваний: 37

это называется... Импортозамещение по-русски))
:))

звук уже настроили... теперь можно подключать Ардуино к ПК и писать на SSD в ПК ))

но просто писать звук мало... надо ещё писать видео ! )) есть видео камера USB...

блин... не могу понять как подключиться к USB... чтоб получить потоковое видео... от USB камеры...
:(
Ответить