lunes, 14 de mayo de 2012

Impresora Térmica

Lo prometido es deuda y a continuación hablaré un poco sobre impresoras térmicas.


Las impresoras térmicas se componen básicamente de 4 bloques:

  • Cabeza térmica
  • Motor a pasos
  • Sensor de temperatura de cabeza térmica
  • Sensor de papel
Estos cuatro bloques conforman la impresora, teniendo cada uno una función bien definida y es responsabilidad del diseñador hacer la instrumentación y el control adecuado.



Las impresoras térmicas funcionan básicamente de la siguiente manera: El papel térmico se coloca en un rodillo haciendo que el sensor de papel envíe en '0' lógico (indicando la existencia del papel). Entonces, el motor a pasos hace girar dicho rodillo mediante un mecanismo compuesto de engranes, logrando una precisión milimétrica en el posicionamiento del papel. Cuando el papel está posicionado, se envía la información que se quiere imprimir usando el protocolo que especifique el fabricante (para la impresora que estamos usando, se usa una interfaz SPI). Finalmente se envían señales de encendido para la cabeza térmica, la cual está formada de pequeños puntos que se calientan y marcan el papel, imprimiendo un renglón. Entonces el proceso se inicia nuevamente, es decir, se hace girar nuevamente el rodillo y nuevamente se envía la información a la impresora para imprimir un nuevo renglón.
El sensor de temperatura, que puede ser un termistor, permite monitorear la temperatura de la cabeza térmica. Al imprimir se calienta la cabeza térmica  y si la impresión es continua, dicha cabeza se puede calentar hasta dañar de forma irreparable la impresora. Por lo tanto se debe evitar el sobrecalentamiento. El fabricante de la impresora que usamos especifica que no debe pasar de 70º C.

domingo, 12 de febrero de 2012

JNI, Eclipse y Win7 64 Bit

He redactado este tutorial como punto de partida para diseñar programas usando la herramienta JNI de java. Esta herramienta permite llamar funciones de lenguaje C, a través de una dll, desde una aplicación en Java.
Esto es útil ya que hay una gran cantidad de Hardware cuyas librerías de comunicación han sido desarrolladas en C (nosotros somos electrónicos). Sin embargo, dada la flexibilidad de programación de interfaces gráficas de usuario (GUIs) bajo Java, además de su potencial multiplataforma, la posibilidad de programar una aplicación que use Hardware bajo este lenguaje de programación no puede ser ignorada.
Para este tutorial usaré el sistema operativo de Microsoft Windows 7 de 64 bits,  los IDE de  Eclipse para Java y C, además del compilador Mingw; tanto el IDE de Java y C y el compilador serán de 64 bits. Pueden descargar Eclipse desde:


El compilador deberá ser descargado desde:


y deberán asegurarse de que están descargando la versión correcta. La siguiente imagen muestra el que yo descargué y usé para este tutorial.


Lo último que hay que descargar es el JDK (Java Development Kit) de la siguiente dirección:


Debo señalar que pueden encontrar la documentación del JNI fácilmente desde Google. De hecho, el ejemplo que estaré escribiendo es prácticamente el mismo que pueden encontrar en dicha documentación, sin embargo, en este tutoral además de escribir sobre el JNI, señalaré como configurar Eclilpse para compilar tanto la librería en C como la aplicación en Java.

Para empezar hay que descomprimir el compilador Mingw-64. Yo lo descomprimí en:

C:\mingw-w64

y los ejecutables se encuentran en:

C:\mingw-64\bin

este directorio lo utilizaremos cuando configuremos Eclipse.
Los IDEs de Java y C también hay que descomprimirlos, pero la gran ventaja es que no hay que instalarlos, sólo basta con descomprirmlos y ejecutarlos. Finalmente ejecutamos el JDK que hayamos descargado de Oracle para que éste se instale en el sistema. Usualmente en 

C:\Program Files\Java\...

Para empezar con el tutorial, vamos a crear un proyecto de Java en Eclipse y agregaremos una  clase llamada Main con la opción "public static void main(String[] args)" habilitada. La función que implementaremos en C únicamente imprimirá en consola una leyenda, asi que la llamaremos print. El código queda como muestra la imagen siguiente.


En la imagen se muestra la función que estará en C llamada print y el nombre de la librería *.dll. Además de dichas definiciones, debemos llamarla dentro de nuestro código mediante la instrucción "new Main().print();"
Ya que escribimos y salvamos el código, lo que debemos hacer es crear un Header a partir de este código que será usado por nuestro código en C. Para lograr esto, usaremos dos herramientas que son instaladas dentro del JDK: javac y javah, ambas contenidas dentro de la carpeta  ../bin del directorio de instalación:



EL código que escribimos anteriormente se guardará con el nombre Main.java y lo copiaremos dentro de la carpeta donde están los ejecutables de javac y javah. 
Una vez copiado, usaremos la consola de Windows para obtener el Header. La consola se encuentra en  Inicio->Programas-> Accesorios. Cuando localicen la consola, deberán ejecutarla como administradores, haciendo clic derecho sobre el nombre y escogiendo la opción como muestra la figura:

El siguiente paso es ir al directorio ..\bin y ejecutar las siguientes instrucciones:


La primera, genera un archivo llamado Main.class. La segunda genera el Header que necesitamos: Main.h, que contiene, entre otras cosas, el prototipo de la función que usaremos en el código en C:



Ahora tenemos que ir al IDE de Eclipse para C. Creamos un nuevo proyecto en C como Librería Compartida (Shared Library) y en el directorio donde se crea este proyecto, copiaremos el Main.h. Llamaremos el archivo JNIPrueba y la librería dll se llamará como hayamos nombrado el código en C agregando "lib" al principio, por lo tanto la librería será libJNIPrueba.dll. Ya que se trata de una librería compartida, no hay una función main(), sino que se trata de una función cuyo nombre será igual al del prototipo contenido en Main.h. El código en C queda como se muestra a continuación:


En la imagen anterior es muestra la función que imprime la leyenda "jni" la cual se llama igual que el prototipo contenido en Main.h. Noten como, aunque el nombre es el mismo, dentro del paréntesis se agregan los objetos *env y obj. Además de mostrar el código, muestro los dos Headers que debemos incluir: Main.h y jni.h. EL primero es el que copiamos anteriormente; el segundo se encuentra en el directorio del JDK en la carpeta include. Debemos configurar Eclipse para que encuentre este Header yéndonos a Project->Properties y agregando dos directorios en Includes, dentro de GCC C Compiler en C/C++-> Settings como muestra la figura:



Ahora para compilar, debemos configurar a Eclipse para que use el Mingw de 64 bits. Para lograr esto, primero debemos escribir el nombre del compilador en la opción "command" dentro de GCC C Compiler y MinGW C Linker como se muestra a continuación:




Finalmente debemos incluir en el PATH de Eclipse el directorio donde se encuentran estos compiladores:



Ahora podemos compilar y si todo ha salido bien, se generará la librería libJNIPrueba.dll.

Ahora que tenemos la librería regresamos al código en Java. Eclipse no puede encontrar la dll hasta que nosotros le digamos donde está, por lo tanto hay que configurarlo agregando el directorio de la librería en las propiedades del proyecto como se muestra en la figura siguiente:



Para concluir, después de correr el programa deberá aparecer en la consola la leyenda "jni":


Espero haya sido de utilidad este tutorial. Más adelante escribiré como comunicarse con dispositivos USB usando esta herramienta.
Cualquier duda o comentario, no duden en escribirme!!!

domingo, 23 de enero de 2011

MPLABX en Ubuntu Linux

Un pequeño tutorial para instalar MPLABX en Ubuntu Linux y compilar en C usando el compilador de HITECH versión lite.
Primero descarga el MLABX desde Microchip que pesa alrededor de 220MB y es un archivo .bin.
Instalenlo escribiendo en una terminal:

sudo chmod +x mplabxidebeta32.bin


y


sudo ./mplabxidebeta32.bin


Si les mandara un error debido a que no encuentra Java entonces hagan lo siguiente: 
1. Descarguen la última versión desde java.com
2. Copien el archivo descargado en /usr/java como root. Es importante que lo copien e instalen  en este directorio. Yo probé en otros directorios y el MPLABX no es capas de encontrarlo.
3. Instalenlo. También es un archivo .bin así que pueden instalarlo de la misma forma que el mplabx.


Una vez instalado Java, no deberían tener problemas para instalar el MPLABX.


Para instalar el compilador, sólo hace falta descargarlo desde HITECH o Microchip e instalarlo. Yo instalé la versión 9.81 y es un archivo .run que se instala de la misma manera que los .bin. Dicha instalación no tiene interfaz gráfica así que sólo deben seguir las instrucciones en la terminal.


Al final de la instalación, cuando ejecuten el MPLABX es probable que no encuentre Java nuevamente. Lo que yo hice fue eliminar los accesos que te crea en el escritorio y en las aplicaciones y crear un script con las siguientes instrucciones:



#!/bin/bash


if [ "$1" == 'done' ]
then
export PATH=$PATH."/usr/hitech/picc/9.81/bin"
MICROCHIP_DIR=/opt/microchip/mplab_ide
"$MICROCHIP_DIR"/bin/mplab_ide --jdkhome /usr/java/jre1.6.0_23/
else
sudo $0 done
fi



Está hecho de esa forma ya que tiene que correr como root. El parámetro --jdkhome se usa para que el MPLABX encuentre Java.


Hecho esto, ya pueden correr el MPLABX sin ningún problema. Claro que aún es un beta, entonces los posibles errores ya tendrán que ver con el software.






Espero sea de utilidad este pequeño tutorial. Escriban sus comentarios







miércoles, 15 de septiembre de 2010

Sterilizer

A lot of work have been done and I didn't share it, sorry for that. We changed the ADC from Linear Technology to one from Analog Devices. The one from Linear was adding lots of noise, probably due to the PCB (possibly wasn't desinged correctly) and the one from Analog is working so much better. Of course the PCB also changed.
The GLCD is a little bit different, we are using now one from Newhaven Display and the VHDL code also changed. It's working great and is more efficient now, we managed to reduce the amount of  FPGA's resources used by an almost  20%.
We also add the Pressure sensor, the MPX2200 from freescale, modelled the equations and built the blocks within the FPGA.
The image shows some test we made with a resistive oven using two sensors: the one we built and a reference one.

We also made tests using the pressure sensor, but unfortunately I have no pictures.
Hopefuly, we will install it next wek. Till next time!!

lunes, 26 de julio de 2010

Seguridad En el Transporte Público (Iniciativa México)

Que tal. Les daré una mejor descripción del proyecto con el que estamos concursando en iniciativa México, a falta de información en la página de dicho concurso.
Durante mi estancia en el INAOE, mi asesor y amigo, el Doc Martínez, nos hizo que pensáramos en proyectos que fueran útiles para desarrollarlos como tesis. Platicando con mi papá, surgió la idea de atacar la delincuencia que afecta el transporte y a sus usuarios. Esta idea, se fue depurando y aterrizando hasta que dio como resultado el proyecto que presentamos.
Cuando comenzamos a investigar en la información para sustentar nuestro proyecto, observamos que en México, no existe una estrategia efectiva para atacara este problema social, la delincuencia en los autobuses, alentando nuestra decisión y aclarándonos la urgencia de nuestro sistema.
Construimos un sistema con cámaras de video, que deberían operar de manera autónoma para tomar fotografías de las personas cuando abordan el microbús y diseñamos el sistema para guardar las fotografías en una memoria Secure Digital (SD, como la que usan las cámara que venden en cualquier almacén) en un formato compatible con cualquier computadora para facilitar su lectura. Esta estrategia dio como resultado un sistema capaz de guardar un registro fotográfico de los usuarios del transporte público. La siguiente imagen muestra el prototipo que diseñamos.

Nuestra finalidad es doble:

  • Proporcionar la fotografía del (los) asaltante(s) para facilitar su búsqueda y captura.
  • Disminuir la delincuencia. Cuando un asaltante sabe que su rostro quedará guardado, lo pensará dos veces antes de decidirse a robar un microbús.
Las pruebas las hemos hecho en microbuses verdaderos, como se muestra en la imagen, adquiriendo imágenes de personas cuando éstas abordan.


El prototipo como se presentó en el INAOE, toma las imágenes y las guarda en la memoria con el formato adecuado. Además, es capaz de guardar la fecha y hora en que la persona aborda el microbus, dando una idea del lugar donde el asaltante abordó.
Aún falta trabajo por hacer. Las cámaras deben ser autónomas, es decir, deben tomar las imágenes de acuerdo a algún fenómeno ocurrido durante el abordaje. Esta parte no está terminada aún.
A manera de conclusión, creemos firmemente que este proyecto podrá aumentara la seguridad en las personas durante sus estancias en el transporte y, por lo tanto, aumentará la calidad de este servicio que todos, en algún momento, usamos.
Les dejo la liga al proyecto en Iniciativa México y si les cuadra la idea, por favor apoyenla, no les tomará más de 2 minutos. Cualquier comentario es bienvenido. GRACIAS!!

http://www.iniciativamexico.org/iniciativasDetalle.php?id=27576&idUsuario=

lunes, 7 de junio de 2010

Sterilizer's imminent end

After lot of work, the end of the first version of the Sterilizer's Control is at it's end stage. The PCBs are all working now, also the GLCD is perfectly working. After many delays due to the amplifying stage and the VHDL code (for this amplifying stage), all have been corrected.
Still, the final PCBs are not done. I already have the solder mask, but haven't made the PCBs again for being applied with the mask. Also, there are a few bugs on the code which I'll fix probably tomorrow.
Seems that this week or next we'll install our control at the hospital. I really hope so because I'm out of money!!!!
I'll put some pics of all the work we've done so far, but not today!!!!

domingo, 16 de mayo de 2010

Puertos Bidireccionales en FPGAs (Continuación 2)

Para definir puertos bidireccionales, se utiliza el concepto de tres estados. Bajo esta definición, la salida es deshabilitada colocandola en alta impedancia, y, así, la lectura es independiente. El código se muestra en la siguiente figura:
Al igual que el ejemplo anterior. SWITCH, SWITCH2 y ENTRADA son definidos como in, SALIDA es out y LED es inout. El funcionamiento es basicamente el mismo: cuando SWITCH es '1', LED, funcionando como salida, tendra lo que tiene ENTRADA, sin embargo, cuando SWITCH es '0', LED se pondrá en alta impedancia. Esta condición provocará que el ISE infiera que se trata de un puerto bidireccional de tres estados. Siguiendo la explicación, cuando SWITCH2 es '1', entonces SALIDA tendrá lo que tiene LED funcionando como entrada.
Como se observa en la imagen inferior. Al igual que el ejemplo anterior, LED se encuentra en '1' siendo ENTRADA '1' y SWTICH '1'.

Sin embargo, en la siguiente imagen se muestra como, cuando SWITCH es '0', colocando en alta impedancia a LED (como salida), y SWITCH2 es '1', entonces SALIDA tendrá lo que tiene LED.


Concluyendo, si queremos utilizar puertos bidireccionales en un FPGA, entonces debemos colocar la condición de alta impedancia cuando el puerto funciona como entrada, provocando que el ISE lo defina como un puerto de tres estados bidireccinal.