lunes, 10 de octubre de 2011

Red de área de almacenamiento (SAN)


Continuando con el tema de sistemas virtualizados e implementación de servidores, encontramos que en las compañías en donde se implementan servidores de gama media-alta, por lo general la capacidad de almacenamiento requerida supera los 5 TB. Para este tipo de soluciones, encontramos que el almancenamiento de la información dentro del mismo sistema de los servidores, puede no ser tan práctico, y es posible que se queden cortos en el momento de querer expandir el crecimiento del sistema.

Hoy en día, para servidores virtualizados y que corren aplicaciones en la nube, y de alta disponibilidad, es una mejor opción separar el almacenamiento de los servidores, y una SAN es una forma óptima de hacerlo.

Una SAN es básicamente un arreglo de discos duros, los cuales se encuentran administrados por controladoras especializadas, encargadas de gestionar las conexiones, transacciones a cada uno de los discos, y generar los arreglos de almacenamiento con redundancia para evitar pérdida de información en caso que falle algún disco. La SAN se diferencia de otro tipo de arreglo, como la (NAS - Network Attached Storage), en que la comunicación se realiza a muy bajo nivel, por ejemplo, mientras un servidor conectado a la NAS solicita un archivo en una ruta específica, un servidor conectado a la SAN solicita la información contenida en un bloque específico de un disco dado. Lo anterior hace que la comunicación entre los servidores y el sistema de almacenamiento sea más óptima y veloz en una SAN.

La conexión entre la SAN y el servidor se puede realizar a través de dos canales: fibra óptica o iSCSI. Mientras que por fibra la conexión es muy rápida, también implica altos costos en su implementación, pues requiere de tarjetas HBA y switches de fibra que son costosos. Por otro lado, mediante iSCSI los costos son menores, pero se sacrifica la velocidad.

A continuación se muestra un diagrama comparativo de los sistemas de almacenamiento:


De la figura anterior, se observa que la comunicación entre almacenamiento y servidor, se hace a más bajo nivel.

Últimamente en la compañía se realizó la implementación de un sistema AX4-5, originalmente fabricado por la compañía EMC, pero comercializado por DELL. Los componentes de esta unidad son: 1 sistema de controladoras, 1 enclosure de discos, 1 sistema de fuentes de alimentación de las controladoras. La instalación del sistema fue bastante sencilla, y se logró configurar de forma correcta.

La administración del sistema se hace a través de una interfaz web, a la cual se accede por la dirección IP que se le asigne a las controladoras de la SAN.

Se realizó conexión directa a 4 servidores con sistema operativo Vmware ESX, a través de fibra óptica y una vez conectados, las controladoras los reconocen automáticamente y ya es posible crear los diferentes grupos de almacenamiento y unidades lógicas de almacenamiento o LUNs, las cuales son reconocidas por los servidores como si fueran discos duros independientes.

A continuación comparto algunas fotos del sistema:

Vista Posterior de sistema de almacenamiento. De arriba hacia abajo: Enclosure de discos, unidades controladoras, fuentes de alimentación de controladoras.

Vista posterior de sistema de almacenamiento.


martes, 26 de julio de 2011

Redes VPN

Normalmente los terminales de las compañías y oficinas se encuentran interconectados a través de una Red de Acceso Local (LAN), la cual permite que los equipos puedan intercambiar información, y compartir recursos: archivos, carpetas e impresoras. Para que los equipos puedan tener acceso a esta red, tienen que estar conectados directamente a ella, ya sea a través desde un punto de acceso físico conectado a un switche y un router, o a través de una conexión inalámbrica. Los equipos que no estén cableados a la red, o que no tengan alcance a la red inalámbrica no podrán unirse a ésta, ni usar los servicios de la misma.

Algunas veces se hace necesario interconectar dos redes, o un terminal con una red remota, por ejemplo, para el caso de un empleado que debe tener acceso a sus archivos en su terminal de la oficina desde un sitio remoto, o interconexión entre dos filiales de la empresa. 

Internet permite el intercambio de datos entre dos equipos cualesquiera que se encuentren conectados a la Red; sin embargo, se presentan dos inconvenientes principales: Generalmente las direcciones IP son dinámicas, y únicamente los servidores y algunos equipos con privilegios mantienen direcciones IP públicas fijas; adicionalmente, Internet es una red pública, en la cual toda la información que se transmita está sujeta a ser interceptada y manipulada por terceros. De esta forma, transmitir datos directamente por Internet, sin ningún tipo de seguridad, es peligroso, sobre todo para las empresas que deben mantener reserva de mucha información relevante.

De acuerdo a las necesidades anteriormente planteadas, surgen las redes VPN (Red Privada Virtual), las cuales permiten crear redes con equipos que físicamente se encuentran distribuidos en diferentes redes locales. El medio de transmisión de la información de las VPN es a través de Internet, sin embargo, los datos son cifrados, de tal forma que únicamente pueden ser interpretados por el terminal y por el servidor de acceso de la VPN. En la siguiente figura se muestra el esquema de una red VPN:


Las redes VPN constan de un servidor VPN, encargado de gestionar las conexiones entrantes de los clientes, y de cifrar la información que se transmite a través de la red. Una vez un usuario se conecta, éste recibe una dirección IP virtual, tal como si se estuviera conectando a una red LAN, y como si un router le asignara una IP para la red local. Una vez conectados, los usuarios pueden compartir archivos, usar servicios como SSH, escritorios remotos, etc., estando físicamente en diferentes partes del mundo, y conectados a redes locales independientes, únicamente con acceso a Internet.

Existe una gran cantidad de herramientas para implementar VPN, algunas de ellas gratis, y otras licenciadas. El uso de la herramienta, depende de la aplicación final y del nivel de seguridad y operatividad deseado para la red. La herramienta OpenVPN es una herramienta adecuada y fácil de usar para la implementación de redes virtuales. En la página de OpenVPN se puede encontrar muy buena información y documentación para su manejo y administración.


jueves, 21 de julio de 2011

Virtualización de servidores

Hoy en día las pequeñas y medianas empresas, especialmente las del sector tecnológico, tienen la necesidad de implementar un servidor, en el cual puedan albergar servicios como: sitio Web, administración de documentación, plataformas de gestión de proyectos y de personal, almacenamiento de datos; y para empresas más especializadas: bases de datos, servidores de correo, servidores de autenticación, entre otros.

Los equipos y el hardware de los computadores avanza a pasos agigantados, y hoy en día es posible adquirir un equipo con capacidades excepcionales, a muy bajo costo relativo. De esta forma, los servicios de virtualización aprovechan estas capacidades de alto rendimiento de los servidores que se pueden adquirir en el mercado de hoy en día, y así es posible tener una gran cantidad de servidores virtuales, con uno o unos pocos servidores físicos.

Entre las principales ventajas que tienen los servidores virtualizados se encuentran:
  1. Poco hardware: Para tener muchos servidores ya no es necesario tener grandes centros de cómputo con complejos sistemas de interconexión, redes, fuentes de alimentación, y un gran consumo de energía. Por ejemplo, se pueden implementar fácilmente 50 servidores en un equipo físico con muy buenas características, instalado en un solo rack.
  2. Balance de cargas: Con los sistemas de virtualización existentes es posible sacarle un provecho máximo al hardware de procesamiento, ya que el sistema de administración de recursos permite asignar recursos a cada máquina dependiendo de sus necesidades, y de esta forma se asignan más recursos a los servidores que más carga tengan en el momento, y se liberan recursos de servidores que tengan poco trabajo.
  3. Alta disponibilidad: Es posible tener siempre servidores de backup para el caso que alguno se caiga o falle, el otro pueda entrar sin tener ni un solo instante de corte de servicio. Adicionalmente, el software de virtualización permite ingresar y retirar servidores sin necesidad de tener que apagar el sistema.
  4. Integración con otras herramientas: Las compañías que fabrican el software de virtualización incluyen herramientas interesantes que permiten ser aplicadas con la virtualización de servidores. Entre las herramientas que se ofrecen, se encuentra una para virtualización de escritorios, la cual le permite a los clientes tener toda la información y aplicaciones almacenadas en el servidor, pudiendo acceder desde cualquier parte y desde cualquier terminal con conexión a Internet.
Las dos principales compañías que fabrican software de virtualización para servidores son Vmware y Citrix.

Para una mayor información sobre software de virtualización, consultar la documentación en línea de Vmware y de Citrix.

jueves, 14 de julio de 2011

Single board computer

Un single board computer es básicamente una tarjeta que incluye todos los elementos que debe tener un computador tradicional, como procesador, memoria RAM, memoria no volátil, conectividad de red, puertos USB, salida para monitor, entre otros. Esta tarjeta es de un tamaño mucho más reducido que una motherboard normal.

En un sinble board computer es posible instalar un sistema operativo (Linux, android, inclusive Windows), y permite tener casi las mismas capacidades que un computador común y corriente, teniendo en cuenta que tiene recursos de procesador y memoria más limitados, pero trae consigo tres beneficios clave para determinadas aplicaciones: bajo costo, tamaño pequeño y bajo consumo de energía.

De esta forma, es posible desarrollar aplicaciones que requieran una gran cantidad de procesamiento, o interfaces de red e Internet, las cuales no se pueden implementar en un sistema con un microcontrolador, o sería demasiado complejas de diseñar desde ceros. Así, la implementación de la solución se reduce al desarrollo de software, sin tener que preocuparse por el hardware de interfaces de red, memoria, procesamiento, etc.

El equipo EFIKA MX SMARTTOP es un buen equipo, que incluye el sistema operativo Linux y soporta la ejecución de aplicaciones en python, c, c++, servicios Web, etc. A continuación se muestra una imagen de este sistema:

Las especificaciones técnicas del hardware son las siguientes:
  • Procesador Freescale i.MX515 (ARM Cortex-A8 800 MHz)
  • Unidad de procesamiento de gráficos 3D
  • Salida de video HDMI
  • 512 MB de RAM
  • Almacenamiento no volátil SSD de 8 GB
  • Ethernet de 10/100 Mbit/s
  • WiFi 802.11 b/g/n
  • Lector de tarjetas SDHC
  • 2 puertos USB
  • Salida de audio estéreo con jacks de 3.5 mm
  • Entrada de micrófono con jack de 3.5 mm
  • Parlante incorporado
  • Peso: 250 gramos
  • Dimensiones: 160 x 115 x 20 mm
Como se puede observar, incluye todas las características básicas de un computador de escritorio, y se envía con sistema operativo Linux Ubuntu preinstalado, de tal forma que únicamente basta con conectar teclado y mouse y encenderlo para comenzar a usarlo.

Lo más atractivo de este sistema son sus dimensiones y peso, lo cual lo hace útil incluso para ser usado en aplicaciones vehiculares, además es muy robusto pues no incluye partes móviles (disco duro); adicionalmente su consumo es bajo (menor que 5W a 12V), por lo cual es factible para ser usado en aplicaciones alimentadas con baterías.

Otro aspecto a fundamental para considerar un equipo de este tipo para determinada solución es su precio, aproximadamente 130 USD, el cual es muy reducido en comparación al precio de un computador de escritorio o portátil convencional.

En OSP Ltda. se adquirieron estos dispositivos con el fin de evaluarlos, y se llevaron a cabo las siguientes pruebas de forma exitosa:
  • Conexión a red WiFi.
  • Acceso a internet.
  • Permite instalación de aplicaciones haciendo uso de la herramienta de gestor de paquetes de Ubuntu.
  • Servidor de escritorio remoto.
  • Ejecuta correctamente aplicaciones desarrolladas en Python.
  • Soporta una Webcam conectada al puerto USB y permite capturar imágenes y videos.
  • Ejecuta aplicaciones tipo Web implementadas en en framework Django con el servidor Web de desarrollo de python.
Esta es una muy buena herramienta, con la cual se han obtenido buenos resultados en las pruebas que se han realizado, y es completamente recomendable para desarrollar aplicaciones en las cuales es necesario el poder de procesamiento y hardware de un computador, pero se requiere reducir tamaño, consumo y costos.

Dejo un video muy interesante de una conferencia donde se explica detalladamente el sistema:





martes, 28 de junio de 2011

Programador AVR dragon

Cuando se hace uso de microcontroladores para el desarrollo de aplicaciones, es necesario tener ciertas herramientas. Una herramienta esencial para desarrollar firmware para aplicaciones embebidas es el programador. Éste es fundamental, pues permite descargar el archivo compilado a la memoria de programa del dispositivo, e incluso permite programar la memoria de datos no volátil EEPROM. Sin un programador sería imposible desarrollar aplicaciones embebidas.

Los dispositivos AVR pueden ser programados de múltiples formas; sin embargo la más común y sencilla es a través de ISP. En cuanto a programadores, es posible fabricar un programador sencillo usando únicamente el puerto paralelo, el correspondiente cable y unas cuantas resistencias; sin embargo, como hoy en día ya casi ningún computador tiene puerto paralelo, esta opción no sería muy viable. Por otra parte, también es posible encontrar en línea diseños de programadores que hacen uso del puerto serial, pero lastimosamente también es obsoleto y se tendría que usar un cable convertidor o buscar otro tipo de solución.

Los programadores que se mencionaron anteriormente son de fabricación manual, y pueden fallar de vez en cuando en el momento de programar, por lo cual, siempre se debe efectuar verificación sobre la memoria programada.

Otra opción que es muy práctica, es el uso de bootloaders, que aprovechan una sección de la memoria de programa para guardar una rutina especial que permite auto-programar el dispositivo, el cual recibe los datos a través de un puerto serial o incluso USB. Este es el caso de los microcontroladores USB de Atmel, los cuales vienen por defecto con un bootloader que les permite ser programados a través del puerto USB, haciendo uso de un sencillo programa de Atmel (FLIP), que puede descargar y usar de forma gratuita. Sin embargo, este programa no funciona en el momento que se modifique el inicio del microcontrolador para que funcione como dispositivo USB y se realicen aplicaciones usando esta interfaz. Para este caso sí es necesario usar un programador.

Existen muchos programadores comerciales, sin embargo, una muy buena opción es el AVR DRAGON. Este programador es muy completo, y permite programación tanto a bajo voltaje como a alto voltaje, y además incluye una función de depuración sobre hardware, permitiendo incluir breakpoints en hardware.



¿Cómo usar esta herramienta?

Si es usuario de Windows, se recomienda usar el Dragon junto con el IDE AvrStudio de Atmel, el cual incluye una interfaz gráfica muy sencilla y una gran cantidad de herramientas para programar y depurar dispositivos. Permite modificar de forma amigable los fusibles del microcontrolador y escribir tanto en la memoria flash como en la EEPROM. Soporta todos los modos de programación del Dragon, y también permite actualizar el firware, y modificar parámetros como la frecuencia de oscilación del programador.

Lastimosamente la herramienta AvrStudio no está disponible para Linux, y si se tiene este sistema operativo se debe hacer uso de otra aplicación. La aplicación en Linux más usada para controlar el Dragon es el AvrDude, el cual se puede bajar e instalar fácilmente desde Internet; incluso está disponible en los repositorios de Ubuntu. En este caso, es necesario hacer la programación desde una ventana de comandos, donde se indica el dispositivo a programar, el modo de programación, la memoria a programar, etc. A continuación se muestra un ejemplo de comando de programación de dispositivo:

sudo avrdude -p atmega32u4 -c dragon_isp -P usb -U flash:w:programa.hex 

Para el anterior ejemplo "-p" indica el microcontrolador objetivo, "-c" el programador y el modo de programación, "-P" es el puerto al cual se encuentra conectado el programador y el comando "flash:w:programa.hex" indica que se escribirá la memoria flash con el programa almacenado en el archivo "programa.hex".

Por otra parte, el AvrDude incluye un modo consola, útil para depuración o para verificar sectores específicos de cualquiera de las memorias del microcontrolador. A continuación se muestra la forma para ingresar al modo terminal de AvrDude:


sudo avrdude -p atmega32u4 -c dragon_isp -P usb -t

Para este caso, se tienen en cuenta los mismos parámetros especificados anteriormente, excepto que se da la opción "-t" que indica entrada a modo consola.

Para información adicional acerca del AvrDragon, AvrStrudio o AvrDude, es posible encontrar muy buena documentación en línea en la página de Atmel, y en la página de documentación oficial de AvrDude.

Como recomendación final: el Dragon es una herramienta muy poderosa, pero también es extremadamente delicado, pues no incluye una caja de protección, sino que el circuito se encuentra completamente expuesto. No se debe tocar directamente, para evitar daños por descarga electrostática, tampoco se debe tocar cuando esté en funcionamiento porque se pueden ocasionar daños en los circuitos. Se debe tener mucho cuidado también para evitar cortocircuitos en los pines de programación, voltaje de alimentación adecuado, y conectar correctamente los correspondientes pines, por lo cual se deben revisar las conexiones dos veces antes de energizar y programar.

Link recomendado: http://www.administracionsatelital.com/

lunes, 13 de junio de 2011

Convertidor análogo-digital

Casi todas las variables que se pueden medir en la naturaleza varían de forma continua: sonido, luminosidad, humedad, temperatura, etc. Así, las señales que miden una variable física, constan de una serie de valores que cambian constantemente a lo largo de su variable independiente (generalmente tiempo o espacio). Por otra parte, los sistemas de control y de procesamiento son dispositivos completamente digitales, es decir, solamente aceptan determinados valores dentro de un rango específico. De esta forma, se deben controlar sistemas de naturaleza análoga, con dispositivos digitales.


Para convertir una variable física en una señal digital que pueda ser procesada por un microcontrolador, se deben llevar a cabo los siguientes pasos:


  1. Medición: Este procedimiento es realizado por un sensor, el cual incluye un transductor, mediante el cual es posible transformar las variables físicas en variables eléctricas (voltaje y corriente).
  2. Muestreo: Durante el muestreo se digitaliza la variable independiente, la cual generalmente es el tiempo. Para este caso, el muestreo consta en tomar valores de la señal original solamente en determinados instantes de tiempo. Los valores de la señal que se toman, aún conservan su naturaleza analógica.
  3. Cuantización: En el proceso de cuantización se asignan valores discretos a la señal muestreada. La asignación de estos valores depende directamente de la resolución.
  4. Codificación: Es el proceso final, en el cual a cada valor discreto de la señal se le asigna un código determinado, el cual, para el caso de los microcontoladores, es un número binario.

Un ADC lleva a cabo los pasos 3 y 4, cuantizando un determinado valor de voltaje (entre GND Y VCC), y posteriormente codificándolo en un número binario, cuyo rango depende de la resolución del ADC (para el caso de un ADC de 10 bits, entre 0 y 1023).

El módulo ADC de un microcontrolador es uno de sus módulos más importantes, hasta tal punto que la mayor parte de microcontroladores que se encuentran en el mercado hoy en día incluyen un módulo ADC, el cual permite adquirir señales analógicas, procesarlas y posteriormente enviar señales de control.

Existen varias técnicas para la conversión de señales análogas a digitales, entre las más importantes se encuentran: conversión por aproximaciones sucesivas, por integración, por contador y en paralelo. Cada una de estas técnicas tiene sus ventajas y sus desventajas. A continuación se explicará el método de aproximaciones sucesivas, ya que es el método que usa el módulo ADC de los microcontroladores AVR.

Conversión por aproximaciones sucesivas

El convertidor por aproximaciones sucesivas usa un convertidor digital/análogo, un circuito de lógica de control y un comparador. El proceso comienza desde el bit más significativo hasta el menos significativo. Así, la lógica de control activa cada bit y genera una señal análoga con el convertido digital/análogo, esta señal se compara con la señal de entrada y de acuerdo al resultado de la comparación el controlador cambia o deja el bit que se está examinando. Luego se continúa con el siguiente bit menos significativo hasta que se hace el recorrido por todos los bits. En la figura siguiente se muestra el proceso de conversión de un valor análogo (dado por la línea roja) usando un convertidor de 4 bits.



La principal ventaja de esta técnica es que el tiempo de conversión es siempre el mismo para cualquier entrada, pero su desventaja es la necesidad de usar un hardware complejo para su implementación.

Link recomendado: http://www.administracionsatelital.com/

martes, 7 de junio de 2011

Uso del comparador analógico en ATMEGA16

En esta entrada de Blog, mostraré un ejemplo ilustrativo del uso del comparador analógico de un microcontrolador AVR. La implementación se realiza en un microcontrolador ATMEGA16. En dicho ejemplo se usará el comparador para estimar la frecuencia de una señal sinusoidal.

Funcionamiento de comparador

El comparador análogo compara los valores de entrada en el pin positivo AIN0, y en el pin negativo AIN1. Cuando el voltaje en el pin positivo es mayor que el voltaje en el pin negativo, se activa la bandera del comparador análogo. Adicionalmente, se puede usar la salida de comparador análogo para activar la captura de eventos de la unidad Timer1 y también para activar interrupciones por flanco de subida, bajada o conmutación de la salida del comparador.

Por otra parte, es posible seleccionar cualquiera de los pines de las entradas analógicas (ADC7:0) para reemplazar la entrada negativa del comparador análogo. Así, se puede multiplexar la comparación de varias señales, conectadas a diferentes pines del microcontrolador. Para este caso, se hace uso del multiplexor del convertidor análogo/digital, y por tal motivo, éste se debe apagar mientras se realiza la multiplexación del comparador. Si el bit de habilitación de multiplexación del comparador análogo se encuentra activado (ACME=`1'), y el ADC se encuentra deshabilitado (ADEN=`0'), entonces los bits MUX2:0 en el registro ADMUX controlarán el pin de entrada que reemplazará la entrada negativa del comparador.

Ejemplo

Diseñar un programa que permita medir la frecuencia de una señal sinusoidal entre 0 y 5V, haciendo uso del comparador análogo y el módulo de captura del Timer1. La visualización del resultado debe realizarse en un arreglo de 4 displays de 7 segmentos.

Código solución

  1 // Dispositivo = ATMEGA16
  2 // Fclk = 1.0MHz
  3 // Incluir librería matemática libm.a en el proyecto
  4 
  5 #include<avr/io.h>            // Puertos y registros i/o
  6 #include<util/delay.h>        // Tiempos y retrasos
  7 #include<avr/interrupt.h>    // Interrupciones
  8 #include <util/atomic.h>    // Ejecución atómica de bloques
  9 
 10 // Prototipo de funciones
 11 void visualizar(int);    // Función para visualizar un dato en 4
 12                         // displays de 7 segmentos
 13 
 14 // Declaración de variables globales
 15 volatile unsigned int tiempo1=0, tiempo2=0, diff=0;
 16 
 17 int main(void)
 18 {
 19     // Variable flotante para calcular frecuencia
 20     volatile float freq;
 21 
 22     // Variable entera de contador
 23     int i;
 24 
 25     // Asignación de dirección de puertos
 26     DDRA=0xFF;        // Puerto A salida
 27     DDRC=0xFF;        // Puerto C salida
 28     DDRD=0x0F;        // Mitad de puerto D como salida
 29 
 30     // Configuración del comparador análogo
 31     // * El comparador activa el módulo de captura del Timer1
 32     ACSR|=(1<<ACIC);
 33 
 34     // Configuración de Timer1
 35     // * Modo normal
 36     // * Filtro cancelador de ruido en captura
 37     // * Captura por flanco de subida
 38     // * Reloj sin preescalador
 39     TCCR1B|=(1<<ICNC1)|(1<<ICES1)|(1<<CS10);
 40     TIMSK|=(1<<TICIE1);    // Habilitación interrupción de captura
 41 
 42     sei();    // Habilitación de interrupciones globales
 43 
 44     // Ciclo de polling
 45     while(1){
 46 
 47         // Mediante este macro es posible ejecutar un
 48         // bloque de forma atómica, es decir, sin que la
 49         // interrupción interrupa la ejecución de este bloque
 50         ATOMIC_BLOCK(ATOMIC_FORCEON)
 51         {
 52         // Se convierte la diferencia del registro de
 53         // comparación en frecuencia
 54         freq=1E6/((float)diff);
 55         }
 56 
 57         for(i=1;i<50;i++)
 58         // Visualización del valor de frecuencia
 59         visualizar(freq);
 60 
 61     }
 62 }
 63 
 64 // Función para visualizar un número entero de 4 dígitos
 65 // como máximo en un arreglo de 4 displays de 7 segmentos
 66 // de ánodo común, en los cuales los pines de los segmentos
 67 // se conectan al puerto C, y los ánodos se conectan al 
 68 // nibble menos significativo del puerto D
 69 void visualizar(int num)
 70 {
 71     // Vector que contiene el mapeo de cada dígito para
 72     // el display de 7 segmentos
 73     const int mapa7Seg[10]={
 74     0b11000000,    // 0
 75     0b11111001,    // 1
 76     0b10100100,    // 2
 77     0b10110000,    // 3
 78     0b10011001,    // 4
 79     0b10010010,    // 5
 80     0b10000010,    // 6
 81     0b11111000,    // 7
 82     0b10000000,    // 8
 83     0b10010000};// 9    
 84 
 85     // Variable para hacer el recorrido por cada display
 86     volatile char i;
 87 
 88     // Ciclo de graficación en cada display
 89     for(i=0;i<=3;i++)
 90     {
 91         // Se apagan los segmentos antes de cambiar de display
 92         PORTC=0xFF;
 93 
 94         // Cambio de display
 95         PORTD=8>>i;
 96 
 97         // Visualización de dígito
 98         PORTC=mapa7Seg[num%10];
 99 
100         // Tiempo de espera para visualización
101         _delay_ms(1);
102 
103         // División entre 10 y ruptura de ciclo de 
104         // graficación para no mostrar ceros a la izquierda
105         if((num/=10)==0)
106             break;    
107     }
108 
109 }
110 
111 // Rutina de servicio de interrupción por evento de captura
112 // de la unidad Timer1
113 ISR(TIMER1_CAPT_vect)
114 {
115     // Enciende bit 0 del puerto A para verificar
116     // que las interrupciones se ejecuten adecuadamente
117     PORTA=1;
118 
119     // Actualización de marcas de tiempo de eventos
120     tiempo1=tiempo2;
121     tiempo2=ICR1;
122 
123     if(tiempo2 > tiempo1)
124         // Diferencia entre eventos para hallar período
125         diff=tiempo2-tiempo1;
126     else
127         // Si la diferencia es negativa, significa que el
128         // contador tuvo overflow, por tanto se debe añadir 0x10000
129         diff=0x10000+tiempo2-tiempo1;
130 
131     // Apagado del bit 0 del puerto A
132     PORTA=0;
133 }

Diagrama esquemático de la solución


Explicación de la solución

El programa para solucionar este ejemplo hace uso del módulo de captura del Timer1 el cual se conecta a la salida del comparador, detectando de esta forma cada vez que se presente un evento de comparación de voltajes. Para medir la frecuencia de una señal sinusoidal, se compara la señal de entrada con respecto a una referencia de 2.5 V; cada vez que la onda sinusoidal cruza esta referencia, se tendrá medio período de la señal, a partir del cual se puede calcular su frecuencia. En la rutina de servicio de interrupción se agregan un par de líneas que activan y desactivan el pin 0 del puerto A, para verificar que se estén capturando correctamente los eventos.

lunes, 30 de mayo de 2011

USB con microcontroladores AVR

Hoy en día cuando surge la necesidad de crear sistemas embebidos con microcontroladores, los cuales deben interactuar con computadores, se hace completamente necesaria la implementación de una interfaz a través del puerto USB. Anteriormente se hacía uso del puerto paralelo del computador, y posteriormente el puerto serial RS-232; sin embargo, estos puertos se están volviendo obsoletos y ya casi todos los computadores que salen al mercado no disponen de estos puertos.

Para tratar de solucionar este inconveniente, en el mercado se encuentra una popular interfaz que permite convertir desde RS-232 a USB. Sin embargo, implica un costo adicional y más espacio físico. A continuación se muestra una popular interfaz de RS-232 a USB:


De esta forma, es completamentamente recomendable incluir el protocolo USB directamente con el microcontrolador y así aprovechar las ventajas que trae consigo el uso de este tipo de puerto.

Los fabricantes de microcontroladores ya incluyen en sus chips el hardware necesario para hacer uso del puerto USB. Atmel incluye en algunos de sus microcontroladores de 8 bits el hardware necesario para la implementación de puerto USB.

Así, se desarrolló una librería completamente libre para trabajar con USB, tanto en modo HOST como en modo DEVICE. La librería se llama LUFA, y se puede encontrar una documentación muy completa en su página oficial.


Las clases que soporta esta librería son:
  • Audio: Device
  • CDC: Device, Host
  • HID: Device, Host
  • Midi: Device, Host
  • Almacenamiento masivo: Device, Host
  • Impresora: Host
  • RNDIS: Device, Host
  • Imagen fija: Host

La única limitante que tiene esta librería es que funciona únicamente con los microcontroladores USB de AVR. Para quienes no tienen a disposición un dispositivo microcontrolador que incluya en su hardware una interfaz USB, existe la librería V-USB, mediante la cual es posible implementar el protocolo USB con cualquier dispositivo AVR, sin necesidad que éste sea de tipo USB.



La librería V-USB funciona con cualquier microcontrolador AVR con al menos 2 kB de memoria Flash, 128 bytes de RAM y un reloj de al menos 12 MHz. La documentación de esta librería se encuentra en el sitio oficial.

Las dos opciones mencionadas anteriormente son bastante buenas e incluyen una gran cantidad de documentación y ejemplos. Con todas estas herramientas a disposición, hago la invitación a desarrollar proyectos con interfaz USB, y dejar atrás la vieja interfaz RS-232.

martes, 24 de mayo de 2011

Procesamiento de imágenes en Python

El procesamiento digital de imágenes es un tema muy extenso del cual existe una gran cantidad de libros y tratados que explican a profundidad todas las técnicas disponibles para extraer características o información útil a partir de una imagen. En esta entrada del Blog, enunciaré brevemente algunas herramientas que se pueden usar con Python para una aplicación sencilla, haciendo uso de una cámara web conectada al PC.

El procesamiento de imágenes hoy en día tiene un gran rango de aplicaciones, entre las cuales podemos encontrar:
  • Identificación de vehículos infractores
  • Reconocimiento de rostros para seguridad
  • Seguridad en viviendas y locales comerciales
  • Vigilancia de movimiento de vehículos
  • Aplicaciones de automatización industrial y verificación de calidad de productos
  • Robótica y sistemas de visión de robots y autómatas
  • Entre otras...



Adquisición

Si se cuenta con sistema operativo Linux, y una webcam, es bastante sencillo adquirir imágenes a partir de la misma usando un script en Python, únicamente se deben tener instaladas las librerías de opencv (Open Source Computer Vision), y comprobar que la cámara se encuentre listada en los drivers para linux UVC. A continuación se muestran las líneas de código necesarias para tomar una fotografía usando la webcam y convertirla al formato de imagen de Python:

import opencv.adaptors
from opencv import highgui 
import Image

camera= highgui.cvCreateCameraCapture(0)

im = highgui.cvQueryFrame(camera)
mat = opencv.cvGetMat(im)
im = opencv.adaptors.Ipl2PIL(mat) 

Preprocesamiento

Por su parte, la librería de imágenes de python (PIL) contiene una gran cantidad de herramientas que permiten procesar la imagen de forma adecuada para analizarla. Así, es posible realizar diferentes tipos de transformaciones como rotación, traslación, aumento, reducción, efecto de lentes, operaciones matemáticas, diferentes tipos de filtrado para realzar características específicas, umbralización, binarización, etc.

Para realizar todas las operaciones mencionadas anteriormente, se tienen a disposición los siguientes módulos:
  • Image: Permite abrir, guardar, convertir, evaluar funciones y obtener información de imágenes.
  • ImageDraw: Permite agregar formas geométricas y texto a imágenes.
  • ImageEnhance: Permite mejorar la calidad de las imágenes, ajustando parámetros como brillo, contraste y nitidez.
  • ImageFilter: Es un módulo que incluye varios filtros que pueden ser aplicados fácilmente a cualquier tipo de imágenes.
  • ImageMath: Permite realizar operaciones matemáticas con imágenes.
Para más información sobre estos u otros módulos, puede consultar la página de documentación oficial de la librería PIL.

Procesamiento y extracción de características

Los procedimientos a realizar en este paso del análisis de imágenes dependen mucho de la aplicación específica para la cual se esté desarrollando. Sin embargo, la mayoría de veces es necesario umbralizar la imagen para tener una matriz binaria y extraer la características necesarias para identificar patrones en la misma.

Cuando se trabaja con imágenes binarias, generalmente se hace necesario aplicar operaciones morfológicas, mediante las cuales es posible filtrar ruido, mejorar regiones de interés o identificar formas específicas. De esta forma, la librería pymorph implementa las funciones morfológicas más comunes para el procesamiento de imágenes. Se debe tener en cuenta que esta librería no opera con objetos de tipo imagen PIL, sino que es necesario realizar la conversión a matriz bidimensional de python.

Para una referencia más completa sobre la librería pymorph, consultar la documentación oficial AQUI.

miércoles, 18 de mayo de 2011

Python vs. Matlab

En el aporte del día de hoy daré mi punto de vista y comparación entre 2 herramientas de programación usadas ampliamente por desarrolladores e investigadores: Python y Matlab. Resaltaré los puntos fuertes y débiles de cada uno de estos lenguajes, y no diré cual es mejor, pues esa respuesta depende mucho del contexto de la aplicación; sin embargo complementaré la respuesta y diré cual es mejor para determinados propósitos, ya que ambas herramientas son excelentes, dependiendo del propósito para el cual se estén usando.


Matlab

Matlab es una herramienta muy potente, principalmente usada en el ámbito académico y de investigación por la rapidez con la cual se pueden desarrollar algoritmos. Está diseñado para probar metodologías, sin tener que preocuparse por los detalles de implementación. Lo anterior, lo hace ideal para pruebas preliminares y para validar determinados métodos de forma rápida y confiable. Los Toolboxes disponibles proveen muchas funciones y librerías que hacen muy fácil la implementación de algoritmos complejos para todo tipo de procesamiento. Adicionalmente, está disponible tanto para sistema operativo Windows, como para sistemas Linux.

La principal desventaja de esta herramienta es que no es un sistema gratis, y además es costoso, pues es necesario comprar cada Toolbox por aparte. Además, no es posible generar aplicaciones stand alone, sino que siempre es necesario instalar las librerías en el equipo en el cual se ejecutará la aplicación, con su correspondiente licenciamiento.

Python

Python es libre y de código abierto, viene preinstalado en muchas de las distribuciones actuales de Linux, y también puede ser instalado en Windows. Es un lenguaje orientado a objetos sencillo de usar cuya curva de aprendizaje es muy corta. No tiene tantas funcionalidades y herramientas como las que ofrece Matlab, pero aún así es muy sencillo de usar. Python es el punto intermedio entre C++ y Matlab.

En cuanto a librerías y herramientas, están a disposición una gran cantidad de módulos que se pueden descargar de forma gratuita. Por otra parte, Python permite generar ejecutables finales para aplicaciones stand alone, sin necesidad de instalar librerías adicionales en el equipo final.

En conclusión...

Matlab es una excelente herramienta para investigar y desarrollar (si se tienen los recursos necesarios para las licencias), pues permite ahorrar mucho tiempo en validación. Sin embargo, cuando se debe pasar a un entorno de producción y desarrollar aplicaciones para usuarios finales, recomiendo Python.

lunes, 9 de mayo de 2011

Servidor Web miniatura

Cuando escuchamos hablar de un Servidor Web nos imaginamos siempre un gran computador, con múltiples discos duros, una gran RAM, almacenado en un gabinete con sus correspondientes sistemas de conectividad, alimentación y refrigeración. Sin embargo, los avances tecnológicos de la actualidad han hecho posible implementar un servidor Web en una tarjeta de menos de una pulgada cuadrada.

A continuación se puede ver la imagen de un servidor de este tipo disponible en el mercado:
Un servidor Web es un sistema que permite resolver peticiones que se originan desde otros equipos hacia la IP que tiene asignada el servidor, a través de un puerto, el cual generalmente es el 80 para peticiones HTTP efectuadas desde un navegador.

El sistema anteriormente mencionado únicamente necesita un conector para Ethernet con los correspondientes filtros necesarios para la conexión con una red de área local. El dispositivo se puede conectar con un microcontrolador a través de una interfaz UART, y no necesita de hardware especializado adicional. Por otra parte, este servidor incluye un microcontrolador el cual se puede programar y no hace necesario el uso de un microcntrolador externo.

Las páginas que se servirán con este dispositivo se diseñan en HTML estándar, haciendo que el desarrollo de software no sea demasiado complejo. Además, es posible configurarlo para funcionar con dirección IP estática o dinámica, dependiendo de las necesidades de la aplicación.

En cuanto a costo, este dispositivo puede conseguirse desde 27 dólares, el cual es un muy buen precio, teniendo en cuenta todas las prestaciones que ofrece.

Este servidor puede tener muchas aplicaciones en el desarrollo de dispositivos electrónicos, especialmente para la implementación de interfaces de usuario gráficas y amigables, dejando atrás los pulsadores, potenciómetros, pantallas de cristal líquido monocromáticas, LEDs, etc, pues todos estos sistemas de interfaz de usuario pueden ser implementados a través de software en una página Web.

lunes, 2 de mayo de 2011

Uso de PWM en ATMEGA16

En la publicación del día de hoy mostraré un ejemplo práctico con código fuente incluido para el uso del módulo PWM del microcontrolador ATMEGA16. Este ejemplo se hace para este microcontrolador en específico, pero es posible aplicarlo a cualquier otro microcontrolador ATMEGA que tenga módulo PWM cambiando los correspondientes registros.

Se debe controlar un motor DC usando una señal PWM (generada con el Timer 0 en modo PWM con corrección de fase), la cual puede tener 8 niveles de ciclo de trabajo, desde 0% hasta 100%. Los niveles del PWM se deben modificar a través de dos interruptores pulsadores con los que se podrá incrementar o reducir un nivel de ciclo de trabajo por cada pulsación de éstos. Adicionalmente, el nivel actual del PWM se debe mostrar usando una barra de LEDs conectada al puerto C del microcontrolador.

El código fuente para solucionar el anterior ejemplo, se muestra a continuación:


//*****************************************************
// Programa para el control de velocidad de un motor DC
//
// Descripción: Mediante este programa se usa el módulo
// de PWM con corrección de fase del Timer 0 para el
// control de la velocidad de un motor DC a través de
// dos pulsadores, los cuales permiten aumentar o
// reducir la velocidad

//*****************************************************

// Dispositivo = ATMEGA16
// Fclk = 1.0MHz

#include<avr/io.h>


int main(void)
{

// Variable que guarda el nivel de velocidad
// del motor (0..8)
volatile char nivel=0;

// Configuración de dirección de puertos I/O
DDRA=0x00; // Puerto A como entrada
DDRC=0xFF; // Puerto C como salida
DDRB|=(1<<DDB3);// Pin 3 de puerto B como salida

PORTA=0xFF; // Habilitación de pull-ups del puerto A
PORTC=0x00; // Inicialización de salida del puerto C

// Configuración del Timer 0:
// * Modo PWM con corrección de fase
// * Modo no inversor
// * Fuente de reloj directa desde el oscilador del microcontrolador
TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS00);

// Inicialización del PWM
OCR0=0x00;

// Ciclo de polling
while(1)
{
// Se evalúa si se ha presionado algún botón
if(PINA!=0xFF)
{
// Se evalúa cual botón se presionó
switch(PINA & 0x03){
case 1: if(nivel<8)
nivel++; // Incrementa velocidad
break;
case 2: if(nivel>0)
nivel--; // Decrementa velocidad
break;
};

PORTC=(1<<nivel)-1; // Visualización en barra de LEDS

OCR0=32*nivel-1*(nivel!=0); // Actualización de PWM

// Ciclo que pone el sistema en espera hasta que
// se libere el botón presionado
while(PINA!=0xFF)
{
asm("nop");
}
}
}

}

Para solucionar el anterior ejemplo, se observa que se inicializan los puertos asignando su correspondiente dirección, y posteriormente se inicia la unidad Timer0 en el modo PWM con corrección de fase. Luego, en el ciclo de polling se evalúa constantemente si se ha presionado alguno de los botones, y cuando esto es cierto, se procede a incrementar el nivel del PWM, se visualiza a través de la barra de LEDs y se actualiza el registro OCR0, con el cual se controla el ancho de pulso generado. Finalmente se introduce un ciclo de espera, en el cual se detiene el ciclo principal hasta que se suelte el botón que ha sido presionado. A continuación se muestra el diagrama esquemático para esta aplicación:


Link recomendado: http://www.administracionsatelital.com/

miércoles, 27 de abril de 2011

Desarrollo de aplicaciones con interfaz gráfica

Quienes desarrollan hardware en algún momento se han encontrado con la necesidad de implementar una aplicación para el computador, la cual muchas veces debe incluir una interfaz gráfica. Este tipo de aplicaciones a menudo requiere ingreso de datos por parte del usuario, visualización de reportes, e incluso manejo de bases de datos y conectividad a Internet. A parte de lo anterior, se hace necesaria la interacción con dispositivos externos y sistemas desarrollados con microcontroladores y software embebido. La interacción con estos dispositivos de hardware se realiza a través de puertos USB, RS-232, Ethernet, e incluso dispositivos inalámbricos como Bluetooth o WiFi.

El lenguaje de programación Python es un lenguaje muy sencillo y potente que permite la implementación de programas y sistemas complejos en poco tiempo de desarrollo, con lo cual se desarrollan productos complejos que puedan satisfacer las necesidades del cliente. La principal desventaja de Python es la dificultad para la creación de interfaces gráficas y desarrollo de aplicativos finales para el usuario.

El framework de desarrollo Web Django es una excelente herramienta que permite integrar programación en Python, manejo de puertos e interacción con hardware, uso de bases de datos, y desarrollo de una interfaz gráfica de usuario. Todo esto se implementa en un entorno Web, por lo cual el diseño gráfico de la interfaz es sencillo, y se reduce al diseño de plantillas HTML.


Una aplicación en Django tiene la forma de un sitio Web, con la ventaja que se puede manipular fácilmente el hardware del computador usando código Python. Mientras se encuentra en etapa de desarrollo, es posible usar un servidor incluido con el framework Django, sin embargo, en el momento de implementar la aplicación de producción, se recomienda el uso de un servidor Web robusto. Se pueden instalar módulos adicionales al servidor Apache para que tenga la capacidad de ejecutar aplicaciones desarrolladas en Django.

En cuanto a bases de datos, Django permite una fácil integración con sqlite, mysql y posgresql, y además incluye un sitio administrativo muy completo en donde es posible visualizar y editar registros de la base de datos.

El link del sitio es http://www.djangoproject.com/, y recomiendo hacer el tutorial básico de 4 pasos, en el cual se ilustran las principales características y funcionalidades de Django. La instalación en Linux es sencilla, y todos los paquetes adicionales necesarios se pueden bajar usando los repositorios y el gestor de paquetes.