Pages: [1] 2   Go Down
Author Topic: Fade  (Read 1081 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ragazzi mi aiutate a capire come far accendere e spegnere i led lentamente o mi indirizzate a qualche link che lo spiega...grazie smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Millenium-bug,
puoi guardare il seguente link: http://www.arduino.cc/en/Tutorial/DimmingLEDs

Comunque, per tua informazione, devi usare la funzione PWM (Pulse Width Modulation) dei pin analogici di arduino (quelli col simboo della tilde).
In pratica il pin emette un'onda quadra da 5V a 0V con un duty cycle variabile da 0% (valore 0 impostato al pin) al 100% (valore 255 impostato al pin) ad una frequenza molto alta (non ricordo esattamente... qualcuno te lo puo' dire con precisione).
L'occhio umano non e' in grado di vedere con una frequenza cosi' elevata (googla se vuoi POV - Persistence of Vision) e quindi, anche se il led si accende e si spegne alla massima luminosita', l'occhio e' tratto in inganno e lo vede come meno intenso ma costantemente acceso.
Spero di essere stato, nella brevita' della risposta, comunque abbastanza chiaro.

Ciao.
Logged

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

Ciao, nella sezioen Learnign dei sito c'è quello che fa al caso tuo (http://arduino.cc/en/Tutorial/Fade )
Non ho l'IDE sotto mano ma se cerchi trovi anche l'esempio già pronto.

Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Dguzz
I pin identificati con la tilde non sono pin analogici, sono digitali.
D'altronde se fossero analogici non ci sarebbe bisogno del PWM: ad esempio l'Arduino DUE ha 2 uscite analogiche.
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

PaoloP scusami,
Hai perfettamente ragione... Ero di fretta, ma ho voluto cercare di dare una risposta allo stesso tempo concisa ma completa... Prossima volta risponderò solo se avrò un po' più di tempo (sono nuovo del forum, abbastanza bravo con la programmazione, molto meno con l'elettronica - ricordi di lontani studi smiley-roll-sweat).
Spero di non aver creato confusione a nessuno. Grazie per la precisazione.

Ciao
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessun problema, ma l'importante è non dare informazioni errate, visto che qualche leggenda metropolitana pare si sia già creata.  smiley-wink smiley-mr-green
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie a tutti delle risposte .
Più o meno ho capito come funziona, solo che non capisco come impostare 2 led.
Ho trovato questo:

Code:
int ledPin = 9;    // LED connected to digital pin 9

void setup()  {
  // nothing happens in setup
}

void loop()  {
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect   
    delay(30);                           
  }

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect   
    delay(30);                           
  }
}

Ma dice solo come fare con un solo led...e non cpaisco come si deve scrivere per avere altri led in fade.


Logged

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

Ciao,
  spiega meglio cosa vuoi ottenere, vuoi che prima un led e poi l'altro effetuino il fade? Devi usare due pin PWM
vuoi che il fade sia identico ma con due led? Devi attaccere due led al solito pin ma ATTENZIONE che devi prendere le necessarie precauzioni affinché non ti si bruci il pin che supporta al massimo 40mA
Vuoi che i fade siano contemporanei ma sfasati o in qualche modo differenti? Devi usare due pin PWM ma ti serve un codice diverso perchè forse il for non ti permette ti ottenere il risultato desiserato...
Descrivi meglio cosa vuoi ottenere e magari metti il codice che hai prodotto dopo alcune prove e che non funziona, anche perchè il codice che hai postato è quello dell'esempio...

Ciao
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai Ragione.

Allora ho 6 led. Voglio che si accenda prima uno in fade, poi dopo un tempo se ne accenda un' altro e così via. Appena si è acceso l'ultimo si devono spegnere nuovamente in sequenza di nuovo tutti.

I driver PWM che ho abbiamo già visto con PaoloP che vanno bene, ora il mio problema è nella scrittura del progetto.
Ho cqpito (o almeno credo) guardando qualche progetto come funziona, ma non ho capito come si mettono/scrivono (scusate ma non conosco ancora bene il linguaggio tecnico) altri led.
Logged

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

Ciao,
  premetto che possono esistere tante soluzioni ma l'unica che conosco e posso consigliarti è sfruttare tutti e 6 le uscire PWM di arduino (con 6 led sei alla massima capacità PWM di arduino) e precisamente i pin sono 3,5,6,9,10,11. Ad ogni pin colleghi un led con relativa resistenza e invece che sfruttare il delay che blocca il programma leggi l'uso di millis che permette di effettuare verifiche del tempo trascorso senza bloccare il programma.
Ogni led avrà quindi la sua  analogWrite(ledPin, fadeValue); sfasata di qualche millisecondo (se non ho capito male) e quando l'ultimo led è acceso al massimo effettui un ciclo invertendo la frequenza dei pwm.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Visto che sono totalmente a zero, potresti farmi un esempio di programmazione?

Cioè tipo devo che scrivere in :

Code:
void setup()  {
 
}

void loop()  {
                        
  }

P.S. ovviamente non pretendo che mi scriva tu la programmazione (anche perchè non imparerei così) ma che mi aiuti a capire il criterio.
Logged

Roma
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

questo codice esegue la sequenza dei 6 led.
Code:
int led1 = 3;
int led2 = 5;
int led3 = 6;
int led4 = 9;
int led5 = 10;
int led6 = 11;
int conta =0; //sequenza led
int frequenza=0; // frequenza pwm
int uscite[] = {3, 5, 6, 9, 10, 11};
    void setup() {     
      Serial.begin(9600);     
      pinMode(led1, OUTPUT);     
      pinMode(led2, OUTPUT);     
      pinMode(led3, OUTPUT);     
      pinMode(led4, OUTPUT);     
      pinMode(led5, OUTPUT);     
      pinMode(led6, OUTPUT);     
    }
   
    // the loop routine runs over and over again forever:
    void loop() {
        if(conta>5)
           {
              conta=0;
            }     
        accendiled(uscite[conta]);
    }
    void accendiled(int uscita)
     {
        frequenza++;
        if(frequenza>255)
           {
             frequenza=0;
             analogWrite(uscita, frequenza);   // turn the LED on (HIGH is the voltage level)
             conta++;
            }
         analogWrite(uscita, frequenza);   // turn the LED on (HIGH is the voltage level)
         delay(10);               // wait for a second
         Serial.print(uscita);Serial.print(" - ");Serial.println(frequenza);
         return;
       }
Logged

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

Ciao, provo a farti un esempio ma non ho l'ide a disposizione quindi potrebbero esserci errori in compilazione e/o di logica
Code:
nFadeDelay = 30;
nLed1Delay = 35;
nLed2Delay = 200;
nLed1FadeValue = 0;
nLed2FadeValue = 0;
nFadeStep = 5;
nDelayCheck = millis();
nAttMillis = millis();
while (nLed2FadeValue < 255){
  if (millis() - nAttMillis > nFadeDelay ){ //Verifica se è trascorso il tempo tra un incremento di luminosità e il successivo
   if (millis() - nDelayCheck > nLed1Delay){ //Verifica se dall'avvio è trascorso abbastanza tempo per iniziare ad accendere il led 1
    if (nLed1FadeValue < 255){ //Incrementa la luminosità del led 1 se possibile
       nLed1FadeValue += nFadeStep;
    }
   }
   if (millis() - nDelayCheck > nLed2Delay){ //Verifica se dall'avvio è trascorso abbastanza tempo per iniziare ad accendere il led 2
    if (nLed2FadeValue < 255){ //Incrementa la luminosità del led 2 se possibile
       nLed2FadeValue += nFadeStep;
    }
   }
   analogWrite(ledPin1, nLed1FadeValue ); //Imposta il PWM del led 1
   analogWrite(ledPin2, nLed2FadeValue ); //Imposta il PWM del led 2
   nAttMillis = millis();
  }
}
Ovviamente dovrai definire correttamente le variabili e occuparti di inserire la procedura che spegne i led secondo el logiche descritte nei post precedenti. Ti basta comprendere il codice sopra e invertirne la logica

Ciao
Logged

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

Rileggento i vecchi post credo di aver preso un mezo granchio e di aver capito che il secondo led non doveva aspettare che il primo fosse totalemnte acceso. In quest'ottica il codice di giacomoforgione è forse più vicino alle tue esigenze anche se pure quello non aderisce completamente a quello che ti aspetti. Ad ogni modo hai un bel po' di codice da studiare e adattare alle tue esigenze per riuscire ad arrivare al tuo obiettivo  smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ragazzi grazie infinite ad entrambi. Ora me li studio per bene e vi faccio sapere come va. Grazie ancora smiley
Logged

Pages: [1] 2   Go Up
Jump to: