Go Down

Topic: problema collegamento di un relè ad un elettromagnete (Read 1 time) previous topic - next topic

zizio66

Buongiorno,
sono Paolo e sono nuovo del forum.
Ho ideato un sistema collegando un lettore rfid ad arduino che al passaggio di una determinata carta, attiva un relè.
Questo relè è collegato ad un piccolo elettromagnete a 24v normalmente chiuso e alimentato con una batteria da 9v. L'elettromagnete si scollega appunto quando passa la carta corretta sul lettore rfid.
lo sketch è corretto! Ma quando collego l'elettromagnete il modulo arduino si blocca e non legge più alcuna carta.
Probabilmente c'è un ritorno dall'elettromagnete al relè e ad arduino che lo blocca.
Per farlo ripartire devo resettare arduino con l'apposito pulsante.
Potreste aiutarmi?
Se non collego l'elettromagnete al relè il relè scatta correttamente.
Grazie.
Paolo.


gpb01

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.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili
Search is Your friend ... or I am Your enemy !

GeppettoLab

Ciao a tutti, ho anche io lo stesso problema.
Però posso provare a darti qualche consiglio. Prima di tutto allontana la l'elettromagnete da tutto il resto, quando si accende potrebbe creare interferenze. Poi prova a schermarlo costruendogli una gabbia metallica intorno.

Differentemente da zizio66 ho un sistema di 10 pulsanti con LED che se premuti nella combinazione corretta attivano una elettrocalamita a 12 V alimentata da un trasformatore 12V 1,5A.
Solo quei 5 pulsanti accesi fanno scattare il relè.
Tramite un pin digitale di arduino controllo un relè a cui collego l'elettrocalamita, come da figura.

Tutto funziona perfettamente fino a che non collego l'alimentatore dell'elettrocalamita.
A questo punto quando accendo l'ultimo dei 5 pulsanti, il relè scatta ed immediatamente mi si spengono/accendono altri pulsanti rispegnendomi il relè.
Allego foto del circuito per i pulsanti che ho realizzato, che potrebbe fare da antenna.

Ho provato a schermare l'elettrocalamita con pochi risultati, e non posso allontanarla molto perchè dovrà comunque essere a breve distanza dal circuito.

Allego il codice ma è abbastanza lineare, non credo sia lui a dare problemi.
Code: [Select]

#include <Bounce.h>

const int LEVEL = 10;

int sequence[LEVEL] = {0, 1, 1, 0, 0, 0 , 1, 1, 1, 0};      //the right sequence
int yourSequence[LEVEL] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};   //user sequence

boolean light[LEVEL] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

int switchPin[LEVEL] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 24};
int lightPin[LEVEL] = {14, 15, 16, 17, 18, 19, 20, 21, 22, 23} ;

int relayPin = A20;

/*
    Create Bounce objects for each button.  The Bounce object
    automatically deals with contact chatter or "bounce", and
    it makes detecting changes very simple.
*/
Bounce button0 = Bounce(switchPin[0], 100);
Bounce button1 = Bounce(switchPin[1], 100);  // 10 = 10 ms debounce time
Bounce button2 = Bounce(switchPin[2], 100);  // which is appropriate for
Bounce button3 = Bounce(switchPin[3], 100);  // most mechanical pushbuttons
Bounce button4 = Bounce(switchPin[4], 100);
Bounce button5 = Bounce(switchPin[5], 100);  // if a button is too "sensitive"
Bounce button6 = Bounce(switchPin[6], 100);  // to rapid touch, you can
Bounce button7 = Bounce(switchPin[7], 100);  // increase this time.
Bounce button8 = Bounce(switchPin[8], 100);
Bounce button9 = Bounce(switchPin[9], 100);

void setup() {



  pinMode(lightPin[0], OUTPUT);
  pinMode(lightPin[1], OUTPUT);
  pinMode(lightPin[2], OUTPUT);
  pinMode(lightPin[3], OUTPUT);
  pinMode(lightPin[4], OUTPUT);
  pinMode(lightPin[5], OUTPUT);
  pinMode(lightPin[6], OUTPUT);
  pinMode(lightPin[7], OUTPUT);
  pinMode(lightPin[8], OUTPUT);
  pinMode(lightPin[9], OUTPUT);

  // Configure the pins for input mode with pullup resistors.
  pinMode(switchPin[0], INPUT_PULLUP);
  pinMode(switchPin[1], INPUT_PULLUP);
  pinMode(switchPin[2], INPUT_PULLUP);
  pinMode(switchPin[3], INPUT_PULLUP);
  pinMode(switchPin[4], INPUT_PULLUP);
  pinMode(switchPin[5], INPUT_PULLUP);
  pinMode(switchPin[6], INPUT_PULLUP);
  pinMode(switchPin[7], INPUT_PULLUP);
  pinMode(switchPin[8], INPUT_PULLUP);
  pinMode(switchPin[9], INPUT_PULLUP);

  digitalWrite(lightPin[0], LOW);
  digitalWrite(lightPin[1], LOW);
  digitalWrite(lightPin[2], LOW);
  digitalWrite(lightPin[3], LOW);
  digitalWrite(lightPin[4], LOW);
  digitalWrite(lightPin[5], LOW);
  digitalWrite(lightPin[6], LOW);
  digitalWrite(lightPin[7], LOW);
  digitalWrite(lightPin[8], LOW);
  digitalWrite(lightPin[9], LOW);

  pinMode(relayPin, OUTPUT);

  analogWrite(relayPin, 255);
 
}

void loop() {
  /*
      Update all the buttons.  There should not be any long
      delays in loop(), so this runs repetitively at a rate
      faster than the buttons could be pressed and released.
  */
  button0.update();
  button1.update();
  button2.update();
  button3.update();
  button4.update();
  button5.update();
  button6.update();
  button7.update();
  button8.update();
  button9.update();

 
  /*
     Check each button for "rising" edge
     Type a message on the Keyboard when each button releases.
     For many types of projects, you only care when the button
     is pressed and the release isn't needed.
     rising = low (pressed - button connects pin to ground)
     to high (not pressed - voltage from pullup resistor)
  */

  if (button0.risingEdge()) {
    if (light[0] == LOW) light[0] = HIGH;
    else light[0] = LOW;
    yourSequence[0] = light[0];
    digitalWrite(lightPin[0], light[0]);
    isPuzzleSolved();
  }
  if (button1.risingEdge()) {
    if (light[1] == LOW) light[1] = HIGH;
    else light[1] = LOW;
    yourSequence[1] = light[1];
    digitalWrite(lightPin[1], light[1]);
    isPuzzleSolved();
  }
  if (button2.risingEdge()) {
    if (light[2] == LOW) light[2] = HIGH;
    else light[2] = LOW;
    yourSequence[2] = light[2];
    digitalWrite(lightPin[2], light[2]);
    isPuzzleSolved();
  }
  if (button3.risingEdge()) {
    if (light[3] == LOW) light[3] = HIGH;
    else light[3] = LOW;
    yourSequence[3] = light[3];
    digitalWrite(lightPin[3], light[3]);
    isPuzzleSolved();
  }
  if (button4.risingEdge()) {
    if (light[4] == LOW) light[4] = HIGH;
    else light[4] = LOW;
    yourSequence[4] = light[4];
    digitalWrite(lightPin[4], light[4]);
    isPuzzleSolved();
  }
  if (button5.risingEdge()) {
    if (light[5] == LOW) light[5] = HIGH;
    else light[5] = LOW;
    yourSequence[5] = light[5];
    digitalWrite(lightPin[5], light[5]);
    isPuzzleSolved();
  }
  if (button6.risingEdge()) {
    if (light[6] == LOW) light[6] = HIGH;
    else light[6] = LOW;
    yourSequence[6] = light[6];
    digitalWrite(lightPin[6], light[6]);
    isPuzzleSolved();
  }
  if (button7.risingEdge()) {
    if (light[7] == LOW) light[7] = HIGH;
    else light[7] = LOW;
    yourSequence[7] = light[7];
    digitalWrite(lightPin[7], light[7]);
    isPuzzleSolved();
  }
  if (button8.risingEdge()) {
    if (light[8] == LOW) light[8] = HIGH;
    else light[8] = LOW;
    yourSequence[8] = light[8];
    digitalWrite(lightPin[8], light[8]);
    isPuzzleSolved();
  }
  if (button9.risingEdge()) {
    if (light[9] == LOW) light[9] = HIGH;
    else light[9] = LOW;
    yourSequence[9] = light[9];
    digitalWrite(lightPin[9], light[9]);
    isPuzzleSolved();
  }

}

//compare the two sequences
boolean seq_cmp(int *a, int *b) {
  for (int n = 0; n < LEVEL; n++) if (a[n] != b[n]) return false;
  return true;
}

void isPuzzleSolved() {
  if (seq_cmp(yourSequence, sequence)) { //controlli ed operazioni specifiche per ogni puzzle
    analogWrite(relayPin, 0);
    puzzleSolved = true;
    Serial.println("risolto");
  } else {
    analogWrite(relayPin, 255);
    puzzleSolved = false;
    Serial.println("rito");
  }
}



Grazie
Luca

Stilita

Non ho capito bene il cablaggio, ma è buona norma mettere un diodo in controfase su tutti i carichi induttivi. Perchè sui fronti di salita e discesa della corrente si generano delle extratensioni in senso opposto all'alimentazione (in poche parole "vogliono" opporsi ai cambiamenti di stato).Tali tensioni possono provocare malfunzionamenti, anche se isolate galvanicamente dal circuito, poichè generano onde elettromagnetiche.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

GeppettoLab

sui fronti di salita e discesa della corrente si generano delle extratensioni in senso opposto all'alimentazione (in poche parole "vogliono" opporsi ai cambiamenti di stato).Tali tensioni possono provocare malfunzionamenti, anche se isolate galvanicamente dal circuito, poichè generano onde elettromagnetiche.
Ma la extratensione non è fermata dal relè stesso?
Eventualmente dove dovrei aggiungere il diodo, su uno dei poli dell'elettrocalamita?

Grazie!

Stilita

Inizialmente parlavo in generale, poi nel tuo caso ho detto che anche se sei isolato, e lo sei, il disturbo può viaggiare nell'aria ed essere captato da Arduino, che fa da antenna ricevente.
E come quando usi il phon vicino ad una radiolina.
Il diodo, 1 ampere 1000 volt, lo colleghi con il catodo (tacca di riferimento) al positivo dell'elettromagnete, e anodo a massa.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Claudio_FF

#6
Jun 04, 2018, 07:43 pm Last Edit: Jun 04, 2018, 08:16 pm by Claudio_FF
Quote from: GeppettoLab
Ma la extratensione non è fermata dal relè stesso?
Come isolamento si, ma la scintilla tra i contatti trasmette energia in un ampio spettro di frequenze (se il problema è la scintilla e non altre cose).

Quote
Eventualmente dove dovrei aggiungere il diodo, su uno dei poli dell'elettrocalamita?
In parallelo alla bobina, messo nel verso in cui normalmente non conduce, e... sempre se stiamo parlando di corrente continua. Se è alternata occorrono uno snubber RC, o un varistore, o un paio di zener in antiserie.

Un relè allo stato solido risolverebbe il problema scintilla.

Così per curiosità (ahimé non ho cose che si resettano) si potrebbe anche provare a filtrare il lato Arduino (mettendo quei componenti proprio vicino ad Arduino):



Anche gli ingressi tastiera potrebbero risentire di disturbi, e sarebbe da aggiungere una R e C anche su quelli, sempre il più vicino possibile al micro.



Ah, poi quell' analogWrite() per comandare il relé non è propriamente corretto. Ok, scrivi solo 0 o 255, ma per fare questo basta una digitalWrite()
* * * * Una domanda ben posta è già mezza risposta * * * *

steve-cr

Dalla mia esperienza ti posso dare un consiglio che non vedo scritto spesso: metti a TUTTI gli ingressi non utilizzati dal tuo progetto una resistenza di pull-down oppure di pull-up o più semplicemente collegali direttamente a GND.
Anche se non vengono letti dal tuo programma Arduino sono le perfette porte di ingresso di tutto ciò che viene captato nella zona.
Fammi sapere se risolvi.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

fabpolli

Dalla mia esperienza ti posso dare un consiglio che non vedo scritto spesso: metti a TUTTI gli ingressi non utilizzati dal tuo progetto una resistenza di pull-down oppure di pull-up o più semplicemente collegali direttamente a GND.
Anche se non vengono letti dal tuo programma Arduino sono le perfette porte di ingresso di tutto ciò che viene captato nella zona.
Fammi sapere se risolvi.
Vista la tua esperienza ne aprofitto  :) la pull-up interna è sufficiente? per i disturbi è meglio la pullup o il collegamento a GND che a sua volta è un bel piano di massa del pcb?
Grazie

steve-cr

Io metterei tutto a GND e mi tolgo ogni problema. La pull-up interna è già... "interna", quindi non vorrei che il disturbo la "saltasse" dato che parliamo di micron...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

GeppettoLab

Ho aggiunto un diodo come suggerito e la situazione migliora, anche se sporadicamente, soprattutto quando stresso velocemente l'attivazione e lo spegnimento dell'elettromagnete, ancora ho qualche problema.
Sto attendendo l'arrivo di un relay a stato solido per ulteriori test e poi creerò una gabbia di faraday intorno al magnete per provare a ridurre il magnetismo esterno.
Intanto grazie, vi aggiornerò dopo i prossimi test.

steve-cr

Hai messo gli ingressi inutilizzati a GND ?
Poi ho guardato meglio, e ho visto che i tuoi pulsanti vanno dentro direttamente ad Arduino senza pull-down.
Sicuramente fanno da antenna.
Metti le resistenze di pull-down e gli altri ingressi a GND.

Se giri intorno alla questione con l'utilizzo di un relé statico prima o poi ti ritroveraì con il medesimo problema mentre ora hai modo di stressare Arduino con il tuo elettromagnete e trovare la soluzione che ti potrà sempre servire in futuro per qualsiasi altro circuito.
Poi facci sapere...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

GeppettoLab

Ciao
Hai messo gli ingressi inutilizzati a GND ?
Ho messo tutti gli ingressi inutilizzati a GND
Poi ho guardato meglio, e ho visto che i tuoi pulsanti vanno dentro direttamente ad Arduino senza pull-down.
Non uso pull-down perchè sto usando per gli altri ingressi i pull-up interni.

La situazione non migliora, ho sporadicamente ancora lo stesso problema.
Sto ancora aspettando il relay a stato solido. A questo punto spero possa essere la soluzione, altrimenti cosa altro potrebbe essere?
Grazie
Luca

Stilita

Ho aggiunto un diodo come suggerito e la situazione migliora, anche se sporadicamente, soprattutto quando stresso velocemente l'attivazione e lo spegnimento dell'elettromagnete, ancora ho qualche problema.
Sto attendendo l'arrivo di un relay a stato solido per ulteriori test e poi creerò una gabbia di faraday intorno al magnete per provare a ridurre il magnetismo esterno.
Intanto grazie, vi aggiornerò dopo i prossimi test.

Intanto che arriva il nuovo relè fai un'altra prova:
metti un condensatore poliestere 400 volt in parallelo
all'elettromagnete,la capacità dipende dall'impedenza della bobina (non riesco a dirtela).
In poche parole rifasi, con il condensatore cerchi di eliminare la componente
induttiva, ma la capacità la devi trovare provando.
Comincia con 100 nF, e poi altre capacità...finchè non trovi.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

GeppettoLab

metti un condensatore poliestere 400 volt in parallelo
all'elettromagnete,
Provo, posso chiederti come mai in poliestere e perchè 400V, così per cultura.
la capacità dipende dall'impedenza della bobina (non riesco a dirtela).
C'è un modo in cui posso calcolarmi l'impedenza della bobina (non trovo dati sul numero di spire, o simili) e quindi la capacità del condensatore? Non è ho di poliestere e vorrei ridurre il range per un eventuale acquisto.
Grazie
Luca

Go Up