led rgb che (dovrebbero) scorrere

Ciao a tutti,
sono inesperto ed ora capirete il perche'!

Ho un Arduino mega 2560 dove vorrei pilotare 8 led RGB in questa "semplice" maniera: potete immaginare una striscia di 8 led bianchi (RGB) dove scorre, intervallato da 2 bianchi, il rosso , il verde ed infine il blu, praticamente i tre colori distini si inseguono con 2 bianchi tra un colore e l'altro.

In allegato potete vedere lo sketch con il solo colore rosso, ma credo che non sia la maniera giusta per procedere...vero??? :~

Avete qualche suggerimento?
Grazie a tutti.

espositore_bianco_e_rosso.ino (2.53 KB)

nessuno mi puo' aiutare??

Che frettoloso, ci dai neanche 4 ore per rispondere? :wink: :wink: :wink:

L' Arduino Mega ha solo 14 uscite PWM. Non puoi pilotarne 8 LED RGB (che sono in tutto 24 LED di diversi colori).

Le soluzioni sono per un RGB con anodo comune:
2 TLC5940 o 1 TLC5947 (che é solo SMD e percui devi prendere una schedina come per esempio http://www.razorconcepts.net/tlc5947.html http://docs.macetech.com/doku.php/octobrite ).

Strise LED con controller PWM tipo WS2801, WS2811 o LED smd con controller integrato WS2812 vedi libreria Google Code Archive - Long-term storage for Google Code Project Hosting. la libreria sopporta il WS2811/12 basta cambiare:
FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2801); in:
FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2811);

Ciao Uwe

Ciao e scusa per la fretta!! :drooling_face:

Non ho la necessita di controllarli con segnali PWM, mi basta solo lo stato acceso-spento, qualche consiglio?
Grazie

Se Ti bastano 7 colori piú spento puoi collegare il LED con relativi resistenze a 24 uscite digitali. Scegli la corrente dei LED bassi (5ma) per non bruciare le ucsite. (certi gruppi di Pin non sopportano 100mA in totele)
Non userei pin1 perché serve per la comunicazione USB.
Poi non userei dei nomi per ogni LED ma userei 3 Array perché cosí puoi usare dei cicli per accendere/spegnere i LED.

Ciao Uwe

Il mio problema è lo sketch, solo per far scorrere il rosso ho scritto un papiro, credo di non essere sulla trada giusta.... :~

int led1R=1, led1G=2, led1B= 3;
int led2R=4, led2G=5, led2B=6;
int led3R=7, led3G=8, led3B= 9;
int led4R=10, led4G=11, led4B=12;
int led5R=13, led5G=14, led5B= 15;
int led6R=16, led6G=17, led6B=18;
int led7R=19, led7G=20, led7B= 21;
int led8R=22, led8G=23, led8B=24;
int velo1 = 1000;
int velo2 = 1000;

void setup() {                
  // initialize the digital pin as an output.
  // LED1
  pinMode(led1R, OUTPUT);
  pinMode(led1G, OUTPUT);
  pinMode(led1B, OUTPUT);
   // LED2
  pinMode(led2R, OUTPUT);
  pinMode(led2G, OUTPUT);
  pinMode(led2B, OUTPUT); 
   // LED3
  pinMode(led3R, OUTPUT);
  pinMode(led3G, OUTPUT);
  pinMode(led3B, OUTPUT); 
   // LED4
  pinMode(led4R, OUTPUT);
  pinMode(led4G, OUTPUT);
  pinMode(led4B, OUTPUT);   
   // LED5
  pinMode(led5R, OUTPUT);
  pinMode(led5G, OUTPUT);
  pinMode(led5B, OUTPUT); 
   // LED6
  pinMode(led6R, OUTPUT);
  pinMode(led6G, OUTPUT);
  pinMode(led6B, OUTPUT);  
    // LED7
  pinMode(led7R, OUTPUT);
  pinMode(led7G, OUTPUT);
  pinMode(led7B, OUTPUT);   
   // LED8
  pinMode(led8R, OUTPUT);
  pinMode(led8G, OUTPUT);
  pinMode(led8B, OUTPUT); 
  
  }
  void loop() {
  
   

// LED1 ROSSO     
digitalWrite (led1R,HIGH); 
delay (velo2);
  
//ACCENSIONE LED 2 ROSSO
digitalWrite (led2R, HIGH);
   
  //LED 1 RGB
  digitalWrite (led1R,HIGH); 
  digitalWrite (led1G,HIGH);
  digitalWrite (led1B,HIGH);
  delay (velo2);


    //LED 2 RGB
    digitalWrite (led2R, HIGH);
    digitalWrite (led2G, HIGH);
    digitalWrite (led2B, HIGH);

  
//ACCENSIONE LED 3 ROSSO
digitalWrite (led3R, HIGH);
delay (velo2);

//ACCENSIONE LED 4 ROSSO
digitalWrite (led4R, HIGH);

  //LED 3 RGB
  digitalWrite (led3R, HIGH);
  digitalWrite (led3G, HIGH);
  digitalWrite (led3B, HIGH);
  delay (velo2);

    //LED 4 RGB
    digitalWrite (led4R, HIGH);
    digitalWrite (led4G, HIGH);
    digitalWrite (led4B, HIGH);


//ACCENSIONE LED 5 ROSSO
digitalWrite (led5R, HIGH);
delay (velo2);

//ACCENSIONE LED 6 ROSSO
digitalWrite (led6R, HIGH);

  //LED 5 RGB
  digitalWrite (led5R, HIGH);
  digitalWrite (led5G, HIGH);
  digitalWrite (led5B, HIGH);
  delay (velo2);
  
    //LED 6 RGB
    digitalWrite (led6R, HIGH);
    digitalWrite (led6G, HIGH);
    digitalWrite (led6B, HIGH);
    
//ACCENSIONE LED 7 ROSSO
digitalWrite (led7R, HIGH);
delay (velo2);

//ACCENSIONE LED 8 ROSSO
digitalWrite (led8R, HIGH);

  //LED 7 RGB
  digitalWrite (led7R, HIGH);
  digitalWrite (led7G, HIGH);
  digitalWrite (led7B, HIGH);
  delay (velo2);
  
    //LED 8 RGB
    digitalWrite (led8R, HIGH);
    digitalWrite (led8G, HIGH);
    digitalWrite (led8B, HIGH);




}

EDIT by mod:
per favore usa il tag CODE apposito per includere del codice

E' sicuramente la strada sbagliata :wink:
Ad esempio, tu per i led usi i pin dall'1 al 24...

void setup() {
  for (byte temp = 1; temp < 25; temp++) {
    pinMode(temp, OUTPUT);
  }
}

ecc...

Non vorrei approffittare troppo :slight_smile:
mi potresti creare un codice piu' completo cosi' me lo studio per benino.. :astonished:

Grazie mille!

Sarebbe bene che ci arrivassi da solo, altrimenti serve a poco :wink:

Ti do alcune dritte. Io al tuo posto userei un paio di variabili: nella prima ci metterei il valore del led precedentemente acceso, nella seconda il led che sto accendendo.
Accendo il led e spengo il precedente. Questo crea l'effetto del led che scorre.

Controlla quando arrivi ai margini, nel caso inverti la direzione di accensione.

ok, ci provo.
grazie

Allora incomincia a non usare questo modo di scelta delle variabili

int led1R=1, led1G=2, led1B= 3;
int led2R=4, led2G=5, led2B=6;
int led3R=7, led3G=8, led3B= 9;
int led4R=10, led4G=11, led4B=12;
int led5R=13, led5G=14, led5B= 15;
int led6R=16, led6G=17, led6B=18;
int led7R=19, led7G=20, led7B= 21;
int led8R=22, led8G=23, led8B=24;

ma

byte LEDRosso[] = {1, 4, 7, 10, 13, 16, 19, 22};
byte LEDVerde[] = {2, 5, 8, ...};
byte LEDBlu[] = {3, 6, 9, ...};

cosí puoi lavorare con un indice di un array senza dover scrivere ogni LED singolarmente.

Ciao Uwe

Gtazie x la dritta!
Per la dichiarazione delle variabili ho capito che:

1.Creare un array e' molto piu' comodo che la dichiarazione singola
2.Nel mio caso, posso utilizzare la variabile di tipo BYTE e non INT xche' occupa meno memoria.

Per il Setup ed il loop:

  1. Conviene utilizzare la struttura FOR, evitando cosi' di scrIvere papiri (ed errori) infiniti....

Si
Puo'
Faaree!(?)

imho:
Gtazie x la dritta!
Per la dichiarazione delle variabili ho capito che:

1.Creare un array e' molto piu' comodo che la dichiarazione singola
2.Nel mio caso, posso utilizzare la variabile di tipo BYTE e non INT xche' occupa meno memoria.

Per il Setup ed il loop:

  1. Conviene utilizzare la struttura FOR, evitando cosi' di scrIvere papiri (ed errori) infiniti....

Si
Puo'
Faaree!(?)

sí, si puó fare!!!

Ciao a tutti!
Mi auguro che lo sketch fino a qua sia abbastanza corretto... :zipper_mouth_face:

Il rosso scorre nei 4 led rgb, a questo punto lo dovrebbe seguire a ruota il verde e dopo il blu...ma come si fa?

byte LEDRosso[] ={1,4,7,10};
byte LEDVerde[] ={ 2,5,8,11};
byte LEDBlu[] ={3,6,9,12};
byte count1=0;
byte count2=0;
byte count3=0;
int time = 500;

void setup (){
  for (count1=0;count1<4;count1++) {
    pinMode(LEDRosso[count1], OUTPUT);
 }   
  for (count2=0;count2<4;count2++) {
    pinMode(LEDVerde[count2], OUTPUT);
 }   
  for (count3=0;count3<4;count3++) {
    pinMode(LEDBlu[count3], OUTPUT);
}


}

void loop(){
 for (count1=0;count1<4;count1++) {
   digitalWrite(LEDRosso [count1], HIGH);
   delay(time);
   digitalWrite(LEDRosso[count1], LOW);



}


}

cavoli, mi sono incartato...non riesco andare avanti... =(

A me viene in mente un metodo.
Usi un array e ci memorizzi la posizione di ognuno dei led interessati allo scorrimento.
Esempio: nel 1° elemento ci metti la posizione del led rosso; nel 2° quella del led verde; nel 3° quella del led blu.
Ad ogni ciclo sposti virtualmente i led aggiornando le posizioni in questo array.
Terminati gli aggiornamenti, alla fine del ciclo, aggiorni la posizione reale dei led spengendo tutti i led e poi accendendo il led rosso nella posizione indicata dal 1° elemento dell'array, il led verde secondo la posizione letta dal 2° elemento dell'array ecc...

grazie, ho usato il tuo metodo e devo dire che funziona. Continuero' con la sperimentazione con i led creando altri giochi di luce, quindi....abbiate pazienza se vi rompo ancora!

imho:
grazie, ho usato il tuo metodo e devo dire che funziona.

Mi fa piacere. Ricorda comunque che in programmazione non esiste un unico modo per fare una cosa. Ce ne sono diversi: uno può essere più complicato ma più veloce, un altro più semplice ma più lento, uno che sia una via di mezzo di entrambi ecc. Va scelto possibilmente quello che ha il giusto connubio fra pesantezza e prestazioni.

Continuero' con la sperimentazione con i led creando altri giochi di luce, quindi....abbiate pazienza se vi rompo ancora!

Siamo qui :wink: