TODOPIC
Mecatrónica => DMX512 - Diseños y Proyectos => Mensaje iniciado por: Chipcon en 02 de Junio de 2011, 17:01:33
-
Hola que tal foreros espero me ayuden a encontrar la solución a mi problema:
Estoy realizando un controlador de 8 salidas para leds strips,hasta el momento no tenia ningún problema pero,al momento de realizar
la librería, es decir los efectos que va a realizar el controlador me tope con el efecto llamado RAINBOW.
Aqui dejo el link de como es el efecto.
No tengo problema con el corrimiento del color pero no logro dar ese suavizado es decir;
degradar el color
Entonces mi pregunta es alguno tiene cualquier idea de como se puede realizar???
Cualquier sugerencia es bienvenida.. gracias
Este es mi código para realizar el efecto pero el corrimiento del color es abrupto.
// Efecto rainbow en las 8 salidas
void Rainbow (unsigned char vel,unsigned char bri,unsigned char Sen)
{
unsigned char a;
static unsigned int Time,Comp;
static unsigned char Paso;
if (vel > 200) // Genera algoritmo de tiempo?
Comp = ((int)vel*4); // Multiplica y obtiene hasta 1 segundo de retardo
else
Comp = vel; // En caso contrario toma el valor actual
Time ++;
if (Time >= Comp) // Cumple retardo de efecto
{
Time = 0;
for (a = 0;a <= 23;a ++) // USO UNA TABLA PARA CARGAR LOS COLORES EN 8 SALIDAS ES DECIR (RGB1)....(RGB8)
RGB[a] = RAIN[Paso][a]; // Genera color rainbow
Paso ++;
if (Paso > 7)
Paso = 0;
}
Colores (24); // Envia informacion a cpld
}
-
ME PARECE QUE ESO ESTA HECHO CON PWM Y VA AUMENTANDO O DISMIYUNEDO GRADUALMENTE PARA DAR ESE EFECTO
-
Exactamente, en la descripción dice:
6 bit PWM, 27 channels driving 9 RGB LEDs using a PIC 16F88 at 8Mhz
-
Exactamente, en la descripción dice:
6 bit PWM, 27 channels driving 9 RGB LEDs using a PIC 16F88 at 8Mhz
no lei la descripcion, solo vi el video.
entonces tu como quieres regular la intensidad de tus leds?, al parecer no usas pwm, o no lo veo en tu codigo. explica mas o menos como lo haces tu para ayudarte
-
Eso es correcto no utilizo el pwm, es un poco difícil de explicar pero voy a resumir, yo utilizo un micro para poder procesar los datos DMX,asignar dirección etc. etc.
veras el controlador toma un máximo de 24 canales para obtener hasta 8 salidas.
La forma de generar el pwm de los leds es con un cpld,entonces lo que mi micro hace es procesar y enviar hasta 24 bytes a un cpld.
Lo que necesito es hacer el efecto rainbow pero desde "software".
Yo hice una tabla que es la siguiente:
// Tabla para generar efecto rainbow / / / / / / /
const unsigned char RAIN[8][24] = {{0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff},
{0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff},
{0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff},
{0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff},
{0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00},
{0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00},
{0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00},
{0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00}};
La funcion realiza lo siguiente:
// Efecto rainbow en las 8 salidas
void Rainbow (unsigned char vel,unsigned char bri,unsigned char Sen)
{
unsigned char a,b;
static unsigned int Time,Comp;
static unsigned char Paso;
static unsigned char Brillo = 255;
static bit Toggle;
if (vel > 200) // Genera algoritmo de tiempo?
Comp = ((int)vel*4); // Multiplica y obtiene hasta 1 segundo de retardo
else
Comp = vel; // En caso contrario toma el valor actual
Time ++; // Contador de tiempo activo
if (Time >= Comp) // Cumple tiempo de seleccion
{
Time = 0;
for (a = 0;a <= 23;a ++)
RGB[a] = RAIN[Paso][a]; // Genera color rainbow
Paso ++;
if (Paso > 7)
Paso = 0;
Colores (24); // Envia informacion a cpld
}
}
Cada que cumple el retardo requerido entonces se incrementa el indice paso y se obtiene un nuevo valor en los 24 bytes es decir, el desplazamiento del color pero ahora requiero
por el momento los cambios son inmediatos es decir no se ve esa suavidad entre colores.
ya estuve analizando y parece que cada color se va degradando y a su vez empieza a tomar el color anterior y así sucesivamente.
esa es la parte que me interesa resolver
Gracias
-
Si explicara mejor como quiere hacer el efecto se te comprendera mejor, si usa DMX en este caso las señales te varian de 0 a 255, y para tu lograr variaciones que me imagino tu quiere hacer que los colores cambien en todas sus gamas, pues para eso no podra usar 24Byte, ya que la tabla como te da cuenta , cambia el o los colores a salto, por ejemplo aqui la primera linea
0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff},
aqui empieza maximo de color luego baja(0x00,0x00) aqui sube 0x80 en 40% y asi sucesivamente, osea si quiere hacer mas variacion suave debe cambiar aqui y los tiempos .
-
Saludos STK500 te comento mi micro controlador procesa la cadena DMX, el controlador que estoy diseñando tiene 8 salidas en grupos de 3 es decir (RGB1)(RGB2)....(RGB8).
por esa razón son 24 bytes,efectivamente cada byte tiene valores de 0-255,por otro lado el efecto es llamado por la librería que estoy implementando.
Por ejemplo un LEDPAR 64 de una marca x puede manejarse con 6 canales dmx. digamos canal 1 (R),canal 2(G) ,canal 3(B) ,canal 4(Dimmer),canal 5 (strobe/shutter) y finalmente canal 6(libreria).
La librería puede estar formada por varios efectos por ejem.
canal 6 0-31 nothing
canal 6 32-63 colormix
canal 6 64-95 fade in
canal 6 96-127 rainbow.
Entonces lo que se hace es jugar con los efectos dependiendo el valor de un canal dmx asignado para este ejemplo es el (6).
Olvidando el tema de como genero el periodo pwm de las salidas,tratare de explicar nuevamente.
La tabla que tengo arriba tiene 24 bytes que al cargase estos datos a las salidas rgb producen los colores del arcoiris rojo,naranja,amarillo,verde,azul,indigo,violeta pero como tengo 8 salidas al ultimo
le cargo un color magenta solo para que este prendida.
La variable (paso) sirve para realizar el corrimiento de colores.
Pero es aquí la parte de las sugerencias veras cada el contador paso se incrementa se desplaza el color pero de forma abrupta pues se debe ir degradando el color y a su vez incrementando el color anterior para que se vea el efecto en el video que les mostre.
saludos
-
Yo hice un efecto parecido con 3 leds RGB con 9 PWM al comienzo me salió que los colores cambiaban muy rápido a pesar que era que el PWM varia de 0 a 1000.
Con un retardo de 1ms en cada paso ahí se notaba el cambio de colores muy bien una función para cada color.
Ahora quería mejorar el efecto porque voy desde luz apagado al máximo de apagar de nueva lentamente con una formula lineal sale bien pero brilla mucho al inicio y quería una formula parecida a una campana de gauss así que prende suavemente y el punto mas brillante dura un poco más el efecto es mejor para la combinación de colores mejor resultado.
Use un microcontrolador con 9PWM por hardware asi que le podia agregar funciones extras como efectos por frecuencia de sonido y ritmo.
-
yo de C no Se , lo mio es mas a AVRBascom, pero hay cosas que no comprendo de tu explicacion, tambien me esta comentando de un LEDPAR-64 (Receptor) estos ya vienen ajustados para sus efectos, lo que no es profesional, ya que los efectos lo hace el Controllador COMANDO (DMX512 Transmiter) que este lleva todos su efectos( Delay,contador,Strobo,Secuencias y muchos mas)ahora
por lo que creo tu tiene es PLC y veo que pone un Codigo donde estan un Algorimos y es ahi donde estan todos los efectos que te explico ahi arriba, y como dice nuestros amigos Cristian, para que los efectos sean suave debe poner retardos, yo tengo un projectos por ahi, hechos en AVRBascom que es un Arcoiris, aun no lo tengo pulido,porque lo quiero montar en una Lampara tipo Lunas, lo que me interesa saber es como comanda en realidad cada canale, porque cada canales debe tener un Fader(dimmer) con un tiempo preprogramado para tu poder lograr los efectos, o hacer exterior para trabajar con el tiempo, asi lo puede ajustar a diferente gustos.
yo siendo tu trabajaria con el Algorimos de las DATA, pero 24 byte lo veo muy pobre para conseguir ajuste largo y suave, debe pensar que el dmx512 trabaja con dusty de 0 a 255 y es aqui donde deberia trabajar con esta variable para cada canales.
-
gracias por sus respuestas y efectivamente lo que quiero es un algoritmo como el que comenta el amigo cristian pues parece que el efecto se logra
al tener un valor actual + un valor futuro con el cual se suma ó resta color hasta obtener el color deseado
en pocas palabras una función para la traslación de color.
Alguna idea de como implementarla en c??
-
Hola, por lo que veo en el video, nunca generan el "blanco", es decir, no encienden los 3 colores... yo pensaria como si fuesen 3 ondas desfasadas 120 (como en trifasica), donde el "cero" seria el valor 127 , y creo que los valores de encendidos, tendrian que ser "tablas" para linealizar o producir la campana de gauss...
Entonces, cada color, seria un contador, que se incrementa luego de un retardo, luego, conciderar que 360grados, corresponden a un valor de 255, para 120-->x, que seria el valor que tendrias que cargar al contador siguiente..., el tercer contador, comenzaria en 240grados..
Saludos!
Norberto
-
¡¡ eso, eso, eso, eso es TODOPIC :P !! :P :mrgreen:
Muchas gracias Norberto mira te comento que si efectivamente algo ya había platicado con un compañero de trabajo sobre la forma del degradado.
También te informo que hice algo parecido al efecto incrementando cada grupo RGB al color futuro y decrementando el color actual de cada grupo RGB.
y aun cuando se obtiene el suavizado no obtuve el mismo resultado que del video.
Nuevamente te agradezco la respuesta y en cuanto aplique tu técnica subo los resultados
Saludos Cordiales
-
Bueno después de corregir el programa parece que obtuve el efecto deseado y les doy las gracias a los compañeros con sus
comentarios.
Les dejo un pequeño video de lo que hace este controlador de 8 salidas para dmx.
Actualmente estoy terminando el software por eso es una telaraña de cables.
Saludos Cordiales
-
Felicitaciones Chipcon, se ven mejor que el video original!!!, lograste muy buenos efectos!! :-/
-
:mrgreen: Gracias por su apoyo ya que todo estuvo en la idea que me proporcionaron.
Desafortunadamente el desarrollo es para mi empresa por tal motivo no subo informacion del controlador.
Pero dejenme revisar y me voy a poner a manos con un proyectito completo de otro fixture DMX.
para toda la comunidad apasionada jejeje
¡¡Saludos Cordiales!!
-
me voy a poner a manos con un proyectito completo de otro fixture DMX.
para toda la comunidad apasionada jejeje
estaremos atentos al proyecto!!! :-/