Pages: [1]   Go Down
Author Topic: led con inseguitore  (Read 896 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti e la prima volta che scrivo su questo forum e che uso arduino.
ho provato a fare un progetto che ho visto su un libbro 6 led che si accendono come la macchina di super car la sequenza era questa
si accende il primo led
pausa di 30 millisecondi
si accende il secondo
pausa di 30
si spegne il primo
pausa di 30
si accende il terzo
e cosi fino al 6 led poi lo faceva al contrario.

ho voluto modificare il codice usando il pwm fa la stessa cosa solo che al posto di spegnere il led si attenua fino a spegnersi
funziona solo che ho due problemi uno non riesco a farli andare al cotrario dal 6 al 1
e probabilmente  il codice si potrebbe migliorare.
il codice e questo
Quote
# define pot 0
# define attesa 30
int ledPIN[]= {
  2,3,4,5,6,7};
int valorePOT = 0;
int livelloLED = 0;
int led= 0;
int x= 0;
void setup()
{
  for (int led= 0; led < 6; led++)
  {
    pinMode(ledPIN[led],OUTPUT);
  }
}


void loop()
{

  for (led =0;led< 6; led++)
  {
    analogWrite(ledPIN[led],255);
    delay(10);
    analogWrite(ledPIN[led +1],255);
    delay(10);
    for (x=255-1; x >0; x--)
    {
      analogWrite(ledPIN[led],x);
      delayMicroseconds (500);

    }
  }
}




volevo chiedervi se cosi sono sulla buona strada
grazzie a tutti
« Last Edit: November 30, 2012, 07:16:36 pm by baciocco » Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 66
Posts: 1956
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao baciocco, benvenuto

per farlo andare al contrario non devi far altro che aggiungere il codice con un ciclo di For con conteggio decrescente

Ma c'e' una cosa che non capisco ....
.......come fa' a funzionarti, visto che il PWM non e' su tutti i pin dell'Atmega ?

Si, i led si accendono in sequenza, ma lo spegnimento dei led sui pin 2 e 4 non puo' essere graduale, visto che non sono gestibili in PWM

i pin PWM sono quelli in cui accanto al numero del pin c'e' il simbolo ~
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao grazie per la risposta.
ho l'arduino mega che ha 12 pwm
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè devi usare il PWM?

Code:
int ledPins[] = {40,41,42,43,44,45,46,47,48,49};
void setup()
{  
  for(int i = 0; i < 10; i++)        
  pinMode(ledPins[i],OUTPUT);
}                              

void loop()                    
{
  int tempo= 50;
                    
  for(int i = 0; i <= 9; i++)
  {
    digitalWrite(ledPins[i], HIGH);  
    delay(tempo);
    digitalWrite(ledPins[i], LOW);  
  }                                
                                    
  for(int i = 9; i >= 0; i--)
  {                              
    digitalWrite(ledPins[i], HIGH);  
    delay(tempo);                
    digitalWrite(ledPins[i], LOW);
  }                                
 }
 
« Last Edit: December 01, 2012, 07:47:02 pm by pablos » Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

perche il codice che mi mostri e come era nel libbro
io volevo modificarlo per prendere confidenza col codice di arduino
e da una settimana che ci sto "giocando" prima usavo picaxe o basicx
e poi devo dire che con l'attenuazione del led e molto piu bello ho aggiunto altri 6 led
adesso sto provando con 3 led che si spengono sempre piu. sembra che lasciano una scia di luce "e piu bello"

questo "progetto" e solo per scopi di apprendimento per imparare i vari cicli di controllo (if,for,while, ecc.)

una cosa volevo chiedere a voi esperti.
perche molti usano delle variabili int (che occupano spazio in memoria) solo per dichiarare un pin es.       int led = 2;
e non usano    #define led 2 che al contrario se o capito bene non occupa memoria

per adesso con arduino sto rimanendo impressionato
a delle funzioni che ti semplificano la vita come la: map(val, vMIN, vMAX, sMIN, sMAX) per scalare valori che e una bomba

detto questo volevo approfittare per fare i complimenti a massimo banzi e al suo team , e a tutti voi sia principianti che esperti ai principianti perche con i loro problemi aiutano
a risolvere anche i miei e agli esperti perche risolvono problemi "e un po vi invidio"

ciao

Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 954
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

io farei così:
Code:
byte ledPIN[]= {2,3,4,5,6,7};

void setup()
{
  for (byte led= 0; led < 6; led++)
  {
    pinMode(ledPIN[led],OUTPUT);
  }
}

void loop()
{
  for (char led=0; led<6; led++)  //ciclo for che viene ripetuto 6 volte, da 0 a 5
  {
    digitalWrite(ledPIN[led],HIGH);  //led del pin riferito alla variabile ledPIN[led] acceso fisso

    for (int fade=0; fade<256; fade++)   //ciclo for che viene ripetuto 256 volte
    {
      if(led!=0)     //controllo che il led acceso fisso non sia il primo se no andrei fuori dal vettore ledPIN
      {
       analogWrite(ledPIN[led-1],255-fade); //pwm calante sul led precedente al led acceso fisso
      }
 
     if(led!=5)  //controllo che il led acceso fisso non sia l'ultimo se no andrei fuori dal vettore ledPIN
      {
       analogWrite(ledPIN[led+1],fade); // pwm crescente sul led sucessivo al led acceso fisso
      }
      delay(1);  //aspetta 1ms, quindi la durata di questo ciclo è di circa 256ms
    }
  }

 for (char led=5; led>=0; led--)  //ciclo for che viene ripetuto 6 volte, da 5 a 0
  {
    digitalWrite(ledPIN[led],HIGH);  //led del pin riferito alla variabile ledPIN[led] acceso fisso

    for (int fade=0; fade<256; fade++)  //ciclo for che viene ripetuto 256 volte
    {
      if(led!=0)  //controllo che il led acceso fisso non sia il primo se no andrei fuori dal vettore ledPIN
      {
       analogWrite(ledPIN[led-1],fade);// pwm crescente sul led sucessivo al led acceso fisso
      }

      if(led!=5)  //controllo che il led acceso fisso non sia l'ultimo se no andrei fuori dal vettore ledPIN
      {
       analogWrite(ledPIN[led+1],255-fade); //pwm calante sul led precedente al led acceso fisso
      }
      delay(1);   //aspetta 1ms, quindi la durata di questo ciclo è di circa 256ms
    }
  }
}

dovrebbe fare un che c'è sempre un led acceso e i 2 led attorno che fanno si accendono e spengono gradualmente smiley se c'è qualcosa che non va o che non capisci nel programma basta che chiedi smiley-wink

una cosa volevo chiedere a voi esperti.
perche molti usano delle variabili int (che occupano spazio in memoria) solo per dichiarare un pin es.       int led = 2;
e non usano    #define led 2 che al contrario se o capito bene non occupa memoria
questo me lo sono sempre chiesto anch'io smiley-roll-sweat
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prendi il mio codice postato prima e mettici byte al posto di int


byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};
...
for(byte i = 0; i <= 9; i++)
...
for(byte i = 9; i >= 0; i--)

... non funziona più

Ps:

- I PWM della mega 2560 sono 15 ma non sono in sequenza, quindi con un for solo non riesci a farlo
- libro con una 'b' sola smiley
« Last Edit: December 02, 2012, 08:22:20 am by pablos » Logged

no comment

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 954
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Prendi il mio codice postato prima e mettici byte al posto di int


byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};
...
for(byte i = 0; i <= 9; i++)
...
for(byte i = 9; i >= 0; i--)

... non funziona più
perchè un non esce mai dal secondo for, il byte è sempre >= 0, io nel mio programma ho usato un char che invece può essere minore di 0
il byte va da 0 a 255
il char va da -128 a +127
l'int va da -32768 a 32767
nel reference trovi anche tutti gli altri tipi di variabili: http://arduino.cc/en/Reference/HomePage
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

conosco lo spazio occupato dalle var.

quello che conta è che venga utilizzati meno  spazio possibili nelle var dichiarate pubbliche tipo questa
byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};

le altre all'interno delle funzioni vengono distrutte al termine della stessa.
A parità di righe impiegate, tempo impiegato per fare il prog e memoria utilizzata penso sia più conveniente usare un int in questo specifico caso. Semplicemente un mio parere
Logged

no comment

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 954
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

conosco lo spazio occupato dalle var.

quello che conta è che venga utilizzati meno  spazio possibili nelle var dichiarate pubbliche tipo questa
byte ledPins[] = {40,41,42,43,44,45,46,47,48,49};

le altre all'interno delle funzioni vengono distrutte al termine della stessa.
A parità di righe impiegate, tempo impiegato per fare il prog e memoria utilizzata penso sia più conveniente usare un int in questo specifico caso. Semplicemente un mio parere
io non sono d'accordo, da quello che so il micro fa meno "fatica" a calcolare le variabili più "corte" e unsigned rispetto a quelle signed... Quindi l'unsigned char e il byte dovrebbero essere quelle migliori...
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Pages: [1]   Go Up
Jump to: