Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Semplice Test deviatori o finecorsa con Arduino

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoFR » 13 mag 2020, 21:08

Sto passando del tempo con arduino e avendo pochissima "attrezzatura" ho preso un deviatore e con arduino sto facendo qualche prova, nulla di serio è piu a scopo "didattico" per me.

Osservando il funzionamento di un deviatore si intuisce che il polo comune viene messo in collegamento con una estremità o l'altra, quindi nel lasso di tempo in cui avviene è possible che possano verificare una delle 2 seguenti circostanze:
1. probabile doppio contatto (il comune viene messo in collegamento con entrambe le altre estremità).
2. probabile distacco completo dalla estremità iniziale per poi entrare in contatto con l'altra, quindi per un breve periodo assenza di collegamento

Sto usando Arduino UNO, 2 resistenze da 400 OHM (ho queste in casa) per scaricare a GND le correnti che rimangono nel filo. Questo è l'attuale finecorsa che sto usando nel test, https://galleryplus.ebayimg.com/ws/web/324078143556_1_10_1.jpg. Per quanto riguarda il collegamento fare una foto risulterebbe molto confusionario, disegnare lo schema non saprei come e non fatemelo rifare con gimp che finisco domani, quindi ve lo spiego, ho collegato al COM il 5v di arduino, PIN 8 e 9 li ho collegati ai 2 fili e li ho messi in parallelo a GND con le resistenze.

Lo sketch dovrebbe riconoscere la posizione in cui si trova e ovviamente se è presente o meno, stampare sul monitor seriale le varie fasi, per ora il mio sketch fa quello che volevo, ovvero mi fa vedere tutte le fasi ma vorrei che mi mostri anche la durata del mancato collegamento/doppio collegamento, ripeto a me non serve a nulla se non far pratica ma magari a qualcuno potrebbe far comodo.

ecco lo sketch
Codice: Seleziona tutto
   int stato = 0;
   int statoIniziale = 0;
   
void setup() {
  pinMode (8, INPUT);
  pinMode (9, INPUT);
  Serial.begin(9600); 
}

void loop() {
  //l'attuale finecorsa ha una posizione di partenza obbligata
  int diretto = digitalRead (8);   
  //viene messo in collegamento solo mentre si preme il pulsante
  int deviato = digitalRead (9); 
  //questo IF mi occorre solo per riconoscere se ho collegato bene i fili, viene eseguito solo al primo avvio 
if ( statoIniziale == 0 ){         
  Serial.print("il filo diretto è");
  Serial.print(diretto);
  Serial.print("mentre il filo deviato è");
  Serial.print(deviato);
}
//inizio del codice vero e proprio
if (diretto==HIGH && deviato == LOW)
  {
    stato = 1;
    if (statoIniziale !=stato)    Serial.println("Hardware standby");
  }

   if (diretto==LOW && deviato == HIGH)
  {
    stato = 2;
    if (statoIniziale !=stato)    Serial.println("fincorsa raggiunto");
  }

   if (diretto==HIGH && deviato == HIGH)
  {
    stato = 3;
    if (statoIniziale !=stato)    Serial.println("malfunzionamento");
  }
 

   if (diretto==LOW && deviato == LOW)
  {
    stato = 4;
    if (statoIniziale !=stato) Serial.println("finecorsa non rilevato");
  }
  //assegnando la var "stato" a "statoIniziale" non mi stamperà in loop sul monitor ma solo al cambio di posizione
  statoIniziale = stato;
}

Questo è quello che ottengo:
Codice: Seleziona tutto
il filo diretto è1mentre il filo deviato è0Hardware standby
finecorsa non rilevato
fincorsa raggiunto
finecorsa non rilevato
fincorsa raggiunto
finecorsa non rilevato
Hardware standby

come potete vedere all'accensione (o reset) mi viene stampato se ho indovinato i fili (informazione che serve a non poco senza andare a implementarlo da sketch), quindi premendo una sola volta vedo effettivamente i cambiamenti che avvengono. Possiamo vedere però che c'è un probabile debouncing in quanto dopo il primo "fincorsa raggiunto" torna giustamente in "finecorsa non rilevato", però poi si ripete, si potrebbe anche sorvolare ma dato che ci siamo ...

Ora che ho buttato un po di codice per riconoscere lo stato in cui si trova vorrei misurare il lasso di tempo in cui entrambi sono LOW LOW, quindi il caso in cui stampa "finecorsa non rilevato".

Ho cercato qualche funzione che potrebbe servire ma
- pulseIn da quello che ho capito misura la lunghezza d'onda
- millis potrebbe aiutare ma non saprei come integrarla correttamente
Avatar utente
Foto UtenteMarcoFR
5 3
New entry
New entry
 
Messaggi: 54
Iscritto il: 21 giu 2016, 19:03

0
voti

[2] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utenteedgar » 13 mag 2020, 21:34

MarcoFR ha scritto:1. probabile doppio contatto (il comune viene messo in collegamento con entrambe le altre estremità)

Questo lo puoi escludere, immagina quanti circuiti andrebbero in fumo in una situazione del genere
Avatar utente
Foto Utenteedgar
6.372 3 5 8
Master
Master
 
Messaggi: 3216
Iscritto il: 15 set 2012, 22:59

0
voti

[3] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoD » 14 mag 2020, 8:07

1)
Benvenuto nel forum EV.
Ora sono di fretta,..
2)
Ti includo solo un esempio di applicazione di millis, permette di eseguire delle istruzioni periodicamente

Codice: Seleziona tutto
void loop()
{
   _ms = millis() & 0xFFFFF;  //serve solo una variabile int
   if ((_ms - memt) >= 10 ) //  periodicità  10 ms
   { memt = _ms;
    ...istruzioni eseguite ogni  10 ms
   }
}

Non è molto bello, permette di incrementare dei contatori e misurare il tempo a multipli del conteggio.


3) cerca il costrutto " Switch() ",
permette di strutturare facilmente le strutture con if(){;}else{;}
O_/
Avatar utente
Foto UtenteMarcoD
7.262 4 8 13
Master EY
Master EY
 
Messaggi: 3223
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[4] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoFR » 14 mag 2020, 13:53

MarcoD ha scritto:1)
Benvenuto nel forum EV.
Ora sono di fretta,..
(...)

piu tardi provo a vedere cosa fa quel codice

per quanto riguarda la funzione switch avevo inizialmente scritto con quella ma non riuscivo a farla andare con la doppia condizione nei case, forse l'avrò scritta in modo errato ma mi riscontrava errore in tutti i case, mi sembra mi diceva "expected ) before" la prima variabile..
Ultima modifica di Foto UtenteWALTERmwp il 17 mag 2020, 2:56, modificato 1 volta in totale.
Motivazione: Ridotta citazione, l'integrale richiamo non è necessario
Avatar utente
Foto UtenteMarcoFR
5 3
New entry
New entry
 
Messaggi: 54
Iscritto il: 21 giu 2016, 19:03

0
voti

[5] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utentelucaking » 14 mag 2020, 15:38

MarcoFR ha scritto: //questo IF mi occorre solo per riconoscere se ho collegato bene i fili, viene eseguito solo al primo avvio
if ( statoIniziale == 0 ){
Serial.print("il filo diretto è");
Serial.print(diretto);
Serial.print("mentre il filo deviato è");
Serial.print(deviato);
}

Allora secondo me ha senso metterlo nella funzione setup() che arduino chiama gia di default solo una volta all' avvio, così ti eviti anche la variabile "statoiniziale".
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

0
voti

[6] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoFR » 14 mag 2020, 17:36

lucaking ha scritto:Allora secondo me (...)

giusta osservazione, l'avevo scritto piu per comodità per l'appunto, lo commentavo e viceversa per provare ma effettivamente lo mettevo sempre nel loop, hai ragione sul metterlo nel setup però la variabile statiniziale mi occorre per non riempire il monitor seriale 100 volte al secondo ripetendo la stessa cosa....
Ultima modifica di Foto UtenteWALTERmwp il 17 mag 2020, 2:57, modificato 1 volta in totale.
Motivazione: Ridotta citazione, l'integrale richiamo non è necessario
Avatar utente
Foto UtenteMarcoFR
5 3
New entry
New entry
 
Messaggi: 54
Iscritto il: 21 giu 2016, 19:03

0
voti

[7] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoFR » 14 mag 2020, 17:45

MarcoD ha scritto:(...)

non l'ho testato ma rileggendolo con calma ho capito che con questo codice vado a dirgli io cosa deve fare e ogni quanto, ne farò bagaglio ma non è ciò che mi occorre ora, a me servirebbe letteralmente andare a misurare un lasso di tempo, precisamente il lasso di tempo che passa tra lo stato "pin 8 HIGH - pin 9 LOW" (oppure "pin 8 LOW - pin 9 HIGH") finquando passano a "pin 8 LOW - pin 9 LOW " quindi in parole semplici quanto tempo ci mette per il cambio fisico della levetta all'interno del deviatore, oppure per quanto tempo rimanesse in corto sempre se si verificasse
Ultima modifica di Foto UtenteWALTERmwp il 17 mag 2020, 2:58, modificato 1 volta in totale.
Motivazione: Ridotta citazione, l'integrale richiamo non è necessario
Avatar utente
Foto UtenteMarcoFR
5 3
New entry
New entry
 
Messaggi: 54
Iscritto il: 21 giu 2016, 19:03

0
voti

[8] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoD » 14 mag 2020, 17:58

quindi in parole semplici quanto tempo ci mette per il cambio fisico della levetta all'interno del deviatore, oppure per quanto tempo rimanesse in corto sempre se si verificasse

Con le strutture precedenti lo puoi fare inserendo un contatore sofware, che conta a passi di 1ms il tempo dal rilevamento della apertura al rilevamento della chiusura, Purtroppo la risoluzione è limitata a 1 ms.
Gestendo degli interrupt che abilitano uno dei contatori hardware del uP, si ottengono risoluzioni migliori, ma non lo so fare.

La maggior parte dei deviatori è meccanicamente progettata ad operare in " break before made"
ossai prima apri il contatto e poi chiudi sull'altro contatto.

Potrebbe essere interessante non operare sui deviatori manuali, ma sui contatti deviatori di un relè,
per capire quanto è il tempo di risposta in eccitazione ed in diseccitazione, e la presenza di eventuali rimbalzi.
Avatar utente
Foto UtenteMarcoD
7.262 4 8 13
Master EY
Master EY
 
Messaggi: 3223
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[9] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utentelucaking » 14 mag 2020, 19:15

MarcoFR ha scritto:... a me servirebbe letteralmente andare a misurare un lasso di tempo, precisamente il lasso di tempo che passa tra lo stato "pin 8 HIGH - pin 9 LOW" (oppure "pin 8 LOW - pin 9 HIGH") finquando passano a "pin 8 LOW - pin 9 LOW " quindi in parole semplici quanto tempo ci mette per il cambio fisico della levetta all'interno del deviatore, oppure per quanto tempo rimanesse in corto sempre se si verificasse

A sto punto credo dovresti usare due pin con interrupt esterno per detectare i due eventi, salvarti con la funzione millis() il momento in cui accadono e dopo di che nel main loop fare tutti i calcoli e prendere le decisioni del caso.
Almeno cosi proverei a farlo io, comunque potrebbe essere un esercizio interessante, anche perché sicuramente ci sarà da fare i conti col ringing dei contatti.
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

0
voti

[10] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utentelucaking » 15 mag 2020, 10:32

lucaking ha scritto:... credo dovresti usare due pin con interrupt esterno per detectare i due eventi, salvarti con la funzione millis() il momento in cui accadono e dopo di che nel main loop fare tutti i calcoli e prendere le decisioni del caso.

Ragionandoci su e alla luce di cio che è stato detto in questa discussione, questa potrebbe essere una vaccata, in quanto all' interno dell' ISR la funzione millis() dovrebbe non funzionare correttamente.

Interessante, appena ho l' arduino sotto mano provo, a sto punto il problema è come...
Speriamo in qualche aiuto dal cielo. :mrgreen:
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti