SejoProyectos: Verano 2011

Thursday, May 19th, 2011

Ahora que empezaron las vacaciones, no hay que desaprovechar la gran oportunidad que se nos está dando para realizar proyectos sin presiones y distracciones de la escuela.

En este post describo varios proyectos que tengo ganas de realizar este verano, los publico porque pienso que estaría muy bien que colaboráramos entre varias personas para desarrollarlos.

Cada proyecto tiene su título, una pequeña descripción, y una lista de actividades generales que el proyecto implica. Cuando dice diseño de hardware digital se refiere a usar VHDL e implementarlo en FPGA. Las actividades que contienen la palabra software están pensadas para ser realizadas principalmente en C o en Python, aunque también se aceptaría Java. Diseño y elaboración de PCBs implica hacer esquemáticos y plantillas de PCBs (Printed Circuit Boards), además de armarlos físicamente.

Si están interesados en trabajar en alguno de ellos o si tienen otras propuestas, no duden en contactarme a través de los comentarios de este post, de Twitter (@SrSejo) o de Facebook.

Redes neuronales en hardware: reconocimiento de imágenes

Aprovechando la flexibilidad y paralelismo de las FPGAs, en este proyecto se implementarán redes neuronales en ellas. La idea es tener una respuesta inmediata al recibir un estímulo nuevo, lo que le permitiría un funcionamiento óptimo en aplicaciones donde se requiere velocidad. Tengo interés en usarlas para reconocimiento de imágenes, especialmente en reconocimiento de caracteres escritos.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software de interfaz PC – hardware.

Analizador lógico de múltiples canales

Un analizador lógico es un dispositivo que presenta los estados de una señal digital en función del tiempo. En el laboratorio usamos osciloscopios con este fin, con la gran desventaja de que solo cuentan con dos canales debido a la naturaleza analógica de sus posibles entradas. Este proyecto consiste en diseñar un módulo de hardware digital que al conectarlo a una computadora cumpla la función de analizador lógico de múltiples canales.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software de despliegue (graficación) de señales / datos.
  • Software de interfaz PC – hardware.
  • Diseño y elaboración de PCBs.

Brainfuck microcomputer

Brainfuck es un lenguaje de programación ‘esotérico’ consistente en solo ocho instrucciones de un caracter de longitud cada una. La idea de este proyecto es diseñar un procesador junto con hardware periférico mínimo (e.g. interfaz serial) para obtener una computadora que funcione a base de Brainfuck compilado.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software ensamblador / compilador de Brainfuck.
  • Software de interfaz PC – hardware.

Ropa con LEDs

Inspirado en tendencias actuales, este proyecto interdisciplinario (ingeniería + diseño) tiene como fin desarrollar prendas de vestir con LEDs que se encienden por acción de un microcontrolador.

Actividades / Temas:

  • Programación de microcontroladores.
  • Diseño de modas / gráfico / industrial.
  • Diseño y elaboración de PCBs, arreglos de LEDs e interconexiones.
  • Software de interfaz PC – hardware.

Experimentación con distintos microcontroladores y microprocesadores

Más que un proyecto, quisiera hacer pruebas con las siguientes plataformas: ATmega16 (el microcontrolador que sustituirá al 8051 en la materia de Microcontroladores), MicroBlaze (soft-processor de Xilinx que se puede implementar en una FPGA), x86 y x86_64 en Linux

Actividades / Temas:

  • Programación en lenguaje ensamblador.

Engineering: making your dreams come true 😛

PCB para Sistema Mínimo del AT89S51

Sunday, February 13th, 2011

La práctica 3 del Laboratorio de Microcontroladores consistió en armar (con cablecitos) y soldar una tarjeta con los componentes indispensables para hacer funcionar al microcontrolador AT89S51. Si bien ya se entregó, quise reforzar mis conocimientos de diseño de PCBs (Ver post anterior), por lo que hice este proyecto en KiCad.

En primer lugar tuve que crear el símbolo del microcontrolador para usarse en EESchema (el programa de KiCad para hacer esquemáticos). Aquí está el archivo de la librería que lo contiene: Librería de Kicad con el AT89S51

Luego ya lo usé para crear el esquemático y después la PCB (vuelvo a recomendar este tutorial)

Les dejo un screenshot del resultado

Ya la mandé a hacer, por lo que este post tampoco ha concluido…

De aquí se pueden bajar los archivos del proyecto: Archivos de Kicad para el Sistema Minimo del AT89S51

Controlador de marquesina en matriz de LEDs usando la serie 7400

Sunday, February 13th, 2011

Hace tiempo, cuando me iba a cambiar de carrera a ITSE, la directora de carrera Katya me dijo que las materias iniciales de Sistemas Digitales eran importantes porque luego la gente se envicia con los microcontroladores y quiere solucionar todo con ellos siendo que habría soluciones más sencillas “usando solo unas compuertas”. No sé por qué se me quedaron tan grabadas esas palabras…

Es sabido que la primera práctica verdadera (es decir, de programación) del Laboratorio de Microcontroladores en el Tec CCM es hacer una marquesina en una matriz de LEDs de 8 (o 7) columnas por 16 (o 15) renglones. Un mapa de bits (¿obligatoriamente son las letras ABCD?) se muestra en la matriz y avanza a través de ella.

Sé que me emocionaré cuando mi programa en lenguaje ensamblador del 8051 logre hacer eso (todavía no llego a la práctica). Como sea, pensé en el proyecto que describo en este post (y lo desarrollé y escribí) solo(1) para probar que la marquesina es algo que se puede hacer desde que se tienen los conocimientos de Sistemas Digitales 1 (o Arquitectura Computacional y Sistemas Digitales en el caso de los ITC), y que tal vez no hay que hacer tanto fuzz por poderlo hacer hasta Microcontroladores. (Sí, sí, qué arrogancia la mía)

(1) también lo escribo para documentar mis actividades extraacadémicas

Empecemos…

El problema:

Presentar una marquesina en el sistema de matriz de LEDs que armamos en la práctica 1 del Laboratorio de Microcontroladores(2) utilizando chips de la familia 7400 de TTL y una EPROM.

(2)El sistema de matriz de LEDs tiene dos buses de entrada: uno de 4 bits donde está codificado el número de columna (de 16 posibles) a activar, y uno de 8 bits que consiste en la combinación de LEDs a encender en la columna activada.

Objetivos de la solución:

  • Controlar los buses del sistema de matriz de LEDs (a partir de ahora lo llamaré solo matriz de LEDs) para que muestren (¡en lucesitas encendidas! jaja) un mapa de bits guardado en una memoria
  • Controlar la posición (movimiento cíclico) del mapa de bits en la matriz de LEDs.

Solución propuesta:

Como la matriz de LEDs solo puede encender una columna a la vez, para mostrar una imagen en ella hay que hacer dos cosas:

  1. Encender (activar) por una fracción de tiempo cada columna, a una frecuencia lo suficientemenet alta para que engañar al ojo humano y hacerlo creer que todas están activas a la vez
  2. Encender los LEDs que corresponden a la imagen de acuerdo a qué columna está  activa.

Para el punto 1 solo hay que usar un contador funcionando a la frecuencia adecuada. El valor del contador se envía a la matriz de LEDs a través del bus de columnas, y ella se encarga de decodificar el valor del contador para activar una columna.

Para el punto 2 hay que decodificar el valor del contador para mostrar un patrón de bits correspondientes. La solución que encuentro más flexible es usar una ROM donde las direcciones se asocian a las columnas, y el dato almacenado es la combinación de bits a mostrar que se manda al bus de renglones de la matriz.

Por otro lado, hay que hacer que el mapa de bits “avance cíclicamente” dentro de la matriz, es decir: si el patrón está en la primera columna pasa a la última, y si está en cualquier otra columna N, pasa a la columna N-1.

Para esto propongo un contador que guarde la dirección en memoria que en un momento dado corresponde al dato de la primera columna, es decir que funcione como apuntador. Haciendo avanzar a una determinada frecuencia a este contador, el dato correspondiente a la primera columna también avanza.

Ahora, ¿cómo usar este apuntador para conocer el dato correspondiente a TODAS las columnas? Fácil: le sumamos el valor del contador de columnas, y el resultado es la dirección del dato a acceder. Por ejemplo, trabajando con 4 bits, si el apuntador vale 0xD, la dirección del dato de la columna 0x0 es 0xD, para 0x1 es 0xE, para 0x2 es 0xF, para 0x3 hay overflow y el resultado es 0x0, pero no es problema (al contrario) porque estamos “regresando” dentro de la imagen (guadada entre 0x0 y 0xF) logrando que avance cíclicamente.

Para hacer funcionar el contador con el apuntador, si bien podríamos usar otra señal de reloj, es preferible utilizar el mismo que se usa para el contador de columnas, pero con una frecuencia dividida usando contadores. La primera división de frecuencia puede ser el mismo contador de columnas: el bit más significativo va a llevar la frecuencia de actualización (¿refrescamiento?) de la matriz completa. Usando este bit como reloj para otro contador podemos obtener frecuencias divididas que luego podemos escoger con un multiplexor controlado con switches.

A continuación un diagrama a bloques del asunto

Aterrizando la idea

Ayudado con la lista en Wikipedia de los chips de la serie 7400, hice la siguiente lista de materiales para este sistema:

  • 2 Dual 4-bit Binary Counter 74393(3). Esto nos da cuatro contadores de 4 bits. Uno lo usamos para las columnas, otro para el apuntador, y los otros como contador de 8 bits para el divisor de frecuencia
  • 1 4-bit Full Adder 7483. Para sumar el apuntador con el valor de columna
  • 1 8-line to 1-line Multiplexer 74151. Para escoger entre las ocho opciones de frecuencia dividida
  • 1 EPROM 2732. Memoria para guardar el mapa de bits.(4)
  • Headers dobles y sencillos. Para las entradas y salidas
  • DIP Switch de 4 bits, 3 resistencias de 1kOhm. Para controlar el multiplexor

(3) Los conseguí en TuProyecto.com, me dijeron que tuvieron que ir hasta quiensabedonde para comprarlos porque no son comunes. Se pueden reemplazar por cuatro 4-bit Binary Counter 7493

(4) Es de 4kx8, lo que es demasiado considerando que solo usaremos 16 de esas 4k direcciones. La escogí solo porque es la que le pidieron a los ITCs de mi generación, pero podría ser cualquier otra mientras tenga al menos 16 localidades de 8 bits. También recomendaría comprar una base para poder quitarla y reprogramarla fácilmente

Esquemático y diseño de PCB

Ya con los materiales, hice el esquemático y diseño del PCB en KiCad, ayudado con este tutorial. Aquí unos screenshots:

De aquí se pueden descargar los archivos del proyecto: MatrizTTLs

Armado del circuito

Aquí hay una foto de los materiales:

La PCB la mandé a hacer en una máquina de control numérico computarizado (CNC) que tienen en el Tec Campus Santa Fe, así que esto todavía no termina…