Go Down

Topic: sequenza led accelerata (Read 1 time) previous topic - next topic

fireworks

Salve a tutti,
sono nuovo mi chiamo Roberto e sono di Trani; mi sono affezionato molto al mondo di arduino; con molta calma sto cercando di capire come funziona .

Ho creato questo programmino:

int tgr=LOW;
int var=0;
int X;

void setup() {
pinMode(40,INPUT);
for (int uscita=2 ; uscita<29; uscita++){
pinMode(uscita,OUTPUT);
}
}

void loop(){
X=1000;
tgr=digitalRead(40);
if((tgr==HIGH)&&(var==0)){
for(int uscita=2; uscita<29; uscita++){
digitalWrite(uscita,HIGH);
delay(X);
digitalWrite(uscita,LOW);
X=X-35;
}
}
else{
for(int uscita=0; uscita<29; uscita++){
digitalWrite(uscita,LOW);}
}
}

facendo eseguire il programma, il tutto funziona molto bene; l'unica cosa che non mi soddisfa è la parte accelerata. mi spiego meglio:
all'inizio è molto lenta, poi successivamente accelera troppo velocemente; esiste un modo per avere un'accelerazione "costante"?

grazie a tutti in anticipo.....

pablos

Ciao
Cosa accelera? Arduino scappa via dalla scrivania?

In questo modo obblighi la gente a studiare e decifrare la logica del programma nel tentativo di capire cosa vuoi fare visto che hai omesso questo dettaglio fondamentale.
Specifica cosa vuoi ottenere, a cosa può servire, spiega il programma cosa dovrebbe fare, qualcuno potrà puntare direttamente sulla parte di programma senza studiarselo tutto.

ciao
no comment

Michele Menniti

Intanto devi mettere un delay (X) anche dopo digitalWrite(uscita,LOW);
le cose dovrebbero cambiare parecchio
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

medimax

Secondo me oltre alla modifica di Michele

Quote
Intanto devi mettere un delay (X) anche dopo digitalWrite(uscita,LOW);


io partirei con un valore di X più grande..

pablos

Se vuoi fare effetto KITT

Code: [Select]
void oneAfterAnotherLoop()
{
  int delayTime = 50; //the time (in milliseconds) to pause between LEDs
                       //make smaller for quicker switching and larger for slower

//Turn Each LED on one after another
  for(int i = 0; i <= 9; i++){
    digitalWrite(ledPins[i], HIGH);  //Turns on LED #i each time this runs i
    delay(delayTime);
    digitalWrite(ledPins[i], LOW);
    //delay(delayTime);                //gets one added to it so this will repeat
  }                                  //8 times the first time i will = 0 the final
                                     //time i will equal 7;

//Turn Each LED off one after another
  for(int i = 9; i >= 0; i--){  //same as above but rather than starting at 0 and counting up
                                //we start at seven and count down
    digitalWrite(ledPins[i], HIGH);  //Turns off LED #i each time this runs i
    delay(delayTime);                //gets one subtracted from it so this will repeat
    digitalWrite(ledPins[i], LOW);
}                                  //8 times the first time i will = 7 the final
                                     //time it will equal 0                                                                 
}
no comment

pablos

#5
Apr 11, 2012, 05:58 pm Last Edit: Apr 11, 2012, 06:00 pm by pablos Reason: 1
attento perchè se accendi 27 led in fila e poi li spegni in sequenza senza transistors cuoci tutto

ciao
no comment

Michele Menniti


Secondo me oltre alla modifica di Michele

Quote
Intanto devi mettere un delay (X) anche dopo digitalWrite(uscita,LOW);


io partirei con un valore di X più grande..

Può essere che la cosa migliori perché si allarga il tempo totale, ma considera che fino a 100ms il flashing di vede quindi ha a disposizione circa 30 step, solo che li vanifica col fatto che i led si accendono subito dopo essersi spenti, visto che manca appunto un delay.

@ Pablos: l'idea è simpatica, ma anche tu forse hai omesso un delay(delayTime); in fondo.
Sul discorso consumi hai perfettamente ragione, probabilmente usa una MEGA per avere così tante porte, ma se non l'ha fuso finora credo che le avrà messe :)
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

fireworks

Avete ragione! Scusate, forse sono andato troppo nello specifico, senza spiegare per bene nulla.

Allora, la mia idea è di accendere dei led in sequenza
led1 si accende, aspetto X secondi, poi si spegne; a questo punto la sequenza, passa al led2 e così via.
se X lo mantengo costante, ottengo una sequenza costante di led che si accendo e spengono.

La mia idea e di creare una sequenza che pian piano acceleri. per questo ho inserito quella condizione X=X-35; ogni volta che itera, la X diminuisce di una quantità pari a 35 millisecondi.

Ripeto così, il sistema funziona benissimo, il fatto è che ottengo all'inizio lunghi tempi prima di passare al led successivo e verso la fine della sequenza ottengo tempi troppo corti, ecco perché vi chiedevo se era possibile creare qualcosa di più "equilibrato".

Mentre aspettavo che qualcuno rispondesse, ho buttato giù un'altra condizione, usando la funzione esponenziale:

void loop(){
x=0;
tgr=digitalRead(40);
if((tgr==HIGH)&&(var==0)){
for(int uscita=2; uscita<29; uscita++){
x=x+1;
digitalWrite(uscita,HIGH);
delay(Y);
digitalWrite(uscita,LOW);
Y=1000*(0,9)^x;
}
}

ottenendo un risultato molto più accettabile(a livello teorico-cartaceo), ma su arduino non l'ho ancora provato, visto che non sono riuscito a capire ancora come far funzionare la funzione pow.
Qualcuno mi saprebbe aiutare in qualche altro modo?


Spero di essere stato più chiaro.  :P :P

djpatrik1824

E se tu facessi un qualcosa del genere?

y=y-1;
x=x-y;

In questo modo anche l'accelerazione diviene graduale...poi a seconda dei valori che inserisci ottieni una salita diversa...

Michele Menniti

ma hai almeno provato il consiglio che ti ho dato? altrimenti che li chiedi a fare? :smiley-mr-green:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

fireworks


Intanto devi mettere un delay (X) anche dopo digitalWrite(uscita,LOW);
le cose dovrebbero cambiare parecchio


Ma un delay costante dopo digitalWrite(uscita,LOW); ?

fireworks


Secondo me oltre alla modifica di Michele

Quote
Intanto devi mettere un delay (X) anche dopo digitalWrite(uscita,LOW);


io partirei con un valore di X più grande..


Non otterrei valori troppo lunghi e morti all'inizio??

fireworks

#12
Apr 12, 2012, 08:41 am Last Edit: Apr 12, 2012, 08:43 am by fireworks Reason: 1

attento perchè se accendi 27 led in fila e poi li spegni in sequenza senza transistors cuoci tutto

ciao


Tranquillo Pablos, la mia idea è questa!
ora cerco di scendere un po' più sul concreto!

I led servono in realtà a ben poco, io tramite arduino comanderò dei mosfet IFRZ48; questi mi faranno, ogni qualvolta riceveranno l'impulso, chiudere un secondo circuito, per l'innesco di un accenditore elettrico, per l'accensione di fuochi d'artificio.
Ricapitolando i led non esistono più al posto dei led ci saranno dei mosfet, che fungeranno da interruttore per i miei accenditori elettrici.
Ora tramite video cercherò di farvi capire cosa ho in mente di ottenere!

http://www.youtube.com/watch?v=p77-h8sa_ro&feature=relmfu

da 5 secondi, capirete la "mia sequenza accellerata".....grazie  :)

p.s.
sono un pirotecnico, non vi preoccupate, con l'hobby per l'elettronica!  8) 8)

fireworks


leo72

Fireowrks in inglese significa "fuochi d'artificio". Avevo avuto il sospetto  :P

Go Up