Pages: [1] 2   Go Down
Author Topic: Output digitali in HIGH appena accesa....  (Read 1009 times)
0 Members and 1 Guest are viewing this topic.
La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...  smiley-confuse

Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Uwe! speravo in una tua risposta.
ho collegato le due resistenze come da schema: www.logicaprogrammabile.it/come-pilotare-rele/pilotarele1/
grazie
« Last Edit: February 24, 2012, 07:57:37 am by Muccio » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 162
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 162
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6572
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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
}

Logged

La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if (stato1 == 1) { 
    digitalWrite(LED1, HIGH);
  } 
  else { 
    digitalWrite(LED1, LOW);
    delay(10);
  }
puoi semplificarlo in:
Code:
digitalWrite(LED1, stato1);

Hai messo delle resistenze pulldown sulle entrate dei pulsanti?

Ciao Uwe
Logged

La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!
Logged

Pages: [1] 2   Go Up
Jump to: