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.
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
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.
#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
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.
Stilita:
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!
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.
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).
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()
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.
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.
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
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...
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.
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...
Ciao
steve-cr:
Hai messo gli ingressi inutilizzati a GND ?
Ho messo tutti gli ingressi inutilizzati a GND
steve-cr:
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
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.
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.
Stilita:
metti un condensatore poliestere 400 volt in parallelo
all'elettromagnete,
Provo, posso chiederti come mai in poliestere e perchè 400V, così per cultura.
Stilita:
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
GeppettoLab:
Provo, posso chiederti come mai in poliestere e perchè 400V, così per cultura.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
Con l' impedenzimetro, poi sapendo l'induttanza con le formule
ti dovresti calcolare la capacità per rifasare.
Ma credo che non hai l'attrezzatura, per questo ho detto di
fare qualche prova empirica.
GeppettoLab:
Ho messo tutti gli ingressi inutilizzati a GND
Non uso pull-down perchè sto usando per gli altri ingressi i pull-up interni.
Se hai delle resistenze, mettile come pull-up esterne. Io quelle interne non le ho mai usate perché non mi fido e non ho mai avuto problemi di interferenze.
Poi come alimenti Arduino? Da USB oppure hai un alimentatore dedicato?
Poi, così, "en passant", odio usare tanti pin su Arduino: cerco sempre la via più rapida e meno dispendiosa di risorse e odio fare programmi molto lunghi cercando di sintetizzarli al massimo.
Quindi sulla tua applicazione vedo meglio l'uso di un solo pin ANALOGICO e tanti pulsanti in PARALLELO con una resistenza ognuno come il circuitino allegato.
Potresti usare delle resistenze in modo da suddividere i 1024 punti di lettura analogica in dieci pulsanti.
Poi dichiari che se la lettura è da 0 a 100 è il pulsante 1, se è da 101 a 200 è il pulsante 2 e via di seguito.
Ho un contatore che si incrementa ogni volta che premo un pulsante, che mi serve come "posizionamento" del mio codice nella stringa di pulsanti che voglio.
Quindi saprai che il primo pulsante deve essere nella zona 500-600, il secondo nella zona 300-400, e così via, anche ripetendo lo stesso pulsante.
Poi vado a comparare i pulsanti premuti.
Più facile a farsi che a dirsi...
Grazie mille del consiglio steve-cr, ho utilizzato delle resistenze da 10k come pullup eliminando il pullup interno (era una prova più immediata di quella consigliatami da Stilita che vorrei comunque attuare) e funziona a parte qualche interferenza ancor più sporadica di prima. Ogni tanto insomma ancora interferisce ma decisamente con una frequenza accettabile.
Ho provato anche a togliere il diodo e funziona allo stesso modo.
Aspetto ancora il relè e se non arriva reinserirò il diodo.
Da oggi solo vere resistenze di pullup, e per i prossimi progetti con elettrocalamita, diodi, relè a stato solido e il minimo numero di ingressi!
Grazie mille a tutti
Luca