Colore random su RGB, "carino"

Ciao, per un progetto a cui sto lavorando vorrei ottenere un colore random da un led rgb, ma deve essere un colore carino. Difficile a spiegarsi ma noto che dal random ottengo sempre colori molto chiari, che raramente hanno prevalenza di uno dei 3 colori RGB.

Anche con una chiamata di questo tipo

red=random(20,150);
green=random(20,150);
blue=random(20,150);

cercando di limitare il campo dei colori + chiari non ottengo risultati interessanti. Dovrei forse ragionare in base ad altri casi? che so, se il rosso esce cosi, allora il campo degli altri due mettilo cola', o che??

Qualche idea?

Grazie, F

Federico: ma deve essere un colore carino.

Prima di tutto devi spiegare cosa intendi con "colore carino" :) La funzione random di Arduino è tutto meno che un vero random, prima vediamo di capire cosa vuoi ottenere esattamente e poi troviamo la necessaria funzione matematica.

e se definissi una serie di costanti (che equivalgono ai colori che vuoi suddivisi in terzine)? n1,n2,n3,n4,n5,n6,n7,n8,n9,n10...nn ----1°---|----2°---|----3°---|---- ---n---|

es.

const int Color[9]={121,32,56,11,143,23,54,78,43};//ogni 3 valori equivale ad una terzina (rgb)

//nel loop

int a = random(3) rgb(Color[(a*3)-2],Color[(a*3)-1],Color[a*3]);

Ecco dunque, preferirei non definire dei colori io perche' vorrei che fossero casuali. Con carino intendo.. EHM... piacevoli alla vista? :-D Cerco di spiegarmi meglio, vengono quasi tutti molto chiari come colori, come se la possibilita' che esca che so un 200 180 0 sia proprio rara. Ho un video ma non so se si capisce qualcosa...

http://www.youtube.com/watch?v=hE8_DGgu96I

o sembra una cosa decorosa e sono io che ho la paranoia?

F

Federico: Ecco dunque, preferirei non definire dei colori io perche' vorrei che fossero casuali. Con carino intendo.. EHM... piacevoli alla vista? :-D

La soluzione è semplice, prima ti trovi sperimentalmente tot combinazioni RGB che ti piacciono, le codifichi dentro un matrice e poi estrai random le locazioni della matrice, in questo modo sei sicuro di ottenere sempre un colore piacevole.

a caso? il fatto è che non sono infinite le combinazioni 255valori per 3led. tanto vale prevedere i colori belli. li definisci come suggerisce Marbi o in altro modo e li scegli a caso. per il caso puoi usare millis() facci fare un conto, o se cerchi cè in giro , il vero random per il C. ciao

stefanosky:

a caso? il fatto è che non sono infinite le combinazioni 255valori per 3led.
tanto vale prevedere i colori belli.

penso che il gusto sia totalmente differente da persona a persona, quindi astrobeed ti sta dando una gran mano tentando di farti ragionare a capire questo concetto… io userei un’array di colori che mi piacciono (255^3-Colorichetipiacciono), e non sono pochi

per il caso puoi usare millis() facci fare un conto, o se cerchi cè in giro , il vero random per il C.
ciao

se questo rgb deve fare soltanto questo perchè non usare un delay (elimini molto codice)

perchè non provi a fare una lettura su 3 pin analogici e dirottarli con dei valori tra 0 e 255 al PWM dei led RGB? Come penso tu sappia arduino ha anche ingressi analogici , puoi fare 3 letture su 3 pin analogici e inviarne le uscite ( forzate a valore comrpeso tra 0 e 255 ) a R ,G e B...dovrebbe funzionare.. io l'ho provato per pilotare 3 led per generare l'effetto fuoco ( quello del presepio) , nulla toglie che puoi lavorare con led Rossi, verdi e blu.

così sei piuttosto sicuro che il valore ( fortemente influenzato dal calore) sia veramente Random...

max996duino

tempo fa avevo scritto uno sketch per far variare i colori di una strip led rgb con un solo potenziometro...quindi volendo con una qualsiasi variabile, dai un occhio qui: http://cinquetau.altervista.org/blog/2010/04/24/mixing-rgb/

generando un numero da 0 e 1535 potresti generare automaticamente una combinazione senza salvare array con le 3 combinazioni di colori.

del codice non mi ricordo più molto però se pensi che possa tornarti utile, magari gli ridò un'occhiata così lo miglioro!

ciao Federico

secondo me, il colore piú "figo" per l'orologio Nixi-Tube é un bel blu.

Per avere delle combinazioni piacevoli di colore secondo me l'unica via sicura é avere una tabella colore a 3 combinazioni RGB e prendere una combinazione alla volta in modo casuale.

L' altra possibilitá é definire un colore principale con un valore PWM alto e aggiungere poco degli altri due.

Ho fatto anch io degli esperimenti a riguardo con dei pulsanti in silicone (Button pad http://www.sparkfun.com/products/7835). Visto che con quella gomma di silicone opaca si riesce ad avere dei colori bellissimi pastelli ho un po lasciato andare l' illuminazione con colori random (risoluzione 12bit col TLC4096 limitata a 9 bit perché senó troppo luminoso. Ognitanto mi veniva l' espressione: oooh, che bel colore.

Ciao Uwe

il vero random per il C.

Il vero random non esiste sul computer o (uC). Su iternet lo si puo’ trovare qui

Capisco quello che vuole dire Federico. In pratica ti ritrovi colori chiari perche’ vengono estratti numeri che non differiscono molto tra loro e sono tutti abbastanza alti. Se vuoi colori pastello o che si avvicinano a colori piu’ “definiti” e non biancastri, devi definire delle separazioni. Quindi, come dicevi, imporre che se esce un numero per il rosso, non puo’ uscire un numero che differisce di poco (dove quel “poco” lo definisci tu) da quello del rosso, per il verde e per il blu o solo per uno dei due.
Il fatto che si abbia questa tendenza all’“insipido”, secondo me, puo’ dipendere dal fatto che, appunto, la funzione random non e’… random.

EDIT:
mentre scrivevo ha postato Vanzati, mi riferivo al primo Federico :wink:

super è in breve il concetto che volevo esporre, hai fatto prima tu... segue

una domandona ai Big, ed utilizzando un doppio array?

non so nemmeno se si può fare, però per logica è fattibile tipo:

int Color[N][6] dove N è il numero dei colori da te scelti. ed ogni variabile Color ha 2 valori (minimi e massimi), quindi sarà FunzioneRGB(random(Color[N][1],Color[N][2]),random(Color[N][3],Color[N][4]),random(Color[N][5],Color[N][6]))

ed arrivo alla domandona ai Big:

si può fare? e se si, come assegno le variabili nelle dichiarazioni? per intenderci nella parte alta, sopra al void setup()

se i valori sono interi, cosi':

int mioArrayDiArray[2][2] = {{1, 10}, {100, 1000}};

ma non capisco che ci vuoi fare... Perche' dovrebbe essere utile? Cosa rappresenta quella N? Che intendi? :cold_sweat:

vediamo se riesco a farvi capire cosa mi gira in testa

Colore[N][6]

dove N sono le N combinazioni, mentre gli altri 6 array equivalgono a: 1. minimo red 2. massimo red 3. minimo verde 4. massimo verde 5. minimo blu 6. massimo blu

in questo modo puoi lavorare sui range per sfumare il colore che ti piace affinchè risulti sempre diverso ma di quella tonalità di colore

facciamo finta che i colori che ti interessino siano rgb(110,120,130) rgb(150,160,190)

e che tu decida di far uscillare di 10 unità in più (e 10 in meno) questo range, sarà quindi:

int Colore[2][6]={{100,120,110,130,120,140},{140,160,150,170,180,200}}

in questo modo posso richiamare la funzione rgb in questa maniera rgb(random(Colore[N][1],Colore[N][2]),random(Colore[N][3],Colore[N][4]),random(Colore[N][5],Colore[N][6]))

spero di essere stato chiaro ... spero!!! :disappointed_relieved:

superkulak:

il vero random per il C.

Il vero random non esiste sul computer o (uC). Su iternet lo si puo’ trovare qui

Capisco quello che vuole dire Federico. In pratica ti ritrovi colori chiari perche’ vengono estratti numeri che non differiscono molto tra loro e sono tutti abbastanza alti. Se vuoi colori pastello o che si avvicinano a colori piu’ “definiti” e non biancastri, devi definire delle separazioni. Quindi, come dicevi, imporre che se esce un numero per il rosso, non puo’ uscire un numero che differisce di poco (dove quel “poco” lo definisci tu) da quello del rosso, per il verde e per il blu o solo per uno dei due.
Il fatto che si abbia questa tendenza all’“insipido”, secondo me, puo’ dipendere dal fatto che, appunto, la funzione random non e’… random.

EDIT:
mentre scrivevo ha postato Vanzati, mi riferivo al primo Federico :wink:

Questo e’ il post che prende bene il concetto del mio pensiero. Provo a fare qualche esperimento aggiuntivo per vedere se ne viene fuori qualcosa di buono alla luce di tutte le proposte che avete fatto, altrimenti andro’ per la soluzione “colori predefiniti” anche se non mi attira molto l’idea.

ps:
Il blu mi rendo conto che sia un colore che sta bene coll’arancione dei nixie ma sono un po’ stufo di vedere tutto blu, inoltre sto cercando di mettere nel mio lavoro alcune particolarita’ (vorrei mettere ad esempio qualche animazione sui bulbi dei secondi, qualche modalita’ “nixie che non funziono bene” e colori che cambiano ad ogni ora) perche’ dopo tutto questo lavoro non vorrei che venisse fuori un prodotto software eccessivamente scontato e che qualcuno possa pensare che l’ho copiato…

[quote author=Federico Vanzati link=topic=62979.msg457059#msg457059 date=1307120752] tempo fa avevo scritto uno sketch per far variare i colori di una strip led rgb con un solo potenziometro...quindi volendo con una qualsiasi variabile, dai un occhio qui: http://cinquetau.altervista.org/blog/2010/04/24/mixing-rgb/

generando un numero da 0 e 1535 potresti generare automaticamente una combinazione senza salvare array con le 3 combinazioni di colori.

del codice non mi ricordo più molto però se pensi che possa tornarti utile, magari gli ridò un'occhiata così lo miglioro! [/quote]

Molto interessante. Per altro potrebbe tornarmi totalmente utile per un lavoro che devo fare sulla macchina di un amico (lo solita tamarrata)

Fede, se ti può interessare io ho sviluppato un piccolo PRNG (Pseudo-Random Number Generator) che genera numeri con una casualità superiore a quella del generatore random() precostituito del C. E' scritto in modo che all'avvio riceva dei seed di inizializzazione e poi memorizzi ogni tot tempo i seed nella EEPROM così che, anche andasse via la corrente, non ripartirebbe con la stessa sequenza come nel caso della random() dell'Arduino se non viene "seedata" con randomSeed.

Parlando dei colori, secondo me devi operare sulla base delle tonalità che i tuoi LED possono emettere, giocando con i colori primari e secondari e filtrando in anticipo possibili combinazioni "strane".

Inoltre voglio spendere i miei 2 cent parlando dell'abitudine di prelevare un valore casuale di inizializzazione leggendo da un pin analogico lasciato non connesso. In realtà tale pin NON dà mai una lettura perfettamente casuale ma contenuta sempre all'interno di un range, dipendente anche da quanta "ricezione" ha quel pin, nel senso se scollegato completamente, se con un pezzo di filo volante ecc... La cosa è facilmente verificabile creando un loop che legge dal pin e poi stampa su seriale il valore letto. Vedrete che tale valore oscilla brevemente all'inizio per poi attestarsi intorno ad un valore quasi fisso.

uwefed:
dei colori bellissimi pastelli ho un po lasciato andare l’ illuminazione con colori random (risoluzione 12bit col TLC4096 limitata a 9 bit perché senó troppo luminoso. Ognitanto mi veniva l’ espressione: oooh, che bel colore.

Uso quell’integrato sui led anche io!

superkulak: Il vero random non esiste sul computer o (uC). Su iternet lo si puo' trovare qui

Non è del tutto esatto, esistono diversi algoritmi che sono in grado di garantire una generazione casuale di numeri pressoché perfetta, cioè se analizzi un campione abbastanza grande i vari numeri generati copriranno tutto il range previsto e saranno usciti lo stesso numero di volte. Il problema è che questi algoritmi richiedono un seme generatore iniziale con cui iniziare la generazione dei valori, se il seme è uguale anche la serie generata è uguale, per ovviare si usano vari sistemi, p.e. si usa come seme un calcolo basato su data, ora e altri valori che cambiano costantemente su un computer.

Marbi: super è in breve il concetto che volevo esporre, hai fatto prima tu... segue una domandona ai Big, ed utilizzando un doppio array?

Quello che Tu esponi non é la stessa cosa che avevo propost? di seglere da una elenco di combinazione RGB una combinazione. Se in pratica si mette in un array o nel EEprom o nella Flash del ATmega é una scelta di programmazione e spazio.

superkulak: Il vero random non esiste sul computer o (uC). Su iternet lo si puo' trovare qui

Sono d' accordo che il vero random é difficile realizzare. La funzione random implementata in SW é una fila di numeri pseudocasuale ma fatta in modo di non ripetersi troppo frequentemente. Per avere 3 valori molto differenti per RGB si deve un po aiutare controllando una certa differenza dei valori. Ma questo non vuole dire che i colori risultanti siano piacevoli.

Ciao Uwe