conflitto modulo microSD e modulo rfid

buon giorno,
il mio progetto:

raccolta punti su tessere rfid.

prevede:

arduino uno
display 2x16 i2c
tastiera 4x4 collegata con modulo i2d
lettore rfid
modulo microSD

riesco a collegare modulo rfid, display e tastiera e tutto funziona perfettamente ma quando collego SD si blocca tutto!! il modulo microSD da solo funziona bene
penso di no riuscire a gestire il pin sda (10) del rfid e il pin cs (dovrebbe essere il 4) del microSD.
da quello che ho capito devo impostare i pin HIGHT :

  pinMode(SD_CS_PIN, OUTPUT); // pin 4 cs SD
  digitalWrite(SD_CS_PIN, HIGH);
  pinMode(SDA_DIO, OUTPUT); // pin 10 sda rfid
  digitalWrite(SDA_DIO, HIGH);

poi, il pin del modulo che utilizzo in LOW , poi finito imposto sul HIGHT.

le librerie sono:
<Keypad_I2C.h>
<SPI.h>
<RFID.h>
<Wire.h>
<LiquidCrystal_I2C.h>
<SdFat.h>

ma nulla !! ache collegando un modulo alla volta (perciò un programma semplice e dedicato) non riesco a interrompere la comunicazione mettendo il pin HIGHT funziona sempre.

sicuramente mi sfugge qualcosa ma ormai sono giorni che provo e leggo post…
vi sarei grado per qualche consiglio.
grazie in anticipo

Dire "lettore RFID" non vuol dire nulla. Ci sono molti moduli in giro. Io ne ho alcuni SPI e alcuni anche I2C.
Metti un link a quello che hai.

questo è il modulo rfid:

questo è il modulo microSD:
https://www.tancredi.it/catalogsearch/result/?q=8702

questi ultimi due postati da te sono spi.
quindi dovresti postare quali pin hai collegato su cosa...
prima di tutto sai perché vanno prima in low e poi in HIGH, e soprattutto sai qual'è il pin che devi portare in quelle condizioni e in quale momento?

micro sd arduino uno
cs 4
mosi 11
miso 12
vcc 5v
gnd gnd
sck 13

rfid arduino uno
sda 10
sck 13
mosi 11
miso 12
irq non collegato
gnd gnd
est 9
3.3v 3.3v

vanno in LOW per abilitare ricezionedati spi
in HIGH per chiudere comunicazione

se comunico sd mando in LOW pin 4 dopo che ho inviato dati chiudo con HIGH...
stessa cosa con rfid ma sul pin 10...

il momento suppongo dopo aver inviato i dati:

  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(4, HIGH);

ma non ne sono sicuro....
grazie

ho messo qualche T di troppo.. :confused:

baadaa:
ho messo qualche T di troppo.. :confused:

Senza fare nuovi post puoi semplicemente modificare e correggere un tuo post utilizzando il bottone More -> Modify che si trova in basso a destra (... ovviamnete del TUO post) :slight_smile:

Guglielmo

io partirei con l'acquisto un shift level dato che ho due periferiche che comunicano sullo stesso canale ma con delle soglie di tensioni diverse sebbene non dovrebbe essere un problema reale per Arduino, almeno che l'rfid non sia 5v tollerant e quindi accetta segnali 5v.

Edit: level shift. pardon... o convertitore logico bidirezionale.

Come detto da @miky_police
NON puoi collegare un dispositivo a 3,3V ad arduino che funziona a 5V. Non è solo una questione di alimentazione (arduino ha uscita a 3,3V) ma soprattutto di segnali. Se il dispositivo è alimentato a 3,3V anche i segnali sono a 3,3V.
Serve un convertitore di segnale. Esempio: LINK
Magari se provi da solo il RFID e lo colleghi a 5V regge ma probabilmente si danneggia.

Inoltre metti su stessi pin in comune (MISO/MOSI/SCK) segnali dal RFID a 3,3V con quelli del SD a 5V. Come minimo Arduino va nel pallone.

stavo impazzendo!! ... non è un problema di software..
ho imparato una cosa nuova.
perciò fatemi capire (è da poco che maneggio arduino), non posso collegare nessun modulo che viene alimentato con tensione diversa da arduino uno (5V) perche giustamente i segnali alti fanno riferimento alla tensione di alimentazione. questo modulo lo posso usare con un arduino mini che lavora a 3.3V o utilizzare come consigliato da voi un level shift?
come funzionano questi level shift che non gli ho mai usati? per esempio come lo devo collegare quello del link consigliato?
questo va bene uguale?
https://www.amazon.it/gp/product/B06Y5KKMLL/ref=ox_sc_act_title_2?smid=A3JF3T1CRN0KMB&psc=1
una altra cosa, come diceva miky_police quale è il momento di aprire la connessione con un dispositivo SPI e quello giusto di chiudere?
grazie tante

Quel modulino dovrebbe andare bene. Quello che ti ho linkato io dovrebbe essere di SparkFun e quindi mi pare più affidabile, rispetto a qualcosa prodotto non si sa da chi.
Per lo SPI in teoria le librerie già loro dovrebbero gestire (internamente) il pin CS/SS quando necessario.
Si, a 3,3V o usi un Arduino mini a 3,3V o usi shift level
Al level shift da un lato colleghi la 3,3V e GND da Arduino (che poi mandi anche al RFID) e i 4 segnali dal RFID. Altro lato colleghi i 5V e GND da Arduino e poi i 4 pin MISO/MOSI/SCK/CS (nell'ordine giusto rispetto a come colleghi il RFID)

mi stai dicendo che non devo piu gestire gli ingressi pin CS/SS??? del modulo rfid (pin10) e del modulo SD (pin4)....
avevo capito che se sono presenti piu dispositivi che utilizzano SPI dovevo gestire l'indirizzamento dei dati.
grazie per delucidazioni sul level shift. in pin HV del modulo del link è ingresso 5V?

baadaa:
mi stai dicendo che non devo piu gestire gli ingressi pin CS/SS???

Normalmente, se scritte bene, è compito delle "librerie" farlo :slight_smile:

Guglielmo

baadaa:
grazie per delucidazioni sul level shift. in pin HV del modulo del link è ingresso 5V?

Si, HV high = 5V, l'latro LV low=3,3V

il modulo RFID prevede anche il collegamento :
RST (RDIF) pin 9(ARDUINO)
che perciò rimane fuori dal level shift ? lo collego direttamente?
grazie

penso che per andare in reset bisogna circuitarlo a massa, quindi il pin9 deve andare in low per resettare il modulo. il problema é che il pin9 in high da 5v. io utilizzerei un partitore di tensione (composto da due resistenze una in serie ed una in parallelo ovviamente da calcolare) collegato al pin 9 ed al rst del rfid, ma mi riservo di quanto appena suggerito perché la parte circuitale dei progetti la sto ancora imparando volta per volta.

buona sera,
ho montato il modulino level shift che mi avete consigliato, ma non è cambiato nulla!! singolarmente il moduli rfid o il modulo micro sd sunfionano bene ma quando li utilizzo contemporaneamente sullo stesso progetto il rfid si blocca.
ho provato anche a comandare i pin cs e sda ma nulla non so piu che fare!! qualche consiglio? vi poso anche il CODICE …vi ricordo che è il mio secondo progetto con arduino sono novellino …

raccolta_punti_prova_totale.ino (10.1 KB)

Inizialmente metti in comunicazione l'rfid ponendo giustamente il pin10 in low... All'interno del if (RC522.isCard()) passi al setaccio altre funzioni che richiamano la sd che richiede la comunicazione SPI, ma avendo quest'ultima "aperta sull'rfid con il pin10 in LOW" va in conflitto il tutto, poiché mandi i comandi per leggere la SD anche sull'RFID che non ci capisce una mazza, bloccando il tutto.
Prima di chiamare la lettura della sd mettendo il pin4 in low devi riportare il pin10 in HIGH per interrompere la comunicazione con l'rfid... la comunicazione SPI, come d'altra parte anche la I2C, permette di comunicare con una sola periferica per volta.
Spiegato anche il fatto per cui, inizialmente, una periferica per volta funzionava correttamente.

void loop()
{
  lcd.clear();
  lcd.setCursor(16, 0);
  lcd.print("ATTESA TESSERA");

  digitalWrite(10, LOW);
  delay(100);
  for (int pCounter = 0; pCounter < 30; pCounter++) {  // faccio scorrere scritta
    lcd.scrollDisplayLeft();//verso sinistra
    delay(400);//velocita scritta

    // Se viene letta una tessera
    if (RC522.isCard())
    {
      Serial.println("prova1");
      pCounter = 30; // per uscire dal for
      delay(100);
      digitalWrite(10, HIGH);

      leggiCarta(); //leggo carta e la inserisco in stringa codiceLetto
      leggiFileSd(); // verifico su SD se esiste un file denominato come codiceLetto

mi sembra che metto il pin 10 in HIGH prima di chiamare le funzioni SD.
il problema è proprio:

    if (RC522.isCard())
    {
      Serial.println("prova1");

arriva fino a if… e si blocca non mi stampa “prova1”.
le altre periferiche i2c vanno bene senza gestire nessun pin tutti i moduli display, tastiera, rfid funzionano bene il problema è quando inserisci il modulo sd che si inizializza correttamente allora io chiudo pin 4(HIGH) e poi il tutto si blocca su if(RC522…

a questo punto memorizza i dati della carta letta in variabili e solo alla fine del RC522.isCard(){} passa agli if del caso... con lettura ed ecc...