Go Down

Topic: led rgb che (dovrebbero) scorrere (Read 2039 times) previous topic - next topic

imho

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.



imho


uwefed

#2
Feb 14, 2013, 01:04 am Last Edit: Feb 14, 2013, 01:07 am by uwefed Reason: 1
Che frettoloso, ci dai neanche 4 ore per rispondere?  ;) ;) ;)

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 http://code.google.com/p/fastspi/ 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

imho

Ciao e scusa per la fretta!! :smiley-fat:

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

uwefed

#4
Feb 14, 2013, 08:27 am Last Edit: Feb 14, 2013, 08:38 am by uwefed Reason: 1
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


imho

#5
Feb 14, 2013, 08:37 am Last Edit: Feb 14, 2013, 09:34 am by leo72 Reason: 1
Il mio problema è lo sketch, solo per far scorrere il rosso ho scritto un papiro, credo di non essere sulla trada giusta.... :~

Code: [Select]

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

leo72

E' sicuramente la strada sbagliata  ;)
Ad esempio, tu per i led usi i pin dall'1 al 24...
Code: [Select]
void setup() {
  for (byte temp = 1; temp < 25; temp++) {
    pinMode(temp, OUTPUT);
  }
}


ecc...

imho

Non vorrei approffittare troppo ^_^
mi potresti creare un codice piu' completo cosi' me lo studio per benino.. :smiley-eek:

Grazie mille!

leo72

Sarebbe bene che ci arrivassi da solo, altrimenti serve a poco  ;)

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.


 
 


uwefed

Allora incomincia a non usare questo modo di scelta delle variabili
Code: [Select]
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
Code: [Select]
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

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!(?)


uwefed


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!!!

imho

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

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?




Code: [Select]
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);



}


}

imho

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

Go Up