Conflit SPI entre module RFID et module SD

Bonjour à tous,

Je suis en train de réaliser une serrure badgée avec un module RFID et un enregistrement des logs sur une carte SD.

Dans un premier temps j'ai glané du code pour l'ouverture de la porte >> tout fonctionne
Dans un second temps j'ai glané du code pour l'écriture sur la carte SD >> l'écriture fonctionne mais la fonction de lecture des tags RFID ne fonctionne plus...

Seulement voilà, en laissant le code tel quel et que je retire le module SD de la breadboard, la lecture de badge fonctionne a nouveau...

Des précisions: Carte Arduino UNO, module RFID RC522 et module SD générique (broche SCK, CS, MOSI et MISO)

Merci à vous

#include <SPI.h>
#include <RFID.h>
#include <EEPROM.h>
#include <SD.h>

#define SS_PIN 10// Arduino Uno: RST: 9, SS (SDA): 10, MOSI: 11, MISO: 12, SCK: 13
#define RST_PIN 9 //module RC522
#define CS_PIN 3 // Module SD


byte led_rouge = 6, led_verte = 7, bouton = 4, serrure = 8, buzz = 2;
byte cur_badge[5]; //current badge, liste des 5 octets du badge que l'on lit

RFID rfid(SS_PIN, RST_PIN); 

File journal;
    
void setup()
{ 
  Serial.begin(9600); //uniquement pour debug
  SPI.begin(); 
  rfid.init();
  pinMode(led_rouge,OUTPUT);
  pinMode(led_verte,OUTPUT);
  pinMode(bouton, INPUT_PULLUP);
  pinMode(serrure, OUTPUT);
  pinMode(buzz, OUTPUT);
  pinMode(12, INPUT);
 

  
  if( !digitalRead(bouton))// à l'appui du bouton au moment du démarrage, effaçage de la mémoire
  {
    for (int n=0; n<1024; n++) //lancer ces deux lignes pour effacer totalement la mémoire 
        EEPROM.write(n,0);
  
  digitalWrite(led_rouge,1);
  digitalWrite(led_verte,1);
  tone(buzz,2093,1000);
  delay(1000);
  digitalWrite(led_rouge,0);
  digitalWrite(led_verte,0);
  }
  else //bip normal d'allumage
  {
    digitalWrite(led_verte,1);
    tone(buzz,2093, 150); delay(150);
    digitalWrite(led_verte,0); delay(150);
    tone(buzz, 2093, 150); digitalWrite(led_verte,1); delay(150);
    digitalWrite(led_verte,0);
  }

    if (!SD.begin(3)) {
    Serial.println("L'initialisation de la carte SD a echoue !");
    return;
  }
    Serial.println("L'initialisation de la carte SD a reussie !");

   journal = SD.open("test.txt", FILE_WRITE); //on peut en ouvrir qu'un à la fois //

  if (journal) { //si le fichier a bien été ouvert :
    Serial.print("En train d ecrire dans le fichier test.txt");
    journal.println("J'ecris une ligne dans le ficher !");
    journal.close();
    Serial.println(" Fait");
    digitalWrite(CS_PIN, LOW);
  } else { // sinon :
    Serial.println("Erreur lors de l'ouverture de test.txt");
  }
}

void new_badge()
{
  // Enregistre un nouveau badge dans la mémoire EEPROM
  int start_mem = EEPROM.read(0)*5+1; //dans la première case mémoire, on stock le nombre de badge déjà sauvegardés,
                                  //et on calcule la case mémoire à partir de laquelle enregistrer le nouveau badgenb_badge
    for(byte n= 0; n<5; n++)
    {
      EEPROM.write(start_mem+n, cur_badge[n]);
    }
    EEPROM.write(0, EEPROM.read(0)+1);
}

bool compare_badge()
{
  //Compare le badge lu avec tous les badges enregistrés
  int nb_badge = EEPROM.read(0); //récupération du nombre de badges stockés en mémoire
  bool badgeOk = false; //0 si badge non correspondant, 1 si badge correspondant
 /* Serial.println("Badge actuel: ");
  Serial.println(cur_badge[0]);
  Serial.println(cur_badge[1]);
  Serial.println(cur_badge[2]);
  Serial.println(cur_badge[3]);
  Serial.println(cur_badge[4]);
  Serial.println("FIN BADGE ACTUEL");*/
  for(int n = 0; n<nb_badge; n++)
  {
  /*Serial.print("Badge memoire lu numero: "); Serial.println(n+1);
  Serial.println(EEPROM.read(n*5+1));
  Serial.println(EEPROM.read(n*5+2));
  Serial.println(EEPROM.read(n*5+3));
  Serial.println(EEPROM.read(n*5+4));
  Serial.println(EEPROM.read(n*5+5));
  Serial.println("FIN BADGE MEMOIRE LU");*/
    badgeOk = EEPROM.read(n*5+1)==cur_badge[0] && EEPROM.read(n*5+2)==cur_badge[1] && EEPROM.read(n*5+3)==cur_badge[2] && EEPROM.read(n*5+4)==cur_badge[3] && EEPROM.read(n*5+5)==cur_badge[4];
    if (badgeOk) return true;
  }
  return false;
}



void loop()
{
    if (rfid.isCard()) {
        if (rfid.readCardSerial())
            {
                for(byte n=0; n<5; n++)
                {
        cur_badge[n] = rfid.serNum[n]; //copie de la liste des 5 octets lus sur le badge dans la liste current badge (cur_badge))
        } 
                /*Serial.println("DEBUT");
                Serial.print(rfid.serNum[0],DEC);
                Serial.print(" ");
                Serial.print(rfid.serNum[1],DEC);
                Serial.print(" ");
                Serial.print(rfid.serNum[2],DEC);
                Serial.print(" ");
                Serial.print(rfid.serNum[3],DEC);
                Serial.print(" ");
                Serial.println(rfid.serNum[4],DEC);
                Serial.print("FIN");*/
                  Serial.println();
                for (byte n=0; n<5; n++)
                {
                  Serial.print(rfid.serNum[n],DEC);
                  Serial.print(" ");
                  journal.print(rfid.serNum[n],DEC);
                 journal.print(" ");
                }
         if(compare_badge()) //si la comparaison du badge actuel avec un des badges mémoire est ok, alors on ouvre
         {
          digitalWrite(led_verte,1);
          tone(buzz,523,50);
          delay(50);
          tone(buzz, 783, 50);
          delay(50);
          tone(buzz, 1046, 50);
          delay(50);
          tone(buzz, 1568, 50);
          delay(50);
          tone(buzz, 2093, 70);
          delay(250);
          digitalWrite(serrure, 1);
          delay(3000);
          digitalWrite(led_verte,0);
          digitalWrite(serrure, 0);
         }
         else
         {
          digitalWrite(led_rouge, 1);
          tone(buzz,370,50);
          delay(100);
          tone(buzz, 370, 300);
          delay(1000);
          digitalWrite(led_rouge, 0);
         }
       }
    }

          
    if(!digitalRead(bouton)) //lors de l'appui du bouton pour enregistrer un nouveau badge
    {
       while(!digitalRead(bouton)) {} //anti rebond sur le bouton d'enregistrement de nouveau badge
       delay(100);
       
       digitalWrite(led_rouge, 1); digitalWrite(led_verte,1); //allumage des deux leds simultanément pour signaler que c'est ok et prêt
  
       while (!rfid.isCard() && digitalRead(bouton)) {} //on attend la lecture d'un badge, ou le rappui du bouton qui va annuler, car le if suivant ne sera pas vérifié
       
       if (rfid.readCardSerial())
       {
        for(byte n=0; n<5; n++)
            {cur_badge[n] = rfid.serNum[n];} //lecture du badge que l'on passe
        if(!compare_badge()) //si le badge n'est pas déjà enregistré, on enregistre le nouveau badge
            {
              new_badge(); 
              digitalWrite(led_rouge, 0);
              digitalWrite(led_verte, 1);
              tone(buzz, 2093, 500);
              delay(200);
              digitalWrite(led_verte, 0);
              delay(200);
              digitalWrite(led_verte, 1);
              delay(200);
              digitalWrite(led_verte, 0);
              delay(200);
              digitalWrite(led_verte, 1);
              delay(200);
              digitalWrite(led_verte, 0);
            }
          else //si le badge que l'on veut ajouter est déjà enregistré, du con, ça clignote rouge
          {
              digitalWrite(led_verte, 0);
              digitalWrite(led_rouge, 1);
              tone(buzz,370,500);
              delay(200);
              digitalWrite(led_rouge, 0);
              delay(200);
              digitalWrite(led_rouge, 1);
              delay(200);
              digitalWrite(led_rouge, 0);
              delay(200);
              digitalWrite(led_rouge, 1);
              delay(200);
              digitalWrite(led_rouge, 0);
          }
        }
      else 
      {
         //si on rappuie sur le bouton, retour
        digitalWrite(led_rouge,0);
        digitalWrite(led_verte,0);
        while(!digitalRead(bouton)) {} //anti redéclenchement si on reste appuyé
        delay(500);
      }
     }
    rfid.halt();
}

Lire les messages épinglés avant de poster !

Code illisible = peu de chance d'obtenir une réponse

http://forum.arduino.cc/index.php?topic=546956.0

http://forum.arduino.cc/index.php?topic=315372.0

Il s’agissait d’un problème électrique, il suffit de mettre en série une résistance de 330Ohm sur la broche MISO du module SD.