viernes, 6 de enero de 2017

ARBOL DE NAVIDAD LED


Hola a todos, esta vez les presento mi arbolito de navidad hecho con luces LED (banda o tira de LEDs), componentes electrónicos y material reciclable.

Materiales Usados

 Para la estructura de árbol se usó:
  1. Cartón Microcorrugado para la base.


  2. Cono de Technopor para el árbol (ramas).


  3. Pintura verde para pintar el cono.
  4. Arbustos disecados para las hojas.

     
  5. Estrella de plástico en la cima.

La construcción se efectúa de forma lógica. Primero se arma la base a libre elección de la forma, yo hice una base cuadrada y tronco octagonal, ambos huecos para que puedan contener la parte electrónica internamente.





Para la iluminación usé una banda o tira LED multicolor o RGB de 2m.


La banda esta conectada a un circuito controlador que tiene un PIC. Todo el circuito y la banda se alimenta con una fuente de 12 V con la potencia suficiente para alimentar el circuito y los LEDs.


Usé un conector con bornes a plug para conectar la fuente al circuito y los LEDs y lo puse debajo de la base cuadrada.


 El circuito de control lo puse dentro del tronco octogonal el cual esta conectado a través de un Molex a la banda de LEDs.


 El diagrama lógico del circuito esta a continuación




Se observa que los transistores actúan como compuertas lógicas que separan la etapa de potencia (Alimentación de la Banda LED). cuando se aplica un voltaje a la base del transistor, se cierra el circuito y se enciende la banda del respectivo color.

Como hay 3 colores se pueden realizar 2^3 combinaciones de acuerdo al siguiente esquema de colores:


Donde 1 representa el voltaje aplicado al pin. Naturalmente la combinacion 000 no encenderá ningun color (oscuridad total)

Finalmente (para ya no aburrirlos demasiado) dependiendo del programa que se encuentre en el PIC lograrán todos los efectos especiales que puedan imaginar.

Con el siguiente programa basado en PWM logro el efecto de desvanecimiento de los colores de intenso a ténue.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Oscar Carrion P.                                  *
'*  Notice  : Copyright (c) 2016 Electrolife SAC                *
'*          : All Rights Reserved                               *
'*  Date    : 28/12/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   : LUCES LED DE 7 COLORES                            *
'*          :                                                   *
'****************************************************************

 'configuracion de puertos
cmcon = 7       'convierte a digitales los comparadores ANALOG en 16f628
trisa = $00     'puerto A como entrada
trisb = $00     'Puerto B como entrada

OUT_GREEN  var portb.0
OUT_RED    var portb.1
OUT_BLUE   var portb.2

cambio   var byte
duty     var word
x        var byte
id       var bit

c        con 10      'diferencial de ciclo de trabajo

'condicion inicial
portb = $00
cambio = 0   'seleccion de pines / colores
duty = 2000     'ciclo de trabajo

loop:
    select case cambio      'variable de cambio de color

    case 0        'VERDE
        for x = 1 to 5      'cinco ciclos o pulsos del mismo tau
            OUT_GREEN = 1
            OUT_RED =   0
            OUT_BLUE =  0
            pauseus duty        'ciclo alto
            OUT_GREEN = 0
            OUT_RED =   0
            OUT_BLUE =  0
            pauseus 2000 - duty 'ciclo bajo
        next x                  'en total demora 5*2ms = 10ms
       
        duty = duty - c     'incremento del ciclo de trabajo de 10 en 10
        if duty <= 0 then     
            duty = 2000   'veces realizadas del Bucle FOR
            cambio = 1   
        endif                '2000/10 = 200 * (tiempo del FOR) = 2 seg
                                        
    case 1        'ROJO

y así sucesivamente hasta completar todos los colores...

El árbol de navidad terminado se muestra a continuación


Y en pleno funcionamiento en el siguiente video:
 

Felices fiestas!!!

martes, 26 de julio de 2016

Mejoramiento de Imágenes mediante Ecualización de su Histograma

La ecualización del histograma es una técnica que permite mejorar el contraste de una imagen mediante el procesamiento de su histograma.

¿Qué es un Histograma?


Un histograma mide el número de pixeles con una determinada intensidad en una imagen.


Por ejemplo, en la siguiente imagen y su histograma:



Los pétalos del girasol tienen intensidades de gris claras cercanas a 255 y la ventana de la esquina superior izquierda tienen intensidades de gris oscuras cercanas a 0.

Entonces existen aproximadamente:


2000 pixeles con intensidad 50,
22000 pixeles con intensidad 100,
1000 pixeles con intensidad 150, y así sucesivamente. (De acuerdo al gráfico de la derecha.)

De acuerdo a su histograma, las imágenes se pueden ser:


  • Oscuras: Si la mayoría de sus pixeles se encuentran en la zona izquierda del histograma.
  • Claras: Si la mayoría de sus pixeles se encuentran en la zona derecha del histograma.
  • Bajo contraste: Si la mayoría de sus pixeles se encuentran en la zona central del histograma.
  • Alto contraste: Los pixeles se encuentran distribuidos en todo el ancho del histograma.
Con la ecualización del histograma las imágenes oscuras, claras, y de bajo contraste se transforman en imágenes de alto contraste (generalmente).

Las imágenes de alto contraste están optimizadas respecto a su distribución de intensidades y casi no se logra mejorías notorias con la técnica de ecualización.

Técnica de ecualización con MATLAB

Para ecualizar una imagen oscura, clara o de bajo contraste se siguen los siguientes pasos:
1. Se obtiene el histograma de la imagen que se desea ecualizar. Esto lo realizo con las siguientes instrucciones
L=256;
for m=0:L-1 
    p= (image == m);
    image_hist(m+1)=sum(sum(p)); 
end

El programa es un bucle que recorre todas las intensidades de gris de una imagen de 8 bits. En 'p' se almacena una imagen lógica cuyos valores son: 0 si no existe coincidencia en la comparación y 1 si existe coincidencia. Luego se suman todas las coincidencias del valor del pixel dado en 'm' y se almacena el valor en un vector 'image_hist' que es el histograma de la imagen. Al graficar,


n=0:L-1;
figure;
stem(n,image_hist,'filled','markersize',2)
axis([0 L-1 0 max(image_hist+10)])

Se obtiene el gráfico a la derecha de la imagen del girasol.


2. Se halla la transformación lineal para obtener la nueva imagen a partir del histograma de la imagen original. Esto se obtiene sumando y normalizando las probabilidades de los pixeles de la imagen original. De acuerdo a la siguiente fórmula:

T ( r ) = ( L 1 ) 0 r p r ( w ) dw T(r)=(L-1) int from{0} to{r} p_r(w)dw 

Ya que las imágenes son digitales, tienen valores discretos de intensidad; por lo tanto la integral de la fórmula anterior se transforma en sumatoria, del siguiente modo:

T ( r ) = ( L 1 ) i = 0 k p r ( r i ) = ( L 1 ) NM i = 0 k n i k = 0,1,2,. .. , L 1 T(r)=(L-1) sum from{i=0} to{k} p_r(r_i) = (L-1) over NM sum from{i=0} to{k} n_i newline newline k=0,1,2,...,L-1

Donde 'NM' es la cantidad total de pixeles de la imagen y 'n' es el numero de pixeles de cada intensidad en la imagen. Como el limite superior de la sumatoria varia de 0 a L-1, existirán L sumatorias, las cuales son acumulativas. Una sumatoria acumulativa se puede realizar en MATLAB por medio de la función 'cumsum()' del siguiente modo:

Tr=((L-1)/size(image,1)*size(image,2))*cumsum(image_hist)

En particular, no soy partidario del uso de funciones predefinidas en MATLAB, por lo que prefiero usar el siguiente algoritmo de suma acumulativa:

 
s=zeros(1,L); 
st=0; 
for k=1:L 
    st=st+image_hist(k); 
    s(k)=st;           % Paso principal del algoritmo
end 
% Transformacion lineal 
Tr=((L-1)/(size(image,1)*size(image,2)))*s; 
Tr=round(Tr); % redondeamos al mas cercano entero

La gráfica de la transformación lineal para la imagen del girasol es:


  


El girasol se considera una imagen de alto contraste, según su histograma. Para imágenes como el girasol, la transformación lineal resulta similar a una función lineal T(r)=r osea; la imagen de entrada es muy similar a la imagen transformada, no resultando ninguna mejora aparente en la imagen que se desea ecualizar.

3. Como último paso se aplica la transformación lineal a la imagen original. Esto se realiza con el siguiente código:

image_out=zeros(size(image)); 
for k=0:L-1 
    layer = Tr(k+1)*(image==k); 
    image_out = image_out + layer;   %suma por capas
end

Finalmente, pongo ejemplos de la transformación lineal para imágenes oscuras, claras y de bajo contraste. En la fila superior se muestra la imagen original y la imagen ecualizada y en la fila inferior se muestra el histograma de la imagen original y la transformación lineal obtenida a partir de su histograma.

Imagen Oscura
Imagen Clara
Imagen de bajo contraste
Fuente consultada: Digital Image Processing, R. Gonzalez, R. Woods, 3ra edición. Pag. 122.

martes, 15 de diciembre de 2015

Experimento 1: Recuperación de una señal senoidal a partir de una señal PWM.

Nota: Para ver las fórmulas usar Firefox o Chrome con la extensión MathJax

En esta experiencia se describirá la conversión de una señal digital de modulación por pulso a una señal analógica determinística. Básicamente se trata la conversión de una señal PWM a una señal senoidal.

OBJETIVO

La finalidad de la experiencia será repasar los principales conceptos de la conversión analógica-digital y también servirá como base para desarrollar sistemas de comunicación prácticos como la transmisión digital de voz (modulada en PWM).

IMPLEMENTACION

Para el desarrollo de dicha experiencia necesitaremos:

  • Un generador de funciones
  • Un módulo Arduino UNO
  • Componentes electrónicos pasivos (un potenciómetro y un capacitor)
La siguiente figura muestra el diagrama general de conexiones del experimento:


Figura 1


De acuerdo a la figura, el generador de la onda senoidal se conecta a una de los pines analógicos del módulo ARDUINO UNO. Luego, la salida de uno de los pines digitales del ARDUINO UNO se conecta a una red RC configurada como filtro pasa bajos pasivo de primer orden.

Los parámetros de la señal senoidal de entrada se configuran de acuerdo a las características de la señal que reciben los pines analógicos del ARDUINO UNO.

Los pines analógicos A0 - A5 aceptan amplitudes de voltajes entre 0 a  5 V DC, entonces la amplitud de la onda senoidal será de 4 Vpp con un voltaje Offset de +2.5 V.

En cuanto a la frecuencia de la señal senoidal, esta debe ser menor a la mitad de la frecuencia de muestreo, bajo el criterio de Nyquist. La frecuencia de muestreo típica del ARDUINO es de 4.46 KHz, medida experimentalmente. Entonces, la frecuencia máxima de la señal senoidal de entrada deberá ser menor a 2.23 KHz. Para efectos del experimento consideramos una señal de 100 Hz.

De la descripción anterior se obtiene una expresión matemática (que es una característica de las señales determinísticas) de la señal de entrada:


x ( t ) = 2.5 + 2 cos ( 2 π f c t ) x(t) = 2.5+2 cdot cos(2%pi f_c t)             (1)


PROGRAMA DEL ARDUINO

El programa tiene básicamente 3 líneas de comando o instrucciones:

void loop()
{
  valor=analogRead(5);         //lee el dato analógico del pin 5 y lo guarda en una variable de 10 bits
  salida=valor*(255./1023);  //convierte el 'valor' en una variable de 0 a 255 valores.
  analogWrite(3,salida);       //muestra la variable de salida como una señal PWM.
}

El conjunto de instrucciones se repite indefinidamente debido a que se encuentra dentro de la función 'loop'.

DEMOSTRACION DE LA TRANSFORMACION

La tabla posterior muestra el cálculo de las magnitudes del valor medio y de los dos primeros armónicos para diversos valores de ciclo de trabajo.


PWM(f)
C0
C1
C2
τ = 0
0
0
0
τ = 0.2T
0.2A
0.19A
0.15A
τ = 0.5T
0.5A
0.32A
0
τ = 0.8T
0.8A
0.19A
0.15A
τ = T
A
0
0
Cálculo de los armónicos de una señal PWM


En el siguiente vídeo se demuestra el cálculo en la tabla cuando la frecuencia (fundamental) de la señal PWM es de 490 Hz.



Como se puede observar, los valores calculados coinciden con los experimentales.

CONVERSIÓN DE LA SEÑAL PWM A SENO

Se aplica la señal de la fórmula 1 al Arduino UNO y su salida convertida en PWM se filtra con un filtro pasa bajos pasivo de primer orden que es una red RC, como se muestra en la gráfica 1.

A continuación los resultados:

Gráfica 1:







La señal celeste es la señal senoidal aplicada y la señal amarilla es la señal PWM a la salida del pin digital 3 del arduino.

Vemos que la señal de entrada para que ingrese al módulo arduino se le suma un voltaje offset de 2.5 V aprox. para que la señal esté dentro del rango de valores aceptables por los pines de entrada analógicos del arduino. El voltaje aceptable está entre 0 y 5 Volts.

Gráfica 2:




Esta gráfica muestra la señal PWM de entrada al filtro, y la señal celeste que es la señal senoidal filtrada (recuperada). También se observa el espectro de la señal PWM.

Lo más importante para destacar en este punto es que en la transformada de la señal se observa:

  1. Un impulso en el origen que representa el valor medio de la señal PWM, el cual siempre es un valor de voltaje mayor que 0.
  2. Un impulso en 100 Hz muy cerca al impulso en el origen que es la frecuencia de la señal senoidal de entrada.
  3. Un impulso en 500 Hz que representa el primer armónico de la señal PWM.
Gráfica 3:



En esta tercera gráfica se observa la transformada de la señal filtrada con un filtro pasabajos formado por una red RC de 100 KΩ y 100nF (primer orden) lo cual da una frecuencia de corte de 100 Hz.

Pensemos en un filtro imaginario (línea de color rojo) que atenúa todas las frecuencias superiores a 100 Hz. Solo quedan relevantes las 3 armónicas de la gráfica 2 pero con magnitudes diferentes a causa del filtrado.

La forma senoidal general de la señal celeste se debe al impulso central ubicado en 100 Hz y el rizado de la señal celeste se debe al tercer impulso ya atenuado por el filtro.

Si cuantificamos la frecuencia de la señal de rizado vemos que existen 5 ciclos por cada periodo de la señal senoidal lo cual se comprueba en el espectro donde el tercer impulso mas pequeño esta en 500 Hz y entonces:

Nº de ciclos = 500 Hz 100 Hz = 5 Nº de ciclos = {500 Hz} over {100 Hz} = 5

Finalmente, si deseamos desaparecer el rizado, la solución más obvia según la gráfica 3 es incrementar la pendiente de corte del filtro lo cual se logra incrementando el orden del filtro. 

Para obtener filtros de mayor orden, lo más recomendable es realizar filtros activos (con OPAMPs) en lugar de las redes pasivas RC las cuales causan mayor atenuación de la señal filtrada,

Gráfica 4


Finalmente, para tener una señal similar a la original se pasa la señal filtrada por un capacitor de desacoplo el cual solo deja pasar las componentes de AC de la señal.

Lo que queda por demostrar es que si la eliminación o filtrado del tercer impulso ocasiona que la señal de salida se asemeje aún más a la original como es de esperarse.

Finalizo mostrando una fotografía con el circuito de prueba para analizar y demostrar la conversión de la señal analógica senoidal a señal PWM y su posterior recuperación.