Использование клавиатуры для воспроизведения аудиофайла на Arduino Mega и Adafruit VS1053
Я пытаюсь использовать клавиатуру для запуска аудиофайла с помощью Arduino Mega и музыкального производителя Adafruit VS1053. Я заставил музыкальные файлы воспроизводиться независимо, и когда на клавиатуре вводится правильный номер, красный светодиод мигает зеленым, но я понятия не имею, как заставить музыкальный файл воспроизводиться в результате моей комбинации.
Работает то, что музыкальный файл воспроизводится, но проблема в том, что он воспроизводится автоматически, а не при вводе комбинации.
Я попытался ввести файл MusicPlayer.playfullfile("track002.mp3")
в цикл с помощью оператора if, и когда я нажимаю на клавиатуру, последовательный считыватель сообщает мне, что он воспроизводит музыкальный файл, но на самом деле ничего не воспроизводится :
char key = keypad.getKey();
if (key) {
Serial.println(key);
if (key =='9') {
playMusic("track001.mp3");
}
}
Я проводил эксперименты с playmusic
вне цикла, и он отлично работает и без проблем находит файл. Таким образом, проблема возникает, когда я пытаюсь ввести его в цикл как часть комбинации клавиш, он немедленно возвращается без воспроизведения.
Это от серийного считывателя
Воспроизведение музыкального файла 9
Воспроизведение музыкального файла 9
Воспроизведение музыкального файла 9
Воспроизведение музыкального файла
Любая помощь была бы чрезвычайно признательна.
Мой полный код приведен ниже:
#include <Keypad.h>
#include <SD.h>
#define SD_ChipSelectPin 53
#include <SPI.h>
#include <Adafruit_VS1053.h>
String password = "123";
String answer = "";
int position = 0;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = { 51, 49, 47, 53 };
byte colPins[COLS] = { 45, 43, 41, 39 };
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS,
COLS );
int R = 27; // 3rd yellow wire in GROUND
int G = 29;
// define the pins used
//#define CLK 13 // SPI Clock, shared with SD card
//#define MISO 12 // Input data, from VS1053/SD card
//#define MOSI 11 // Output data, to VS1053/SD card
// Connect CLK, MISO and MOSI to hardware SPI pins.
// See http://arduino.cc/en/Reference/SPI "Connections"
// These are the pins used for the breakout example
#define BREAKOUT_RESET 9 // VS1053 reset pin (output)
#define BREAKOUT_CS 10 // VS1053 chip select pin (output)
#define BREAKOUT_DCS 8 // VS1053 Data/command select pin
(output)
// These are the pins used for the music maker shield
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin
(output)
// These are common pins between breakout and shield
#define CARDCS 4 // Card chip select pin
// DREQ should be an Int pin, see
http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer =
// create breakout-example object!
//Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS,
BREAKOUT_DCS,
DREQ, CARDCS);
// create shield-example object!
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
void setup() {
if (! musicPlayer.begin()) {
// initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
// Set volume for left, right channels. lower numbers == louder volume!
musicPlayer.setVolume(20,20);
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
}
musicPlayer.playFullFile("track003.mp3");
}
void loop() {
char key = keypad.getKey(); // init. variable key keypad is non blocking
while(key == NO_KEY) {
// we got no key press? -> do again
key = keypad.getKey();
delay(100);
}
answer.concat(key); //add key to answer
if(answer.equals(password)) {
//password OK
musicPlayer.playFullFile("track002.mp3");
Serial.println(F("Playing track 001"));
LockedPosition(false);
answer="";
} else {
LockedPosition(true);
}
if (answer.length() > password.length()) {
// answer is different and bigger than password
// can't become the right answer
answer = "";
}
if (key == '*' || key == '#') {
LockedPosition(true);
answer="";
}
}
void LockedPosition(int locked) {
if (locked) {
digitalWrite(R, HIGH);
digitalWrite(G, LOW);
} else {
digitalWrite(R, LOW);
digitalWrite(G, HIGH);
delay(10000);
digitalWrite(G,LOW);
}
}
@Rick, 👍2
Обсуждение1 ответ
В скетче есть конфликт контактов.
SD-карта находится на шине SPI. Контакты SPI на Arduino Mega-это контакты 50, 51, 52 и 53. Эти контакты также доступны на заголовке ICSP/SPI. Мега совместимые экраны используют контакты SPI на заголовке ICSP. Вывод 53 должен быть установлен в качестве выходного, если Mega является ведущим SPI и обычно используется в качестве вывода CS для ведомого устройства.
Согласно скетчу, номер PIN SD CS равен 53.
Согласно скетчу, на клавиатуре используются контакты 51 и 53. 51-это контакт SPI, используемый экраном, а контакт 53-это контакт CS для SD-карты.
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- `.readFileCounts()` не работает в мини-модуле DFPlayer
- DFPlayer для записи на SD-карту
- Запись выходов "терменвокса" в MIDI-файл на SD-карте
- DFPlayer, воспроизведение звука при высоком значении pin
- Почему этот код не воспроизводит преобразованный заголовочный файл wav2c через Arduino на мой динамик?
- Файл Wave не воспроизводится с Teensy 3.5
- Звук перестает воспроизводиться после подключения rtc
Я добавил эти комментарии в основную часть вопроса., @sa_leinad
Нет, спасибо @sa_leinad! Мы надеемся, что решение есть., @Rick
Вывод, который вы показываете с последовательного монитора, отсутствует в коде, который вы опубликовали-откуда взялся текст "Воспроизведение музыкального файла 9"?, @jose can u c
Эй, @josecanuc, эта часть взята из предыдущей попытки кода, чтобы показать, что я пробовал до сих пор. Что я пытался сделать с этой попыткой, так это заставить звук воспроизводиться, когда я нажимаю "9", используя приведенный ниже код. Последовательный считыватель прочитал Воспроизводимый музыкальный файл, но на самом деле ничего не воспроизводил: клавиша char = клавиатура.getKey(); если (клавиша) { Серийный номер.номер печати(ключ); если (ключ =='9') { PlayMusic("трек 001.mp3"); } }, @Rick
Я сузил круг обстоятельств, при которых это происходит. Я помещаю "SD.существует("файл")" в верхней части цикла, и он последовательно возвращает значение true до первого использования клавиатуры. С этого момента он возвращает значение false, что объясняет, почему музыкальный проигрыватель не воспроизводит его. Он просто не может его найти. Есть какие - нибудь мысли о том, как клавиатура может мешать работе SD?, @Rick