Este artigo é o quinto de uma série que faz uso do PC em aplicações mecatrônicas. Conforme dissemos nos anteriores (MEC289 e MEC290, MEC292 e MEC294) ele foi escrito em 2002 quando os computadores ainda tinham portas paralelas e seriais. Se você tem um velho computador com porta serial pode aproveitar os projetos e ensinamentos desta série de artigos.
Neste artigo, iremos sair um pouco da porta paralela do PC e usar a sua porta serial, a famosa comunicação RS-232.
Em nosso último artigo (MEC294) foi sugerida uma alteração no programa do controle de motor, para que o mesmo tivesse uma opção de alternar a direção automaticamente em um período de 2 segundos.No código-fonte 1, mostrado mais adiante, segue a listagem; em relação ao programa original.
![](/images/stories/mecatronica/mec0295_0001.jpg)
Na segunda parte desta sequência de artigos, indicamos, como os dados eram transmitidos paralelamente em um barramento de dados de 8 fios ( D0 a D7), veja figura 2.
![Transmissão paralela em barramento de 8 fios.
Transmissão paralela em barramento de 8 fios.](/images/stories/mecatronica/mec0295_0002.jpg)
Vamos supor o cenário de um PC imprimindo em uma impressora paralela no formato texto (figura 3). Imagine- mos também que o PC queira imprimir o texto 123 na impressora.
![Impressão de formato texto em impressora paralela.
Impressão de formato texto em impressora paralela.](/images/stories/mecatronica/mec0295_0003.jpg)
De antemão,+- sabemos que os caracteres 1, 2 e 3 são bytes (8 bits) e serão transmitidos um de cada vez pelo barramento. Você deve estar se perguntando: em quais códigos eu consigo representar esses caracteres A resposta é através da tabela ASCII (American Standard Code for Information Interchange): uma normalização feita no inicio dos primeiros computadores que padronizou a comunicação entre computadores e periféricos. Observe, mais à frente.
Voltando à nossa impressão, o PC terá que enviar os códigos em hexadecimal 31, 32 e 33, que correspondem na tabela ASCII aos caracteres 1, 2 e 3.
![](/images/stories/mecatronica/mec0295_0004.jpg)
A figura 4 resume a nossa transferência de dados para imprimir 1, 2 e 3.
![Transferência de dados para impressão dos caracteres 1, 2 e 3.
Transferência de dados para impressão dos caracteres 1, 2 e 3.](/images/stories/mecatronica/mec0295_0005.jpg)
Ótimo, aprendemos como enviar dados para uma impressora paralela. Mas, e se nossa impressora fosse serial? Boa pergunta, mas antes de respondê-la vamos discorrer um pouco sobre comunicação serial de um modo simples, sem aprofundar-nos em detalhes.
O objetivo é que você compreenda alguns termos e tenha a ideia básica de como a comunicação serial funciona. Dessa maneira, poderemos utilizá-la em nossos programas LOGO para controlar dispositivos e fazer a comunicação com outros computadores.
As famosas COM1 e COM2 dos PCs são para comunicação serial assíncrona , as quais seguem uma normalização que popularmente conhecemos como RS-232. Essa norma define tanto o aspecto de temporização quanto o elétrico. Diferente da comunicação paralela que utiliza 8 fios para passar dados, a comunicação serial utiliza somente 1 fio para fazer isso.
No PC podemos ter dois tipos de conectores para as portas seriais: o DB9 com nove pinos e o DB25 com 25 pinos (figura 5). Analisando essa figura podemos notar que temos um número razoável de linhas.
![Conectores típicos para a porta serial do PC.
Conectores típicos para a porta serial do PC.](/images/stories/mecatronica/mec0295_0006.jpg)
Aí vem a pergunta: Para que tantos pinos se só iremos utilizar 1 fio na transmissão de dados? A resposta é para fazer o controle de fluxo de dados , mas não se preocupe em saber agora para que servem e como funcionam todos esses pinos.
Em nossas aplicações iremos utilizar somente 3 pinos (TX, RX e GND) e, se pensarmos na nossa impressora, teremos a conexão em termos de dados (sem considerar as linhas de controle) utilizando apenas uma linha RX dela, que recebe os dados do pino TX do PC (figura 6 ), onde o TX é a linha de transmissão, RX a linha de recepção e o Terra a linha de referência.
![Utilização de apenas uma linha da impressoras.
Utilização de apenas uma linha da impressoras.](/images/stories/mecatronica/mec0295_0007.jpg)
E como iremos transmitir os dados empregando somente um fio ? Para passar um byte (8 bits) temos que passar um bit de cada vez em função do tempo: primeiro o bit correspondente a D0, depois a D1, e assim por diante até chegar ao correspondente a D7 . Observe a figura 7 onde se mostra a transmissão do caractere ASCII “1” (31 em hexadecimal e 0011 0001 em binário) note que além dos dados temos o START BIT e STOP BIT.
![Transmissão do caracteres ASCII “1”.
Transmissão do caracteres ASCII “1”.](/images/stories/mecatronica/mec0295_0008.jpg)
Esses bits são necessários para controlar a nossa transmissão para sabermos quando um dado está iniciando a transmissão ou sua finalização . Vale salientar que os níveis de tensão em comparação com os níveis lógicos estão invertidos . Como lembrete, se medirmos uma transmissão de um nível lógico zero teremos +12 volts e para nível lógico 1 teremos -12 volts; portanto, se você for medir diretamente no conector do PC não se esqueça que as tensões estão invertidas em relação aos níveis lógicos.
Chega de teoria e vamos realizar algo prático. Para iniciar, vamos fazer um conector de “loop back”, ou seja, ligar o pino de transmissão com o de recepção conforme a figura 8.
![Conexão de “loop back”.
Conexão de “loop back”.](/images/stories/mecatronica/mec0295_0009.jpg)
Com isso conseguiremos fazer o nosso computador se comunicar com ele mesmo, pois estamos ligando a linha de TX com a de RX.
No ambiente LOGO execute o programa mostrado no código-fonte 2, ao lado.
![](/images/stories/mecatronica/mec0295_0010.jpg)
Observe que no terminal da janela de comandos aparece o resultado, indicado abaixo do código-fonte.
Analisando o nosso programa, temos a instrução abraporta “com1 que reserva o recurso da porta serial para o LOGO. Caso ela já esteja aberta, aparecerá uma indicação de erro. Nessa situação use o comando de fecheporta.
A instrução mudemodoporta “com1:9600,n,8,1, configura a porta serial para 9600 bits por segundo, ª sem paridade , 8 bits por caracter e 1 stop bit.
Já as instruções escrevacaractereporta escreveram os caracteres 1, 2 e 3 na porta serial; note que essa instrução retorna um valor O em caso de erro de escrita ou 1 em caso de sucesso. Por isso temos a instrução completa como atribua “y escrevacaractereporta ascii “1 que irá transmitir o caracter 1 em ASCII e atribuirá em y 0 valor do retorno da escrevacaracterporta . Então, até aqui transmitimos os caracteres, depois da instrução espere 60 teremos a instrução leiacaractereporta, que vai ler os caracteres que foram transmitidos e estão armazenados no buffer da porta serial.
Caso não haja nenhum caractere para ser lido no buffer da serial, a função leiacaractereporta retoma -1. Repare que essa instrução está em um loop de 10 e dentro dele temos a instrução de leitura da porta, e caso o retorno não seja -1, o dado lido será escrito no terminal da janela de comandos.
Para finalizar temos o comando fecheporta, que irá fechar as portas que estejam abertas.
![](/images/stories/mecatronica/mec0295_0011.jpg)
Apesar do programa acima funcionar em um único computador com um conector de loop back, idealizamos outro programa (listado no código-fonte 3) que interliga 2 computadores, mas que pode ser executado também em um único PC usando o conector de “loop back”.
![](/images/stories/mecatronica/mec0295_0012.jpg)
Executando o programa comando-serial teremos uma janela conforme a figura 10.
![](/images/stories/mecatronica/mec0295_0013.jpg)
Além dos botões de LIGA e DESLIGA temos duas áreas de dados, uma local e outra remota . A local representa o dado recebido do PC Remoto, se o botão de LIGA ou Desliga foi acionado . Analisando o programa, percebemos que ele envia um numero decimal 1 pela serial quando pressionamos o botão LIGA , e nesse momento escreve no estático do Dado Remoto um X.
Para o botão de DESLIGA temos o mesmo procedimento, só que o dado enviado será um 0 (zero) e no estático do Dado Remoto irá escrever um espaço em branco.
O programa comando_serial, portanto, somente envia dados pela serial, mas nele ativamos um temporizador através do comando ativetemporizador 1 2000 [vê_serial]. Note que colocamos um tempo alto de 2000 milissegundos (2 segundos), mas você poderá alterá-lo ao seu gosto, lembrando-se de que, caso haja algum problema com a serial, irá aparecer uma janela de erro a cada chamada da vê_serial , que no nosso exemplo é de 2 segundos. Tempo suficiente para acionar o botão de Fim e desativar o temporizador.
A função de ve_serial é a que lê os dados recebidos quando se recebe um dado, ela vê e se for 1 escreve X no estático de Dado_Local, se for 0 (zero) escreve um espaço em branco.