quinta-feira, 16 de fevereiro de 2012

4) A porta paralela


A porta paralela foi criada inicialmente para que o computador pudesse controlar impressoras conectadas a ele. Entretanto, logo foi percebido que a grande flexibilidade oferecida pela porta paralela poderia ser aproveitada para controlar muitos outros dispositivos em uma grande variedade de aplicações. Devido à facilidade de programação e de uso dos sinais transmitidos, a porta paralela foi durante muito tempo a maneira preferida de fazer projetos caseiros de controle de dispositivos externos ao computador. 

Modos de operação
A porta paralela pode funcionar em três modos diferentes:
  • SPP (Standard Parallel Port)
  • EPP (Enhanced Parallel Port)
  • ECP (Extended Capabilities Port)
A seleção do modo de operação da porta paralela é feita através do BIOS Setup do computador. Para este projeto utilizaremos o modo SPP. Neste modo, a porta paralela é capaz de transmitir 12 bits para saída e receber 5 bits na entrada.
O modo SSP é bastante simples de usar, mas tem a limitação de ser unidirecional e ter uma taxa de transferência de 150 KBytes. Para resolver este problema, foi desenvolvido o modo EPP. Este modo de operação da porta paralela é bidirecional e atinge uma taxa de transferência de 2 MBytes. Entretanto, para atingir esta taxa necessita de um cabo especial que permite taxas mais altas de transmissão.

Aumentar a taxa de transferência trouxe um problema: a necessidade de mais atenção por parte do processador. Então foi desenvolvido o modo ECP que é igual ao modo EPP, porém utiliza um canal de DMA o que faz com que a transmissão e recepção sejam feitas sem a intervenção do processador, aumentando o desempenho do computador.
A porta paralela usa um conector DB25 que geralmente fica localizado na parte de trás do computador. A figura 3 mostra o conector no computador.
Figura 3: Conector DB25 fêmea
Como o nome indica, é um conector de 25 pinos, destes 25, 17 são usados para a comunicação e 8 são aterrados (massa). A figura 4 mostra a configuração dos pinos.

Figura 4: Configuração dos pinos de um conector DB25

Os pinos marcados em azul são usados para a saída de dados, destes, os pinos C0 a C3 são reservados para controle do dispositivo (impressora) e os pinos D0 a D7 para dados, mas nada impede que todos sejam usados para a saída de dados.
Os pinos marcados em vermelho (S3 a S7), são pinos de entrada, permitem que o computador receba informações externas e finalmente os pinos marcados em verde (18 a 25) são aterrados (massa).

Registradores

Para acessar os dados pela porta paralela é preciso ler ou escrever nos endereços de memória associados à porta. Estes endereços são chamados de registradores. Para a porta paralela podem ser associados dois conjuntos de registradores conforme seja utilizada a porta 1 ou a porta 2 (LPT1 ou LPT2). Normalmente é a porta 1 que está configurada para uso no computador. Importante lembrar que a seleção de qual porta será usada é feita no BIOS/Setup da máquina ou no Gerenciador de dispositivos do Windows.
Existem 3 registradores para cada porta paralela, cada um controla um conjunto de bits da porta. Para a porta LTP1, que é a porta default na maioria dos computadores, temos o conjunto de registradores listados na tabela 3.

Registrador
Endereço
Função
Pinos
Registro de dados
378h
Saída de dados
D0 a D7
Registro de status
379h
Entrada de dados
S3 a S7
Registro de controle
37Ah
Saída de dados
C0 a C3
Tabela 3 – Endereços dos registradores da porta LTP1

Note que os registradores de controle e de status não utilizam um byte inteiro, o registro de status usa os cinco bits mais significativos e o registro de controle usa os quatro bits menos significativos. É preciso ter cuidado para não alterar os outros bits do registro de controle se este for utilizado para o envio de dados. 

Programação no Windows

Visto que o Windows bloqueia o acesso direto ao endereço dos registradores, é necessário utilizar a dll inpout32.dll criada especialmente para o acesso à porta paralela. Esta dll pode ser obtida gratuitamente pela internet em vários endereços facilmente encontrados em uma busca rápida em qualquer mecanismo de busca.

Para facilitar a programação no Delphi foi criada a unit ParBib que carrega a dll e fornece funções de acesso a todos os bits da porta paralela. Também acompanha um programa exemplo que usa a unit ParBib para ler/gravar dados na porta paralela (figura 5).

Figura 5: Tela do programa de exemplo

Placas para teste de entrada e saída

Para testar o programa, é preciso dispor de um cabo com um conector DB25 macho, que possa ser conectado ao computador. Um cabo paralelo comum de impressora serve, basta retirar o conector que seria encaixado na impressora. Após cortar ou desmontar a ponta que encaixa na impressora, é preciso identificar os fios. Isso pode ser feito com um multímetro ou com qualquer dispositivo que teste continuidade. Na falta de um multímetro pode ser usado um led alimentado por duas pilhas comuns de 1.5 volts e um resistor de 220Ω a 440Ω entre o led e a bateria para não descarregar as pilhas muito rápido.
Além do cabo, é bastante útil montar uma plaquinha com leds para mostrar o estado dos bits da saída paralela e testar o programa, esta placa é bastante simples contém apenas um conector para o cabo paralelo e um led e um resistor para cada pino de saída da porta paralela, como mostra a foto na Figura 6.

Figura 6: Placa com leds e resistores para mostrar o estado dos pinos de saída da porta paralela.


A Figura 7 mostra o esquema elétrico da placa de teste. Os resistores R1 a R8 podem ter valores de 220Ω a 440Ω.  Para a placa de testes mostrada na figura 6 foram acrescentados leds e resistores também para os pinos C0 a C3 (pinos 1, 14, 16 e 17).

Figura 7: Esquema elétrico para a placa de teste da porta paralela. Fonte: www.rogercom.com


Os conectores à esquerda na foto da figura 6, servem para conectar a uma segunda placa com interruptores e assim testar também os pinos de entrada da porta paralela. A Figura 8 mostra as duas placas conectadas. O circuito elétrico da placa para teste dos pinos de entrada é bem parecido com o da outra placa, mas os leds são substituídos por interruptores. Os interruptores da segunda placa foram retirados de mouses sucateados.

Figura 8: Placas para teste da entrada e saída da porta paralela.


Importante: A porta paralela provê uma tensão de saída que varia de 2.5V a 4V, conforme o computador e fornece uma corrente de alguns miliamperes. Isso é suficiente para acender alguns leds como mostrado nas placas acima, ou ativar as entradas digitais de CIs, mas não conseguem alimentar um circuito inteiro. Um circuito mais complexo do que simplesmente acender alguns leds deve obrigatoriamente ter uma fonte de alimentação própria.

4.1 Software para controle da porta paralela

Como citado acima, para usar a porta paralela no Windows é necessário dispor da dll inpout32.dll. Esta dll é de domínio público e pode ser facilmente encontrada em diversos sites na internet. Já a unit ParBib.pas foi desenvolvida especialmente para este projeto. Esta unit carrega a dll inpout32.dll e facilita bastante ler e escrever nos pinos da PP. Todos os programas e bibliotecas foram desenvolvidos para Delphi versão 7, mas funcionam também nas versões posteriores.

O próximo item contém uma lista dos tipos e funções encontradas na unit ParBib.pas e uma breve descrição de cada uma.

Lista de tipos e funções da unit ParBib.pas

type TDataIndex= 0..7;
Intervalo numérico usado para indicar um pino de dados
type TLPT= (pLPT1, pLPT2);
Tipo enumerado para selecionar a porta paralela que será usada.

function inportb(EndPorta: Integer): BYTE stdcall; external '.\inpout32.DLL' name 'Inp32';
Função importada da dll para ler um byte de um endereço relacionado à porta paralela.

procedure outportb(EndPorta: Integer; Valor:BYTE); stdcall; external '.\inpout32.DLL' name 'Out32';
Função importada da dll para escrever um byte em um endereço relacionado à porta paralela.

As duas funções acima são de uso geral e estão disponíveis apenas como um recurso adicional. As funções abaixo são mais específicas, mais simples de usar e são a razão do desenvolvimento desta biblioteca.

procedure SetLPT(porta: TLPT);
Seleciona a porta que será utilizada pelas funções abaixo. Por default é selecionada a porta 1 (pLPT1).

function  GetDataBit(index: TDataIndex): boolean;
Retorna o estado do pino de dados indicado pelo parâmetro index (ver Figura 4). O valor true indica que o pino está ativado (1) e o valor false indica que o pino está desativado (0).

procedure SetDataBit(index: TDataIndex; Value: boolean);
Seta o pino de dados indicado pelo parâmetro index com o valor indicado pelo parâmetro Value. O valor true ativa o pino e o valor false desativa.

procedure SwitchDataBit(index: integer);
Inverte o valor do pino indicado pelo parâmetro index.

function  GetDataByte: byte;
Retorna um byte com o estado de todos os pinos de dados da porta paralela.

procedure SetDataByte(Data: byte);
Usa o parametro Data para setar todos os pinos de dados da porta paralela.

function GetStrobe: boolean;
function GetAutoFeed: boolean;
function GetInit: boolean;
function GetSelectIn: boolean;
function GetAck: boolean;
function GetError: boolean;
function GetBusy: boolean;
function GetPaperEnd: boolean;
function GetSelOut: boolean;
Retorna o estado do pino correspondente (ver Figura 4). O valor true indica que o pino está ativado (1) e o valor false indica que o pino está desativado (0).


procedure SetEstrobe(Value: boolean);
procedure SetAutoFeed(Value: boolean);
procedure SetInit(Value: boolean);
procedure SetSelectIn(Value: boolean);
Seta o pino de dados correspondente (Figura 4) com o valor indicado pelo parâmetro Value. O valor true ativa o pino e o valor false desativa.

procedure SwitchStrobe;
procedure SwitchAutoFeed;
procedure SwitchInit;
procedure SwitchSelectIn;
Inverte o valor do pino correspondente.

Programa ParControl.exe

Este programa pode ser usado para testar as entradas e saídas da porta paralela e também serve de exemplo de uso da unit ParBib. Permite selecionar a porta 1 ou porta 2, lembrando que essa seleção serve apenas para o programa ler ou gravar no endereço correto. Qual porta será ativada pelo computador depende da configuração feita no Bios/Setup da máquina. Além disso, tem uma interface bastante intuitiva com botões para ativar/desativar todos os pinos de saída e verificar o estado dos pinos de entrada (Figura 5). 



Índice

2) Visão geral do projeto
3) Fonte de alimentação para testes de bancada
4) A porta paralela
5) Motores de passo
6) Montagem dos circuitos
7) Montagem do robô
8) Alimentação
9) Software de navegação
10) Conclusão
Apêndice - Duplicando polias e engrenagens


    5 comentários:

    1. Bom dia! Saberia dizer qual é a manha para "liberar" (se é que se pode dizer assim) o acesso a porta paralela no Windows7 64 bits? Obrigado.

      ResponderExcluir
    2. Oi, meu computador ainda roda windows xp, nunca tentei acessar a porta paralela no windows 7, não sei dizer como faz pra acessar.

      ResponderExcluir
    3. PS: A dll que dá acesso à porta paralela é a inpout32.dll. Fazendo uma busca no google descobri que existe também a dll inpout64.dll, não testei mas acho que vale a pena verificar.

      ResponderExcluir
    4. boa noite ,gostaria de saber porque na funciona a porta paralela para automaçao dos computadores dell com sistema win xp

      ResponderExcluir