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

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

Сообщение olegue »

Код: Выделить всё

  
*/
 
#include <Wire.h>                           // Подключаем библиотеку Wire                           
#include <TimeLib.h>                        // Подключаем библиотеку TimeLib
#include <DS1307RTC.h>                      // Подключаем библиотеку DS1307RTC
 
 
RTC.read(tm)

//tm.Hour;
//tm.Minute;
//tm.Second;
//tm.Day;
//tm.Month;
//tm.Year;

 


}

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

Добавлено after 4 minutes 20 seconds:
мне кажется что в этой процедуре (запись заголовка) нужно добавить время записи файлов

Код: Выделить всё

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-карту. */

  rec.write("RIFF");
  byte1 = fileSize & 0xff;
  byte2 = (fileSize >> 8) & 0xff;
  byte3 = (fileSize >> 16) & 0xff;
  byte4 = (fileSize >> 24) & 0xff;
  rec.write(byte1);  rec.write(byte2);  rec.write(byte3);  rec.write(byte4);
  rec.write("WAVE");
  rec.write("fmt ");
  byte1 = waveChunk & 0xff;
  byte2 = (waveChunk >> 8) & 0xff;
  byte3 = (waveChunk >> 16) & 0xff;
  byte4 = (waveChunk >> 24) & 0xff;
  rec.write(byte1);  rec.write(byte2);  rec.write(byte3);  rec.write(byte4);
  byte1 = waveType & 0xff;
  byte2 = (waveType >> 8) & 0xff;
  rec.write(byte1);  rec.write(byte2);
  byte1 = numChannels & 0xff;
  byte2 = (numChannels >> 8) & 0xff;
  rec.write(byte1);  rec.write(byte2);
  byte1 = sampleRate & 0xff;
  byte2 = (sampleRate >> 8) & 0xff;
  byte3 = (sampleRate >> 16) & 0xff;
  byte4 = (sampleRate >> 24) & 0xff;
  rec.write(byte1);  rec.write(byte2);  rec.write(byte3);  rec.write(byte4);
  byte1 = bytesPerSec & 0xff;
  byte2 = (bytesPerSec >> 8) & 0xff;
  byte3 = (bytesPerSec >> 16) & 0xff;
  byte4 = (bytesPerSec >> 24) & 0xff;
  rec.write(byte1);  rec.write(byte2);  rec.write(byte3);  rec.write(byte4);
  byte1 = blockAlign & 0xff;
  byte2 = (blockAlign >> 8) & 0xff;
  rec.write(byte1);  rec.write(byte2);
  byte1 = bitsPerSample & 0xff;
  byte2 = (bitsPerSample >> 8) & 0xff;
  rec.write(byte1);  rec.write(byte2);
  rec.write("data");
  byte1 = dataSize & 0xff;
  byte2 = (dataSize >> 8) & 0xff;
  byte3 = (dataSize >> 16) & 0xff;
  byte4 = (dataSize >> 24) & 0xff;
  rec.write(byte1);  rec.write(byte2);  rec.write(byte3);  rec.write(byte4);

}
Добавлено after 23 minutes 19 seconds:
нагуглил что вот эту сточку надо дергать

rec.open(filename, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

roman.com писал(а):флешке не нужны никакие буферы... берешь флешку и пишешь сразу 512 байт без всяких буферов))
Мне не доводилось писать на флешку, но, разве ей не нужно время, чтобы перенести данные из своего буфера в ПЗУ? можно ли в это время продолжать в неё писать? (захват то идёт непрерывно)
если есть файловая система, то как решается вопрос с фрагментацией файлов (особенно без буферов)?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Друг Кота
Сообщения: 19496
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

[uquote="olegue",url="/forum/viewtopic.php?p=4240655#p4240655"]мне кажется что в этой процедуре (запись заголовка) нужно добавить время записи файлов[/uquote]
по идее раньше https://forums.adafruit.com/viewtopic.php?f=25&t=124195
или rec.open файл создает ?
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

что то наподобии вот этого

Код: Выделить всё

 if (!file.timestamp(T_CREATE, 2009, 11, 10, 1, 2, 3)) {

	    error("set create time failed");

	  }
Добавлено after 57 seconds:
Morroc писал(а):или rec.open файл создает ?
таки да


Используем SD и RTC (ну и Wire для RTC)

План реализации:

Пишем callback-функцию дату-время и подсовываем её SD.

Реализация:

Код: Выделить всё

	#include <SD.h>
	#include <Wire.h>
	#include <RTClib.h>	 	 
	RTC_DS3231 RTC;  // define the Real Time Clock object
	//------------------------------------------------------------------------------
	// call back for file timestamps
	void cb_dateTime(uint16_t* date, uint16_t* time) {
	  DateTime now = RTC.now();
	 
	  // return date using FAT_DATE macro to format fields
	  *date = FAT_DATE(now.year(), now.month(), now.day());
	  // return time using FAT_TIME macro to format fields
	  *time = FAT_TIME(now.hour(), now.minute(), now.second());
}

	//------------------------------------------------------------------------------

	void setup() {
	  Serial.begin(9600);
	  Wire.begin();
	  if (!RTC.begin()) {
	    Serial.println("RTC failed");
	    while(1);
	  };

	  // set date time callback function
	  SdFile::dateTimeCallback(cb_dateTime);
	 //теперь все операции с файлами должны брать время с RTC
	}
	//------------------------------------------------------------------------------
	void loop() {}
Источник: первая ссылка Гугла "arduino sd file date time".[/quote]

вот здесь интересно сделано. //теперь все операции с файлами должны брать время с RTC

Добавлено after 5 minutes 26 seconds:
http://arduino.ru/forum/programmirovani ... e-failov-n
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Ivanoff-iv писал(а):
roman.com писал(а):флешке не нужны никакие буферы... берешь флешку и пишешь сразу 512 байт без всяких буферов))
Мне не доводилось писать на флешку, но, разве ей не нужно время, чтобы перенести данные из своего буфера в ПЗУ? можно ли в это время продолжать в неё писать? (захват то идёт непрерывно)
если есть файловая система, то как решается вопрос с фрагментацией файлов (особенно без буферов)?
выше всё обсуждали...

Добавлено after 1 minute 22 seconds:
[uquote="roman.com",url="/forum/viewtopic.php?p=4239594#p4239594"]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:

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

или всё таки можем ? ))
:))[/uquote]
и т.д.
[uquote="roman.com",url="/forum/viewtopic.php?p=4239502#p4239502"]а чтобы после наших издевательств мы могли вставить флешку в ПК и прочитать что мы там записали... нам нужно писать на флешку не просто по секторам... а писать согласно файловой системе... FAT32... FAT16... и т.д.)) а для этого надо писать отдельную функцию - работа с файловой системой...

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


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

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

тупо взял ATmega8 и подключил к ней флешку и Ethernet модуль...
сижу... пишу с ПК на флешку... картинки и звук и видео...
сижу... читаю с флешки на ПК... картинки и звук и видео...
картинки.jpg
звук.jpg
видео.jpg
и т.д.
:tea:[/uquote]
мы что будем переписывать весь форум по новой ? ))
Реклама
Друг Кота
Сообщения: 19496
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

Ага, пока диктофон на меге8 не заработает)
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

[uquote="olegue",url="/forum/viewtopic.php?p=4240675#p4240675"]вот здесь интересно сделано.[/uquote]
как работает еепром на Ардуине уже проверил ?))

/////////////////////////////////////////////////////////////////////////////////////////// код для Ардуино
// запись EEPROM Ардуино:

EEAR = 1; // пишем адрес ячейки куда хотим записать 1
EEDR = 1; // пишем данные которые хотим записать 1
EECR |= 0b00000100; // пишем команду "разрешить запись EEPROM"
EECR |= 0b00000010; // пишем команду "запись EEPROM"
while(EECR & 0b00000010); // ждём окончание записи EEPROM

EEAR = 2; // пишем адрес ячейки куда хотим записать 2
EEDR = 2; // пишем данные которые хотим записать 2
EECR |= 0b00000100; // пишем команду "разрешить запись EEPROM"
EECR |= 0b00000010; // пишем команду "запись EEPROM"
while(EECR & 0b00000010); // ждём окончание записи EEPROM

EEAR = 3; // пишем адрес ячейки куда хотим записать 3
EEDR = 3; // пишем данные которые хотим записать 3
EECR |= 0b00000100; // пишем команду "разрешить запись EEPROM"
EECR |= 0b00000010; // пишем команду "запись EEPROM"
while(EECR & 0b00000010); // ждём окончание записи EEPROM
/////////////////////////////////////////////////////////////////////////////////////////// END

//потом читаем...

/////////////////////////////////////////////////////////////////////////////////////////// код для Ардуино
// читаем EEPROM Ардуино:

EEAR = 1; // пишем адрес ячейки которую хотим прочитать 1
EECR |= 0b00000001; // пишем команду "чтение EEPROM"
Serial.println(EEDR); // выводим в последовательный порт... или куда мы там обычно выводим... ))
// в буфере EEDR находятся считанные данные

EEAR = 2; // пишем адрес ячейки которую хотим прочитать 2
EECR |= 0b00000001; // пишем команду "чтение EEPROM"
Serial.println(EEDR); // выводим в последовательный порт... или куда мы там обычно выводим... ))
// в буфере EEDR находятся считанные данные

EEAR = 3; // пишем адрес ячейки которую хотим прочитать 3
EECR |= 0b00000001; // пишем команду "чтение EEPROM"
Serial.println(EEDR); // выводим в последовательный порт... или куда мы там обычно выводим... ))
// в буфере EEDR находятся считанные данные
/////////////////////////////////////////////////////////////////////////////////////////// END


можешь скопировать это всё в свою Ардуину ))
:tea:

Serial.println(" "); - это что за фигня какая-то ? )) типа терминала какого то...
наподобие этого... System.out.println(" ");

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

Сообщение olegue »

roman.com писал(а):можешь скопировать это всё в свою Ардуину ))
и тогда мне не понадобится библиотека eeпром для Ардуино?


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

но по любому освоить запись ADC на влэшку надо обязательно.

Добавлено after 3 minutes 17 seconds:
[uquote="roman.com",url="/forum/viewtopic.php?p=4240717#p4240717"]мы что будем переписывать весь форум по новой ? ))[/uquote]

я обязательно вернусь к тому что Вы написал, но чуть позже,я сначала хочу завершить этот проек и довести его до приемлегого состояния.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

olegue писал(а):и тогда мне не понадобится библиотека eeпром для Ардуино?
не понадобится.
:tea:
Ардуино умеет работать напрямую с регистрами: EEAR, EEDR, EECR, EECR... и т.д.
Это название регистров AVR... но которой собрано Ардуино.
Без всяких библиотек))
olegue писал(а):но если я буду писать структуру данных в еепром
:dont_know:
я не работаю со структурами... мне они не нужны))
это пустая трата драгоценного процессорного времени... ))
olegue писал(а):поэтому и придумали ардуину
поэтому ардуина такая тормознутая))
:tea:
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

Еще такой вопрос. У меня модуль карты без преобразователя уровней, поэтому я запитал Аtmegu и карту от 3.3в. Счас добавляют часы ds1307. Там питание 5в. То что я питаю Атемегу от 3.3 сильно ли влияет на ее быстродействие. Я заметил счто скетч заливается гораздо медленнее. До этого я прводил эксперименты с кард модулем с преобзователями урвней и питал все от 5в. Потом мне что-то не понравилось и я перешел на 3.3.

Такие дала. Короче как влияет снижение питание на работу Атмеги?
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

какая мега ? ))

мега8 от RC генератора 8 МГц при 5 вольт...
мега8 от RC генератора ~7,2 МГц при 2 вольт...

мега328 от RC генератора 8 МГц при 5 вольт...
мега328 от RC генератора ~7,9 МГц при 2 вольт...

мега8 и мега328 от кварцевого генератора 8 МГц при 5 вольт...
мега8 и мега328 от кварцевого генератора 8 МГц при 2 вольт...

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

Сообщение olegue »

[uquote="roman.com",url="/forum/viewtopic.php?p=4240799#p4240799"]зачем ds1307... не понятно... можно сделать программно...
на да ладно)) пусть будет))[/uquote]

таки можно сделать, но вопрос всегда в том что я могу сделать с условной помощью сообщества, но в данном случает цитируемое сообщение не дает мне никакой новой информации.

Добавлено after 2 minutes 5 seconds:
что бы Атмега сама считала время? а оно не уйдет за месяц на неделю вперед?
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

не, это тухлый вариант, думай как установить время , думай как держать....
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

olegue писал(а):но по любому освоить запись ADC на влэшку надо обязательно.
надо))

сделай как я... )) када я осваивал запись Ардуино в память TFT экрана... я всё проверил в Протеусе))
вверху я вижу скорость работы SPI Ардуино...
внизу я вижу байты данных и команды которые передаёт Ардуино в память TFT экрана...
ILI9341-ардуино.jpg
(136.34 КБ) 62 скачивания
сделать тоже самое со своей Ардуино))

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

Добавлено after 36 minutes 2 seconds:
olegue писал(а):это тухлый вариант...
:dont_know:
включаем обычный таймер... таймер работает от кварца... каждую секунду срабатывает прерывание...
считаем секунды...
умножаем на 60... получаем минуты...
умножаем на 60... получаем часы...
умножаем на 24... получаем сутки...

очень сложная задача))
olegue писал(а):думай как установить время...

кнопочками)) заходим в "меню" > "установка времени"

очень сложная задача))
olegue писал(а):думай как держать...
кнопочками)) заходим в "меню" > "коррекция таймера" > "+"... часы идут быстрей)) > "-"... часы идут медленней))

очень сложная задача))
Martian писал(а):Вот мне потому отдельные RTC симпатичны.
а мои 2 штуки мега128 получает время из... GPS навигатора)) вместе с координатами))
пульт_время.jpg
(147.97 КБ) 64 скачивания
кораблик_время.jpg
(165.6 КБ) 57 скачиваний
:)
очень сложная задача))

а моя мега8 получает время из... сервера))
а сервер получает время из компьютера))
а компьютер получает время из сервера точного времени... по Интернету (протокол NTP).
а сервер точного времени из Интернета получает время... из атомным часов...
атомные часы.jpg
(61.27 КБ) 74 скачивания
:shock:

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

Сообщение olegue »

roman.com писал(а):да я осваивал запись Ардуино в память TFT экрана... я всё проверил в Протеусе))
да, пытаюсь в протеусе зарядить Ардуино, но пока безрезультатно, пробую подключить бинарник кода и ардуино иде, валит ошибки, гуглю, разбираюсь
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

ну короче, перешел я опять на 5в.

Код: Выделить всё

void dateTime(uint16_t* date, uint16_t* time) {
  DateTime now = rtc.now();

  // return date using FAT_DATE macro to format fields
  *date = FAT_DATE(now.year(), now.month(), now.day());

  // return time using FAT_TIME macro to format fields
  *time = FAT_TIME(now.hour(), now.minute(), now.second());
}


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-карту. */
  SdFile::dateTimeCallback(dateTime);
   rec.open(filename, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */
   
время всадил вот так, но пока не совсем понятно как этот работает и еще не пробовал в железе.

отсюда взял
https://forum.arduino.cc/t/file-creatio ... d/336037/2

с часами провозился день. Пришлось привести их в чувство по этому видосу . На чип 1307 вообще не шло питание.
https://www.youtube.com/watch?v=b8-4o6A7dZs&t=105s

Добавлено after 4 minutes 44 seconds:
Изображение

оперативка уже заканчивается поэтому дальнейшее продолжение проект в пределах Ардуино УНО вряд ли возможно.

Добавлено after 1 minute 28 seconds:
97% уже занятно после подключения часов, непонятно будет ли нормлаьно работать с часами. Без часов прекрасно пишет файлы , самый большой был около 20 минут.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

я так понял в Протеусе нифига не заработало...

я брал готовый код из какого сайта... для Ардуино UNO специально для Протеуса... тупо скачал архив протеуса и у меня все завелось сразу))

када уже переходить на СИ будем ?)) уже видео пора подключать... а мы тут всё со звуком возимся))
:tea:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Сообщение olegue »

Ничего не вышло! sdfat+eeprom+ds1307 -осталось 58 байт sram , запись просто отказалась взлетать.
Есть мысль отказать от библиотеки EEPROM, а нахрена она если имя можно формировать от сек, мин час.
СЧас попробюу, может хоть какие то байты освободятся

удивительная штука ардуина )))
Мудрый кот
Сообщения: 1781
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Я в своем логгере названия файлов делал так-месяц-день-час-мин,то есть сейчас было бы 06070035
Ответить

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