aiuto su codice per led chaser supercar

Salve, so che è una domanda stupida ma… mi sto intrippando su questo codice!!! In rete ho trovato questo tutorial per utilizzare la libreria softpwm, per realizzare il classico effetto “supercar” su 8 led. Questo è il codice:

//======================================================================================
// Author : CYTRON TECHNOLOGIES SDN BHD
// Project : Arduino Duemilanove
// Project description : Project_4: Kight Rider Light Bar
// http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1276737123
// http://code.google.com/p/rogue-code/wiki/SoftPWMLibraryDocumentation#Description
//======================================================================================
#include <SoftPWM.h>

#define DELAY 40

int leds[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // Pin using

/**************************************************************************************

  • PRIVATE FUNCTION: setup()
  • PARAMETERS:
  • ~ void
  • RETURN:
  • ~ void
  • DESCRIPTIONS:
  • Define of I/O pin as Input or Output

***************************************************************************************/
void setup()
{
SoftPWMBegin(); //Initializes the library - sets up the timer and other tasks.

for (int i = 0; i < 8; i++) // loop from 0 to 7
SoftPWMSet(leds*, 0); // SoftPWMSet(pin, value) // pin is the output pin // value is a value between 0 and 255 (inclusive)*

  • SoftPWMSetFadeTime(ALL, 30, 200); // SoftPWMSetFadeTime(pin, fadeUpTime, fadeDownTime)*
    } // pin is the output pin
  • // fadeuptime is the time in milliseconds that it will take the channel to fade from 0 to 255.*
  • // fadedowntime is the time in milliseconds that it will take the channel to fade from 255 to 0.*

/*******************************************************************************
* PRIVATE FUNCTION: loop()
*
* PARAMETERS:
* ~ void
*
* RETURN:
* ~ void
*
* DESCRIPTIONS:
* Non-Stop looping
*
*******************************************************************************/
void loop()
{

  • int i;*
  • for (i = 0; i < 3; i++) //loop from 0 to 2*
  • {*
  • SoftPWMSet(leds[i+1], 255); // set LED value to 255*
  • SoftPWMSet(leds[6-i], 255);*
    _ SoftPWMSet(leds*, 0); _
    _
    SoftPWMSet(leds[7-i], 0);_
    _
    delay(DELAY);_
    _
    }*_

* delay(250);*

* for (i = 3; i > 0; i–)*
* {*
* SoftPWMSet(leds[i-1], 255);*
* SoftPWMSet(leds[8-i], 255);*
_ SoftPWMSet(leds*, 0);
SoftPWMSet(leds[7-i], 0);
delay(DELAY);
}
delay(250);
}
[/quote]*
solo che non riesco a capire come variare le sequenze di accensione… così com’è si accendono dagli estremi verso il centro e viceversa, io invece vorrei ottenere l’effetto classico, da un estremo all’altro e viceversa… aiutino (almeno sulla comprensione del codice???) !!! Grazie!!!_

Ipotizzo tenendo conto di quanto da te riportato:

  for (i = 0; i < 8; i ++)   {              //loop from 0 to 7
    SoftPWMSet(leds[i], 255);   // LED i ON
    SoftPWMSet(leds, 0);                  
    delay(DELAY);
  }

  delay(250);

  for (i = 7; i < 0; i --)  {                   //loop from 7 to 0
    SoftPWMSet(leds[i], 255);   // LED i ON
    SoftPWMSet(leds, 0);                  
    delay(DELAY);
  }
  
  delay(250);

mmmm no, così mi da errore in compilazione sulla riga "SoftPWMSet(leds, 0);"

ho già trafficato con semplici sketch con variabili ed incrementi, ma stavolta ci sto veramente perdendo la strada di casa.... riconosco effettivamente che non sono una cima in programmazione..... :roll_eyes:

Allora quello che hai scritto era sbagliato.

L’istruzione SoftPWMSet(leds, 0), infatti, fa riferimento ad un array e non ad un pin.

  for (i = 0; i < 8; i ++)   {              //loop from 0 to 7
    SoftPWMSet(leds[i], 255);   // LED i ON
    SoftPWMSet(leds[i], 0);                  
    delay(DELAY);
  }

  delay(250);

  for (i = 7; i < 0; i --)  {                   //loop from 7 to 0
    SoftPWMSet(leds[i], 255);   // LED i ON
    SoftPWMSet(leds[i], 0);                  
    delay(DELAY);
  }
  
  delay(250);

Se era sbagliato non so, però funziona!!! :stuck_out_tongue: facendo la tua modifica tutto buio!!

non conosco la libreria, ma non e’ che l’autore ha messo i led in un certo modo, meccanicamente parlando intendo ? perche’ guardando qui :

SoftPWMSet(leds[i+1], 255);            
    SoftPWMSet(leds[6-i], 255);

al rpimo giro, con i=0, lui accende prima il led gestito dalla cella 1 dell’array, poi quello della cella 6
Comunque giocando sui numeri che puntano all’array di pin fai quello che vuoi

non credo abbia armeggiato con i led, vanno semplicemente dal pin 2 al 9!

guarda fai prima
http://forum.arduino.cc/index.php/topic,8113.0.html

Ti ringrazio, ma quei post li avevo già visti da tempo!!!! La mia era una richiesta di info/aiuto riguardo la libreria softpwm, tutto qua!!!

Lo so che i pin vanno dal 2 al 9, ma tu hai un video dove si vedono le connessioni e la posizione fisica dei led ?

nytro81:
solo che non riesco a capire come variare le sequenze di accensione… così com’è si accendono dagli estremi verso il centro e viceversa, io invece vorrei ottenere l’effetto classico, da un estremo all’altro e viceversa… aiutino (almeno sulla comprensione del codice???) !!! Grazie!!!

E’ un semplice ciclo:

  for (i = 3; i > 0; i--)
  {
    SoftPWMSet(leds[i-1], 255);
    SoftPWMSet(leds[8-i], 255);
    SoftPWMSet(leds, 0);
    SoftPWMSet(leds[7-i], 0);
    delay(DELAY);
  }

E non ti serve neanche la softPWM, perché come vedi viene acceso il led alla massima intensità (255) oppure spento del tutto (0).
Potresti fare tutto con semplici digitalWrite:

for (byte i = 0; i < 8; i++) {
  digitalWrite(leds[i], HIGH);
  delay(DELAY);
}
for (byte i = 7; i == 0; i--) {
  digitalWrite(leds[i], HIGH);
  delay(DELAY);
}

Non credo Leo,
se guardi il setup() c'è la Begin che indica come è settato il sistema di fading.

Quindi il fare c'è e funziona, lui si lamenta solo della disposizione dei led, del fatto che non si accendono in sequenza.

Ah, claro. Quindi va da 0 a 255, con quel comando? Beh, non cambia nulla, basta mettere softPWM(ecc) al posto di digitalWrite(), la logica non cambia.

esatto, il comportamento del fade lo determina il setup all'inizio e funziona bene. sinceramente non ho un video dell'autore che mostra le sue connessioni, vi dico che come l'ho provato io (codice originale e connessioni led in fila dal pin 2 al 9) l'animazione che riproduce è partendo dalle 2 estremità si accendono e spengono in sequenza fino a congiungersi al centro e viceversa! Io invece avrei bisogno del "più semplice" (ma forse non lo è!!) avanti/indietro!!! Ripeto, ho avuto a che fare con altri codici del genere con sequenze per accensioni senza grossi problemi, ma con questo ci faccio a schiaffi!

Guarda tu hai già in mano 2 possibili soluzioni,
La mia è quella di mettere mano ai numeri nella array,
Quella di leo è la seconda.

Prova

Correggetemi se sbaglio, ma semplicemente mettendo mano all’ordine dei pin sull’array non credo risolverei molto… se attualmente avendoli in fila dal 2 al 9 ottengo una “doppia animazione” (da un estremo al centro da entrambe i lati) se cambio ordine dei pin al massimo otterrei 2 “avanti-indietro” paralleli… nel senso, dato che sono 2 animazioni speculari e non consecutive, non riuscirei mai ad ottenere avanti-indietro sull’intera fila… non so se mi sono spiegato!!! X adesso modificando così il codice

//======================================================================================
//	Author		    : CYTRON TECHNOLOGIES SDN BHD
//	Project	            : Arduino Duemilanove
//	Project description : Project_4: Kight Rider Light Bar	
//                            http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1276737123
//                            http://code.google.com/p/rogue-code/wiki/SoftPWMLibraryDocumentation#Description					
//======================================================================================
#include <SoftPWM.h>

#define DELAY 40

int leds[8] = {2, 3, 4, 5, 6, 7, 8, 9};        // Pin using


/**************************************************************************************
* PRIVATE FUNCTION: setup()
*
* PARAMETERS:
* ~ void
*
* RETURN:
* ~ void
*
* DESCRIPTIONS:
* Define of I/O pin as Input or Output 
*
***************************************************************************************/
void setup()
{
  SoftPWMBegin();                          //Initializes the library - sets up the timer and other tasks.

  for (int i = 0; i < 8; i++)              // loop from 0 to 7
    SoftPWMSet(leds[i], 0);                // SoftPWMSet(pin, value)   // pin is the output pin   // value is a value between 0 and 255 (inclusive)

  SoftPWMSetFadeTime(ALL, 30, 200);        // SoftPWMSetFadeTime(pin, fadeUpTime, fadeDownTime)
}                                          // pin is the output pin
                                           // fadeuptime is the time in milliseconds that it will take the channel to fade from 0 to 255.
                                           // fadedowntime is the time in milliseconds that it will take the channel to fade from 255 to 0.
                                           
/*******************************************************************************
* PRIVATE FUNCTION: loop()
*
* PARAMETERS:
* ~ void
*
* RETURN:
* ~ void
*
* DESCRIPTIONS:
* Non-Stop looping 
*
*******************************************************************************/
void loop()
{
  int i;

  for (i = 0; i < 8; i++)                    //loop from 0 to 2
  {
    SoftPWMSet(leds[i+1], 255);              // set LED value to 255
    SoftPWMSet(leds[i], 0);                  
    
    delay(DELAY);
  }
  
  delay(250);
  
  for (i = 7; i >  0; i--)
  {
    SoftPWMSet(leds[i-1], 255);
    SoftPWMSet(leds[i], 0);
    
    delay(DELAY);
  }

  delay(250);
}

ottengo questo… pare ci sia un minimo di senso ma non capisco come mai poi svalvoli così!!

ma e' bellissima, si ok tamarra, ma bella :slight_smile:
dove diavolo hai prteso quei leddoni ? ogni quadratino e' un singolo led o un gruppo di led ?

che bei tempi quando feci la stessa cosa sul motorino, dietro al parafanghi (ancora non era obbligatoria la targa)
avevo un problema sull'alimentazione che mi sballava il clock del 555, piu' acceleravi e piu' andava veloce, la vendevo come feature :stuck_out_tongue_closed_eyes:

controlla i due for, non sono complementari

Le scariche delle candele interferivano sull'oscillatore??!? Non sono leddoni ma semplicemente segmenti i una led strip! Isolati a settori con le alette di alluminio!

Non conosco la libreria e non conosco quale led si accende con leds[0] e con leds[1] ecc.
Prova ad accendere ogni singolo led e riporta qui l'ordine.
Se ad esempio con leds[0] si accende il primo led a sinistra (guardando la barra frontalmente),
allora se leds[1] è il secondo leds ecc fino all'ultimo ti consiglio di evitare del tutto i for, almeno inizialmente.
Quindi accendi i led uno dopo l'altro inserendo un delay tra uno è l'altro per fare almeno la parte iniziale dell'effetto,
se funziona fai un video così possiamo apprezzare ad occhio il risultato.

L'idea è quella di fargli fare quello che vogliamo senza badare ai concetti della buona programmazione, poi dopo che una parte funziona, ci si ragiona e si lavora per creare l'algoritmo.

Questo è l'effetto supercar più gradevole mai visto (oltre quello originale)

Io non molto chiaro in che ordine devono accendere i led.
x = led acceso
012345678
x000000000
xx00000000
xxx0000000
xxxx00000
0xxxx0000
00xxxx000
000xxxx00
0000xxxx0
00000xxxx
000000xxx
0000000xx
00000000x

ripetendo questo ordine all'infinito, prima in senso discendente e poi in senso ascendente, cioè da sopra verso sotto e da sotto verso sopra.

Dubito sia così l'effetto originale

Ciao.

Ma poi la metti davvero sull'auto?
Chissà se negli anni 80 hanno usato un computer per accendere 7 led in sequenza :smiley: :smiley: