Multiplicar pines 13,12,11

Buenas, tengo un controlador asistencia RFID que guarda los IDs registrados en una micro SD, ambos tienen en comun comunicación por bus SPI, oses Pin 13,12,11 (SCK, MISO, MOSI), he multiplicado esos pines a una protoboard pero si funciona el lector rifd no funciona el modulo sd y viceversa, asi que si alguien puede ayudarme o mostrarme en una imagen como realizo esa conexión se lo agradeceria demasiado, gracias.
PD: Aclaro que el reloj todavia no lo tengo conectado, pues primero quiero resolver este problema.

#include <SPI.h>       // libreria comunicacion SPI
#include <MFRC522.h>   // libreria del Lector RFID
#include <Wire.h>    // libreria comunicacion I2C
#include <Time.h>     // libreria para el tiempo 
#include <DS1307RTC.h>   // libreria del reloj
#include <SD.h>       // libreria para la memoria SD
 

#define RST_PIN 9 // Configurable, pin 9 para Reset del MFRC522 
#define SS_PIN 10 // Configurable, pin 8 para el selector de chip del MFRC522

const char *Mes[13] = {" ",        // arreglo de meses 
  "Ene", "Feb", "Mar", "Abr", "May", "Jun",
  "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"
};

File myFile;   

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

String read_rfid;   // variable donde almacena la tarjeta leida 
String tag[4] = {"636c3fa6", "707870a4", "a49839a5", "d7485d79"};   // tag Almacenados 
boolean P1=false ,P2= false ,P3=false ,P4=false;    // condiciones para los estados de entrada o salida 
String nombre[5] = { "Luis ", "Maria ", "Pedro ", "Sofia ", "Desconocido "};   // Usuarios registrados 

int pinSD = 4;    // pin selector para la SD 
int LedVerde=7;    // pin 7 para el led verde 

void setup() {
 pinMode(LedVerde,OUTPUT);    // pin 7 se declara como salida 
 Serial.begin(9600);        // se inicializa el puerto serial 
 SPI.begin();            // se inicializa la comunicacion SPI 
  mfrc522.PCD_Init();     // se inicia el modulo lector RFID 
  if (!SD.begin(pinSD)) {     // se compruba que este activa la tarjeta SD 
    Serial.println("initializacion fallida!");
    return;
  }
   Serial.println("initializacion lista.");

}


// funcion para leer los bloques de la tarjeta RFID 
void dump_byte_array(byte *buffer, byte bufferSize) {    
read_rfid="";
for (byte i = 0; i < bufferSize; i++) {
read_rfid=read_rfid + String(buffer[i], HEX);
}
}

void loop() {
  if(!mfrc522.PICC_IsNewCardPresent())   // comprueba si no existe alguna targeta presente en el lector 
  return;
  
  if(!mfrc522.PICC_ReadCardSerial())     // comprueba si no se ha leido la tarjeta 
  return;

  dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);       // va a la funcion para leer el codigo de la tarjeta 
  registro();  // entra en el registro de evento 
  digitalWrite(LedVerde,LOW);   // apaga el led indicador 
}



// registro de evento
void registro()
{
  myFile = SD.open("registro.txt", FILE_WRITE);  // abre el archivo Registro donde se guardan los datos obtenidos 
  tmElements_t tm;      // reasiga nombre a variable 
  RTC.read(tm);     // lee los datos del reloj
  ingreso();      // va a la funcion ingreso para indicar su estado si es entrada o salida 
  Serial.print(",");  // separadores de datos 
  myFile.print(",");
  Personal();   // va a la funcion personal para identicar el tag leido 
  Serial.print(",");
  myFile.print(",");
  Serial.print("UID:");   
  //myFile.print("UID:");
  Serial.print(read_rfid);    // ID del tag leido 
  myFile.print(read_rfid);    // guarda el tag leido en la memoria SD 
  Serial.print(",");
  myFile.print(",");
//Registra Hora 
  Serial.print(" Hora:");
  //myFile.print(" Hora:");
    print2digits(tm.Hour);     
    Serial.write(':');
    myFile.print(":");
    print2digits(tm.Minute);
    Serial.write(':');
    myFile.print(":");
    print2digits(tm.Second);
    Serial.print(",");
    myFile.print(",");
// Registro de fecha 
    Serial.print(" Fecha(D/M/Y):");
    //myFile.print(" Fecha(D/M/Y):");
    Serial.print(tm.Day);
    myFile.print(tm.Day);
    Serial.write('/');
    myFile.print("/");
    Serial.print(Mes[tm.Month]);
    myFile.print(Mes[tm.Month]);
    Serial.write('/');
    myFile.print("/");
    Serial.print(tmYearToCalendar(tm.Year));
    myFile.print(tmYearToCalendar(tm.Year));
    Serial.println();
    myFile.println();// realiza un salto de linea en la memoria SD 
    myFile.close();     // cierra el archivo de la SD 
    digitalWrite(LedVerde,HIGH);   // enciende el led verde 
    delay(500);   // esperaa 1/2 segundo 
}

// le asiga un cero si el digito es mejor a 10 
void print2digits(int numero) {
  if (numero >= 0 && numero < 10) {  // si el digito es menor de 10 y mayor o igual a cero 
    Serial.write('0');     // coloca un cero 
    myFile.print("0");    
  }
  Serial.print(numero);   
  myFile.print(numero);
}


// identificacion de personal
void Personal(){
  if(tag[0] == read_rfid){      // tag de Persona 1 
    Serial.print(nombre[0]);
    myFile.print(nombre[0]);   
  }
    if(tag[1] == read_rfid){    // tag de persons 2 
    Serial.print(nombre[1]);
    myFile.print(nombre[1]);
  }
    if(tag[2] == read_rfid){     // tag de persona 3 
    Serial.print(nombre[2]);
    myFile.print(nombre[2]);
  }
    if(tag[3] == read_rfid){   //  tag de persons 4
    Serial.print(nombre[3]);
    myFile.print(nombre[3]);
  }
    if( tag[0] != read_rfid && tag[1] != read_rfid && tag[2] != read_rfid && tag[3] != read_rfid){    // si el tag no esta Registrado 
    Serial.print(nombre[4]);
    myFile.print(nombre[4]);
  }
}


// comprobacion de estado del ingreso 
void ingreso(){
  bool x = false;   // condicion inicial 
    if(tag[0] == read_rfid && P1 == false && x==false){  // condicion para entrada de persona 1 
      Serial.print("Entrada ");
      myFile.print("Entrada ");
      P1 = true;
      x=true;
    }
     if(tag[0] == read_rfid && P1 == true  && x==false){   // condicion para salida de persona 1 
      Serial.print("Salida ");
      myFile.print("Salida ");
      P1 = false;
      x=true;
    }
      if(tag[1] == read_rfid && P2 == false && x==false){    // condicion para entrada de persona 2
      Serial.print("Entrada ");
      myFile.print("Entrada ");
      P2 = true;
      x=true; 
    }
      if(tag[1] == read_rfid && P2 == true && x==false){   // condicion para salida de persona 2 
      Serial.print("Salida ");
      myFile.print("Salida ");
      P2 = false;
      x=true; 
    }
      if(tag[2] == read_rfid && P3 == false && x==false){   // condicion para salida de persona 3 
      Serial.print("Entrada ");
      myFile.print("Entrada ");
      P3 = true;
      x=true;
    }
      if(tag[2] == read_rfid && P3 == true && x==false){   // condicion para salida de persona 3 
      Serial.print("Salida ");
      myFile.print("Sallida ");
      P3 = false;
      x=true; 
    }
      if(tag[3] == read_rfid && P4== false && x==false){    // condicion para salida de persona 4 
      Serial.print("Entrada ");
      myFile.print("Entrada ");
      P4 = true;
      x=true;
    }
      if(tag[3] == read_rfid && P4 == true && x==false){     // condicion para salida de persona 4 
      Serial.print("Salida ");
      myFile.print("Salida ");
      P4 = false;
      x=true;
    }
  
}

Sería mejor si nos muestras el esquema de las conexiones que tienes (puede ser hecho a mano, no somos pretenciosos, lo que importa es que se entienda).

La comunicación SPI usa un pin que activa cada periférico, normalmente llamado CS (chip select), ¿cuáles pines usas para cada módulo?

Sería también conveniente que adjuntes el código para no tener que andar adivinando (no suele ser nuestro punto fuerte).

Por favor adjunta el código de acuerdo a las Normas del Foro en Español, punto 7. También usa la opción "Autoformato" del menú "Herramientas" de la IDE antes de copiar el código así nos facilitas su lectura.


Modulo SD:
CS: 4
MOSI: 11
SCK: 13
MISO:12

RFID:
SDA: 10
RST: 9
SCK: 13
MOSI: 11
MISO: 12

Como se alcanza a ver multiplico los pines que tengo en comun, pero cuando conecto la placa, se lee la Micro SD con el modulo, pero no el lector RFID, pero si desconecto el Modulo SD y dejo solo el lector RFID si lee los tags, ya comprobe individualmente el lector y funciona.

Los dispositivos SPI requieren compartir MOSI MISO y SCK y tener un SS diferente. Hasta ahi vamos bien porque usas 4 para el módulo SD y 10 para el RFID.
Es curioso que no funcione.
Luego de que uses myFile recuerda hacer un myFile.close() que garantice que se cierra el uso dle modulo SD.

Aca veo un problema

void Personal(){
  if(tag[0] == read_rfid){      // tag de Persona 1 
    Serial.print(nombre[0]);
    myFile.print(nombre[0]);   
  }

estas usando ambos, cité este pero lo repites varias veces.
Usa una variable auxiliar y cuando termines de leer con el RFID guara los cambios en la SD. Siempre se ordenado en esa tarea.

Tal Vez me podrias mostrar otra forma de multiplicar los pines es correcto asi en vertical o se podria en horizontal.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.