miércoles, 22 de junio de 2011

MANEJO DE PUERTO PARALELO

PUERTO PARALELO
       (0x378)

   La salida de datos de una computadora a un hardware de propósito específico, se lleva a cabo por medio del uso de los puertos, estos pueden ser el paralelo, serial, o incluso vía inalámbrica. El más sencillo de usar, dado que no usa sincronía para el envío de datos es el puerto paralelo. Para ejemplificar esto usaremos Linux Mint, una distribución basada en Debian, y que gracias al uso del paquete apt, no facilita la configuración rápida de un ambiente de desarrollo básico.
    Primeramente, hay que entrar como usuario root, o emplear el comando sudo, se hará lo siguiente:

$sudo apt-get install build-essential

 De esta manera, se tendrá lo básico para hacer el desarrollo, primero empezaremos con el programa, esto se puede llevar a cabo con cualquier editor, en este caso emplearemos vi:
$vi ejemplo.c
Ya dentro del editor, se teclea lo siguiente:
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#define puerto 0x378
int main(void){
   int i=0;
   unsigned int p = 0x02;
   
   if( ioperm(puerto,1,1)) {
      perror("Se ha detectado un error");
      exit(1);
   }
   for(i = 1 ; i < 20 ; i++ ) {
      outb(p,puerto);
      sleep(3);
      p = 0x00;
      outb(p,puerto);
      if ( i%2 != 0 )
         p = 0x00;
     else
        p = 0x02;
    }
    if ( ioperm(puerto,1,0)){
      perror("Se ha detectado un error ");
      exit(1);
   }
   exit(0);

 }
Esto se graba, y se compila, para después invocarse desde consola, de la siguiente forma:

$ gcc -O2 -o ejemplo ejemplo.c

Ya una vez compilado, lo podemos invocar de la siguiente forma:

$ ./ejemplo  <ENTER>

No hará nada visible para nosotros, ahora debemos de preparar la parte de hardware, para lo siguiente es necesario cuentes con el siguiente material:
- transistores NPN C1008 Y-913 o 2N3904
- misma cantidad de LED que de transistores
- resistencias de 220 ohms, igual cantidad que el número de LEDs
- 2 pares de resistencias de 120 ohms, por cada LED que se use.
- 1 tableta prototypeboard, y cables para conexión en proto.

El puerto paralelo tiene 8 bits de datos, mediante los cuales se envía la información.







viernes, 3 de junio de 2011

CAPTURA DE IMAGEN CON OPENCV

Objetivo
Captura de cuadro(s) de imagen mediante cámara web.

Introducción
Opencv, es una suite que nos ofrece un sin número de funciones dentro del API, para llevar a cabo operaciones de captura y procesamiento de imágenes, entre ellas la captura de imagen fija. En este documento, se muestran las funciones básicas para captura de imagen, así como se explica el uso de parámetros en el empleo de las mismas.
OpenCV emplea el comando CvCaptureFromCAM para accesar a la cámara web conectada vía USB a la computadora. El parámetro CV_CAP_ANY , nos facilita que la función tome la cámara web que este conectada en ese instante. El identificador pCapture toma un valor de TRUE si la cámara es hallada y un valor de FALSE si esta tiene algún problema o simplemente no hay cámara web
conectada. El comando cvQueryFrame, nos proporciona la captura de un cuadro de imagen de la cámara web , si la imagen se obtiene adecuadamente el identificador pVideoFrame arroja un valor de TRUE de otra forma es FALSE.
Para guardar la imagen capturada se emplea la función: cvSaveImage . Está espera 2 parámetros, el nombre de archivo y el cuadro de imagen capturado. Algunas ocasiones dependiendo de la forma de captura de la imagen, se debe agregar un tercer parámetro que indica el número índice de cámara web que se esta empleando, en nuestro caso -0- .
Finalmente cvReleaseCapture se encarga de cerrar el objeto de captura de video, y dejar libre recursos, se le da, de parámetro un objeto del tipo de clase CvCapture.
A continuación se da un ejemplo, de captura de cuadro de imagen, el cual está escrito de tal forma que pueda capturar dos cuadros de imagen.

#include <stdio.h>
#include "cv.h"
#include "highgui.h"
#include <string.h>
int main(int argc, char ** argv)
{
CvCapture * pCapture = 0;
IplImage * pVideoFrame = 0;
int i;
char filename[50];
// Inicializar video de captura
pCapture = cvCaptureFromCAM( CV_CAP_ANY );
if( !pCapture )
{
fprintf(stderr, "Ocurrio una falla al momento de iniciar la captura de video.\n");
return -1;
}
// Captura dos cuadros de imagen y escribelos como archivos
for(i=0; i<2; i++)
{
pVideoFrame = cvQueryFrame( pCapture );
if( !pVideoFrame )
{
fprintf(stderr, "Ocurrio una falla al obtener un cuadro de imagen\n");
}
// Guarda el cuadro de imagen del video capturado como un archivo imagen
sprintf(filename, "CuadroImagen%d.jpg", i+1);
if( !cvSaveImage(filename, pVideoFrame,0) )
{
fprintf(stderr, "Ocurrio un error al momento de guardar el archivo %s\n", filename);
}
// IMPORTANTE: NO quites o modifiques la imagen que se regresa.
// de cvQueryFrame() !
}
// Termina la captura de video y libera recursos
cvReleaseCapture( &pCapture );
return 0;
}