Как воспроизводить звук на Arduino с помощью SD-карты?
Я работаю над "личным помощником" с Arduino, и у меня возникли проблемы с воспроизведением звука с SD-карты... Я использую щит под названием "Easy Shield UNO" от Simkeim, и на нем есть устройство для чтения SD-карт. Он работает, потому что я проверил его через последовательный монитор, но когда я пытаюсь воспроизвести звук, ничего не происходит. (Динамик работает) Может кто-нибудь, пожалуйста, помочь мне проверить мой код или что-то еще, чтобы понять, что не так?
Вот код, который я нашел в Интернете, я только немного изменил его...
#include "SD.h"
#define SD_ChipSelectPin 10
#include "TMRpcm.h"
#include "SPI.h"
TMRpcm tmrpcm;
void setup(){
tmrpcm.speakerPin = 7;
Serial.begin(9600);
tmrpcm.setVolume(255);
}
void loop() {
if(!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD card not found");
return;
}
else{
Serial.println("SD card reading sucess");
tmrpcm.play("test1.wav");
}
}
@Renier Jr., 👍1
Обсуждение1 ответ
Лучший ответ:
Я вижу три проблемы с вашим кодом:
Нет особого смысла снова и снова запускать SD-карту в
цикле(). Пожалуйста, переместите эту часть вsetup()или куда-нибудь еще, где она не вызывается на каждой итерации цикла.Вы не должны вызывать
tmrpcm.play()в каждойитерации цикла (). Он не ждет, пока песня будет закончена. Он просто начинает воспроизведение (которое контролируется прерыванием по таймеру) и завершается. И каждый его вызов будет запускать файл снова при его запуске. Поэтому, вызывая его снова и снова в быстрой последовательности, вы не оставляете достаточно времени для фактического воспроизведения файла, пока вы не воспроизведете его снова с самого начала. Чтобы предотвратить это, вы можете использовать оператор if только для запуска, если в данный момент файл не воспроизводится:if(!tmrpcm.isPlaying()){ tmrpcm.play("test1.wav"); }Вы выбираете вывод 7 в качестве выходного вывода, но вы не можете выбрать вывод свободно, потому что он должен быть подключен к используемому таймеру и, следовательно, иметь возможность ШИМ. Это не относится к контакту 7. В вики-библиотеке TMRpcm вы можете найти следующую строку в разделе "Функции":
audio.speakerPin = 11; set to 5,6,11 or 46 for Mega, 9 for Uno, Nano, etc.Поэтому, пожалуйста, подключите динамик к контакту 9 и используйте
tmrpcm.speakerPin = 9;.
Привет, спасибо за помощь! Я изменил его, как ты сказал, но он все еще издает тот статичный звук... Я также попробовал пример кода TMRpcm, но мой динамик все еще издает статический звук? Как вы думаете, это может быть связано с кодом или файлом? Потому что я попробовал это с двумя другими ораторами, и они сделали то же самое..., @Renier Jr.
@RenierJr. Я снова заглянул в библиотеку и обнаружил, что вы не можете свободно выбирать используемый контакт. Он должен быть с поддержкой ШИМ и принадлежать используемому таймеру (по умолчанию Timer1). Я добавил абзац об этом в свой ответ, @chrisl
Спасибо, крисл!! Я попробовал пример кода, и он использовал контакт 9, теперь он работает, но в музыке много статики. Я попытаюсь изменить частоту дискретизации, чтобы посмотреть, сработает ли это... Еще раз спасибо за время, которое вы потратили, чтобы помочь мне!, @Renier Jr.
- SD-карта не инициализируется
- TFT и SD не работают вместе
- Пример SD-карты зависает на строке SD.begin(), что мне делать?
- Что означают эти контакты? Куда мне их подключить?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как отправить данные из Arduino Uno с SIM900 GPRS в Firebase
- Отправка текстового сообщения через Wi-Fi-shield Arduino
- Понимание того, почему следует избегать «String» и альтернативных решений
А) Пожалуйста, добавьте ссылку на щит. Б) Пробовали ли вы использовать образец скетча, прилагаемый к библиотеке, чтобы убедиться, что все работает должным образом?, @Nino
Я купил щит, когда мы жили в Китае, так что это китайский веб-сайт. https://i-item.jd.com/59763201006.html. Да, я пробовал использовать образец скетча, все работает, но звук-это всего лишь два длинных статических звука, @Renier Jr.
Когда я меняю имя файла, динамик ничего не делает, но когда я использую настоящее имя файла, динамик издает скрипучие звуки, @Renier Jr.