problema di tensione in uscita

ciao a tutti ,
vorrei esporre questo problema che proprio non riesco a risolvere :
ho scritto lo sketch per far funzionare un modulo di 3 relè comandati in apertura e chiusura da tre pulsanti , mentre un quarto pulsante deve avviare una sequenza di apertura / chiusura degli stessi .
Lo sketch funziona correttamente tenendo anche presente che alla pressione di uno dei primi tre pulsanti ( acceso / spento) , la sequenza deve disattivarsi e viceversa , alla pressione del tasto sequenza le funzioni eventualmente attivate dai primi tre pulsanti devono disattivarsi.
Il problema si presenta quando avvio il tasto di sequenza e a quanto pare diminuiscono i volt in uscita sui pin digitali che utilizzo ovvero se uso i pulsanti acceso spento i relè rispondono ma col tasto sequenza i volt non sono sufficienti a comandare le bobine dei relè , ho provato a collegare dei led al posto deì relè e questi si accendono ma con la metà della luminosità .
Ho provato ad escludere dal programma che ho scritto le funzioni che lavorano in modo indipendente e a lasciare attiva solo la funzione di sequenza e il problema non si presenta , ovvero funziona tutto .
I mio pensiero a questo punto è che la funzione di sequenza vada in qualche modo in conflitto col resto ma davvero non ne capisco il perchè , e qui mi rifaccio a qualcuno di più esperto che possa darmi qualche risposta leggendo il mio sketch .
Di per sè potrei eliminare il problema utilizzando per la sequenza dei pin diversi dai primi e saldando sui fili dei diodi polarizzati per evitare dei ritorni di tensione , ma cmq se qualcuno riuscisse a capire dove sia il problema sarebbe un enorme tesoro di esperienza per me .
Grazie in anticipo a tutti coloro che leggeranno e saranno in grado di dirmi qualcosa .... a seguito lo sketch che ho scritto .

int luce_rossa=5;
int luce_gialla=6;
int luce_verde=7;
int input1=10;
int input2=11;
int input3=12;
int input4=9;
int vecchia_lettura1 = 0;
int stato_luce_rossa = 0;
int vecchia_lettura2 = 0;
int stato_luce_gialla = 0;
int vecchia_lettura3 = 0;
int stato_luce_verde = 0;
int vecchia_lettura4 = 0;
int stato_sequenza = 0;
int tempo_massimo = 21000;
int tempo = 0;

void setup() {
Serial.begin (9600);
pinMode (luce_rossa, OUTPUT); 
pinMode (luce_gialla, OUTPUT);
pinMode (luce_verde, OUTPUT);
pinMode (input1,INPUT);
pinMode (input2, INPUT); 
pinMode (input3, INPUT);
pinMode (input4, INPUT);
} 

void LUCE_ROSSA () {
int lettura1 = digitalRead(input1);
if ((lettura1==HIGH)&&(vecchia_lettura1==0)) {
stato_sequenza = 0;
stato_luce_rossa = 1 - stato_luce_rossa;
Serial.print(stato_luce_rossa);
Serial.print(stato_luce_gialla);
Serial.print(stato_luce_verde);
Serial.println(stato_sequenza);
delay (80);  
}
vecchia_lettura1 = lettura1;
if (stato_luce_rossa == 1) {
digitalWrite(luce_rossa, HIGH); //accende la luce rossa se ho tensione sul pin 10
}
else { digitalWrite(luce_rossa, LOW); //altrimenti rimane spenta
}
}

void LUCE_GIALLA () {
int lettura2 = digitalRead(input2);
if ((lettura2==HIGH)&&(vecchia_lettura2==0)) {
stato_sequenza = 0;
stato_luce_gialla = 1 - stato_luce_gialla;
Serial.print(stato_luce_rossa);
Serial.print(stato_luce_gialla);
Serial.print(stato_luce_verde);
Serial.println(stato_sequenza);
delay (15);  
}
vecchia_lettura2 = lettura2;
if (stato_luce_gialla == 1) {
digitalWrite(luce_gialla, HIGH); //accende la luce gialla se ho tensione sul pin 11
}
else {
digitalWrite(luce_gialla, LOW); //altrimenti rimane spenta 
}
}

void LUCE_VERDE () {
int lettura3 = digitalRead(input3);
if ((lettura3==HIGH)&&(vecchia_lettura3==0)) {
stato_sequenza = 0;
stato_luce_verde = 1 - stato_luce_verde;
Serial.print(stato_luce_rossa);
Serial.print(stato_luce_gialla);
Serial.print(stato_luce_verde);
Serial.println(stato_sequenza);
delay(15);
}
vecchia_lettura3 = lettura3;
if (stato_luce_verde == 1) {
digitalWrite(luce_verde, HIGH); //accende la luce verde se ho tensione sul pin 12
}
else { 
digitalWrite(luce_verde, LOW); //altrimenti rimane spenta   
}
}

void SEQUENZA () {
int lettura4 = digitalRead(input4);
if ((lettura4==1)&&(vecchia_lettura4==0)) {
stato_sequenza = 1 - stato_sequenza;
stato_luce_rossa = 0;
stato_luce_gialla = 0;
stato_luce_verde = 0;
Serial.print(stato_luce_rossa);
Serial.print(stato_luce_gialla);
Serial.print(stato_luce_verde);
Serial.println(stato_sequenza);
delay(15);
}
vecchia_lettura4 = lettura4;
if (stato_sequenza == 1) {
tempo ++;
if (tempo >= tempo_massimo) tempo = 0;
if (tempo >0 && tempo <9000) { 
digitalWrite(luce_rossa,HIGH);
digitalWrite(luce_gialla,LOW);
digitalWrite(luce_verde,LOW);
}
if (tempo >9000 && tempo <14000) {
digitalWrite(luce_rossa,LOW);
digitalWrite(luce_gialla,HIGH);
digitalWrite(luce_verde,LOW);
}
if (tempo >14000 && tempo <21000) {
digitalWrite(luce_rossa,LOW);
digitalWrite(luce_gialla,LOW);
digitalWrite(luce_verde,HIGH); 
}
}
}
void loop (){
LUCE_VERDE ();
LUCE_ROSSA ();
LUCE_GIALLA ();
SEQUENZA ();
}

**@musmik: **ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

... ma COME hai collegato i relè ? Mica avrai attaccato direttamente le loro bobine hai pin di Arduino vero ? :o

Ed anche in serie ai LED hai messo le dovute resistenze ?

Guglielmo

ok, grazie dell'avviso , ora sistemo !

musmik:
ok, grazie dell'avviso , ora sistemo !

Grazie ... e ... rispondi anche alle successive domande :wink:

Guglielmo

.... le Bobine dei relè sono da 5 volts DC , il loro consumo effettivo non lo conosco ma difficilmente superano i 40 mA per bobina, del resto i pulsanti di acceso e spento funzionano perfettamente.
Per quanto riguarda i led , ovviamente ho messo le resistenze adeguate prima di fare delle prove .
Il bello è che questa caduta di tensione si presenta solo con l'avvio della sequenza e non con il resto ... mah :cold_sweat:

vorrei anche sottolineare il fatto che ho provato lo sketch su due schede diverse ma le cosa non cambia

musmik:
.... le Bobine dei relè sono da 5 volts DC , il loro consumo effettivo non lo conosco ma difficilmente superano i 40 mA per bobina, del resto i pulsanti di acceso e spento funzionano perfettamente.

Che i pulsanti funzionino NON significa nulla e che i relè assorbano meno di 40 mA credo sia difficile ...

... ti rammento che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip (... cosa che potresti aver già fatto).

I relè si pilotano SEMPRE con un piccolo circuito driver o si prendono le schedine che già lo includono. In allegato un esempio di pilotaggio (in alto a sinistra).

Guglielmo

scheda_3.pdf (408 KB)

Ciao Guglielmo, forse ci siamo fraintesi , le bobine dei relé sono montate sulla scheda driver che é alimentata anch'essa , avevo capito male quando mi hai chiesto se le bobine erano attaccate direttamente ai pin , di fatti quando dico che i primi tre pulsanti funzionano , intendo che anche i contatti dei relé si muovono normalmente ,..... Nel programma che ho scritto ( il mio primo tra l'altro) ... Noti qualcosa di sbagliato?

se diminuisce la tensione, allora vuol dire che chi alimenta tutto non ce la fa!!
Credo sarebbe utile vedere lo schema elettrico, i collegamenti, e come vengono alimentate le cose e chi le alimenta!

a breve posterò l'immagine dei collegamenti , intanto posso dire che la scheda dei relè è alimentata tramite la vcc 5 volt di arduino , cmq sia non credo che ci siano errori nel cablaggio, ho ricontrollato tutto più volte e non ho notato niente di sospetto , c'è da tener presente che se escludo da " void loop" le funzioni che gestiscono i primi tre pulsanti allora la funzione "sequenza" non risente di questo problema.

musmik:
a breve posterò l'immagine dei collegamenti , intanto posso dire che la scheda dei relè è alimentata tramite la vcc 5 volt di arduino....

sai che cosi stai rischiado il regolatore vero??? non credo regga il carico di n relè eccitati troppa roba! attento rischi fumo nero se non va prima in protezione!

Si..urge schema dettagliato dei collegamenti... :wink:

qui c'è lo schema , tieni presente che al posto della scheda di relè che non ho trovato su fritzing ho dovuto mettere dei led , ma come scrivevo più su, la cosa non cambia nemmeno coi led , ovvero all'avvio della sequenza di accensione e spegnimento , i led si accendono ma con metà della loro luminosità , cosa che non succede se li accendo e li spengo tramite i loro pulsanti dedicati ed indipendenti, tieni quindi anche presente che come detto in precedenza la scheda relè la alimento con la 5 volt di arduino .
In parole povere se noti alla fine del mio codice nella sezione loop ci sono LUCE_ROSSA , LUCE_GIALLA ,LUCE_VERDE e SEQUENZA , le prime tre non vanno daccordo con l'ultima ma messe in funzione singolarmente ( quindi eliminando la/le funzione di troppo in loop) funziona tutto normalmente .

nella foto della schema ho usato resistenze a cavolo , quindi non guardare il loro valore , ovviamente nel mio circuito ci sono quelle giuste

purtroppo gli schemi fatti con freezing valgono meno di nulla...meglio farli a carte e penna e fotografarli!!!
1- non si capisce nulla
2 - danno false informazioni

interpretando quello che vedo (led=rele cosi ce scritto) il regolatore di arduinod eve dare tutta la corrente e non è bene!! addirittura come diceva GBPi sembra che siano i pin a dare sta corrente (cosa gia detto che non si fa) ecco perche freezing andrebbe abbolito!

prova ad alimentare i relè con un alimentatore esterno....

capisco , posso anche provare ma dubito che il problema sia quello dato che anche sui led fa la stessa cosa , credo pertanto che il problema sia nel programma più che nell'hardware , anche se io sinceramente non lo trovo .
faccio nel frattempo uno schema alla vecchia maniera e poi posto ... oggi sono a casa dal lavoro per cui forse riesco a fare un video da mettere sul tubo per poi postare il link

p.s il catodo del led (tutti) va sul POSITIVO.. secondo il tuo schema.... cosi non potrebbe mai funzionare....

certo ... devi scusarmi ma non ho mai usato fritzing prima d'ora e non capivo bene dove fosse il catodo nell'immagine del led in fritzing , stando alla "stondatura" sul lato del led sembrava nella posizione giusta , di solito mi rogolo guardando quella e la lunghezza dei piedini.

musmik:
certo ... devi scusarmi ma non ho mai usato fritzing prima d'ora...

e continua a non farlo... te lo consiglio vivamente!!

allora sembra tutto apposto... l'unico cruccio NOn visibile nello schema è quanto gia detto 2 volte :wink: che non si capisce

ho fatto un abbozzo di schema su carta, posto anche una foto della scheda relè e per spiegare meglio metto anche i link a due video che ho appena messo su youtube