domingo, 21 de noviembre de 2010

Programador PICs

Una de las herramientas indispensables en nuestro banco de trabajo es un programador para PICs. En este caso vamos a montar el famoso PicKit2 Clone del cual hay muchisimas versiones en la red. El modelo que propongo es un poco mas sencillo, ya que quite la parte para PICs de 3.3v. Aunque ya tengo un ICD2, me pareció muy interesante por las herramientas extra que trae: Logic y UART
Tool's.

Si alguien esta interesado en montar el programador completo, puede visitar TodoPic o la página del amigo Felixls que son las que he tomado como base para la construcción de mi programador.

El esquema que he utilizado es el siguiente:


Decidí montarlo sobre una baquelita con corte circular (para que quede similar a mi ICD2 :P)


Los transistores y algunas resistencias son en SMD para ahorrar espacio, también quité el LED que indica la alimentación Vcc. El conector para programación ICSP lo he dejado de 10 pines, por lo que he quitado el pin AUX.

La PCB queda de la siguiente manera (6cm de diámetro):

Ya en su carcasa:


DESCARGAS:
PCB's : Esquemático y PCBs

lunes, 15 de noviembre de 2010

Emisor - Receptor RF para Laboratorios de Fisica

Para muchas practicas de laboratorio, resulta muy útil tomar los datos de manera automática para que sean mas confiables y tener la opción de guardarlos y poder trabajar con ellos usando software de análisis de datos, además, se necesita solo un equipo para adquirir los datos, a diferencia de los laboratorios tradicionales, en los cuales se necesitan varios equipos para un mismo fin.

He diseñado un dispositivo para demostrar la ley de enfriamiento de Newton, de tal manera que la medición de las variables de temperatura y tiempo se hagan de manera automática. Este dispositivo se puede usar en los laboratorios de Física de grados 10 y 11 de educación media secundaria demostrando el uso de las TIC en la educación.

Aprovechando la dotación del colegio en el que trabajo, se distribuirán los datos obtenidos por el dispositivo a la red de PC's que usan los estudiantes, para ello se necesita enviar los datos de temperatura y tiempo a los computadores.

Modulo Transmisor

El modulo transmisor tiene como base al microcontrolador 16F628A el cual se encarga de tomar los datos de temperatura del sensor DS18S20, el cual posee una resolución de 0,5°C @9bits, tiempo de conversión de 750mS y se comunica con el protocolo 1-wire (lo cual simplifica el diseño), llevar el conteo interno de toma de datos (cada 5 segundos), controlar la lampara incandescente (fuente de calentamiento) y enviar los datos vía RF hacia el receptor que se encuentra fuera del Laboratorio(hasta 100 metros de alcance).






Modulo Receptor

El modulo receptor tiene como base al PIC18F2550 el cual se encarga de recibir la información RF y la reenvía al computador vía USB.





Las tarjetas de ensamble para los equipos:





Para graficar los datos, se ha diseñado una plataforma software: CtrlTEMP, la cual se encarga de recibir los datos vía USB y se grafican en un plano cartesiano Temperatura vs. Tiempo, además posee la opción de exportar los datos a Excel de Office, archivo en el cual se mostrarán los datos y las gráficas correspondientes (para anexarlos al informe de laboratorio :) ).



DESCARGAS:
CtrlTEMP : Software de visualización de datos.
PCB's: Tarjetas de ensamble.

Ley de enfriamiento de Newton




Cuando un cuerpo que ha sido calentado previamente se deja al aire para que se enfríe, la función de Temperatura respecto al tiempo del cuerpo no es una linea recta, es decir, el enfriamiento no es linealmente proporcional.

La ley que sigue el proceso de transferencia de calor del cuerpo caliente hacia el medio circundante se conoce como Ley de enfriamiento de Newton la cual nos dice:


La temperatura de un cuerpo cambia a una velocidad que es proporcional a la diferencia de las temperaturas entre el medio externo y el cuerpo.


Matemáticamente, se puede expresar de la siguiente manera:



En donde:

dT : Cambio de Temperatura
dt : Cambio de Tiempo
k : Constante de proporcionalidad
T : Temperatura del cuerpo

Si se halla la constante de proporcionalidad k es posible predecir los cambios de temperatura del cuerpo a un tiempo determinado, para hacerlo, se deben tomar los datos de Temperatura a tiempos determinados y realizar la gráfica de Temperatura vs Tiempo.

Para tal fin he diseñado un dispositivo el cual se encarga de medir la temperatura y el tiempo de un cuerpo, lo visualiza en una pantalla LCD y además lo transmite por vía RF a un receptor (fuera del laboratorio) el cual esta conectado a un PC vía USB.





En el PC se ha instalado el software CtrlTEMP el cual se encarga de recibir los datos del receptor RF y los grafica en un plano cartesiano Temperatura vs. Tiempo, además indica el tiempo y temperatura actuales y el tiempo total del proceso.







Para tomar los datos de enfriamiento, se conecta el dispositivo transmisor y se presiona el pulsador de inicio, con lo cual se encenderá la lampara, la cual se encarga de calentar el aire circundante al sensor de temperatura, el calentamiento se hará por un tiempo de 1 minuto, pasado ese tiempo el dispositivo comenzará a visualizar y a transmitir los datos de temperatura y tiempo.

Lo primero que se hará evidente es que la función de relación entre Temperatura y tiempo no es una linea recta (con lo que se demuestra que el cambio no es linealmente proporcional).



Podemos observar que la función que describe la relación entre Temperatura y Tiempo, se asemeja mucho a la función exponencial, la cual es solución para la ecuación que describe la rapidez de enfriamiento del cuerpo.

Si el cuerpo se enfría a partir de una temperatura inicial Ti hasta una temperatura final Tf, la función que describe el enfriamiento del cuerpo es:




Para poder hallar el valor de la constante de proporcionalidad k se debe linealizar la ecuación anterior, para ello la reescribimos de la siguiente manera:





Aplicamos la función logaritmo natural a ambos lados de la igualdad, con lo que obtenemos:





Para trabajar los datos de la gráfica, damos click al botón que nos permite exportar los datos a Excel, el cual nos hará la gráfica de Temperatura vs Tiempo y nos entrega dos columnas con los datos de Tiempo y Temperatura.

Restamos a los datos de la columna de Temperatura el valor de Tf que sería el valor de la temperatura ambiente y luego calculamos el logaritmo natural; el valor de Ti corresponde al primer valor obtenido por el sensor de temperatura. Se traza la mejor recta posible entre los puntos obtenidos y calculamos la pendiente, la cual corresponde al valor de la constante de proporcionalidad k.

Al invertir el valor de k obtenemos un valor en segundos, el cual nos da una idea de la rapidez de enfriamiento.

Se puede usar software de análisis de datos para calcular el valor de las constantes de la ecuación, por ejemplo EUREGA.


Una aplicación de este tipo de sistemas es los hornos, a los cuales se les debe controlar la temperatura para garantizar un buen producto final. AQUI puedes encontrar (página 0x1c) una descripción mas detallada del control de un horno.

DESCARGAS
CtrlTEMP - Software para la adquisición de datos de Temperatura y Tiempo

lunes, 29 de marzo de 2010

Mando Infrarrojo

A la hora de configurar algún dispositivo, se hace uso de los teclados, que, por lo general, hacen uso de muchos pines para gestionar las teclas por multiplexación. Aún cuando es un método muy utilizado, a veces nos trae problemas, sobre todo cuando necesitamos esos preciados pines de I/O.

Una forma muy útil de tener un teclado, es usar un mando de TV (y de paso aprovechamos que son muy económicos y fáciles de conseguir) el cual envía tramas características para cada tecla. Estas tramas se pueden adquirir por un solo pin del microcontrolador haciendo uso de un sensor de recepción infrarroja como el TSOP17xx.

Hay diversas frecuencias de trabajo para los mandos de TV: 38kHz, 40kHz, etc. Según la frecuencia de trabajo son las xx del sensor, por ejemplo: para 38kHz, está el TSOP1738.

Este sensor, nos entrega por su pin de salida, la señal modulada en ancho de pulso, lo cual evita interferencias y demás. Una trama característica, por ejemplo para la tecla POWER de un control es:


Al revisar un poco la literatura acerca de los protocolos que hay para los mandos infrarrojos, encontramos algunos como el famoso RC5, el NEC32, etc. Al revisar la trama, vemos que coincide con la del NEC32 ya que envía 32bits y envía un byte y luego el mismo pero negado.

Para recibir la trama captada por el sensor, usamos un pin que posea interrupción externa con el pin RB0 o el CCPx, este último posee también relación con los timer lo cual facilita la forma de calcular el tiempo que dura cada pulso de la trama.

Los tiempos a tener en cuenta son:


  • t1 = 2.24mS
  • t0 = 1.12mS
  • ts = 13.5mS


  • El tiempo se cuenta entre cada flanco ascendente o descendente, según como lo configuremos.

    Un código alternativo podría ser el siguiente:
    #int_CCP1
    void RecepcionIR(void)
    {
    set_timer1(0);
    
    if(FlagInicia)
    {
    if(CCP_1>=625 && CCP_1<=760)
     bit_clear(ByteNEC32,Count++);  
    if(CCP_1>=1250 && CCP_1<=1500)  
     bit_set(ByteNEC32,Count++);
    }
    if(CCP_1>=8062 && CCP_1<=8688)
     FlagInicia=1;
    } 


    Esto si tenemos un cristal de 20MHz y configuramos el Timer1 con un preescaler de 8, para obtener un Tick de 1.6uS.

    Como aplicación, se tiene un reloj el cual enciende un relé cada hora durante 1 minuto -predefinido-. La configuración de la hora y la fecha y el encendido y apagado del relé -a gusto del usuario- se hacen mediante un mando infrarrojo.



    domingo, 17 de enero de 2010

    Matriz de LED

    Uno de los mejores métodos para indicar información es por medio de pantallas LED, que, aunque costosas, dan muy buenos resultados a la hora de llamar la atención, gracias a su luminosidad.

    Para generar la sensación de que la matriz muestra los datos, se usa el método de multiplexación, el cual consiste en ir encendiendo, fila a fila o columna a columna, de un forma secuencial, los respectivos LED, dentro de un arreglo de los mismos, a lo cual le llamaremos Matriz LED.

    Por ejemplo, si quisiéramos encender el LED encerrado en el círculo rojo, deberíamos conectar los 2v al pin R3 (en los demás 0v) y conectar a 0v al pin C2.

    Una de las cosas importantes para que nuestro letrero quede llamativo, es garantizar su luminosidad, y esto se logra suministrando la corriente necesaria para ello. No olvidemos que en estos casos, los LED van a estar encendidos una fracción de tiempo unicamente y por ende hay que elevar la corriente que pasa a través de el. Un microcontrolador no suministra la suficiente corriente para este caso, por lo que es recomendable usar transistores BJT o MOSFET según sea el caso.

    El hardware básico para manejar una matriz de LED de 7 Filas por 5 Columnas puede ser el siguiente (en el cual está incluido un conector MiniUSB para la programación del microcontrolador via ICSP).



    Después de varios minutos de ruteado ...


    Ya teniendo el hardware básico, podemos adentrarnos en el manejo del firmware del microcontrolador para lograr, en este caso, visualizar algunas letras en nuestra matriz de LED.

    Como bien se dijo al inicio de este hilo, se usa la multiplexación para generar la sensación de continuidad de encendido de los LED. El tiempo al cual se enciende y/o se apagan los LED puede ser de 1 o 2 milisegundos, con lo cual no se observaran parpadeos en la matriz.

    Se puede usar una interrupción del Timer0 para controlar la multiplexación de las columnas, un código alternativo puede ser:

    #int_TIMER0
    void visualizar(void)
    {
    Ints++;
    if(Ints>=8)
    {
    Ints=0;
    FlagOk=1;
    output_a(0xFF);
    }
    }

    En el programa principal, se validaría la bandera FlagOk para visualizar los datos correspondientes a cada columna.

    while(true)
    {
    if(FlagOk)
    {
    FlagOk=0;
    if(i>6)
    i=0;
    output_b(Fila[i]);
    output_a(ColLetra[i]);
    i++;
    }
    }

    Los datos correspondientes a cada fila se guardan en un buffer y se toman de un arreglo bidimensional guardado en la ROM del PIC. Para la letra A, por ejemplo, se tiene:

    const char May7x5[27][7]={
    {0x0E,0x13,0x13,0x13,0x1F,0x13,0x13},//A
    ....
    };

    Para cambiar la letra, usamos los pulsadores:

    if(!input_state(BT1))//Verifico el estado del pulsador BT1
    {
    j++;
    memcpy(ColLetra,May7x5[j],sizeof(ColLetra));
    }






    Aunque en el video no se alcanza a distinguir muy bien el mensaje, no es asi en realidad, cosas de las camaras digitales.






    DESCARGAS:
    PCB : Tarjeta de ensamble
    CÓDIGO: Simulación en ISIS y .hex para programar

    sábado, 16 de enero de 2010

    DiscoPlay

    Normalmente cuando se usan letreros luminosos basados en LED, uno de los grandes obstaculos se presenta cuando definimos el tamaño del mismo, ya que nosotros queremos el mas grande posible...y esto hace que los costos de fabricacion sean muy altos para la mayoria de nosotros.

    Una mejor opción es usar pocos LED y que nos de la sensación de tener muchos LED's, es lo que sucede cuando ponemos a girarlos. Esto se debe a que el ojo humano solo puede resolver (o diferenciar) la frecuencia de movimiento de cuerpos a un bajo periodo de tiempo, caso que podemos aprovechar para crear la sensacion que buscamos.

    Si tenemos un arreglo de 5 LED girando y los encendemos, nos da la sensacion de que hay 5 barras luminosas .... asi que solo es cuestion de controlar el encendido y apagado de estos 5 LED para crear mensajes.




    El hardware de visualizacion es mucho mas sencillo y mas econónimo de realizar que un letrero publik, ya que solo consta de 5 LED, 5 transistores, 10 resistencias.

    Usaremos tambien, en esta primera versión, un microcontrolador PIC12F629 configurando su oscilador interno de 4MHz, con lo cual nos quedan libres los pines del oscilador para usarlos como pines de I/O normales.

    Lastimosamente, el pin de MCLR no se pude usar, ya que, por conflictos con el programador hay que decidir si se usa el oscilador interno o el pin de MCLR, otro inconveniente es que no tenemos mas pines para detectar una referencia con algun sensor (Hall o IR) para indicar el inicio de giro, por lo que hay que adaptar el código para el motor; el cual, se encargará de dar giro a nuestro desarrollo.

    La ventaja es que la brd es pequeña y puede alcanzar, incluso, en ventiladores como los que se usan en PC's, claro está, con una resolución de 5 filas para dibujar las letras, si ya se quiere letras mas grandes y demás, solo es cuestion de migrar a otro microcontrolador como el 16F628A y usar ademas algún pin para detectar el inicio de giro ... podriamos decir que sería una proxima tarea para el DiscoPlay :)

    Aqui la board del DiscoPlay con los LED's, resistencias y transistores en SMD:

    Para visualizar la palabra HOLA, por ejemplo, se debe seguir la siguiente rutina de encendido y apagado de los LED's.

    En donde los cuadros negros indican el LED encendido y los cuadros blancos indican el LED apagado, no olvidemos que el barrido es de forma horizontal, es decir, columna a columna. En camara lenta seria asi:



    Por ahora no poseo el motor para montar al DiscoPlay, asi que para la demostración basta con sacudirlo un poco para ver como se forman las letras, en este caso.