Porta Paralela
As portas paralelas já tiveram em melhores momentos para
fazerem interface entre diversos periféricos e o computador, mas engana-se quem
acha que esse tipo de comunicação ainda não pode ser útil para diversas
aplicações.
fonte: http://www.eletroaquila.net/cabo-db25m-macho-x-db25f-femea-5-0-mt.html
Criada pela IBM para tornar-se um canal exclusivo de
comunicação com as impressoras, as portas paralelas com o passar dos anos foram
sendo mais do que isso, conquistando confiança e performance em acionamentos de
diversos outros periféricos como: scanners, câmeras, unidades de disco, entre
outras.
Na indústria foi, e pasmem, ainda é bastante usada para
comunicação devido a sua capacidade de transferência de grupos de bits
simultaneamente (byte a byte) a cada ciclo, fazendo com que uma grande taxa de
transferência de dados ocorra por meio de diversas linhas condutoras de sinais.
Mas, como nem tudo são flores o que restringe o uso dos
cabos paralelos em diversas funções são a necessidade de conectores com 25 vias
(DB25) e cabos de no máximo 10 metros de comprimento, onde a comunicação com
cabo serial utiliza cabos de formação físicas menor e mais simples e
comprimentos maiores.
Com dito anteriormente os diversos periféricos que foram
conectando com o computador via porta paralela foi possível com o surgimento da
porta paralela bidirecional (EPP/ECP) além da original (SPP), para entender
melhor:
SPP (standard
parallel port): é a porta com características originais, com comunicação
unilateral e mais lenta, é esse tipo de porta que saiu para comunicação com as
impressoras mais antigas;
EPP (enharced
parallel port): utilizado em periféricos tipo pass through, com conectores
diretos, que não são impressoras;
ECP (enhanced
capability port): é o melhor tipo de porta, principalmente para impressoras
com entrada tipo paralela.
Acionando dispositivo via comunicação paralela
Hoje em dia o uso da porta paralela está ficando obsoleto,
mas ainda é possível usá-la para aprender um pouco mais sobre acionamentos de
dispositivos por meio de um sinal (ALTO/BAIXO) com elas.
O computador nomeia as portas paralelas como LPT1, LPT2 e
assim por diante, mas a porta física padrão é denominada LPT1 com os endereços:
378h (no envio de um byte de dados) 378+1h (para receber um valor) e, 378+2h
(para enviar dados).
A porta paralela padrão utiliza um conector tipo DB25, por
onde envia e recebe os dados. É importante salientar que para essa conexão um
pino encontra-se em nível lógico 0 quando a tensão elétrica dele se encontra
entre 0V à 0,4V e em nível lógico 1 quando atenção se encontra acima de 3.1V à
5V.
fonte: http://theclub.com.br/Restrito/Revistas/200905/intr0905.aspx
No site http://www.rogercom.com/pparalela/introducao.htm
existem três projetos interessantes sobre acionamentos de equipamentos via
porta paralela. Baseado eles eu fiz um acionamento de leds via portas paralelas
e o código fonte segue abaixo:
Código compilado em DEV C++
#include <stdio.h> // Biblioteca Standard Input/Output
#include <stdlib.h>
#include <conio.h> // Biblioteca necessária para o uso da função getch();
#include <windows.h> // Biblioteca necessária para o carregamento da inpout32.dll
#include <time.h>
#define LPT1 0x378
/*Inpout32*/
//Declaração dos ponteiros para função.
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
int main()
{
//system ("color 18");
printf("\n\t\tDATA : %s HORA: %s\n\n",__DATE__,__TIME__);
HINSTANCE hLib; //Instância para a DLL inpout32.dll.
inpfuncPtr inportb; //Instância para a função Imp32().
oupfuncPtr outportb; //Instância para a função Out32().
/*Inpout32*/
//Carrega a DLL na memória.
hLib = LoadLibrary("inpout32.dll");
if(hLib == NULL)
{
printf("\n\aErro. O arquivo inpout32.DLL nao foi encontrado.\nO programa vai terminar apos digitar qualquer tecla.");
return-1;
}
inportb = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
if(inportb == NULL)
{
printf("\n\aErro. Erro ao endereçar a função Inp32.");
}
//Obtém o endereço da função Out32 contida na DLL.
outportb = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if(outportb == NULL)
{
printf("\n\aErro. Erro ao endereçar a função Out32.");
return-1;
}
/*Inpout32*/
//Interface//
{
printf("=============================================================\n");
//Programa de Controle//
char teclado=' ';
puts("\n\tAcionamento de controle de equipamentos externos.");
printf("\n=============================================================\n");
puts("Ligar ou desligar equipamentos acoplados na porta paralela.\nAperte as teclas referentes a eles:\n");
puts("0 - LED VERMELHO \n1 - LED AMARELO \n2 - LED VERDE \n3 - LED VERMELHO \n4 - LED VERDE \n5 - LED AMARELO \n6 - LED VERMELHO \n7 - LED AMARELO ");
puts("8 - *TESTA TODOS OS LEDS*");
puts("9 - *TESTA TODOS OS LEDS SEQUENCIAL*");
puts("\n\n\n(**Quando quiser terminar o programa digite p para parar.**)");
puts("(***==========================================mecatronizar.blogspot.com.br***)");
teclado=getch();
while(teclado!='p')
{
switch(teclado)
{
case '0':
outportb(0x378,1); /* A função que manda um byte para a porta paralela no caso o número 1 ou 0000 0001 em binário*/
//system ("colorc8");
break;
case '1':
outportb(0x378,2); /* Novamente a função que manda um dado a porta paralela*/
//system ("color e8");
break;
case '2':
outportb(0x378,4);
//system ("color a8");
break;
case '3':
outportb(0x378,8);
//system ("color c8");
break;
case '4':
outportb(0x378,16);
//system ("color a8");
break;
case '5':
outportb(0x378,32);
//system ("color e8");
break;
case '6':
outportb(0x378,64);
//system ("color c8");
break;
case '7':
outportb(0x378,128);
//system ("color e8");
break;
case '8':
outportb(0x378,0XFF);
//system ("color e8");
break;
case '9':
outportb(0x378,1);
sleep(2000);
outportb(0x378,2);
sleep(2000);
outportb(0x378,4);
sleep(2000);
outportb(0x378,8);
sleep(2000);
outportb(0x378,16);
sleep(2000);
outportb(0x378,32);
sleep(2000);
outportb(0x378,64);
sleep(2000);
outportb(0x378,128);
sleep(1000);
outportb(0x378,0X00);
sleep(1000);
outportb(0x378,0XFF);
sleep(1000);
outportb(0x378,0X00);
sleep(1000);
outportb(0x378,0XFF);
sleep(1000);
outportb(0x378,0X00);
sleep(1000);
outportb(0x378,0XFF);
sleep(1000);
outportb(0x378,0X00);
sleep(1000);
outportb(0x378,0XFF);
sleep(1000);
outportb(0x378,128);
sleep(100);
outportb(0x378,64);
sleep(100);
outportb(0x378,32);
sleep(100);
outportb(0x378,16);
sleep(100);
outportb(0x378,8);
sleep(100);
outportb(0x378,4);
sleep(100);
outportb(0x378,2);
sleep(100);
outportb(0x378,1);
//system ("color e8");
break;
}
teclado=getch();
}
outportb(0x378,0);
FreeLibrary (hLib);
}
return 0;
}
//fim do else pertencente ao if que testa se carregou a dll
//fim da função main e do programa
Para realizar o projeto você vai precisar de:
1 cabo paralelo;
8 leds de várias cores;
8 resistores de 220 ohms;
1 protoboard.
fonte: próprio autor
pino 2 - marrom;
pino 3 - vermelho;
pino 4 - laranja;
pino 5 - amarelo;
pino 6 - verde;
pino 7 - azul;
pino 8 - roxo;
pino 9 - banco;
pino 25 - rosa/preto (GND).
fonte: próprio autor
Seguindo os passos abaixo para fazer as ligações necessárias para o funcionamento correto da interface.
fonte: rogercom.com.br
fonte:próprio autor
É importante ressaltar que para o correto funcionamento do programa, um arquivo tipo .dll deve estar inserido no seu computador e a habilitação da porta paralela pode ser necessária, mesmo em sistemas operacionais mais antigos.
Sendo necessário os arquivos ou o projeto completo, clique AQUI para baixá-los.
Para esse projeto foi utilizado um notebook Evo N150 COMPAQ, nesse computador existem portas paralelas e seriais, mas pode ser qualquer outro que tenha disponível porta paralela.
fonte: próprio autor
No vídeo a seguir esta sendo demonstrado como devem ser inseridos os arquivos e a execução do código, gerando o executável para comandar os leds ou qualquer periférico acoplado à porta paralela.
Bons estudos!