Risolto

Buongiorno a tutti, sono nuovo di questo blog e spero di non commettere errori.
Ho un Arduino con un lettore rfid che utilizzo per l’apertura di una serratura elettrica di un cancello. Lo alimento con un trasformatore per pc da cui prelevo 8,3V. In queste condizioni succede che qualche volta, dopo aver funzionato correttamente per qualche ciclo di apertura, il sistema si blocca e devo resettare il tutto per farlo nuovamente funzionare. Altre volte si blocca dopo diversi cicli. La stessa cosa non succede se attacco Arduino al pc. Qualcuno mi saprebbe spiegare questa strana anomalia?
Grazie

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Questo non é un Blog ma un Forum.

Mi scuso per aver scambiato il forum per un blog e per non essermi presentato nel forum, cosa che, comunque, ho appena fatto!!!!

... potrebbe essre un rientro di disturbi elettromagentici causati dalla serratura elettrica.

Quando sei collegato al PC tramite la USB, sei anch collegato a terra tramite il PC ... quando alimenti con un alimentatore, i problemi saltano fuori.

Puoi fare uno schema di come hai fatto il circuito, che scheda relé hai usato e come hai collegato le alimentazioni? Va bene anche un disegno ben fatto a mano, poi fotografato ed allegato.

Guglielmo

..e magari posta anche il codice che usi. Magari è inzeppato di "String"...

Qui di seguito il codice che ho usato mentre ho allegato lo schema, senza mostrare il collegamento del relè (del tipo doppio optoisolato) ad arduino.
Grazie

#include <SPI.h>
#include <RFID.h>
#include <MFRC522.h>
#define SDA_DIO1 10  
#define RESET_DIO1 9
#define SDA_DIO2 5  
#define RESET_DIO2 8
#define delayRead 1000 
#define delayLed 2000 
#define ledVerde 2
#define ledRosso 3
#define rele 4
#define ledVerde1 7
#define ledRosso1 6


MFRC522 mfrc522_2(SDA_DIO2, RESET_DIO2);   // Create MFRC522 instance.

  
String codiceAutorizzato[] = {"CDFF1B9FB6",  
                              "BDB15C9FCF",  
                              "F039788938",  
                              "CD6180715D", 
                              "CC6785B997", 
                              "133EB773E9", 
                              "92D91ED98C", 
                              "DB6A917959", 
                              "EB8B68D9D1", 
                              "4D1A54E9EA", 
                              "625566D988", 
                              "FDD3A671F9", 
                              "656165D9B8", 
                              "545E24D9F7", 
                              "B94623D95", 
                              "DD635A9F7B", 
                              "C7AC65D9D7", 
                              "D51F99EAB", 
                              "636524D9FB", 
                              "BDD74B9FBE", 
                              "2D90459F67", 
                              "4D941B9F5D", 
                              "FDC4F19E56", 
                              "8D37E79EC3", 
                              "8D6DD39FAC", 
                              "3D851D9F3A", 
                              "6D47A871F3", 
                              "1D8EFE9EF3", 
                              "F7B17B3B6", 
                              "70353B9", 
                              "3728B53C96", 
                              "47F9C03B45", 
                              "7A1B53C2F", 
                              "2771A43BC9", 
                              "576D613B60", 
                              "67D1AF3B22", 
                              "5497724DFC", 
                              "9780B53B99", 
                              "27EC823B72", };
 

  
void setup()
{ 
  Serial.begin(115200);
  SPI.begin(); 
  RC522_1.init();
  RC522_2.init();  
  Serial.println("Setup");
  pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
  pinMode(rele,OUTPUT);
  pinMode(ledVerde1,OUTPUT);
  pinMode(ledRosso1,OUTPUT);
}
  
void loop()
{
   byte i;
 
  if (RC522_1.isCard())
  {
    RC522_1.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
  
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522_1.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
String uid_s = "";
 
if (!mfrc522_1.PICC_IsNewCardPresent() && !mfrc522_1.PICC_ReadCardSerial()) {
   
    for (byte i = 0; i < mfrc522_1.uid.size; i++) {
         
        String uid_a = String(mfrc522_1.uid.uidByte[i] < 0x10 ? "0" : "");
        String uid_b = String(mfrc522_1.uid.uidByte[i], HEX);
           
        uid_s = uid_s+uid_a+uid_b;


      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
      digitalWrite (rele, HIGH);
      delay (2000);     // Tempo relè in stato ON
      digitalWrite (rele, LOW);
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
  delay(delayRead);  
  }
    
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto, String codiceAutorizzato){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}    
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}

Schema_Arduino.pdf (15.5 KB)

Dimenticavo, il relè è alimentato da Arduino ma ho anche provato ad alimentarlo separatamente ma il risultato non cambia

:smiley: c'è giusto "qualche" String :smiley:

dev'esserci il web strapieno di questi programmi fatti tutti allo stesso modo, prendono il codice che leggono e lo trasformano in string

codiceLetto+= String (RC522_1.serNum[i],HEX);

che poi ovviamente deve essere confrontato con un altro numero trasformato in string

String codiceAutorizzato[] = {"CDFF1B9FB6", 
                              "BDB15C9FCF", 
                              "F039788938",
             ....

Il problema è che vorrei gestire un certo numero di chiavi. Allora cosa dovrei fare?
Mi chiedo solo come mai se attacco Arduino al pc lo sketch non si blocca mai mentre se lo alimento con alimentazione esterna si blocca? Guglielmo parlava di interferenze elettromagnetiche, ma come potrei ovviare il problema?
Grazie

I problemi potrebbero essere almeno due.

Il primo: gli assorbimenti improvvisi della bobina del relé possono mettere in crisi l'alimentatore esterno o il regolatore 5V interno di Arduino. Generando i 5V per la bobina con un regolatore a parte forse si risolve. In ogni caso le correnti di alimentazione della bobina non devono transitare attraverso lo stampato di Arduino.

Il secondo potrebbero essere gli scintillii sui contatti, se la serratura è in corrente continua si risolve mettendo un diodo in parallelo alla bobina con il catodo verso il positivo (così normalmente non conduce, ma all'apertura dei contatti assorbe le extratensioni di apertura). Se la bobina è in alternata si potrebbero provare un paio di zener con tensione superiore a quella dell'alimentatore, collegati in antiserie, sempre in parallelo alla bobina).

Dunque Arduino é alimentato in corrente continuo con un alimentatore per pc. Il relè è alimentato da Arduino (ma la sua eventuale alimentazione a parte non mi risolve il problema. L’elettroserratura invece è alimentata a 12 volt in alternata (alimentatore citofonico). Quindi dovrei utilizzare 2 zener e posizionarli sui contatti dell’elettroserratura?

A me sembra che quando attivi l'elettroserratura, il contatto relè disturbi Arduino... ed è una cosa che succede a molti.
La prima cosa rapida, indolore e SOFTWARE che mi viene in mente è: usa il watchdog.

Infatti secondo me Arduino ti si blocca quando ormai la serratura è aperta, tu puoi entrare e lui ha tutto il tempo per riavviarsi da solo. Il watchdog, infatti, controlla il processore di Arduino se funziona oppure si è bloccato ed il controllo lo può fare ogni pochi attimi fino ad 8 secondi.

Poi ti consiglio quello che consiglio a tutti: chiudi tutti gli ingressi non utilizzati a GND attraverso una resistenza da 10k ed usa un alimentatore ben filtrato.
Ti sconsiglio, invece, di utilizzare la porta USB perché ho già provato che i disturbi entrano anche dal cavo che fa da antenna.

Olam0436:
Quindi dovrei utilizzare 2 zener e posizionarli sui contatti dell’elettroserratura?

Direi due zener da circa 24..30V 1W, catodi connessi tra loro, e i due anodi rimanenti connessi ciascuno a un terminale della serratura.

Grazie per le celeri risposte. Domani provo e vi faccio sapere

Scusa Steve, cosa intendi per ingressi non utilizzati a GND? Qui ho collegato i due led di stato (ognuno mediante una resistenza) ed il relè. Devo mettere la resistenza anche al relè?
La porta USB non la posso usare perché dovrei utilizzare un pc nelle vicinanze del cancello (in questo modo intendevi utilizzare la porta USB?).
Una cosa non mi è chiara: il watchdog è in grado di capire se il sistema si è bloccato?
Ringrazio anche Claudio per il consiglio sugli zener.
Domani provo e vi faccio sapere.

Oggi ho posizionato i due zener ma non è cambiata molto la situazione

Olam0436:
Dunque Arduino é alimentato in corrente continuo con un alimentatore per pc. Il relè è alimentato da Arduino (ma la sua eventuale alimentazione a parte non mi risolve il problema.

Non ci credo molto ... dipende COME è fatta questa alimentazione a parte ... deve essere del tutto indipendente da Arduino, neanche i GND in comune.

Quale scheda relè hai (metti un link)? Così vediamo se è una di quelle che è possibile alimentare in tale modo ... ::slight_smile:

Guglielmo

Olam0436:
Scusa Steve, cosa intendi per ingressi non utilizzati a GND? Qui ho collegato i due led di stato (ognuno mediante una resistenza) ed il relè. Devo mettere la resistenza anche al relè?
La porta USB non la posso usare perché dovrei utilizzare un pc nelle vicinanze del cancello (in questo modo intendevi utilizzare la porta USB?).
Una cosa non mi è chiara: il watchdog è in grado di capire se il sistema si è bloccato?
Ringrazio anche Claudio per il consiglio sugli zener.
Domani provo e vi faccio sapere.

Significa che se, per esempio, hai collegato i relè a D1 e D2, gli altri ingressi come D3, D4 e anche analogici come A1, A2 eccetera vanno collegati a GND attraverso una resistenza.
Bene, non usare la porta USB.
Il watchdog è ASSOLUTAMENTE in grado di capire se il sistema si è bloccato. Nasce proprio per queste esigenze.