Autor Tema: Control 28 Led RGB independientes  (Leído 12877 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Control 28 Led RGB independientes
« 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!

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: Control 28 Led RGB independientes
« Respuesta #1 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
 

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Control 28 Led RGB independientes
« Respuesta #2 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!

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Control 28 Led RGB independientes
« Respuesta #3 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

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Control 28 Led RGB independientes
« Respuesta #4 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!

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Control 28 Led RGB independientes
« Respuesta #5 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?

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Control 28 Led RGB independientes
« Respuesta #6 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.
« Última modificación: 16 de Junio de 2011, 15:38:42 por tannke »

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Control 28 Led RGB independientes
« Respuesta #7 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!

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Control 28 Led RGB independientes
« Respuesta #8 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!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Chipcon

  • PIC12
  • **
  • Mensajes: 63
Re: Control 28 Led RGB independientes
« Respuesta #9 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






Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Control 28 Led RGB independientes
« Respuesta #10 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.

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Control 28 Led RGB independientes
« Respuesta #11 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!


« Última modificación: 17 de Junio de 2011, 07:09:39 por Strepto »

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: Control 28 Led RGB independientes
« Respuesta #12 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
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

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Control 28 Led RGB independientes
« Respuesta #13 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!

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: Control 28 Led RGB independientes
« Respuesta #14 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