quarta-feira, 28 de setembro de 2016

Integração via Porta Paralela - parte 1

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

Desmontar o conector de um dos lados do cabo e seguir a sequência:
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!






Um comentário: