Autor Tema: Control de 32 LEDs RGB  (Leído 6900 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Control de 32 LEDs RGB
« en: 22 de Junio de 2011, 21:23:00 »
Hola a todos,

He terminado en un proyecto sencillo y me gustaría mostraros sus entrañas. Esta basado en un STM32 y permite para controlar 32 LEDs RGB. Los 32 LEDs están controlados directamente por 16 integrados HL1606 conectados en serie. El micro envía la informacion al primer HL1606 via SPI. Se puede crear cualquier patrón con 4096 colores por LED RGB ya que implementa un PWM por software.

El hardware tiene lo minimo para "arrancar" el STM32 y conectores para SPI, pulsadores y un micrófono. Todos los emenetos pasivos se encuentran en encapsulados 0603 y la placa mide 30x30mm.
El software consta de unas 850 lineas + librerías. En él se pueden encontrar algunas rutinas para el control de botones, detectar flancos y manejar números en coma fija...
Por defecto genera de 12 patrones distintos, 4 estaticos y 8 sensibles al sonido. El usuario puede cambiar de uno a otro pulsando botones.




« Última modificación: 22 de Junio de 2011, 21:25:13 por jgpeiro06 »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Control de 32 LEDs RGB
« Respuesta #1 en: 22 de Junio de 2011, 21:37:34 »
Hola.

Se ve muy chulo!!! Felicitaciones.

Saludos
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Control de 32 LEDs RGB
« Respuesta #2 en: 23 de Junio de 2011, 03:52:30 »
Una preciosidad más como todas las que salen de tu factoría.
A ver si nos pones un vídeo, hombre

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: Control de 32 LEDs RGB
« Respuesta #3 en: 23 de Junio de 2011, 06:01:15 »
Espectacular master ...estaria bueno un videin para verlo como funciona :)
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Control de 32 LEDs RGB
« Respuesta #4 en: 23 de Junio de 2011, 10:01:28 »
Muy bueno! Pero otro más que pide vídeo, que sino no tiene gracia!  :)
No contesto mensajes privados, las consultas en el foro

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Control de 32 LEDs RGB
« Respuesta #5 en: 23 de Junio de 2011, 15:39:14 »
aunque no he tenido mucho tiempo para realizarlo, aqui va el vídeo...

Solo se muestra 1 de los 12 efectos donde la luminosidad y la intensidad de los leds reaccionan al sonido. Su código es este:
Código: C
  1. case MODE_12 :{        
  2.         timeB_ms = time_ms;
  3.         if( timeB_ms - timeA_ms > 50 ){
  4.                 timeA_ms = time_ms;
  5.                        
  6.                 for( x = 0 ; x < LEDS_SIZE - 1 ; x++ ){
  7.                         sStrip.sRGBLeds[x] = sStrip.sRGBLeds[x+1];
  8.                 }
  9.                 if( vol > 0x300 ){
  10.                         sStrip.sRGBLeds[LEDS_SIZE-1].r = fxdMul( flt2fxd( (sin( fxd2flt(vol)*2.0*3.14+1.0*2.0*3.14/3.0) + 1.0)/2.0 ), vol );
  11.                         sStrip.sRGBLeds[LEDS_SIZE-1].g = fxdMul( flt2fxd( (sin( fxd2flt(vol)*2.0*3.14+2.0*2.0*3.14/3.0) + 1.0)/2.0 ), vol );
  12.                         sStrip.sRGBLeds[LEDS_SIZE-1].b = fxdMul( flt2fxd( (sin( fxd2flt(vol)*2.0*3.14+3.0*2.0*3.14/3.0) + 1.0)/2.0 ), vol );
  13.                 }else{
  14.                         sStrip.sRGBLeds[x] = sRGB_COLOR_BLACK;
  15.                 }
  16.         }
  17. }
  18. break;

Después de actualizar la estructura sStrip se copia a sStripOut en una sección critica(bloqueando las interrupciones del timer 3 para evitar datos corruptos). Cuando el timer 3 genera una interrupción se convierte toda la estructura sStripOut en comandos para los HL1606 y el DMA se ocupa de transmitirlo por el SPI. El refresco es de 32 Hz, pero se envian tramas a 512 Hz para conseguir los 4096 colores con ayuda de un PWM por software.

Código: C
  1. void HL1606_update( void ){
  2.         static uint8_t PWMCnt;
  3.         uint16_t PWMCntShift;
  4.         uint16_t i;
  5.  
  6.         PWMCnt = (PWMCnt + 1) % LEDS_PWMS;
  7.         PWMCntShift = PWMCnt << (15-LEDS_BITS);
  8.  
  9.         for( i = 0 ; i < LEDS_SIZE ; i++ ){
  10.                 spiBuffer[i] = HL1606_RED_OFF | HL1606_GREEN_OFF | HL1606_BLUE_OFF | HL1606_FADE_SLOW | HL1606_LATCH;
  11.                 if( sStripOut.sRGBLeds[i].r > PWMCntShift ){
  12.                         spiBuffer[i] |= HL1606_RED_ON;
  13.                 }
  14.                 if( sStripOut.sRGBLeds[i].g > PWMCntShift ){
  15.                         spiBuffer[i] |= HL1606_GREEN_ON;
  16.                 }
  17.                 if( sStripOut.sRGBLeds[i].b > PWMCntShift ){
  18.                         spiBuffer[i] |= HL1606_BLUE_ON;
  19.                 }
  20.         }
  21.  
  22.         DMA_Cmd( DMA1_Channel3, ENABLE ); // Envia los 32 bytes de spiBuffer
  23. }
« Última modificación: 23 de Junio de 2011, 15:54:44 por jgpeiro06 »

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Control de 32 LEDs RGB
« Respuesta #6 en: 23 de Junio de 2011, 15:39:51 »
En dos palabras ES-PECTACULAR! Jajajajaja! Esta muy bien, y un tamaño muy muy muy reducido! No esta nada mal!

Un saludo!

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Control de 32 LEDs RGB
« Respuesta #7 en: 23 de Junio de 2011, 20:50:19 »
Hola quisiera saber cuánto consume de recursos de proceso para hacerlo con otro micro.
Hay yo tengo los STM32f100 y un LPC1769 y atmega.
Tu proyecto con ARM lo publicaste en sitio de pics.
« Última modificación: 23 de Junio de 2011, 23:28:24 por cristian_elect »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Control de 32 LEDs RGB
« Respuesta #8 en: 24 de Junio de 2011, 02:08:33 »
¡Precioso!

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Control de 32 LEDs RGB
« Respuesta #9 en: 24 de Junio de 2011, 08:32:04 »
Impresionante--------!!!!!  muy bonito!!!  QUIERO UNO!!!!!  :D :-/ :-/
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Control de 32 LEDs RGB
« Respuesta #10 en: 24 de Junio de 2011, 13:31:06 »
Una orgía de leds!  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Control de 32 LEDs RGB
« Respuesta #11 en: 24 de Junio de 2011, 15:28:49 »
Citar
Hola quisiera saber cuánto consume de recursos de proceso para hacerlo con otro micro.
Hay yo tengo los STM32f100 y un LPC1769 y atmega.
Tu proyecto con ARM lo publicaste en sitio de pics.
Sobre los recursos, estoy usando 2 timers, 1 ADC, 1 SPI, 1 DMA y varios GPIO. El micro trabaja a 72MHz pero MIPS, la RAM y la ROM usados no los sé.
Sobre publicar en el subforo que no toca... bueno, aunque el proyecto realmente esta implementado con un ARM, todo está escrito en C y puede ser de utilidad para cualquier programador de PICs.


Me alegro mucho de que os guste el proyecto...otra cosa que me gustaría resaltar de este proyecto es un pequeño algoritmo que he implementado para manejar botones. No es muy eficiente, pero permite añadir todos los botones que queramos de una manera sencilla.
En tiempo de compilación por cada botón añadimos un elemento al array sButtons y lo rellenamos con los parámetros del botón: pin, puerto, estado activo, función a ejecutar cuando se pulse... Después, en tiempo de ejecución, un único bucle "for" procesa todos los botones con el mismo algoritmo: integrar, limite, hysteresis, flanco y acción. Se pueden ejecutar 3 eventos distintas: Flanco de subida, mantenido y flanco de bajada.

Para ver como funciona el algotirmo y sus capacidades os muestro un ejemplo extremo de "el peor botón del mundo".
Notas1: Hyste se pone a 1 cuando integ>5 y a 0 cuando integ<-5.
Notas2: Dif(Hyste) es state[1] - state[0]

Para comprender las distintas gráficas de la imagen anterior lo mejor es probar el código. Aunque es poco eficiente para leer un simple pulsador (todos hemos usado alguna vez "btfss"), no supone un coste excesivo de MIPS ya que no se ejecuta muchas veces por segundo(~100)...

Código: C
  1. #define         BUTTONS_MAX                     1
  2. #define         BUTTON_INTEG_MAX        10
  3. #define         CLR( A )        {A[0]=0;}
  4. #define         SET( A )        {A[0]=1;}
  5. #define         BCK( A )        {A[1]=A[0];}
  6. #define         isRUP( A )      (A[0] && !A[1])
  7. #define         isFDW( A )      (!A[0] && A[1])
  8. #define         isHLD( A )      (A[0] && A[1])
  9.  
  10. struct sBUTTON {
  11.         GPIO_TypeDef* port;
  12.         uint16_t pin;
  13.         uint8_t pressValue;
  14.         uint32_t portClk;
  15.         int8_t integ;
  16.         int8_t state[2];
  17.         void (*actionRUP)( void );
  18.         void (*actionHLD)( void );
  19.         void (*actionFDW)( void );
  20. };
  21.  
  22. void action1( void );
  23. void action2( void );
  24. void action3( void );
  25.  
  26. struct sBUTTON sButtons[ BUTTONS_MAX ] = {
  27.         { BTN_A_PORT, BTN_A_PIN, Bit_SET, BTN_A_CLK, 0, {0,0}, action1, action2, action3 }
  28. };
  29.  
  30. void DoButtons( void ){
  31.         uint8_t i = 0;
  32.         for( i = 0 ; i < BUTTONS_MAX ; i++ ){
  33.                 // Integrate
  34.                 if( sButtons[i].pressValue == GPIO_ReadInputDataBit( sButtons[i].port, sButtons[i].pin ) ){
  35.                         sButtons[i].integ++;
  36.                 }else{
  37.                         sButtons[i].integ--;
  38.                 }
  39.                
  40.                 // Limit
  41.                 if( sButtons[i].integ > BUTTON_INTEG_MAX ){
  42.                         sButtons[i].integ = BUTTON_INTEG_MAX;
  43.                 }else if( sButtons[i].integ < -BUTTON_INTEG_MAX ){
  44.                         sButtons[i].integ = -BUTTON_INTEG_MAX;
  45.                 }
  46.  
  47.                 // Hysteresis
  48.                 if( sButtons[i].integ > BUTTON_INTEG_MAX / 2 ){
  49.                         SET( sButtons[i].state );
  50.                 }else if( sButtons[i].integ < -BUTTON_INTEG_MAX / 2 ){
  51.                         CLR( sButtons[i].state );
  52.                 }
  53.  
  54.                 // Rise-Up/Falling-Down edge detection
  55.                 if( isRUP( sButtons[i].state ) ){
  56.                         // RUP action perform
  57.                         if( NULL != sButtons[i].actionRUP ){
  58.                                 sButtons[i].actionRUP();
  59.                         }
  60.                 }else if( isFDW( sButtons[i].state ) ){
  61.                         // FDW action perform
  62.                         if( NULL != sButtons[i].actionFDW ){
  63.                                 sButtons[i].actionFDW();
  64.                         }
  65.                 }else if( isHLD( sButtons[i].state ) ){
  66.                         // HLD action perform
  67.                         if( NULL != sButtons[i].actionHLD ){
  68.                                 sButtons[i].actionHLD();
  69.                         }
  70.                 }
  71.                
  72.                 // Backup state
  73.                 BCK( sButtons[i].state );
  74.         }
  75. }
  76.  
  77. void action1( void ){
  78.         A = 1;
  79.         A = 0;
  80. }
  81. void action2( void ){
  82.         B = 1;
  83.         B = 0;
  84. }
  85. void action3( void ){
  86.         C = 1;
  87.         C = 0;
  88. }
  89.  
  90. void main(){
  91.         InitButtons();
  92.         while(1){
  93.                 DoButtons();
  94.                 Delay_mS(10);
  95.         }
  96. }


« Última modificación: 25 de Junio de 2011, 17:54:11 por jgpeiro06 »

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: Control de 32 LEDs RGB
« Respuesta #12 en: 25 de Junio de 2011, 17:09:53 »
Faaa espectacular¡¡¡¡¡¡¡¡¡¡ un hippie mataria por semejante psicodelia¡¡¡¡ :D :D :D :D
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Control de 32 LEDs RGB
« Respuesta #13 en: 25 de Junio de 2011, 21:00:01 »
otra cosa interesante es una pequeña libreria para trabajar con numeros en coma fija.  He definido el tipo fixed y un conjunto de macros para operar en coma fija. Estas macros permiten realizar operaciones aritmeticas con 16 bits de precision en un rango de +-1, ademas de la conversion a/de numeros en coma flotante. Toda la implementacion es independiente de la plataforma.

A continuacion os dejo las macros y un pequeño ejemplo de uso:
Código: C
  1. #ifndef __FIXED_POINT_H
  2. #define __FIXED_POINT_H
  3.  
  4. typedef short int fixed;
  5. #define fracBits        15
  6. #define fxdAdd( x, y )  ((fixed)((x)+(y)))
  7. #define fxdSub( x, y )  ((fixed)((x)-(y)))
  8. #define fxdMul( x, y )  ((fixed)(((int)(x) * (int)(y)) >> fracBits))
  9. #define fxdDiv( x, y )  ((fixed)(((int)(x) << fracBits)/(y)))
  10. #define fxd2flt( x )    ((float)(x) / (0x1<<fracBits))
  11. #define flt2fxd( x )    ((fixed)((x) * (0x1<<fracBits)))
  12.  
  13. #endif  /*__FIXED_POINT_H*/
  14.  
  15.  
  16. void main(){
  17.         float f = 0.0;
  18.         fixed x = flt2fxf( 0.318 ), y = flt2fxf( 0.367 );
  19.  
  20.         z = fxdAdd( x, y );
  21.         f = fxd2flt( z );
  22.         z = fxdSub( x, y );
  23.         f = fxd2flt( z );
  24.         z = fxdMul( x, y );
  25.         f = fxd2flt( z );
  26.         z = fxdDiv( x, y );
  27.         f = fxd2flt( z );
  28. }

Desconectado maverick_007

  • PIC10
  • *
  • Mensajes: 10
Re: Control de 32 LEDs RGB
« Respuesta #14 en: 30 de Julio de 2011, 13:27:37 »
hola yo me estoy integrando recien a los micros arm especificamente los stm32f103xx, escogi esta familia porque el fabricante st microelectronics ofrece muestras gratis de estos componentes y me llamo mucho la atencion utilizarlos, los escogi por un proyecto que tengo en mente relacionado con vision artificial y cargar un istema operatico en el microcontrolador como el uClinux, deberian llegar ( espero) la proxima semana.

pero tengo unas preguntas ..... las librerias graficas que ofrece st se pueden utilizar en el coocox ide?   un programma en c escrito en un entorno como el iar y el keil son compatibles entresi y con el coocox ide?   

saludos.


 

anything