Protocollo giochi di luce rgb

Come da titolo sto pensando ad un protocollo dati che una volta eseguito dia vita ad un gioco di luce rgb e mi chiedo se c'è già qualche libreria in circolazione.

I protocolli conosciuti quali DMX, OSC ecc non mi sembrano adatti a quello che voglio ottenere, infatti io voglio spedire tot byte che una volta immagazzinati in ram vengono eseguiti dando vita ad un gioco di luci rgb.

Per esempio voglio che l'intensità da un valore di partenza arrivi ad un valore di destinazione nel tempo T con curva C, la curva potrebbe essere lineare, log, parabolica, sinusoidale ecc.

Inoltre voglio un comando goto e/o for che mi permette di ciclare n volte.

Per adesso o scritto qualcosa sul comando goto (simil for) Il comando "g" ha 2 varianti: g[iiii], dove iiii è l'indice numerico a cui saltare g[nnn]n[iiii], dove nnn è il numero di ripetizioni (max 255) e iiii è l'indice numerico a cui saltare Non sono permessi salti in avanti rispetto all'indice corrente.

Non ho avuto tempo di documentarmi sul lab color space che a quanto sembra ha dei vantaggi, che ne dite voi? ne sapete qualcosa?

Ciao.

Io ho fatto, come ti ricorderai, una lampada RGB con diversi giochi di luce (sul mio sito c'è il progetto completo). Però mi sono scritto una routine per farli, non ho usato nulla di pronto. A dire il vero non ho neanche guardato se qualcun altro aveva realizzato qualcosa... La gestione dei giochi era una catena di switch..case, alcuni anche annidati (a seconda dello schema da riprodurre).

Mi ero dimenticato della tua lampada RGB, ora ho dato uno sguardo al codice e le funzionalità sono simili ai controller per strisce led, dove i giochi sono predefiniti. Io penso sia possibile scrivere una applicazione embedded che permetta di creare nuovi giochi luce semplicemente spedendo via seriale tot byte es 1024 senza però descrivere le triplette RGB per ogni variazione, che comporterebbe un impiego di spazio dati molto superiore a 1024 byte.

Ci sono alcuni punti che non mi risultano lampanti e che richiedono studio e approfondimento: 1) Standard CIELAB, specifico due colori e un valore di brillanza, ottimo dal marrone scuro passo al marrone chiaro solo variando la brillanza, cosi per tutti gli altri colori. 2) Variazioni delle tre grandezze (sia per rgb che CIELAB) legate ad un funzione matematica che è vagamente simile alla grafica vettoriale dove non vengono memorizzati i pixel ma il metodo per ricreare la figura. 3) Ricordo una libreria interessante che implementa anche lo standard CIELAB, oltre a RGB 8 bit e più, ma devo ritrovarla.

Sicuramente il 328 ha il limite di memoria ma penso che il solo standard RGB più il parser e un algoritmo di fading lineare si possono realizzare.

Ci sono altre strade anche più semplici, come eeprom esterna su cui salvare tutte le varianti rgb punto per punto, ma mi affascina la strada più difficile. :P

Ciao, grazie sempre per i tuoi interventi.

Sì, sono schemi predefiniti. Però non penso che sia un grosso problema inventarsi un “linguaggio” per programmare i giochi.
Ad esempio, potresti inventarti il “comando” che fa il passaggio da uno stato ad un altro in un certo intervallo di tempo. Per capirsi, mettiamo che vuoi passare dalla condizione RGB 0,0,0 alla condizione RGB 200,200,200 in 60 secondi. Invierari questo “comando”, poi la tripletta iniziale, la tripletta finale ed il tempo di transizione, lasciando al programma il compito di calcolarsi i valori intermedi.

E’ un esempio, ma sicuramente hai capito il concetto :wink:
Bastano pochi comandi per creare un sacco di effetti.

Bastano pochi comandi per creare un sacco di effetti.

Infatti è proprio questo il motivo che mi ha spinto a ragionarci su.

A livello teorico sto studiando il protocollo al fine di semplificare il più possibile il parser e renderlo meno fallibile. Mi passa per la testa la possibilità di creare delle funzioni i cui puntatori sono dentro un array il cui indice corrisponde al codice ascii del codice scelto per il comando, questo però mi obbliga ad usare codici di comando sequenziali, esempio parto da 10 e termino con 20 per avere 10 comandi. Il vantaggio è che il parser si limita a chiamare una funzione in un modo simile a: ptrFunction[codiceComando-10]() evitando la confusione degli if o switch case e confinando il codice in moduli per ogni comando.

Per le funzioni C che creano giochi legate da funzioni matematiche (es parabola, sinusoide ecc) non ho ancora una soluzione, ma ho solo come obbiettivo la genericità. Proprio in questo momento sto pensando che ci vuole un comando "esegui", potrebbe per semplicità essere un ritorno carrello '\n'.

mmmmm... mi chiedo se il GCODE potrebbe essere usato, conviene? quanto è oneroso?

PS: Ben tornato ad astrobeed.

Ciao.

Ma per cosa useresti il gcode ? Per spostare il vettore colore nello spazio cielab ? Comunque google "dice" che cielab è solo un metodo per definire in modo preciso i colori...magari ti conviene fare delle funzioni che diano vita a giochi di luce come tu stai facendo senza complicarti la vita con la precisione. Anche solo una funzione che implementa colori random lineari é davvero carina anche solo implementare cose strane su quella forma può avere tanti utilizzi. Mi piace l idea però del protocollo ;)

x iscrizione

Comunque google "dice" che cielab è solo un metodo per definire in modo preciso i colori

In effetti il CIELAB l'ho nominato perché c'è una lib arduino già pronta: https://github.com/TrippyLighting/HPRGB2 e ho scoperto che basta specificare due colori e un valore di brillanza, il terzo colore viene individuato dalla librerie in modo automatico.

Ma per cosa useresti il gcode ?

Ho un ricordo vago di gcode e mi sembra ci sia la possibilità di specificare pochi parametri per disegnare le figure geometriche di base, quindi più che altro per prendere spunto dal protocollo gcode, non per usarlo direttamente così com'è.

Ho qualche difficoltà a pensare ad una funzione che faccia variare es R (o altro colore) per descrivere una sinusoide, parabola, dente di sega onda quadra ecc. mmmm l'onda quadra è uno accendi spegni e se faccio variare il dc ancora meglio, poi potrei assegnare un colore al fronte di salita e uno diverso a quello in discesa, risultato passa da un colore all'altro senza fading.

Ok la fantasia c'è, ma partiamo con qualcosa di semplice e realizzabile in tempi brevi.

Quindi solo funzioni lineari su un colore per volta.

Ciao.

Non conosco il GCode quindi non so aiutarti in questo.

Però per generare segnali a dente di sega o triangolari non è difficile, serve però modificare i timer affinché generino i giusti impulsi sui pin. Stessa cosa per l'onda sinusoidale, che comunque non è una versa sinusoide perché non hai valori negativi: nel tuo caso sarebbe più una sequenza di parabole ascendenti e discendenti, anche qui livellate dall'RC. Poi, e qui non so come implementi la cosa quindi potrebbe non servirti, puoi aggiungere un filtro RC per "simulare" l'uscita analogica. Oppure potresti far passare l'uscita PWM da un op-amp e così ottenere un vero segnale analogico, che poi usi per pilotare i driver dei led.

No leo, c'è fraintendimento, provo a spiegare meglio.

Se vuoi disegnare un cerchio puoi: 1) Specificare punto per punto le coordinate 2) specificare le coordinate del centro e fornire il raggio

Nel secondo caso il programma sa come tracciare un cerchio da due dati. Quando parlo di sinusoidi indento grandezze (numeri) che variano secondo la funzione matematica che traccia una sinusoide. Esempio dal protocollo specifico che la funzione da chiamare è sin e la grandezza è R, il programma farà variare R con andamento sinusoidale (o altra funzione scelta), quindi R partirà da 0 per raggiungere 255 nel tempo dipendente dal periodo specificato, per poi ridiscendere a zero impiegando lo stesso tempo, ripetendo n cicli.

Quindi il programma conoscendo il numero di cicli, periodo e il colore, sa come tracciare una sinusoide o altra forma d'onda. Nel caso della onda quadra nel protocollo specifico che la funzione è square che il periodo è .... ecc e il programma sa cosa fare.

Esempio di protocollo che chiama una funzione: f(sin(25,12, G)) G varia con andamento sinusoidale alla frequenza di 25Hz per 12 cicli f(square(25, 50, R,G)) R è il fronte di salita della onda e dura 1/25Hz, G è il fronte di discesa stessa durata perché 50 è il duty cicle. Il codice 'f' viene interpretato come una chiamata a funzione specificata (square, sin ecc) passando tutti i valori specificati. Il nome della funzione in realtà è un byte il cui codice ascii viene usato come indice di un array di puntatori a funzione.

Mi sa tanto di linguaggio di programmazione interpretato dedicato ad una specifica applicazione.

Ciao.

Mi lascia molto perplesso l uso della libreria...cos è la brillanza ? E se il

MauroTec: e ho scoperto che basta specificare due colori e un valore di brillanza, il terzo colore viene individuato dalla librerie in modo automatico.

Non capisco tutte le complicazioni, visto che deve essere una comunicazione potresti usare o la seriale ma poi fare il parsing delle tue funzioni, oppure usare un qualcosa del tipo i2c che vai a scrivere direttamente nei registri e quando conclude la comunicazione lo esegue...

Ma soprattutto, non capisco come fai a disegnare un cerchio con una striscia rgb, non capisco cosa vuoi fare.

Mi lascia molto perplesso l uso della libreria...cos è la brillanza ?

Luminosità, se hai un sistema operativo linux con kde apri il color choser e vedi che puoi settare i colori in RGB e in CIELAB.

Non capisco tutte le complicazioni, visto che deve essere una comunicazione potresti usare o la seriale ma poi fare il parsing delle tue funzioni, oppure usare un qualcosa del tipo i2c che vai a scrivere direttamente nei registri e quando conclude la comunicazione lo esegue...

Esatto, facile non è specie il parser. Comunque il post precedente era in risposta a leo che aveva capito che volessi fare uscire una sinusoide o altra onda dai pin di arduino, e allora gli ho fatto l'esempio del cerchio in bitmap e del cerchio vettoriale per fare capire che non voglio specificare tutti i colori RGB.

Ma soprattutto, non capisco come fai a disegnare un cerchio con una striscia rgb, non capisco cosa vuoi fare.

Non voglio disegnare un cerchio, anche se è possibile, ma lo è nello spazio di colori. es se scegliamo nello spazio di colori un punto centrale e forniamo il raggio, il programma accenderà il colore che dista r dal centro, tracciando un cerchio nello spazio dei colori, quindi la striscia assumerà i vari colori.

Ciao.