Go Down

Topic: Output digitali in HIGH appena accesa.... (Read 1 time) previous topic - next topic

Muccio

Ho montato un circuito con 7 relè da 10A per controllare diversi carichi (fari, elettrovalvole, avviamento compressore ecc..) comandati tramite 7 diversi pulsanti.
I 7 pulsanti danno un'impulso, tramite digitalRead, ai 7 pin digitali configurati come Input.
Gli altri 7 pin configurati come Output fanno eccitare i vari relè (tramite transistor), fino a che un nuovo impulso da pulsante non li disecciti.
Fino a qui tutto facile e tutto funzionante.

Il problema è che all'accensione dell'Arduino UNO, fanno un brevissimo HIGH (di qualche decimo di secondo) che provoca l'eccitazione di tutti i relè e la conseguente accensione di tutti i fari, tutte le elettrovalvole e del compressore con evidenti problemi di assorbimento di rete.
Ho provato a modificare lo sketch inserendo dei delay ma senza successo perchè questo problema si verifica prima che la scheda inizi a caricare il programma.

Non sò che pesci prendere...  :~


uwefed

Hai messo delle resistenze da 10kOhm tra base dei transistori e massa?
Hai messo una resistenze tra base dei transistori e Pin Arduino?
Ciao Uwe

Muccio

#2
Feb 24, 2012, 01:55 pm Last Edit: Feb 24, 2012, 01:57 pm by Muccio Reason: 1
Ciao Uwe! speravo in una tua risposta.
ho collegato le due resistenze come da schema: www.logicaprogrammabile.it/come-pilotare-rele/pilotarele1/
grazie

ulver85

Per evitare problemi potresti accendere prima arduino e poi dare corrente ai vari carichi, in pratica usare 2 switch. Uno per alimentare la logica e l'altro per dare corrente al resto.

Muccio

Potrebbe essere una soluzione, cosi avrei anche la "memoria" delle utenze accese e spente in precedenza evitando che ad ogni accensione si resetti tutto e tutte le uscite vadano in stato LOW.
Soluzione poco "elegante" ma comunque funzionale.
Comunque a livello teorico mi piacerebbe capire e risolvere il problema

Muccio

Un'altra csa: avendo bisogno di 7 out e quindi 7 in ho usato anche i pin 1 RX e 2 TX senza aver avuto problemi. E' corretto farlo o é meglio non usare questi canali?

ulver85

Hai ragione a dire che è poco elegante come soluzione, infatti il mio consiglio è di tenerla come estremis, se riesci ad evitare questi impulsi all'accensione sarebbe meglio.

uwefed


Un'altra csa: avendo bisogno di 7 out e quindi 7 in ho usato anche i pin 1 RX e 2 TX senza aver avuto problemi. E' corretto farlo o é meglio non usare questi canali?

Usa le entrate analogiche come Pin digitali e non usare il Pin 0 e 1.

Ciao Uwe

PaoloP


Un'altra csa: avendo bisogno di 7 out e quindi 7 in ho usato anche i pin 1 RX e 2 TX senza aver avuto problemi. E' corretto farlo o é meglio non usare questi canali?


Se nel tuo sketch non usi la seriale va bene. Ma se usi la seriale per il debug o passare comandi ad Arduino, non va bene.
I pin RX e TX sono 0 e 1.
Non puoi usare i pin dal 2 a 9? Hai anche altri sensori attaccati ad arduino?

uwefed


Ciao Uwe! speravo in una tua risposta.
ho collegato le due resistenze come da schema: www.logicaprogrammabile.it/come-pilotare-rele/pilotarele1/
grazie

Mi sembra giusto. Non mi spiego la resistenza da 100 Ohm in serie al relé.
Ci fai vedere il codice?
ciao Uwe

Muccio

inserisco il codice questa sera, ho tutto nel pc a casa. Ora sono col telefonino. Grazie a tutti!

Muccio

Ecco il codice... non funzionante cioè funziona solo il pulsante1, stasera dopo cena mi ci metto col cervello e vedo di trovare l'inghippo.  :P
Sicuramente ci sarà un modo più elegante per scriverlo  :), ma per ora mi interessa risolvere il problema primario...

Code: [Select]
#define LED1 1
#define BUTTON1 0
#define LED2 3
#define BUTTON2 2
#define LED3 5
#define BUTTON3 4
#define LED4 7
#define BUTTON4 6
#define LED5 9
#define BUTTON5 8
#define LED6 11
#define BUTTON6 10
#define LED7 13
#define BUTTON7 12
int val1 = 0;
int vecchio_val1 = 0;
int stato1 = 1;
int val2 = 0;
int vecchio_val2 = 0;
int stato2 = 1;
int val3 = 0;
int vecchio_val3 = 0;
int stato3 = 1;
int val4 = 0;
int vecchio_val4 = 0;
int stato4 = 1;
int val5 = 0;
int vecchio_val5 = 0;
int stato5 = 1;
int val6 = 0;
int vecchio_val6 = 0;
int stato6 = 1;
int val7 = 0;
int vecchio_val7 = 0;
int stato7 = 1;
 
void setup() { 
  pinMode(LED1, OUTPUT); 
  pinMode(BUTTON1, INPUT);
  pinMode(LED2, OUTPUT); 
  pinMode(BUTTON2, INPUT);
  pinMode(LED3, OUTPUT); 
  pinMode(BUTTON3, INPUT);
  pinMode(LED4, OUTPUT); 
  pinMode(BUTTON4, INPUT);
  pinMode(LED5, OUTPUT); 
  pinMode(BUTTON5, INPUT);
  pinMode(LED6, OUTPUT); 
  pinMode(BUTTON6, INPUT);
  pinMode(LED7, OUTPUT); 
  pinMode(BUTTON7, INPUT);

 
void loop() { 
  val1 = digitalRead(BUTTON1);
  val2 = digitalRead(BUTTON2);
  val3 = digitalRead(BUTTON3);
  val4 = digitalRead(BUTTON4);
  val5 = digitalRead(BUTTON5);
  val6 = digitalRead(BUTTON6);
  val7 = digitalRead(BUTTON7);
  //* tutto ok fino qui
  if ((val1 == HIGH) && (vecchio_val1 == LOW)){ 
    stato1 = 1 - stato1; 
    delay(10);
  }   
 
  vecchio_val1 = val1; 
 
    if (stato1 == 1) { 
    digitalWrite(LED1, HIGH);
  } 
  else { 
    digitalWrite(LED1, LOW);
    delay(10);
  }
  //*fine pulante1
    if ((val2 == HIGH) && (vecchio_val2 == LOW)){ 
    stato2 = 1 - stato2; 
    delay(10);
  }   
 
  vecchio_val2 = val2; 
 
    if (stato2 == 1) { 
    digitalWrite(LED2, HIGH);
  } 
  else { 
    digitalWrite(LED2, LOW);
    delay(10);
  }
  //*fine pulante2
    if ((val3 == HIGH) && (vecchio_val3 == LOW)){ 
    stato3 = 1 - stato3; 
    delay(10);
  }   
 
  vecchio_val3 = val3; 
 
    if (stato3 == 1) { 
    digitalWrite(LED3, HIGH);
  } 
  else { 
    digitalWrite(LED3, LOW);
    delay(10);
  }
  //*fine pulante3
    if ((val4 == HIGH) && (vecchio_val4 == LOW)){ 
    stato4 = 1 - stato4; 
    delay(10);
  }   
 
  vecchio_val4 = val4; 
 
    if (stato4 == 1) { 
    digitalWrite(LED4, HIGH);
  } 
  else { 
    digitalWrite(LED4, LOW);
    delay(10);
  }
  //*fine pulante4
    if ((val5 == HIGH) && (vecchio_val5 == LOW)){ 
    stato5 = 1 - stato5; 
    delay(10);
  }   
 
  vecchio_val5 = val5; 
 
    if (stato5 == 1) { 
    digitalWrite(LED5, HIGH);
  } 
  else { 
    digitalWrite(LED5, LOW);
    delay(10);
  }
  //*fine pulante5
    if ((val6 == HIGH) && (vecchio_val6 == LOW)){ 
    stato6 = 1 - stato6; 
    delay(10);
  }   
 
  vecchio_val6 = val6; 
 
    if (stato6 == 1) { 
    digitalWrite(LED6, HIGH);
  } 
  else { 
    digitalWrite(LED6, LOW);
    delay(10);
  }
  //*fine pulante6
    if ((val7 == HIGH) && (vecchio_val7 == LOW)){ 
    stato7 = 1 - stato7; 
    delay(10);
  }   
 
  vecchio_val7 = val7; 
 
    if (stato7 == 1) { 
    digitalWrite(LED7, HIGH);
  } 
  else { 
    digitalWrite(LED7, LOW);
    delay(10);
  }
  //*fine pulante7
}


Muccio

Quote from: uwefed link=topic=93482.msg703142#msg703142

Usa le entrate analogiche come Pin digitali e non usare il Pin 0 e 1.


Se nel tuo sketch non usi la seriale va bene. Ma se usi la seriale per il debug o passare comandi ad Arduino, non va bene.
I pin RX e TX sono 0 e 1.
Non puoi usare i pin dal 2 a 9? Hai anche altri sensori attaccati ad arduino?

Non pensavo si potessero usare le entrate analogiche come fossero digitali. ok ci ragiono, grazie!

uwefed

Code: [Select]
if (stato1 == 1) { 
    digitalWrite(LED1, HIGH);
  } 
  else { 
    digitalWrite(LED1, LOW);
    delay(10);
  }

puoi semplificarlo in:
Code: [Select]
digitalWrite(LED1, stato1);

Hai messo delle resistenze pulldown sulle entrate dei pulsanti?

Ciao Uwe

Muccio

Eccomi! Questo weekend sono stato rapito da mio figlio ma finalmente sono riuscito a rimettere mano alla scheda e al codice.

Allora: il problema riportato in oggetto è dovuto all'uso dei PIN 1 e 2, lo stesso problema non si verifica usando tutti gli altri PIN digitali.
Il codice è corretto, ma mi sono dimenticato le resistenze di pulldown (grazie Uwe), ho aggiunto quelle e tutto funziona!  :smiley-red:

Ora non mi resta che spostare i pulsanti negli Input analogici (grazie PaoloP) per non usare i PIN 1e2...

Grazie a tutti per le utilissime dritte!!

Go Up