TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Strepto en 16 de Junio de 2011, 10:57:29

Título: Control 28 Led RGB independientes
Publicado por: Strepto en 16 de Junio de 2011, 10:57:29
El fin de este proyecto, es iluminar de diferentes colores (alguno repetido seguro), 28 huecos del bar/pub/disco de un compañero. Estos colores se iran cambiando segun transcurra el tiempo, es decir, cada X tiempo se van cambiando los colores de 1 o 2 huecos. A parte tambien tengo intencion de añadir algun tipo de control para poder escojer que todos esten con el mismo color o incluso que haga algun efecto, pero eso al final.

Para este fin, lo logico seria utilizar varios TLC5940 para ese fin, pero los 28 leds no van a estar juntos con lo que decidi buscarle otra solucion y me encontre con el control del Leds RGB mediante PWM del compañero Nocturno y me parecio una genial idea. Con esta solucion, tendria 1 Maestro y 28 Esclavos (cada uno un led RGB).

Esta nueva solucion ahora plantea otro problema: ¿Que tipo de comunicacion utilizar para comunicar el master con los 28 esclavos? Pues viendo la de informacion que hay en este foro, solo tuve que navegar un rato para dar con dos soluciones sencillas:
1) Un bus 485, el master envia y los esclavos reciben.
2) DMX512, algo que ya he manejado puesto que trabajo en instalaciones de sistemas audiovisuales pero nunca he programado.

De las dos soluciones, seguramente me quedare con la primera, puesto que en el caso de necesitar una respuesta por parte del esclavo, la podria lograr.

Ahora viene lo interesante, pasos a seguir para conseguir llevar a buen puerto este proyecto:
1) Modificar el control del Leds RGB mediante PWM para que funcione con un Pic mas pequeño que el del ejemplo y entender su funcionamiento. - HECHO
2) Añadir una direccion a la subrutina para indentificar el destinatario del comando. - HECHO
3) Modificar y entender el protocolo de comunicacion de RS485 para funcionar con los Leds RGB.
4) Probar una comunicacion con diferentes esclavos que tengas diferentes direcciones.
5) ¿Se podria hacer que el master enviase un comando y que lo recibiesen todos? Mas que recibir, ¿al que obedecieran todos los esclavos?
6) Quitar el virtual terminal de master y crear uno para conseguir un control completo.
7) Implementar alguna funcion vistosa.



Programa del control de Led RGB mediante PWM practicamente como el de Nocturno:
Código: [Seleccionar]
#include <16F88.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
#use fast_io (B)

#byte TRISA = 0x85
#byte TRISB = 0x86
#byte PORTA = 0x05
#byte PORTB = 0x06

#bit  LedRojo        =     PORTA.0
#bit  LedVerde       =     PORTA.1
#bit  LedAzul        =     PORTA.2

char buffer[20];
int8 Rojo,Verde,Azul, Ticks, Midireccion;
int8 CaracteresRecibidos  = 0;
int1 ComandoRecibido;

#int_RDA
void  RDA_isr(void)
{
   char c;
   c=getc();
   putchar(c);
   buffer[CaracteresRecibidos] = c;
   if (c==13)
      ComandoRecibido=true;
   else
      CaracteresRecibidos = (CaracteresRecibidos+1) % sizeof(buffer);
}

#int_TIMER0
void  TIMER0_isr(void)
{
   Ticks++;

   if (Ticks==0) {
      LedAzul=1;
      LedRojo=1;
      LedVerde=1;
   };
   if (Ticks==Rojo)
         LedRojo=0;
   if (Ticks==Verde)
         LedVerde=0;
   if (Ticks==Azul)
         LedAzul=0;
   set_timer0(140);
}

void ProcesaRGB() {
   int8 i=0;
   int8 Direccion = 0;
   int1 CambiandoRojo, CambiandoVerde, CambiandoAzul, Miradireccion;

   CambiandoRojo=false;
   CambiandoVerde=false;
   CambiandoAzul=false;
   Miradireccion=false;

   while (i<CaracteresRecibidos) {
      if ((Buffer[i]=='d') || (Buffer[i]=='D')) {
         Miradireccion=true;
         CambiandoRojo=false;
         CambiandoVerde=false;
         CambiandoAzul=false;
         Direccion=0;
      }
      if (((Buffer[i]=='r') || (Buffer[i]=='R')) && (Midireccion == Direccion)){
         Miradireccion=false;
         CambiandoRojo=true;
         CambiandoVerde=false;
         CambiandoAzul=false;
         Rojo=0;
      }
      if (((Buffer[i]=='g') || (Buffer[i]=='G')) && (Midireccion == Direccion)) {
         Miradireccion=false;
         CambiandoRojo=false;
         CambiandoVerde=true;
         CambiandoAzul=false;
         Verde=0;
      }
      if (((Buffer[i]=='b') || (Buffer[i]=='B')) && (Midireccion == Direccion)) {
         Miradireccion=false;
         CambiandoRojo=false;
         CambiandoVerde=false;
         CambiandoAzul=true;
         Azul=0;
      }
      if ((Buffer[i]>='0') && (Buffer[i]<='9')) {
         if (Miradireccion)
            Direccion=Direccion*10+Buffer[i]-48;
         if (CambiandoRojo)                        
            Rojo=Rojo*10+Buffer[i]-48;
         if (CambiandoVerde)
            Verde=Verde*10+Buffer[i]-48;
         if (CambiandoAzul)
            Azul=Azul*10+Buffer[i]-48;  
      }
      i++;
   }
  
   printf ("Color establecido: Rojo = %u, Verde = %u, Azul = %u \n\r\n\r",Rojo,Verde,Azul);
   CaracteresRecibidos=0;
   ComandoRecibido=false;
}

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
  
   set_tris_a(0x00);
  
   Rojo=0;
   Verde=0;
   Azul=0;
   Ticks=0;
   Midireccion=5; // Direccion del dispositivo.
   ComandoRecibido=false;

   printf ("Jugando con LEDS RGB\n\r\n\r");

   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts (GLOBAL);

   while (1) {
      if (ComandoRecibido)
         ProcesaRGB();
   }
}

De momento no se me ocurre nada mas.

Se admiten todo tipo de sugerencias y preguntas.

Un saludo y espero que les guste!
Título: Re: Control 28 Led RGB independientes
Publicado por: stk500 en 16 de Junio de 2011, 11:55:45
claro que casa esclavo puede recibir el mismo comando o diferente comando, cada esclavo puede ponerle varios conmutadores para direcionarlos, es los mismo que el dmx512, las tramas del master puede se por Ejp.32 canales y los respectivos esclavos se activan segun como tenga sus direciones,
Saludos
 
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 16 de Junio de 2011, 11:58:58
claro que casa esclavo puede recibir el mismo comando o diferente comando, cada esclavo puede ponerle varios conmutadores para direcionarlos, es los mismo que el dmx512, las tramas del master puede se por Ejp.32 canales y los respectivos esclavos se activan segun como tenga sus direciones,
Saludos
 

En el DMX ya sabia, pero en el 485 no tenia ni idea, y como cada comunicacion es casi un mundo aparte, pues mejor preguntar, que encima ahora que se esto, ,en vez de mandar todas las direcciones, con mandar un comando que haga referencia a todos, como pueda ser una "T" sera mas que suficiente  :lol:

Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: tapi8 en 16 de Junio de 2011, 12:58:33
A cada LED le vas a poner un PIC esclavo?
No te iria bien si en una placa pones un PIC de 40 pines con un transistor para cada LED y por medio del transistor le envias la señal de PWM a cada LED?
Esta comunicacion tambien se podria hacer RS232, te da hasta 30m aprox. bueno no se como es de grande ni de ruidoso el pub (si pone bacalao y heavy necesitaras el 485 que es para ambientes industriales con mucho ruido :lol: :lol:).


Saludos
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 16 de Junio de 2011, 13:43:11
A cada LED le vas a poner un PIC esclavo?
No te iria bien si en una placa pones un PIC de 40 pines con un transistor para cada LED y por medio del transistor le envias la señal de PWM a cada LED?
Esta comunicacion tambien se podria hacer RS232, te da hasta 30m aprox. bueno no se como es de grande ni de ruidoso el pub (si pone bacalao y heavy necesitaras el 485 que es para ambientes industriales con mucho ruido :lol: :lol:).


Saludos

El problema, por lo que me ha comentado mi compañero es que los huecos a iluminar estan por todo el bar y no juntos, sino, como ya habia mencionado antes, habria usado el TLC5940 y con un PIC mas simple lo tendria mas que hecho, pero se agradece la sugerencia  :mrgreen:

Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: tapi8 en 16 de Junio de 2011, 15:25:49
Citar
El problema, por lo que me ha comentado mi compañero es que los huecos a iluminar estan por todo el bar y no juntos, sino, como ya habia mencionado antes, habria usado el TLC5940 y con un PIC mas simple lo tendria mas que hecho, pero se agradece la sugerencia 

Un saludo!

Ya pero los cables los tienes que llevar igual no? para un esclavo y el LED minimo tres cables, si envias el PWM ya hecho tienes que llevar 2, masa y el PWM por el +, o hay algun otro problema?
Título: Re: Control 28 Led RGB independientes
Publicado por: tannke en 16 de Junio de 2011, 15:35:01
Citar
El problema, por lo que me ha comentado mi compañero es que los huecos a iluminar estan por todo el bar y no juntos, sino, como ya habia mencionado antes, habria usado el TLC5940 y con un PIC mas simple lo tendria mas que hecho, pero se agradece la sugerencia  

Un saludo!

Ya pero los cables los tienes que llevar igual no? para un esclavo y el LED minimo tres cables, si envias el PWM ya hecho tienes que llevar 2, masa y el PWM por el +, o hay algun otro problema?

No se si estoy metiendo la pata, pero estamos hablando de leds RGB por lo que para cada led necesitamos 3 señales PWM mas la masa. Y a parte, si estos tienen que ser independientes ya no nos basta el pic que comentaban antes de 40 patas :P

un saludo.
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 16 de Junio de 2011, 16:59:20
Ya pero los cables los tienes que llevar igual no? para un esclavo y el LED minimo tres cables, si envias el PWM ya hecho tienes que llevar 2, masa y el PWM por el +, o hay algun otro problema?

Mi idea es, ya que en cada hueco habra un led RGB o 3 leds (rojo, verde, azul), no lo se como lo montara, con llevar la alimentacion y el bus, es mas que suficiente, puesto que los leds estaran practicamente al lado de la placa si no es que estan en la placa  :D

No se si estoy metiendo la pata, pero estamos hablando de leds RGB por lo que para cada led necesitamos 3 señales PWM mas la masa. Y a parte, si estos tienen que ser independientes ya no nos basta el pic que comentaban antes de 40 patas :P

un saludo.

Hombre, teniendo en cuenta que cada led RGB son 4 patas y son 28 huecos, habria que ingeniar algo para poder hacerlo con uno de 40 patas, pero el TLC5940 simplificaria mucho, aumque no es el caso por que como ya he comentado antes, los huecos a iluminar no estan del todo juntos.

Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: gera en 16 de Junio de 2011, 18:28:59
A mi me parece que lo que propones es la mejor solucion. Ademas es un diseño modular, lo que permite ampliaciones si fuera necesario en un futuro. Inclusive provee de cierta autonomia a los modulos esclavos, que podrian funcionar independientemente (sin una orden del maestro) en caso de ser necesario. El problema estaria en como alimentarias los modulos, probablemente tengas que hacer una pequeña fuente para cada uno. Hay formas de hacer mini fuentes sin transformador, pero hay q tener mucho cuidado.

Con respecto al protocolo, RS485 es una buena eleccion, pero arriba de eso tendrias q usar otro protocolo como modbus. Salvo que quieras programar uno propio.
Para mandar comandos a todos los esclavos podrias definir una direccion de broadcast, como en ethernet. Donde cada esclavo lee los paquetes con su direccion y la direccion de broadcast, de ese modo podrias mandar comandos a todos los esclavos de una sola vez.

Saludos!!
Título: Re: Control 28 Led RGB independientes
Publicado por: Chipcon en 16 de Junio de 2011, 19:28:51
Este tema es interesante y me uno a las sugerencias.

Buen el hecho es que utilizar el TLC5940 no es mala idea pero también requiere que la velocidad de GSCLK sea muy rápida pues genera 4096 pasos de intensidad un pic de la familia 16fxxx no es suficientemente rápido si ademas realiza otras tareas, por lo que tendrías que usar un 18fxxx.

Otra observación el hecho de generar 4096 intensidades es demasiado para una aplicación sencilla. que fácilmente puede generarse en 256 intensidades.
La utilización de RS-285 es la mas correcta y finalmente DMX-512 es simplemente utilizar la UART de un micro a una velocidad de 250Kb acoplada al bus RS-485 permitiendo conectar un n numero de esclavos,

Ahora bien si no quieres utilizar DMX-512 esta bien, pero es una forma muy sencilla de operación tu puedes configurar la UART a la velocidad que quieras. un ejemplo.
Si vas a controlar 10 huecos y todos son RGB entonces tu necesitas 30 bytes para la coloración de los 10 huecos, ahora bien puedes agregar una cabecera ó un (tiempo de espera) para sincronizar tus datos.
y manejar una velocidad de 9600 bds. sin necesidad de meterte en comparaciones,
Solo a cada esclavo le asignas una constante (dirección) y entonces el esclavo solo toma la parte que le corresponde de la cadena.

Esto que te permite que con una sola fuente colocada donde quieres puedas alimentar todos los huecos por que? bueno solo necesitarías 4 hilos para conectar todos los huecos
VCC
GND
Dato a
Dato b

Tu dispositivo maestro puede ser el primer hueco el resto esclavos sin la necesidad de colocar nada mas.
Te permitiría actualizar efectos sin la necesidad de agregar nada mas.
Si reflexionas un momento quizás se incremente el numero de micros pero con un pic 16f628 o alguno similar con UART tendrías el control de cada hueco y ademas un acabado mas profesional.
cada hueco se manejaría con 4 pines del micro RGB  + recepción UART, yo no utilizo CCS pero he leeido en el foro que tiene una librería para emular la UART en un micro que no la trae.
Dándote opciones para economizar mas tu proyecto.

Bueno finalmente solo es sugerencia y te dejo este video para que te deleites de lo que se puede hacer con muchos esclavos y un maestro que realiza efectos jejeje
Saludos Cordiales

http://www.disco-designer.com/NIGHTCLUB_DESIGN_DISCO_PANEL_VIDEO1.html





Título: Re: Control 28 Led RGB independientes
Publicado por: cristian_elect en 16 de Junio de 2011, 23:57:11
Segun tu proyecto tienes 28 huecos y cada uno con su tarjeta de control con su comunicación. Ese modo se ahorra una gran cantidad de cables si que no ubiera espacio para pasarlos.
Unos chip pequeños y no muy costosos hay en Atmel los attiny25,45,85 de 8 pines y tienen 4 PWM por hardware seria buena opción para el proyecto.
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 17 de Junio de 2011, 07:07:01
Antes de nada, me gustaria daros las gracias, tanto por vuestro apoyo, como por vuestra colavoracion  :oops: pero ahora al tema.

Gera: Como tu bien has dicho, la idea mia era esa, hacer algo por modulos y que sea de facil arreglo. En este caso sustituir un modulo por otro como la cosa solucion mas rapida, mientras se repara el modulo fallido. Por otro lado, el metodo de comunicacion que estoy utilizando es una modificacion del que utiliza nocturno en el articulo "Generacion de 3 PWM, probramos led RGB"

Citar
Así, si conectamos nuestro PIC al puerto serie del PC, podemos enviarle comandos como estos:

R120G60B240 -> establece Rojo = 120, Verde = 60 y Azul = 240
R34G180 -> establece Rojo = 34, Verde = 180 y deja el azul como estaba.

Lo que he hecho yo ha sido alargar el comando, de forma que para poner los colores a: Rojo 100, Verde 200 y Azul 150, en el quinto hueco (esclavo Nº5) tengo que enviar lo siguiente: D5R100G200B150

Por otro lado, se me habia ocurrido, que si quiero que todos los esclavos obedezcan a una misma orden, en vez de mandar una DX (siendo X un numero) a la que ovedezcan todos, mandar una letra que haga referencia a Todos, como puede ser una T+Restodelcodigo.

Pero bueno, esto de momento solo son ideas, que todavia quedan muchas cosas que hacer y seguro que aparece algun que otro problemilla por el camino.

Chipcon: Antes de nada, quiero decir que se me ha caido la baba con el video.

Ahora, el uso de los 16FXXX es solo para los esclavos (1 esclavo por cada hueco), el master todavia no he empezado con el, pero puede que me tenga que ir a un 18FXXX por la razon que has comentado. Por otra parte, no creo que este vaya en el primero de los huecos, para asi poder poner el master donde al dueño le guste y desde donde le sea facil manejarlo.

Por otro lado, una de las razones mas importantes por las que me he decantado por el 485 en vez del DMX, es el simple hecho de que en el caso de ser necesario, puedo hacer que los esclavos me devuelvan una respuesta, algo que todavia ni he hecho, ni he tenido necesidad de ello (por el momento). De todas formas, gracias por las aclaraciones porque es otra buena opcion a elegir y quien sabe si a alguien que le interese hacer algo por el estilo, pero con DMX, le pueden ir bien esas aclaraciones.

Siguiendo con lo de las fuentes, que habeis comentado tanto Gera como Chipcon, quiero decir, que se me habia ocurrido distribuir una linea de 12V y que cada hueco tuviera su propio 7805 con lo que en el peor de los casos se admitiria hasta que solo llegasen 8V, lo minimo para que funcione el 7805, pero eso es algo que todavia no tengo muy claro. Eso si, de esta forma, solo tendria que distribuir 4 hilos como ha comentado Chipcon, VCC, GND, A y B

Para acabar, cristian_elect: La verdad es que parece una buena idea, pero necesito algo mas de 8 pines para lo que quiero, a parte de que todavia nunca he jugado con ningun tipo de Atmel.

Un saludo!

PD: Os adjunto la simulacion de lo que llevo hasta ahora con su codigo. Que lo disfruteis!


Título: Re: Control 28 Led RGB independientes
Publicado por: stk500 en 17 de Junio de 2011, 07:46:41
Pues bien, leyendos todos los comentarios aqui de los amigos,
si va a usar solo 3 led (RGB) por micros, con que use un micro baratos cualquiera te srive, lo que comenta el amigos arriba de un micro 18F, para que tu quiere hacer , es eso algo tonto, pero si te recomiendo un micro de muchas Ram para el master, en este caso si, un 18F o mas, para direcionar los esclavo lo mas facil es un DIPSWITCH, asi puede direcionar todos los esclavos a Voluntad, por la conexiones, te recomendaria en este caso cable de 120 Ohm de 3pines y una mallas, normalmente estos cable se usan para esos, donde seria asi, los colores son estos, mallas(-), rojo(+) blanco(+data), negro(-data), estos cable lo usos y envio 24 Voltio 4Amp para alimentar estos (http://translate.google.com/translate?hl=en&sl=de&u=http://www.litecraft-online.com/de_DE/produkte/index.html%3FCategory%3D001230110%26Article%3D00162714&ei=MjD7Tc7HHsrKsga19NWgAQ&sa=X&oi=translate&ct=result&resnum=1&ved=0CB4Q7gEwAA&prev=/search%3Fq%3Ddmx512%2BLITECRAFT%2BXpress%26hl%3Den%26biw%3D1024%26bih%3D605%26prmd%3Divns)
no lo veo tan complicados, os podeis imaginar poner 100 piezas de estas con solo una linea de cable, cada modulo tiene su direcion, aunque una deje de funcionar las demas funcionan, otras cosas es no olvidar poner fusible y diodo de protecion a cada modulos esclavos.
 :P
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 17 de Junio de 2011, 08:17:38
Pues bien, leyendos todos los comentarios aqui de los amigos,

Si ellos dejan parte de su tiempo, para aportar ideas u opiniones, que menos que devolverles ese tiempo no?  :D

...lo mas facil es un DIPSWITCH, asi puede direcionar todos los esclavos a Voluntad...

Esactamente, eso es lo que he hecho como se puede ver en la simulacion que he adjuntado en mi anterior post "Esclavo.rar". He puesto un Switch Dip de 5 interruptores con lo que cubro mas que de sobra los 28, incluso se podria llegar a colocar uno de 8 interruptores para controlar los 255. Quien sabe si en la siguiente version  :D

Y por los cables... aumque todavia solo me estoy dedicando al soft, ya tenia pensado algo de ese estilo, que en mi trabajo (instalaciones audiovisuales) tenemos muchos tipos diferentes, entre ellos el que has mencionado.

Para acabar, esos aparatitos no estan, nada mal, pero no es mas divertido diseñarnos los nuestros?  :P Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: stk500 en 17 de Junio de 2011, 11:27:24
 :D :D pues me alegro, lo del Dipswitch, a ver un video cuando lo tenga acabado  :P
Saludos y suerte
Título: Re: Control 28 Led RGB independientes
Publicado por: kobra en 19 de Junio de 2011, 07:06:09
Buenas Strepto, te comento algo similar que me hizo falta y practicamente el proyecto es igual. Para evitar poner un dipswitch agregue un comando para dispositivos nuevos, sencillamente leo el primer byte de la eeprom, cuando es nuevo es 'FF',  pues al recibir comando de nuevo dispositivo si es FF pues lo cambio por el valor enviado, en tu caso podria ser 'N12' Nuevo con direccion 12. Asi me da de sobra para 255 dispositivos que son mas que suficientes para mi, sino hay mas memoria. La unica pega es que tienes que ir conectandolos uno a uno y mandar la orden de nuevo, pero como igualmente se conectan uno a uno pues....

Espero te sirva de ayuda....
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 19 de Junio de 2011, 10:15:43
Buenas Strepto, te comento algo similar que me hizo falta y practicamente el proyecto es igual. Para evitar poner un dipswitch agregue un comando para dispositivos nuevos, sencillamente leo el primer byte de la eeprom, cuando es nuevo es 'FF',  pues al recibir comando de nuevo dispositivo si es FF pues lo cambio por el valor enviado, en tu caso podria ser 'N12' Nuevo con direccion 12. Asi me da de sobra para 255 dispositivos que son mas que suficientes para mi, sino hay mas memoria. La unica pega es que tienes que ir conectandolos uno a uno y mandar la orden de nuevo, pero como igualmente se conectan uno a uno pues....

Espero te sirva de ayuda....

La verdad es que no es mala idea, pero tambien busco que varios equipos puedan llegar a tener una misma direccion de ser necesario, con lo que los dipswitch no es mas que un momento. De todas formas, tengo una pregunta, la primera vez que pones en marcha el sistema, en mi caso tendria que pasar por los 28 esclavos uno a uno para darles su direccion mediante comando N__ no? Por que siempre habra un momento, en el primer arranque en el que todos sean nuevos dispositivos, vamos, que sean "FF". Esto como lo solucionastes?

Un saludo y gracias por la aportacion.
Título: Re: Control 28 Led RGB independientes
Publicado por: tannke en 19 de Junio de 2011, 11:06:48
Una manera de solucionarlo puede ser a la hora de programrlos, ya que los tendras que programar tambien 1 a 1 son 2 segundos con el winpic800 cambiar manualmente el primer registro de la eeprom.

Saludos
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 19 de Junio de 2011, 12:06:45
Vamos, igual que hacia antes de ponerle el dipswitch, darle la direccion en el programa... Nose, no me convence mucho, pero me has dado una idea que puede que la implemente si no es mucha liada para hacer (con el master). Me la pienso y si sale algo en claro ya comentare.

Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: gera en 19 de Junio de 2011, 22:36:52
Otra idea que se me ocurre es que un esclavo que es conectado por primera vez, pregunte a los demas esclavos sus direcciones, y que tome la proxima direccion disponible.
saludos!!
Título: Re: Control 28 Led RGB independientes
Publicado por: kobra en 20 de Junio de 2011, 06:01:32


La verdad es que no es mala idea, pero tambien busco que varios equipos puedan llegar a tener una misma direccion de ser necesario, con lo que los dipswitch no es mas que un momento. De todas formas, tengo una pregunta, la primera vez que pones en marcha el sistema, en mi caso tendria que pasar por los 28 esclavos uno a uno para darles su direccion mediante comando N__ no? Por que siempre habra un momento, en el primer arranque en el que todos sean nuevos dispositivos, vamos, que sean "FF". Esto como lo solucionastes?

Un saludo y gracias por la aportacion.
[/quote]

Te comento que yo cada vez que montaba uno, mandaba el comando con un pulsador en el master que realmente lo unico que hacia era dar alimentación  listo, el master llevaba la cuenta, pero tambien podrias mandar el numero que te interesase, la verdad es que ese muy simple hacer cualquier modificacion o añadirle un comando.  :D
Título: Re: Control 28 Led RGB independientes
Publicado por: tannke en 20 de Junio de 2011, 10:50:46
Cuidado con lo de los 2 dispositivos con la misma dirección, ya que si en un futuro como comentastes quieres que los esclavos puedan contestar puedes tener problemas de colisión de datos.

saludos.
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 20 de Junio de 2011, 13:10:35
Cuidado con lo de los 2 dispositivos con la misma dirección, ya que si en un futuro como comentastes quieres que los esclavos puedan contestar puedes tener problemas de colisión de datos.

saludos.

Hay esta el problema que yo veia, y entonces fue cuando pense en la posibilidad de que cada esclavo tuviese 2 direcciones, una real (DR o RD) y otra virtual (DV o VD). La real seria la del dipswitch y la virtual, la que asignamos al esclavo X. Entonces luego no habria problema en aplicar ninguna de las ideas que habeis comentado antes, aumque la programacion para el master, se haria un poco mas pesada de lo que ya me esta pareciendo  :D

Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: gera en 20 de Junio de 2011, 13:21:41
Por que siempre habra un momento, en el primer arranque en el que todos sean nuevos dispositivos, vamos, que sean "FF". Esto como lo solucionastes?

No si vas encendiendo los esclavos de a uno.
Saludos!
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 29 de Junio de 2011, 15:47:06
Buenas!

Despues de haber estado liado con el curro y con este calor infernal, aqui os dejo los pocos avances que he hecho, que vendria siendo la primera version de los esclavos.

Estos disponen de:

- Direccion real por switch [RD+direccion+comandos_colores]
- Direccion virtual (al iniciar se pone la misma que la real, pero luego se puede cambiar) [VD+direccion+comandos_colores]
- Cambio de direccion virtual con la "C" [RD o VD+numero+C+nueva_direccion]
- Comunicacion full-duplex (a falta de ajustarla cuando tenga el master)

Falta:

- Orden para que actuen todos con la misma orden, puede que alguna direccion especial o alguna otra letra como la T
- Alguna otra cosa que se me ocurra mientras tanto  :D

El codigo:

Código: [Seleccionar]
#include <16F88.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=8000000)
#use rs232(baud=19200,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
#use fast_io (B)

#byte TRISA = 0x85
#byte TRISB = 0x86
#byte PORTA = 0x05
#byte PORTB = 0x06

// 5 bits para conseguir la direccion del dispositivo (Midireccionreal)
#bit  RA0 = PORTA.0
#bit  RA1 = PORTA.1
#bit  RA2 = PORTA.2
#bit  RA3 = PORTA.3
#bit  RA4 = PORTA.4

#bit  LedRojo = PORTB.7
#bit  LedVerde = PORTB.6
#bit  LedAzul = PORTB.3
#bit  TX_RX_485 = PORTA.6  //En desuso hasta que se pueda probar con el master

char buffer[20];
int8 Rojo,Verde,Azul, Ticks, Midireccionreal, Midireccionvirtual;
int8 CaracteresRecibidos  = 0;
int1 ComandoRecibido;

void Cojedireccion (void);

#int_RDA
void  RDA_isr(void)
{
   char c;
   c=getc();
   putchar(c);
   buffer[CaracteresRecibidos] = c;
   if (c==13)
      ComandoRecibido=true;
   else
      CaracteresRecibidos = (CaracteresRecibidos+1) % sizeof(buffer);
}

#int_TIMER0
void  TIMER0_isr(void)
{
   Ticks++;

   if (Ticks==0) {
      LedAzul=1;
      LedRojo=1;
      LedVerde=1;
   };
   if (Ticks==Rojo)
         LedRojo=0;
   if (Ticks==Verde)
         LedVerde=0;
   if (Ticks==Azul)
         LedAzul=0;
   set_timer0(140);
}

void Cojedireccion (void){
   Midireccionreal=0;
   if (RA0 == 1)
   Midireccionreal=Midireccionreal+1;
   if (RA1 == 1)
   Midireccionreal=Midireccionreal+2;
   if (RA2 == 1)
   Midireccionreal=Midireccionreal+4;
   if (RA3 == 1)
   Midireccionreal=Midireccionreal+8;
   if (RA4 == 1)
   Midireccionreal=Midireccionreal+16;
}

void ProcesaRGB() {
   int8 i=0;
   int8 Direccion = 0;
   int1 CambiaRojo, CambiaVerde, CambiaAzul, Miradireccion, Cambiadireccion;
   
   CambiaRojo=false;
   CambiaVerde=false;
   CambiaAzul=false;
   Miradireccion=false;
   Cambiadireccion=false;

   while (i<CaracteresRecibidos) {
      if ((Buffer[i]=='D') && ((Buffer[i-1]=='R') || (Buffer[i-1]=='V'))) {
         Miradireccion=true;
         CambiaRojo=false;
         CambiaVerde=false;
         CambiaAzul=false;
         Direccion=0;
      }
      if ((Direccion == Midireccionreal) || (Direccion == Midireccionvirtual)) {
         if (Buffer[i]=='C') {         //Cambio de direccion virtual
            Miradireccion=false;
            Cambiadireccion=true;
            CambiaRojo=false;
            CambiaVerde=false;
            CambiaAzul=false;
            Midireccionvirtual=0;
            printf("Direccion Virtual cambiada \n\r\n\r");
         }
         if (Buffer[i]=='R') {
            Miradireccion=false;
            Cambiadireccion=false;
            CambiaRojo=true;
            CambiaVerde=false;
            CambiaAzul=false;
            Rojo=0;
         }
         if (Buffer[i]=='G') {
            Miradireccion=false;
            Cambiadireccion=false;
            CambiaRojo=false;
            CambiaVerde=true;
            CambiaAzul=false;
            Verde=0;
         }
         if (Buffer[i]=='B') {
            Miradireccion=false;
            Cambiadireccion=false;
            CambiaRojo=false;
            CambiaVerde=false;
            CambiaAzul=true;
            Azul=0;
         }
      }
      if ((Buffer[i]>='0') && (Buffer[i]<='9')) {
         if (Miradireccion)
            Direccion=Direccion*10+Buffer[i]-48;
         if(Cambiadireccion)
            Midireccionvirtual=Midireccionvirtual*10+Buffer[i]-48;
         if (CambiaRojo)                       
            Rojo=Rojo*10+Buffer[i]-48;
         if (CambiaVerde)
            Verde=Verde*10+Buffer[i]-48;
         if (CambiaAzul)
            Azul=Azul*10+Buffer[i]-48;   
      }
      i++;
   }
   
   printf ("Color establecido: Rojo = %u, Verde = %u, Azul = %u \n\r\n\r",Rojo,Verde,Azul);
   
   CaracteresRecibidos=0;
   ComandoRecibido=false;
}

void main()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_a(0x1F);    //Se configura para 5 entradas y 3 salidas
   set_tris_b(0x37);    //Se configuran los pines de los Leds como salidas y el resto como entradas
   
   Rojo=0;
   Verde=0;
   Azul=0;
   Ticks=0;
   ComandoRecibido=false;
   
   Cojedireccion();
   Midireccionvirtual = Midireccionreal;
   
   printf ("Jugando con LEDS RGB Direccion real: %u, Direccion Virtual: %u. \n\r\n\r", Midireccionreal,Midireccionvirtual);
   
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts (GLOBAL);

   while (1) {
      if (ComandoRecibido)
         ProcesaRGB();
   }
}

Y como no, os adjunto la simulacion con el hex para que lo disfruteis.

Un saludo y se aceptan criticas!
Título: Re: Control 28 Led RGB independientes
Publicado por: splasma2 en 01 de Julio de 2011, 05:33:42
Hola,  echale un vistazo, si puedes  conseguirlo, al proyecto "Guirnalda luminosa programable" de Elektor Dic/2009.

Usa una inteligente solución para comunicarse con varios circuitos esclavos RGB desde un master con 3 hilos, a lo mejor te da alguna idea  :).

Saludos.
Título: Re: Control 28 Led RGB independientes
Publicado por: elfrancho en 11 de Agosto de 2011, 17:50:36
Estoy desarrollando un proytecto similar:

1 control MASTER, con PIC de 40pines (18F4620) que posee:
- teclado matricial
- LCD 2*16
- 3 Varios puertos RS485 (1 por hard y 2 por soft).
- un receptor RF de 450 mhz
- Entrada para Audioritmico.

32 Controles RGB SLAVE que constan de:
- puerto RS485
- Salida MOSFET (para 2 tiras de LED's RGB)
- ID UNICO

Si les intereza iré comentando los avances del proyecto. El que quiera preguntar algo, que pregunte..

Saludos !

Pancho !
Título: Re: Control 28 Led RGB independientes
Publicado por: mr froyd en 16 de Octubre de 2011, 22:49:28
Hola. Necesitaria una placa de este tipo, en que parte del foro debo publicar mi necesidad?
Gracias.
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 27 de Enero de 2012, 12:19:24
Despues de haber dejado este proyecto un rato apartado por motivos de trabajo, vuelvo con algunos cambios y grandes avances, y como no, con ganas de mas mejoras, pero de momento la idea propuesta en el 1 mensaje ya esta lista. De momento aqui os dejo unas fotos de lo que viene siendo el esquema para la simulacion y el programa hecho en VB6 para el control:

(http://img220.imageshack.us/img220/4493/74262763.png)

(http://img35.imageshack.us/img35/4812/86750970.png)

El codigo en CCS para el Pic (tambien adjunto en la descarga)

Código: [Seleccionar]
#include <16F88.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
#use fast_io(a)
#use fast_io(b)

#byte PORTA=0x05
#byte PORTB=0x06

#bit  LedRojo        =     PORTA.0
#bit  LedVerde       =     PORTA.1
#bit  LedAzul        =     PORTA.2

#define Retardo   1

char buffer[20];
int8 Rojo,Verde,Azul, Ticks, MiID, MiGD;
int8 CaracteresRecibidos  = 0;
int1 ComandoRecibido;

#int_Timer0
void ActivaLed() {
   Ticks++;

   if (Ticks == 0) {
      if(Rojo >=  1) LedRojo = 1;
      if(Verde >=  1) LedVerde = 1;
      if(Azul >=  1) LedAzul = 1;
   }
   if (Ticks == Rojo) LedRojo = 0;
   if (Ticks == Verde) LedVerde = 0;
   if (Ticks == Azul) LedAzul = 0;
   set_timer0(140);
}

#INT_RDA
void serial_isr()

   char c;
   c=getc();
   putchar(c);
   buffer[CaracteresRecibidos] = c;
   if (c == 13) // el numero 13 hacer referencia en el codigo ascii al final de carrera.
      ComandoRecibido = true;
   else
      CaracteresRecibidos = (CaracteresRecibidos + 1) % sizeof(buffer);
}

void ProcesaRGB() {
   int8 i = 0, ID = 0, GD = 0, TD;
   int1 CambiandoRojo, CambiandoVerde, CambiandoAzul, CambiaMiGD, MiraID, MiraGD;

   CambiandoRojo = false;
   CambiandoVerde = false;
   CambiandoAzul = false;
   CambiaMiGD = false;

   while (i<CaracteresRecibidos) {
      if ((Buffer[i] == 'D') && (Buffer[i-1] == 'T')){
          TD = 1;
      }
      if ((Buffer[i] == 'D') && (Buffer[i-1] == 'I')){
         MiraID = true;
         MiraGD = false;
         CambiaMiGD = false;
         CambiandoRojo = false;
         CambiandoVerde = false;
         CambiandoAzul = false;
         ID = 0;
      }
      if ((Buffer[i] == 'D') && (Buffer[i-1] == 'G')){
         MiraID = false;
         MiraGD = true;
         CambiaMiGD = false;
         CambiandoRojo = false;
         CambiandoVerde = false;
         CambiandoAzul = false;
         GD = 0;
      }
      if ((ID == MiID) || (GD == MiGD ) || (TD == 1)) {
         if ((ID == MiID) && (Buffer[i] == 'C')){
            MiraID = false;
            MiraGD = false;
            CambiaMiGD = true;
            CambiandoRojo = false;
            CambiandoVerde = false;
            CambiandoAzul = false;
            MiGD = 0;
            printf("Direccion de Grupo cambiada \n\r\n\r");
         }
         if (Buffer[i] == 'R'){
            MiraID = false;
            MiraGD = false;
            CambiaMiGD = false;
            CambiandoRojo = true;
            CambiandoVerde = false;
            CambiandoAzul = false;
            Rojo = 0;
         }
         if (Buffer[i] == 'G'){
            MiraID = false;
            MiraGD = false;
            CambiaMiGD = false;
            CambiandoRojo = false;
            CambiandoVerde = true;
            CambiandoAzul = false;
            Verde = 0;
         }
         if (Buffer[i] == 'B'){
            MiraID = false;
            MiraGD = false;
            CambiaMiGD = false;
            CambiandoRojo = false;
            CambiandoVerde = false;
            CambiandoAzul = true;
            Azul = 0;
         }
      }
      if ((Buffer[i] >= '0') && (Buffer[i] <= '9')) {
         if (MiraID) ID = ID * 10 + Buffer[i] - 48;
         if (MiraGD) GD = GD * 10 + Buffer[i] -48;
         if (CambiaMiGD) MiGD = MiGD * 10 + Buffer[i] -48;
         if (CambiandoRojo) Rojo = Rojo * 10 + Buffer[i] - 48;
         if (CambiandoVerde) Verde = Verde * 10 + Buffer[i] - 48;
         if (CambiandoAzul) Azul = Azul * 10 + Buffer[i] - 48;   
      }
      i++;
   }
   
   printf ("Color establecido: Rojo = %u, Verde = %u, Azul = %u \n\r\n\r",Rojo,Verde,Azul);
   CaracteresRecibidos = 0;
   ComandoRecibido = false;
   TD = 0;
}

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_8MHZ|OSC_INTRC);

   set_tris_A(0);

   Rojo = 0;
   Verde = 0;
   Azul = 0;
   Ticks = 0;
   MiID = 1; // ID del dispositivo
   MiGD = 2; // GD del dispositivo
   ComandoRecibido = false;
   
   printf ("Jugando con LEDS RGB \n\r\n\r");
   
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts (GLOBAL);

   while (1) {
      if (ComandoRecibido)
         ProcesaRGB();
   }
}

Funcionamiento (Sacado del control de leds RGB de nocturno):
El comando a escribir se compone de 2 partes. Por un lado la direccion y por otro lado el comando de colores:
- Para la direccion tenemos 3 opciones: ID (individual direction), GD (group direction) y TD (todas diecciones). Despues de una de estas 3 opciones solo tendremos que indicar la direccion del receptor sobre el que queremos actuar.
- Para los colores tenemos otras 3 opciones: R (Red, rojo), G (Green, verde) y B (Blue, azul). Al igual que con la direccion, despues de la letra indicamos un valor de 0 a 255 (min - max).

Ejemplos:
- ID1R100G100B100: Pone los colores rojo, verde y azul del dispositivo con direccion individual 1 a un valor de 100.
- GD5R100G200: Pone el color rojo en un valor de 100 y el verde en un valor de 200 a los dispositivos con la direccion de grupo 5.
- TDR0B255: Pone el color rojo a 0 y el azul a 255 de todos los dispositivos.

Aclarar que tanto el soft del pic como el del VB no son definitivos, esa es la razon de no estar comentado. Por otra parte para la simulacion, al ser un unico esclavo, no he añadido el MAX485 ni sus controles en el programa, pero es algo que tendre que añadir para una comunicacion bidireccional sin problemas.

Posibles mejoras que tengo intencion de hacer:
- En vez de cada esclavo controlar un unico led RGB, controlar un TLC5940
- En vez de usar comunicacio RS485, cambiar el protocolo a DMX
- Un modulo externo con el que poder asignar las direcciones individuales de cada dispositivo en vez de hacerlo en el programa
- ¿Se os ocurre algo mas?  :D

La simulacion se puede hacer tanto por virtual terminal como con el programa en VB. En este segundo caso habra que usar el VSPE y cambiar los puertos a los que simule el programa.

Espero que os guste. Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: RaDoN en 27 de Enero de 2012, 19:02:18
Buenas, yo tengo algo parecido... pero trabajando con Arduino. Lo más practico me parece es enviarle tras unos caracteres que serán la "ID" del receptor, el código del color que quieres encender en formato hexadecimal, tal cual el código HTML (http://html-color-codes.info/codigos-de-colores-hexadecimales/).

Simplemente usa el valor de cada color para transformarlo en una señal PWM.

Para el TLC escala los valores, ya que este usa 10 bit de resolucion para el PWM (1024 valores).
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 29 de Enero de 2012, 17:26:19
Buenas, yo tengo algo parecido... pero trabajando con Arduino. Lo más practico me parece es enviarle tras unos caracteres que serán la "ID" del receptor, el código del color que quieres encender en formato hexadecimal, tal cual el código HTML (http://html-color-codes.info/codigos-de-colores-hexadecimales/).

Es una buena idea que puede que haga y que ya tenia pensada puesto que es la misma manera en la que el Visual Basic entiende los colores y podria a llegar a simplificar el codigo.

Y gracias por el consejo. Un saludo!
Título: Re: Control 28 Led RGB independientes
Publicado por: RaDoN en 06 de Febrero de 2012, 10:46:01
Parece que "jugar" con leds RGB es muy popular  :mrgreen:

http://ardublog-danidroid.blogspot.com/2012/02/control-de-un-led-rgb.html
Título: Re: Control 28 Led RGB independientes
Publicado por: Strepto en 06 de Febrero de 2012, 18:40:19
Parece que "jugar" con leds RGB es muy popular  :mrgreen:

http://ardublog-danidroid.blogspot.com/2012/02/control-de-un-led-rgb.html

Jajajaja! Que bueno! Menuda coincidencia! Estare atento a ese hilo tambien, aumque es en arduino y yo lo quiero hacer con un Pic, pero podria servir para cojer ideas.

Gracias por la informacion!