Você está na página 1de 11

CAPÍTULO 6 – METODOLOGIA DE DESENVOLVIMENTO DE INTERFACE EM

LABVIEW

Ao longo do desenvolvimento deste trabalho se propõe disponibilizar interfaces de


controle para os Servomotores CC da UFPA, para auxiliar nas aulas teóricas e laboratoriais
das disciplinas de sistemas de controle. Para isto foi necessário desenvolver ou construir
diversas interfaces amigáveis para que o usuário pudesse executar experiências ou trabalhos
de pesquisa sem maiores dificuldades.
Optou-se por utilizar a ferramenta de desenvolvimento LABVIEW (National
Instruments [5]) para estruturar uma interface que recebesse as informações provindas do
Servo e as apresentassem ao usuário, além de transmitir os sinais de comando escolhidos para
o ensaio ou controle da planta. O principal motivo por se utilizar o LABVIEW é a forma de se
programar, conhecida como linguagem G, uma espécie de programação gráfica, sem a
necessidade de codificação em texto permitindo simplicidade na construção de programas por
meio de diagrama de blocos. Além disso, o LABVIEW conta com excelente capacidade de
modularização, isto é, a divisão do programa em rotinas menores [13], necessária no
estabelecimento da comunicação serial com o Servo, onde são utilizados módulos pré-
programados (pelo fabricante) de acesso ao hardware.

Interfaces em LABVIEW
Em LABVIEW o desenvolvimento ocorre basicamente em duas telas: o painel, onde
são colocados os “instrumentos” e o diagrama, que é o “código fonte” do programa. No
painel estão localizados todos os comandos e indicadores, como botões, caixas de texto,
checkboxes e janelas gráficas que serão utilizados pelos usuários para comandar o Servo,
como mostrado nas interfaces apresentadas no Capitulo 3.

Algumas Considerações quanto ao painel


Antes de tudo é importante saber a quem e a que se propõe o uso da interface, pois
com este conhecimento inicial é possível listar todos os comandos que serão necessários para
a interação entre o instrumento, no caso o Servo, e os usuários, alunos e professores.
Quando se pensa em ensaios em malha aberta lembra-se dos sinais de teste mais
comuns como sinais degrau, onda quadrada, senoidal e sinais de seqüência pseudo -
aleatórias. Outro fator normalmente comum é que se utiliza a interface para realizar o ensaio,
coletar as informações necessárias e salvar os dados da experiência para análise em outro

109
Figura 6. 1 Interface em Malha Aberta para Identificação

software, por exemplo, o MatLAB e/ou o Excel. Estas considerações implicam que no
mínimo a interface deve dispor de ferramentas que possibilitem selecionar entre quais sinais
se deseja para realizar o teste e quais os parâmetros desse sinal, como amplitude, freqüência,
nível DC, etc. Além de opções para salvar ou não os dados em um arquivo, ver figura 6.1.
Estas considerações dizem respeito ao que estará disponível para o usuário interagir com a
planta.

O programa em LABVIEW: Diagrama de Blocos


A estrutura básica de um programa em LABVIEW é a seguinte: o programa deve ser
iniciado pelo usuário, executar suas tarefas e, quando requisitado, terminar a execução. Para
que isto seja feito, utiliza-se uma estrutura de repetição while (Paleta funções, execution
control/while loop), como mostra a figura 6.2.

110
Figura 6. 2 Estrutura Básica do um programa em LABVIEW: while loop.

O loop contém dois elementos importantes: o critério de parada (vide figura 6.2) e o
número de iteração. O critério de parada determina qual condição irá terminar a execução,
que, em geral, está associada ao botão, . Pode-se criá-lo com clique direito sobre o
critério, selecionando stop if true (termina o loop se assumir valor booleano verdadeiro) e em
seguida, novamente com o botão direito selecionando create control (cria automaticamente
um botão no painel para controlar o loop).
Com isso a estrutura básica do aplicativo está pronta. O programa se resume às tarefas
que são executadas no loop. A execução permanecerá dentro da estrutura até que o usuário
pressione o botão no painel. A partir deste ponto, o programador deve pensar em que o
seu aplicativo irá realmente fazer, para então inserir as funções adequadas no loop.
Assim, num primeiro momento se faz necessário estabelecer a comunicação serial com
o Servo. Para isto, o LABVIEW possui um conjunto de módulos especiais que estão

111
disponíveis na paleta de funções, functions/ all functions / instruments IO / serial. Estas
funções operam bem em ambiente Microsoft Windows 2000/XP/2003.
Pressupõe-se que o hardware esteja corretamente configurado (drivers instalados) e a
porta serial esteja disponível (nenhum aplicativo esteja utilizando-a). Se esses requisitos
forem atendidos, os módulos do LABVIEW podem ser utilizados com poucas possibilidades
de falhas.
O uso da comunicação serial é realizado em três passos distintos:
1. Inicialização: são carregados todos os parâmetros de comunicação e a porta é
deixada em estado de espera para recepção ou transmissão de dados. Para
efetuar esta operação o módulo VISA Configure Serial Port (ver figura 6.3) é
usado.
2. Leitura e escrita: as operações efetivas na porta serial são a leitura e escrita de
bytes. Para isso, as funções VISA Read e VISA write podem ser utilizadas.
Ocasionalmente, os módulos VISA bytes at serial port e serial break podem
auxiliar estes processos. Recomenda-se que as operações de leitura e escrita
não sejam realizadas em paralelo. É preciso lembrar também que os dados que
fluem no canal serial são do tipo caracter (ASCII) e por isso precisam ser
convertidos antes de adentrar o meio. Para isso, a função byte array to string
(string/ array/ path conversion) pode ser utilizada.
3. Término: após o fim das operações a porta deve ser fechada. Isto impede que o
dispositivo permaneça indisponível para futuras aplicações e até mesmo
ocasione problemas para o sistema operacional. Para efetuar esta operação, o
módulo VISA close pode ser utilizado.
No que diz respeito à comunicação serial o aplicativo do Servo foi estruturado para
realizar as seguintes tarefas:
1. Antes de iniciar o loop principal, iniciar o hardware, mantendo-o neste estado
até o término do loop. Neste mesmo momento, os estados iniciais de alguns
controles e indicadores são estabelecidos, por exemplo, as janelas gráficas são
limpas e os botões play/stop e encerrar são desabilitados, ver figura 6.3;
2. Realizar, em seqüência, a operação de leitura da porta e em seguida escrita.
Em paralelo, há o tratamento dos sinais recebidos e dos que serão enviados à porta.
Por exemplo, os dados recebidos contem somente informações de quantas ranhuras
variaram naquele período de amostragem, sendo necessário converter esta
informação para velocidade e/ou posição numa determinada unidade de medida,

112
neste caso, a unidade utilizada é o radiano por segundo, para a velocidade, e o
radiano, para a posição. Filtragem de dados também pode ser realizada nesta etapa.
Os dados que serão enviados à porta também necessitam ser tratados, uma vez que,
envia-se dois bytes ao Servo, mais detalhes serão mostrados adiante;
3. Ao terminar o loop, fechar o driver. Em seqüência, o programa acessa um
diretório determinado pelo usuário para salvar os dados do ensaio, nesta etapa.

Figura 6. 3 Etapa inicial do programa: configura a porta serial

Como pode ser visto na figura 6.3 o módulo VISA Configure Serial Port foi utilizado
para carregar o driver da porta. Isto é feito com o auxílio de constantes que determinam os
parâmetros de configuração. São elas:
• Baud rate (taxa de transferência): 19200.
• Data bits (bits de dados): 8 bits (default).
• Visa Resource name (porta utilizada): (COM1).
• Stop bit (bits de parada): 1 bit(default).
• Parity (paridade): sem paridade (default).
• Buffer size (tamanho do buffer de dados): 1024 bytes (default).
Notar que o procedimento de inicialização foi realizado antes e fora do loop principal.
Além disso, ele foi posto no interior de uma estrutura de seqüência (structures/ sequence).
Esta estrutura é utilizada para assegurar que os procedimentos contidos em seus quadros

113
sejam executados um após o outro. Além disso, estabeleceu-se uma ligação entre um
elemento de dentro do sequence com o loop principal. Isto foi feito para garantir que o loop
só executará quando aquele dado estiver disponível (mesmo que para nenhum fim), forçando
a inicialização do driver antes de executar qualquer tarefa.
Procede-se então com a operação de leitura e escrita na porta serial dentro do loop
principal. As figuras 6.3 e 6.4 ilustram os dois casos.

Figura 6. 4 Loop principal: VISA READ.

Como pode ser visto nas figuras 6.3 e 6.4, o procedimento de leitura e escrita é feito de
forma seqüencial, usando a estrutura sequence, dentro do loop while. Inicia-se o processo
utilizando o bloco VISA read, utilizando como argumentos o dup VISA resource name
provindo da inicialização e o número de bytes a serem lidos (neste caso, um). Em seguida, o
caracter detectado é convertido para o formato inteiro, através da função string to byte array
(/string/array/path conversion). O resultado deste bloco é uma matriz de números inteiros.
Para capturar o byte utiliza-se a função index array (paleta funções, array). Esta
função é utilizada sempre que se quer acessar os elementos de uma matriz. Neste caso. Além
disso, ela aceita “prolongamentos” que permitem que ela forneça mais de uma saída,
fornecendo mais um argumento. Para realizar um prolongamento da função, basta clicar e

114
arrastar a borda inferior do bloco (quando permitido) para gerar uma nova saída. Assim, o
bloco automaticamente gera um novo parâmetro de entrada. Os argumentos desta função são
os índices dos elementos desejados. Frisa-se de antemão, que o sistema de indexação do
LABVIEW utiliza números inteiros não negativos, isto é, o primeiro elemento de uma matriz
(ou vetor) é referenciado com zero. Desta forma, fornecendo zero ao argumento de index
array, obtém-se o primeiro byte enviado pelo Servo.

Figura 6. 5 Loop principal : VISA WRITE.

Depois, o byte recebido, já convertido em representação decimal, adentra uma sub-


estrutura do programa, nomeada por trata sinal de velocidade.vi, responsável por
transformar os dados em informações de posição e velocidade, como mostrado na figura 6.10.
Após a transformação, os dados são convertidos para radianos ou RPM, de acordo com o
comando do usuário. Finalmente atualizam as janelas gráficas. Um outro ponto do programa
que pode ser executado caso o usuário deseje, é a filtragem dos dados. Isto é recomendável
principalmente quando se está visualizando os sinais de velocidade que aparecem bastante
contaminados por ruídos de medição. O filtro é implementado pela estrutura nomeada de
FiltroDigital.vi, mostrada na figura 6.6. Uma observação, neste ponto, é que o filtro não entra
no laço de realimentação para os Virtual Instruments de malha fechada, servindo apenas para
melhorar a visualização dos sinais apresentados ao usuário.

115
Figura 6. 6 Filtro digital implementado.

A figura 6.5 ilustra como se procede a escrita na porta serial. Basicamente é um


procedimento inverso ao de leitura: utiliza-se o bloco VISA write, informando em seus
argumentos a porta onde irá ser realizada a operação e o caracter que será escrito. Antes há,
porém, uma preocupação semelhante àquela de leitura que é o tratamento dos dados. No caso
da transmissão pelo PC, a questão foi resolvida utilizando-se o VI desenvolvido para
conversão de um sinal de tensão em dois bytes, contendo informação de polaridade e 1024
níveis de precisão referentes ao ciclo de trabalho do PWM, mostrado na figura 6.7.

Figura 6. 7 Tratamento do Sinal de Controle Para o Formato de 2 bytes.

Como foi discutido com mais detalhe no Capítulo 2, o módulo do sinal de tensão a ser
aplicado na armadura do motor é um valor que varia entre -6 e 6 Volts (tensão de

116
alimentação). Esta informação deve ser enviada ao Servo em dois bytes: o primeiro contém os
8 bits mais significativos do ciclo de trabalho do PWM. O segundo, contém 3 bits de
informação: os dois primeiros são os dois bits menos significativos do PWM e o sétimo é a
polaridade do sinal de tensão.
Assim, o usuário deve fornecer através da interface, como amplitude do sinal de
referência, no caso da malha aberta, um valor entre -6 e +6 volts e o programa deve converter
esta informação em dois bytes. Para o caso de malha fechada, o algoritmo de controle fornece
este sinal, denominado de sinal de controle. Isto se procede da seguinte maneira:
1. Determina-se o módulo da tensão desejada, convertendo-o imediatamente em
um número inteiro entre 0 e 1023 (correspondente a uma palavra de 10 bits).
Isto pode ser feito através da função int na equação:

d = int(1023 ⋅ (a + b ⋅ v )) , onde v é a tensão desejada em modulo, a é


Vcc

constante e igual a zero e b é constante e igual a um. O resultado deve ser


arredondado para o inteiro mais próximo [1].
2. Determina-se o sinal de v , ou seja, o sentido de rotação desejada,
transformando-o em um dígito binário. Sugere-se adotar a convenção de sinal
positivo = “1”, sentido horário, e o sinal negativo = “0”, sentido anti-horário.
Nestas condições, a equação de conversão é: s = [sin al (v) + 1] . A função
sinal() retorna +1 se seu argumento é positivo e –1, caso negativo.
3. Divide-se o número d por quatro. O quociente será um número inteiro em
formato byte (8 bits), representativo dos bits mais significativos de d, devendo,
portanto, ser a primeira informação transmitida. O resto da divisão corresponde
aos dois bits menos significativos. A este resultado deve ser somado o número
s multiplicado por 32.

117
Isso se dá pois, seja um número de 10 bits: N = b0 + b1 × 2 1 + … + b9 2 9 . Se os oito
bits mais significativos fossem escritos em um único byte, este seria:
Byte = b2 2 0 + b3 21 + … + b9 2 7 . Para obter este resultado a partir de d, basta dividi-lo por 4

ou 2 2 (isto é, reduzindo todas as potências em duas unidades). Claramente, a parte inteira do


resultado são os 8 bits mais significativos de d. O resto da divisão, os bits b0 e b1 , por

hipótese são os menos significativos, que organizados no mesmo byte determinam um arranjo
da seguinte forma:
Para inserir o dígito s na posição indicada (7o bit) sem alterar a informação, basta
somar o resultado anterior (b0 b1) este dígito multiplicado por 32 ou 25 , já que isto o coloca
imediatamente na posição do 7o bit.

s b1 b0

O VISA Write utiliza os dados no formato caracter (ASCII), logo ainda se faz
necessário converter os resultados para caracter, com este fim utiliza-se à função Byte Array
to string.
Por fim, quando o usuário solicitar o término do programa a função VISA Close é
usada para fechar o driver, ver figura 6.8. Nesta etapa pode-se ainda, em seqüência, acessar
um diretório determinado pelo usuário para salvar os sinais utilizados durante o ensaio, como
mostra a figura 6.9.

Figura 6. 8 Estrutura responsável por fechar a porta serial

118
Figura 6. 9 Rotina para salvar os sinais do ensaio em um arquivo para analise posterior.

Para salvar os dados utiliza-se a função Write Character To File. Na figura 6.8,
observa-se que é necessário um tratamento dos sinais para tornar possível salvá-los.
Basicamente, concatena-se todos os sinais desejados em um único vetor através da função
Build Array. Transpõe-se utilizando a função Transpose 2D Array. Converte-se para string.
Substui-se ‘,’ por ‘.’ com a função search and replace string e finalmente, a função Write
Character To File armazena os dados no local especificado pelo usuário.

Figura 6. 10 Trata Sinal de Posição e Velocidade

119

Você também pode gostar