Problemi con UNO, IR Remote e Sparkfun MP3 shield

Ciao a tutti
sto cercando di realizzare un semplice lettore MP3 con

–Arduino Uno
–uno shield MP3 Sparkfun – SparkFun MP3 Player Shield - DEV-12660 - SparkFun Electronics
–un telecomando ed un ricevitore IR

Lo shield MP3 è stato connettorizzato ed infilato sulla scheda Arduino Uno.

Sulla scheda SD inserita nello shield MP3 sono stati salvati 9 brani MP3.

Il mio fine è selezionare con il telecomando i tasti da 1 a 9 e, quindi, far partire la riproduzione dei brani da track001.mp3 a track009.mp3, seguendo anche le indicazione della “Hookup Guide” raggiungibile dalla pagina indicata al link precedente.

Il problema si presenta con il telecomando.
Infatti, una volta selezionato il primo tasto (ad esempio il tasto 2) avviene correttamente la riproduzione del brano associato (ossia il track002.mp3). E fin qui tutto bene.
Nel momento in cui premo un tasto diverso del telecomando, la decodifica del segnale inviato dal telecomando avviene in modo errato e, pertanto, non avviene una nuova riproduzione.
Come vedete nel file forumimg.png allegato, solo la prima decodifica (FD9867) è corretta (essendo composta da 6 caratteri esadecimali identici a quelli del tasto premuto (cosa verificata preventivamente con uno sketch di setup dei tasti). Gli altri sono tutti sbagliati, eppure, se vengono mostrati con il comando ““Serial.println(results.value, HEX);”” vuol dire che la decodifica c’è stata, ossia che il metodo “decode” dell’oggetto “irrecv” ha effettuato la decodifica e l’ha salvata in “results”.

Come pin del ricevitore IR è stato scelto un pin analogico (che, come sapete, possono funzionare anche come pin digitali). In ogni caso, il problema non è questo. Lo shield MP3 della Sparkfun lascia liberi solo i piedini digitali 5 e 10, e anche utilizzando questi pin il problema si presenta nello stesso modo.
La scelta di utilizzare i piedini analogici deriva dal fatto che i piedini digitali liberi (5 e 10) sono accanto ad altri piedini utilizzati dallo shield MP3. Pertanto, avendo ipotizzato inizialmente dei problemi di interferenza (accoppiamento di segnale) del segnale IR con i piedini vicini, mi sono spostati su quelli analogici, completamente inutilizzati dallo shield MP3.
Qualche idea?

#include <IRremote.h>
#include <SPI.h>           // SPI library
#include <SdFat.h>         // SDFat Library
#include <SdFatUtil.h>     // SDFat Util Library
#include <SFEMP3Shield.h>  // Mp3 Shield Library


long comando = 0;
int scelta = 0;
int sceltan = 0;

#define receiver 14      

IRrecv irrecv(receiver); // crea istanza 'irrecv'
decode_results results;

SdFat sd; // Create object to handle SD functions
SFEMP3Shield MP3player; // Create Mp3 library object
const uint8_t volume = 20; // MP3 Player volume 0=max, 255=lowest (off)
const uint16_t monoMode = 1;  // Mono setting 0=off, 3=max

void setup() {
  Serial.begin(9600);   // velocità monitor seriale 
  irrecv.enableIRIn();  // inizializza il sensore 

  initSD();  // Initialize the SD card
  initMP3Player(); // Initialize the MP3 Shield
}

void loop(){
  if (irrecv.decode(&results))           
  {
    Serial.println(results.value, HEX); 

    comando = results.value;

   if (comando == 0xFD30CF) {
      scelta=0;
    } 
      else if (comando == 0xFD08F7) {
      scelta=1;
    } 
      else if (comando == 0xFD8877) {
      scelta=2;
    } 
    else if (comando == 0xFD48B7) {
      scelta=3;
    } 
    else if (comando == 0xFD28D7) {
      scelta=4;
    } 
    else if (comando == 0xFDA857) {
      scelta=5;
    } 
    else if (comando == 0xFD6897) {
      scelta=6;
    } 
    else if (comando == 0xFD18E7) {
      scelta=7;
    } 
    else if (comando == 0xFD9867) {
      scelta=8;
    } 
      else if (comando == 0xFD58A7) {
      scelta=9;
    } 
      else 
    {
        scelta=-10;   // nessun tasto corretto premuto
    }

    if ((scelta!=sceltan)&&(scelta!=-10)) 
    //se la scelta è diversa dalla precedente ed il tasto è corretto
    //ferma l'eventuale riproduzione in corso
    //fai partire la nuova riproduzione
    //memorizza in sceltan il valore del brano attuale per successivo confronto
    {
     MP3player.stopTrack();
     uint8_t result = MP3player.playTrack(scelta);
     sceltan=scelta;
    } 
   
  irrecv.resume();
 }    // chiude -- if (irrecv.decode(&results))       
}     // chiude -- void loop()


void initSD()
{
  //Initialize the SdCard.
  if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) 
    sd.initErrorHalt();
  if(!sd.chdir("/")) 
    sd.errorHalt("sd.chdir");
}
void initMP3Player()
{
  uint8_t result = MP3player.begin(); // init the mp3 player shield
  if(result != 0) // check result, see readme for error codes.
  {
    // Error checking can go here!
  }
  MP3player.setVolume(volume, volume);
  MP3player.setMonoMode(monoMode);
}

forum.ino (2.49 KB)