Использование клавиатуры для воспроизведения аудиофайла на 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);
  }
}

, 👍2

Обсуждение

Я добавил эти комментарии в основную часть вопроса., @sa_leinad

Нет, спасибо @sa_leinad! Мы надеемся, что решение есть., @Rick

Вывод, который вы показываете с последовательного монитора, отсутствует в коде, который вы опубликовали-откуда взялся текст "Воспроизведение музыкального файла 9"?, @jose can u c

Эй, @josecanuc, эта часть взята из предыдущей попытки кода, чтобы показать, что я пробовал до сих пор. Что я пытался сделать с этой попыткой, так это заставить звук воспроизводиться, когда я нажимаю "9", используя приведенный ниже код. Последовательный считыватель прочитал Воспроизводимый музыкальный файл, но на самом деле ничего не воспроизводил: клавиша char = клавиатура.getKey(); если (клавиша) { Серийный номер.номер печати(ключ); если (ключ =='9') { PlayMusic("трек 001.mp3"); } }, @Rick

Я сузил круг обстоятельств, при которых это происходит. Я помещаю "SD.существует("файл")" в верхней части цикла, и он последовательно возвращает значение true до первого использования клавиатуры. С этого момента он возвращает значение false, что объясняет, почему музыкальный проигрыватель не воспроизводит его. Он просто не может его найти. Есть какие - нибудь мысли о том, как клавиатура может мешать работе SD?, @Rick


1 ответ


0

В скетче есть конфликт контактов.

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-карты.

,