Go Down

Topic: automazione tapparelle (Read 1 time) previous topic - next topic

nicolini2000

salve a tutti, ho modificato l'impianto elettrico di casa mia (sono elettricista) e voglio automatizzare le serrande. ho già cablato il tutto utilizzando dei relè a bassa tensione per comandare i motori, bassa tensione perché avevo già previsto di interfacciare qualche automazione

vorrei usare arduino nano, e non conoscendo la programmazione di arduino ho cercato in rete qualche spunto. Ho trovato diverse cose e spunti, ma nessuno funziona come vorrei. Ho cercato di modificare qualche programma ma senza risultati.

quello che vorrei realizzare è questo: 1 pulsante per la salita, 1 per la discesa, il tutto in autoritenuta
se premo uno dei 2 pulsanti arresto il motore

1 pulsante di salita generale che premuto arresta ogni movimento e la faccia salire con autoritenuta
1 pulsante di discesa generale che premuto arresta ogni movimento e la faccia scendere con autoritenuta

un tempo di lavoro in modo tale di diseccitare i relé

so che è chiedere troppo, potrei farlo con un PLC, conosco la programmazione in ladder ed ho realizzato diverse automazioni, ma dovendo nascondere il tutto dentro il cassettone della tapparella rimane comodo utilizzare arduino e un paio di relé dentro un contenitore

Grazie a tutti quelli che mi vorranno aiutare




Claudio_FF

#1
Sep 02, 2018, 08:24 pm Last Edit: Sep 02, 2018, 08:37 pm by Claudio_FF
potrei farlo con un PLC, conosco la programmazione in ladder ed ho realizzato diverse automazioni
Allora basta scrivere le stesse espressioni logiche in C.

Esempio di relé start/stop con autoritenuta. 'A' è il relé, 'sta' e 'sto' sono i livelli letti dai pulsanti start e stop (si assume che quando premuti forniscano un 1). Al posto dei puntini vanno i pin da usare.
Code: [Select]
byte A = 0;  // rele' inizialmente spento

void loop() {
    // lettura ingressi
    byte sta = digitalRead(...);
    byte sto = digitalRead(...);
    
    // rele' A
    A = (A | sta) & !sto;
    
    // aggiornamento uscite    
    digitalWrite(..., A);
}


Esempio come prima ma con disattivazione dopo 10 secondi. 't0' minuscolo è la variabile tempo, 'T0' maiuscolo è l'uscita del temporizzatore (va a 1 dopo 10 secondi che 'A' è a 1).
Code: [Select]
byte A = 0;   // rele' inizialmente spento
byte T0 = 0;  // temporizzatore inizialmente spento
uint32_t t0 = 0;

void loop() {
    // lettura ingressi
    byte sta = digitalRead(...);
    byte sto = digitalRead(...);
    
    // rele' A
    A = (A | sta) & !T0 & !sto;

    // temporizzatore T0
    if(!A) { t0 = millis(); T0 = 0; }
    else if(millis() - t0 >= 10000) T0 = 1;

    // aggiornamento uscite    
    digitalWrite(..., A);
}


Anche se si lavora in bassissima tensione, gli ingressi vanno filtrati contro i rimbalzi e optoisolati.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

Patrick_M

bello, pulito, semplice, salvato

+1
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Silente

Allora basta scrivere le stesse espressioni logiche in C.

Esempio di relé start/stop con autoritenuta. 'A' è il relé, 'sta' e 'sto' sono i livelli letti dai pulsanti start e stop (si assume che quando premuti forniscano un 1). Al posto dei puntini vanno i pin da usare.
Code: [Select]
byte A = 0;  // rele' inizialmente spento

void loop() {
    // lettura ingressi
    byte sta = digitalRead(...);
    byte sto = digitalRead(...);
   
    // rele' A
    A = (A | sta) & !sto;
   
    // aggiornamento uscite   
    digitalWrite(..., A);
}


Esempio come prima ma con disattivazione dopo 10 secondi. 't0' minuscolo è la variabile tempo, 'T0' maiuscolo è l'uscita del temporizzatore (va a 1 dopo 10 secondi che 'A' è a 1).
Code: [Select]
byte A = 0;   // rele' inizialmente spento
byte T0 = 0;  // temporizzatore inizialmente spento
uint32_t t0 = 0;

void loop() {
    // lettura ingressi
    byte sta = digitalRead(...);
    byte sto = digitalRead(...);
   
    // rele' A
    A = (A | sta) & !T0 & !sto;

    // temporizzatore T0
    if(!A) { t0 = millis(); T0 = 0; }
    else if(millis() - t0 >= 10000) T0 = 1;

    // aggiornamento uscite   
    digitalWrite(..., A);
}


Anche se si lavora in bassissima tensione, gli ingressi vanno filtrati contro i rimbalzi e optoisolati.
Fantastico!! Sono quasi più i commenti che il programma.

Claudio_FF

#4
Sep 03, 2018, 05:51 pm Last Edit: Sep 04, 2018, 05:55 pm by Claudio_FF
Quote
quello che vorrei realizzare è questo: 1 pulsante per la salita, 1 per la discesa, il tutto in autoritenuta
se premo uno dei 2 pulsanti arresto il motore
1 pulsante di salita generale che premuto arresta ogni movimento e la faccia salire con autoritenuta
1 pulsante di discesa generale che premuto arresta ogni movimento e la faccia scendere con autoritenuta
un tempo di lavoro in modo tale di diseccitare i relé
Cioè se non sbaglio questo (con doppio interblocco e protezione da pulsanti sempre premuti):






Un comando alternativo potrebbe essere il seguente. La realizzazione è più semplice e permette di fermare tutto anche dal generale (il comando generale sarebbe un semplice OR cablato sugli stessi ingressi dei comandi locali).

  • 1 pulsante per la salita, 1 per la discesa, il tutto in autoritenuta
  • Se premo il pulsante opposto al movimento attuale arresto il motore
  • 1 pulsante di salita generale che premuto arresta eventuali discese in corso e avvia le salite delle tapparelle ferme, se premuto una seconda volta iniziano a salire anche quelle che si sono fermate.
  • 1 pulsante di discesa generale che premuto arresta eventuali salite in corso e avvia le discese delle tapparelle ferme, se premuto una seconda volta iniziano a scendere anche quelle che si sono fermate.
  • Un tempo di lavoro in modo tale di diseccitare i relé
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

Puso

Ciao intervengo un po per gelosia,perchè  anchio di lavoro (manutentore elettromeccanico di dubbie qualità), lhanno scorso ho comiciato ho cominciato i miei primi passi con Arduino.

Ed a me sai cosa mi hanno risposto?......STUDIA.

Poi in realtà hanno avuto una grandissima pazienza( e con me devo ammtere che ce n'è voluta davvero tanta) e mi hanno insegnato tutto quel poco che ora sò(perche programmare anche in hobbistica è un mondo vero e proprio).

Come consiglio ti dò inazitutto quello di scordarti del PLC ,le schedine Arduino parlano un altra lingua.

Secondo ricordati che che sta lavorando in bassissima tensione con Arduino, ed in bassa con le tapparelle quindi giustamente ti servono dei relè(ma consumano anche loro,soprattutto se eccitati).

Terzo attento ai pulsanti,in programmazione sono abbastanza difficili all'inizio.

Quarto se vuoi un consiglio tienti un paio di pin su Arduino liberi per un modulo Bluetooth.

Quinto e più importante prima cerca di impazzire un pò a banco con Arduino facendo cose semplici tipo accendere e spegnere un Led anche se il pulsante rimane premuto oppure se....ECT ECT.

steve-cr

Sto provando proprio in questi giorni dei TA perché sto realizzando una centralina di controllo carichi.
Costano 2 o 3euro e potresti usarli per far spegnere i tuoi motori a finecorsa senza usare finecorsa e senza usare salite o discese temporizzate (se parti da tutto aperto hai x secondi e va bene, ma se parti da quasi chiuso hai gli stessi secondi di motore acceso e rischi di rovinarlo...).
Misuri l'assorbimento usando un pin analogico di Arduino che controlli solo quando hai il relè del motore acceso: quando l'assorbimento, per esempio, raddoppia, aspetti un secondo e poi spegni...
Un po' come i finestrini elettrici delle auto.

acuplush

#7
Sep 04, 2018, 05:39 pm Last Edit: Sep 04, 2018, 05:54 pm by acuplush
Sto provando proprio in questi giorni dei TA perché sto realizzando una centralina di controllo carichi.
Costano 2 o 3euro e potresti usarli per far spegnere i tuoi motori a finecorsa senza usare finecorsa e senza usare salite o discese temporizzate (se parti da tutto aperto hai x secondi e va bene, ma se parti da quasi chiuso hai gli stessi secondi di motore acceso e rischi di rovinarlo...).
Misuri l'assorbimento usando un pin analogico di Arduino che controlli solo quando hai il relè del motore acceso: quando l'assorbimento, per esempio, raddoppia, aspetti un secondo e poi spegni...
Un po' come i finestrini elettrici delle auto.
mi permetto di intromettermi dato che sono serramentista e taparelle motorizzate le metto su a palate.
i motori delle tapparelle hanno già dei finecorsa integrati (impensabile il contrario!).
nicolini2000 li vuole temporizzare solo per non tenere sempre "in tensione" l'impianto/eccitato il relè di arduino.
danni non se ne fanno se si ha l'effetto del pulsante sempre premuto.

nicolini2000

ho iniziato provando a scrivere lo sketh per il solo rele di salita altri sketch ma prova riprova e modifica, non funziona nulla
posto quello che ho scritto

Code: [Select]

#define releup 4 // definisce i pin per il controllo dei rele
 
  int buttonup = 2;
  int timeup = 5000;  //definisce il tempo di risalita della tapparella
  int val = 0;
   
  void setup() {

  pinMode( buttonup, INPUT );
  pinMode( releup,OUTPUT );
  digitalWrite( releup,LOW );
  }
   
  void loop() {
  val = digitalRead(buttonup); // legge il valore dell'input e lo conserva 
   
  if (val == LOW) { // controlla che l'input sia HIGH (pulsante premuto) 
  digitalWrite(releup, LOW);        // attiva il relé di salita
  delay(timeup);     //aspetta il finecorsa
  digitalWrite(releup, HIGH);
}
  if (releup, LOW)
  val = digitalRead(buttonup); // legge il valore dell'input e lo conserva
  digitalWrite(releup, LOW);   

 }

Silente

Per cominciare ti chiederei di chiarariti/ci il funzionamento del relay. Prima, nella setup() per spegnerlo (presumibilmente) lo mandi LOW (operazione omettibipe in quanto esso é lo stato normale dei pin). Poi, nella prima if di loop(), dove palesemente lo vuoi eccitare lo mandi LOW nuovamente, per poi mandarlo HIGH al fine operazione.
Inoltre mi chiariaci a cosa servono le righe successive alla chiusura della graffa della prima if()? Io le toglierei

nicolini2000

#10
Sep 10, 2018, 09:29 pm Last Edit: Sep 10, 2018, 10:26 pm by nicolini2000
Code: [Select]
ho fatto un po di confusione con LOW-HIGH
ora posto quello che doveva essere postato

non capisco perchè quando accendo arduino il rele è già attivo e
quando premo il pulsante si spegne e rimane spento per il tempo di timeup poi si riaccende
Se premo il pulsante entro il tempo di timeup dovrebbe  interromper l'operazione



#define releup 4 // definisce i pin per il controllo dei rele
 
  int buttonup = 2;
  int timeup = 5000;  //definisce il tempo di risalita della tapparella
  int val = 0;
   
  void setup() {
  Serial.begin(9600);
  pinMode( buttonup, INPUT );
  pinMode( releup,OUTPUT );
 
  }
   
  void loop() {
  val = digitalRead(buttonup); // legge il valore dell'input e lo conserva 
  if (val == HIGH) { // controlla che l'input sia HIGH (pulsante premuto) 
  digitalWrite(releup, HIGH);        // attiva il relé di salita
  delay(timeup);     //aspetta il finecorsa
   
}
  if (releup, HIGH)
  val = digitalRead(buttonup); // legge il valore dell'input e lo conserva
  digitalWrite(releup, LOW);   
 
 }[code]

acuplush

#11
Sep 10, 2018, 09:40 pm Last Edit: Sep 10, 2018, 09:41 pm by acuplush
i relè lavorano contrari.
HIGH = diseccitati
LOW = eccitati

il problema all'accensione io l'ho risolto definendo nel setup i relè su HIGH

nicolini2000

io ho provato e riprovato ma non riesco a tener spento il led

nicolini2000

ho cambiato  if (val == LOW) con HIGH ora il led è spento

se premo il pulsante buttonup si accende il led e si spegne dopo timeup

se ripremo il pulsante entro il tempo timeup il led si dovrebbe spegnere ma non avviene perchè il timeup lo tiene acceso. dovrei interrompere il ciclo del timeup



Code: [Select]
#define releup 4 // definisce i pin per il controllo dei rele
 
  int buttonup = 2;
  int timeup = 5000;  //definisce il tempo di risalita della tapparella
  int val = 0;
   
  void setup() {
  Serial.begin(9600);
  pinMode( buttonup, INPUT );
  pinMode( releup,OUTPUT );
 
  }
   
  void loop() {
  val = digitalRead(buttonup); // legge il valore dell'input e lo conserva 
  if (val == HIGH) { // controlla che l'input sia HIGH (pulsante premuto) 
  digitalWrite(releup, HIGH);        // attiva il relé di salita
  delay(timeup);     //aspetta il finecorsa
   
}
  if (releup, HIGH)
  val = digitalRead(buttonup); // legge il valore dell'input e lo conserva
  digitalWrite(releup, LOW);   
 
 }

Patrick_M

è questo che devi cambiare!
Code: [Select]

digitalWrite(releup, HIGH);        // attiva il relé di salita

per le schedine rele HIGH vuol dire spento e LOW acceso!


p.s.
nicolini2000 per favore edita il tuo post #10 e inserisci il codice tra i tag code
In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Go Up