Микрофон2
- Войдите на сайт для отправки комментариев
Всем привет!
Прошу прощения, что создаю новую тему по старому вопросу. Не нашел как можно удалить старую тему.
В ходе разбирательств с работой микрофона и ардуино нашел библиотеку для записи аудио файлов на сд карту. Большими усилиями я переделал найденные примеры в сети и получил код для записи на карту звуков определенной длительности (задается в начале скетча). Запись начинается путем нажатия на кнопку. Используются Ардуино Нано, МАХ9814, Модуль для микроСД карт HW-125.
Проблема в том, что если скетч из примера работает идеально, то мой не записывает данные на карту.
К сожалению, я не понимаю где ошибка в коде. Может быть кто-то на форуме ее найдет.
Инициализация микросд карты проходит норм - в мониторе порта SD OK
При нажатии на кнопку идет сообщения о старте записи, а далее об ее окончании
#include <SD.h> #include <SPI.h> #include <TMRpcm.h> #include <EEPROM.h> #define SD_ChipSelectPin 4 //using digital pin 4 on arduino nano 328, can use other pins , CS #define microphone_pin A0 TMRpcm audio; // create an object for use in this sketch int RecordNumber; char FileName[10]; const int buttonPin = 8; // the number of the pushbutton pin const int ledPin = 6; // the number of the LED pin int buttonState; // variable for reading the pushbutton status int recordState = 0; // if the recording is going on int recordTime = 3; // sec void setup() { pinMode(ledPin, OUTPUT); // initialize the LED pin as an output pinMode(buttonPin, INPUT_PULLUP); // initialize the pushbutton pin as an input pinMode(12,OUTPUT); //Pin pairs: 9,10 Mega: 5-2,6-7,11-12,46-45, MISO Serial.begin(9600); if (!SD.begin(SD_ChipSelectPin)) { Serial.println("sd faild"); return; }else{ Serial.println("SD OK"); } // The audio library needs to know which CS pin to use for recording audio.CSPin = SD_ChipSelectPin; RecordNumber = EEPROM.read(0); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == LOW) { Serial.println("button is pressed"); RecordNumber++; EEPROM.write(0, RecordNumber); sprintf(FileName,"Audio_%d.wav", RecordNumber); audio.startRecording(FileName,16000,microphone_pin); Serial.println("recording start"); digitalWrite(ledPin, HIGH); delay(recordTime*1000); audio.stopRecording(FileName); Serial.println("recording stopped"); digitalWrite(ledPin, LOW); } }
А зачем вы заказываете запись 16сек длиной, а прерываете ее через три?
Скажу честно, я не знаю точно как это работает, но скорее всего это приводит к сбросу записи и ничего не сохраняется либо же файл получается "битый".
Здравствуйте!
Если Вы про 44 строчку, то 16000 это задается частота дискретизации
Проблема в том, что если скетч из примера работает идеально, то мой не записывает данные на карту.
а если сравнить ваш скетч и пример - в чем разница? она вроде должна быть очевидна, там кода-то всего ничего
Разница большая. Вот стандартный пример из библиотеки
Тут пример из видео на ютубе
Я брал некоторые команды из второго скетча.
И хотел сделать так, чтобы ардуина записывала трек определенной длины
обратите внимание, что в обоих примерах кода не используется delay(). а у вас - оно присутсвует именно во время записи.
Поскольку delay() блокирует контроллер, вероятно МК не может записывать звук в это время
ага, а как тогда можно сделать так, чтобы он записывал звук именно определенное время.
пример
спасибо! попробую сегодня-завтра. отпишусь о результатах.
По моему delay() в данном случае не виновен.
Проверить можно изменив заведомо рабочий скетч примера, добавив после команды старта команду delay(30000) (числом 30000 а не переменной для определенности) и команду окончания записи.
Дополнено позже. ошибочно написал 30000 вместо 3000
Всем привет!
Мы с другом сидели с кодом часа два и поняли в чем ошибка.
строчка 10
в ней задаются биты для имени файла. их было недостаточно. то есть здесь нужно вставить большее значение)
делэй не при чем )
Строка 22 из первого сообщения не мешает?
pinMode(12,OUTPUT);
(на симуляторе для UNO мешает, т.к. 12 это MISO и используется для обмена с SD)
НАДА БОООЛЬШЕ БИТОВ!!! для имени файла, всё дело в этом!!!
Пидец. Не угадал.
Строка 22 из первого сообщения не мешает?
pinMode(12,OUTPUT);
(на симуляторе для UNO мешает, т.к. 12 это MISO и используется для обмена с SD)
нет, не мешает) к 12 пину как раз подключается MISO :)