universidade federal de alfenas paulo ... - unifal … · laboratório de limnologia da...

40
UNIVERSIDADE FEDERAL DE ALFENAS PAULO HENRIQUE GOMES IMPLEMENTAÇÃO DA TÉCNICA DE ELETROFIAÇÃO DE FILMES POLIMÉRICOS Alfenas/MG 2014

Upload: phamdung

Post on 11-Jan-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDADE FEDERAL DE ALFENAS

PAULO HENRIQUE GOMES

IMPLEMENTAÇÃO DA TÉCNICA DE ELETROFIAÇÃO DE FILMES POLIMÉRICOS

Alfenas/MG

2014

PAULO HENRIQUE GOMES

IMPLEMENTAÇÃO DA TÉCNICA DE ELETROFIAÇÃO DE FILMES POLIMÉRICOS.

Projeto de Trabalho de Conclusão de Curso como parte dos requisitos para obtenção do título de graduado em Física Licenciatura pela Universidade Federal de Alfenas. Área de concentração: Física de Materiais. Orientador: Dr. Célio Wisniewski

Alfenas/MG 20134

Resumo

A técnica de eletrofiação, criada a mais de 70 anos, consiste na produção de

nanofibras a partir de uma solução polimérica injetada sob a ação de um campo

elétrico elevado, formando um fio contínuo da solução que é depositado sobre

um substrato. Este tipo de polímero eletrofiado possui uma grande área

superficial devido às fibras e a porosidade e possui inúmeras aplicações

tecnológicas. Neste trabalho, foi desenvolvida a técnica de eletrofiação, no

laboratório de Limnologia da Unifal–MG, para utilização em trabalhos

subsequentes.

Palavras-chave: Polímeros; Eletrofiação; Nanofibras;

Lista de Figuras

Figura 1. Desenho esquemático do processo de eletrofiação de uma substância

polimérica. ................................................................................................................... 2

Figura 2. Relação entre a área da superfície e o diâmetro das fibras[8]. .................... 3

Figura 3. Imagem obtida por MEV do PVDF eletrofiado [5]. ....................................... 3

Figura 4. Desenho esquemático do sistema de eletrofiação. ...................................... 6

Figura 5. Câmara utilizada para eletrofiação. A agulha está conectada a fonte de

alta tensão enquanto que a base (folha de alumínio) compartilha o aterramento com

a fonte de alta tensão. ................................................................................................. 7

Figura 6. PVDF depositado sobre a base coletora. Tensão de 15 KV. Distância

agulha/base coletora de aproximadamente 5 cm. ....................................................... 8

Figura 7. Sistema propulsor com um motor de passo e um conjunto de engrenagens

de redução. ................................................................................................................. 9

Figura 8. Desenho esquemático de um motor de passo. B1..B4 são os bits enviados

ao motor. N e S os polos dos indutores. .................................................................... 9

Figura 9. Velocidade de injeção de solução em função da velocidade do motor, em

porcentagem. ............................................................................................................ 10

Figura 10. Diagrama do circuito de interface entre o PIC 18F4550 e o motor de

passo. ........................................................................................................................ 10

Figura 11. Diagrama do circuito controlador baseado no PIC 18F4550. ................... 12

Figura 11. Interface gráfica do programa principal para controle do sistema de

eletrofiação. ............................................................................................................... 14

Sumário

1. Introdução ......................................................................................................... 1

2. Referencial Teórico ........................................................................................... 1

2.1. Eletrofiação ................................................................................................ 1

3. Objetivo ............................................................................................................. 4

4. Material e Métodos ............................................................................................ 4

4.1. Materiais ..................................................................................................... 4

4.2. Solução Polimérica ..................................................................................... 4

4.3. Circuito controlador .................................................................................... 4

5. Resultados......................................................................................................... 6

5.1. Funcionamento da eletrofiação .................................................................. 6

5.1.1. Câmara de eletrofiação .......................................................................... 6

5.1.2. Sistema propulsor .................................................................................. 8

5.1.3. Circuitos de controle ............................................................................. 10

5.1.4. Software de controle ............................................................................ 12

5.2. Dificuldades encontradas ......................................................................... 15

6. Conclusões ...................................................................................................... 15

7. Referências Bibliográficas ............................................................................... 15

8. ANEXO A – Código fonte dos softwares ......................................................... 17

8.1. Código do microcontrolador PIC 18F4550. .............................................. 17

8.2. Código fonte do software de controle instalado no microcomputador ...... 26

1

1. Introdução

A obtenção de nano fibras pela técnica de eletrofiação consiste na produção

de filmes poliméricos que possuem fibras organizadas ou aleatórias a partir de uma

solução deste polímero [9]. As fibras produzidas são da ordem de micrômetros a

nanômetros e possuem características excepcionais, tais como, grande área de

superfície em relação ao volume, maior rigidez e força de tensão. Graças a essas

características, as nano fibras possuem inúmeras aplicações tecnológicas como na

área industrial na forma de tecidos e na área científica como suportes para

crescimento celular, filtração de vírus e bactérias [1], partículas sólidas

extremamente finas, sensores, entre outros.

A primeira patente utilizando essa técnica foi em 1938, que consistia na

produção de filamentos poliméricos usando força eletrostática, utilizando uma

solução polimérica de acetato de celulose. De 1938 a 1993, poucas foram as

publicações a respeito da técnica de eletrofiação. Nos anos seguintes houve um

crescimento exponencial de publicações a respeito devido ao interesse nano

tecnológico, sendo que a produção da nano fibra por esse método é simples de se

obter [2].

2. Referencial Teórico

2.1. Eletrofiação

A técnica de eletrofiação foi criada a mais de 70 anos com o objetivo de

conseguir fibras da ordem de nanômetros através de uma solução polimérica. Ela

consiste em um campo elétrico gerado, devido à alta tensão elétrica aplicada entre a

solução polimérica e a placa. A solução é injetada através de um capilar, com

dimensões da ordem de 1 mm de diâmetro ou menor, e bombeada por ação da força

gravitacional ou um sistema eletromecânico injetor. O campo elétrico supera a

tensão superficial da solução, ejetando o polímero eletrofiado para fora do capilar

até chegar à placa coletora. As fibras no processo de eletrofiação obdessem uma

forma cônica, denominada cone de Taylor [3].

2

A formação da fibra e seu diâmetro podem variar de acordo com: o peso

molecular, a natureza do polímero e as propriedades físicas da solução de polímero

(concentração, viscosidade, condutividade, permeabilidade dielétrica e tensão

superficial), a tensão elétrica aplicada, a distância da ponta do capilar ao coletor e a

taxa de fluxo da solução [4]. Esses parâmetros são importantes para se constituírem

fibras específicas, de acordo com a necessidade a qual irá ser aplicada. A técnica de

eletrofiação é ilustrada na figura 1.

Figura 1. Desenho esquemático do processo de eletrofiação de uma substância polimérica.

Uma das principais características da nano fibra polimérica é a elevada área

superficial, isso permite uma superfície de contato com o meio externo muitas vezes

superior as das fibras convencionais.

3

Figura 2. Relação entre a área da superfície e o diâmetro das fibras[9].

A alta porosidade é, também, uma característica importante, permitindo uma

maior absorção.

Na figura 2 é mostrada uma imagem obtida por MEV para o polímero PVDF

eletrofiado, demonstrando a formação de fibras com diâmetro micrométrico (~0,2

um) [6][6].

Figura 3. Imagem obtida por MEV do PVDF eletrofiado [5].

4

3. Objetivo

Desenvolvimento e implantação de um sistema de eletrofiação na UNIFAL-

MG;

4. Material e Métodos

4.1. Materiais

Para a técnica de eletrofiação, foram utilizados materiais físicos: uma base

suporte, seringa, agulha (diâmetro 0,55 mm), fonte de alta-tensão de até 30 kV

(Spellman, modelo CZE 3000), placa metálica coletora e um microcomputador; um

circuito controlador e um software desenvolvido com a linguagem visual basic 6.0.

4.2. Solução Polimérica

Para a preparação da solução polimérica foi utilizado o PVDF Foraflon

F4000HD. Para o solvente, foi utilizada uma mistura de N, N-dimetilformamida (DMF,

99,5%) e acetona (99,7%) a uma proporção em volume de 3:1. Para a quantidade

de cada substância a ser preparada foi utilizado uma concentração 12% em peso de

PVDF e 88% de solventes. Portanto, sendo utilizados 1,00 g de PVDF, a quantidade

dos solventes, ou seja, os 88% da concentração do solvente é de 7,33 g, sendo 5,57

g de DMF e 1,80 de acetona. Essas substâncias foram misturas e aquecidas por 1

hora a uma temperatura de 70° C. Consequentemente depositadas em um frasco e

lacradas para que não haja evaporação dos solventes [7].

4.3. Circuito controlador

O circuito controlador foi construído com base no microcontrolador PIC

18F4550, da Microship inc. [8], que possui as seguintes características principais:

5

Tabela 1. Características principais do microcontrolador PIC 18F4550, da Microship inc.

Extraído do manual do fabricante [8].

Da tabela destaca-se a conexão USB (“Universal Serial Bus”) com o

microcomputador para controle do sistema. Como atuador no sistema, destacam-se

o conversor analógico digital (DAC) de 10 bits, necessário à leitura da tensão

atribuída pela fonte ao fluido injetado no eletrofiador, e as portas digitais A e B (Porta

A e B, respectivamente). O DAC permite precisão de aproximadamente 5 mV e

Intervalo de leituras de 0 a 5V. As portas digitais servirão para controle do motor de

passo, controle de relês, chaves, entre outros.

6

Além do PIC 18F4550, foi utilizado um potenciômetro digital (X9C102), um

amplificador de tensão (LM358), um buffer (ULN 2803) e um isolador óptico (CNY

74–4), que serão descritos no tópico resultados.

5. Resultados

5.1. Funcionamento da eletrofiação

O sistema de eletrofiação é mostrado esquematicamente na Figura 4. Ele é

composto basicamente por um microcomputador, uma interface USB, um sistema

eletrônico de controle, interface para o motor de passo, fonte de alta tensão e a

câmara de eletrofiação para injeção da solução e fabricação da manta eletrofiada.

Figura 4. Desenho esquemático do sistema de eletrofiação.

5.1.1. Câmara de eletrofiação

A câmara de eletrofiação é mostrada na Figura 5. A câmara é composta por

uma seringa com uma agulha de diâmetro de 0,55 mm. Uma placa coletora é

revestida com uma folha de alumínio. Ambas a agulha e a placa coletora estão

conectadas à alta tensão e ao aterramento da fonte de alta tensão, respectivamente.

7

A solução de PVDF é inserida na seringa e um sistema propulsor, construindo com

um motor de passo, impulsiona a amostra através da agulha. Simultaneamente à

propulsão, a fonte de alta tensão é ligada e o processo de eletrofiação é iniciado.

Figura 5. Câmara utilizada para eletrofiação. A agulha está conectada a fonte de alta tensão enquanto que a base (folha de alumínio) compartilha o aterramento com a fonte de alta tensão.

8

Na Figura 6 é mostrado o resultado de um processo de eletrofiação. A

velocidade de injeção foi ajustada para 100%, isto é, aproximadamente 0,8 ml/min. A

fonte foi ajustada para 15 KV e a distância da ponta da agulha à base coletora em 5

cm.

Figura 6. PVDF depositado sobre a base coletora. Tensão de 15 KV. Distância agulha/base coletora de aproximadamente 5 cm.

Pode–se notar a dispersão do polímero sobre a folha de alumínio

demonstrando a formação do Cone de Taylor. Entretanto, este resultado ainda é

preliminar, pois ainda não se tem um filme uniforme, mas promissor.

5.1.2. Sistema propulsor

O sistema propulsor é constituído de um motor de passo conectado a um

conjunto de engrenagens. O motor de passo consiste basicamente de um conjunto

de 4 indutores (Figura 8), sendo cada um conectado a um fio ou bit. Os fios

receberão sequencialmente um pulso elétrico (de 12 V no motor da figura) por um

tempo mínimo de 10 ms. Este constitui o tempo morto ou o tempo que é constante e

não pode ser alterado. Entre um pulso e outro existirá um tempo em que o motor

permanecerá desligado e que determinará a velocidade do motor. Este tempo foi

convertido em porcentagem de 0 a 100 % sendo o último o menor tempo e, portanto,

a maior velocidade. O motor de passo ainda possui um conjunto redutor de

9

engrenagens (Figura 7), de forma que uma volta completa corresponde a 20 passos.

O eixo do motor de passo foi conectado a um conjunto de engrenagens para

diminuir a velocidade do êmbolo da seringa e aumentar a força necessária para o

deslocamento do mesmo. Cada passo equivale a aproximadamente 1 µm do

deslocamento do êmbolo da seringa. A viscosidade da solução é alta, o que dificulta

a injeção da solução através da agulha, sendo, portanto necessário um torque

superior ao torque do motor conectado diretamente.

Figura 7. Sistema propulsor com um motor de passo e um conjunto de engrenagens de redução.

Figura 8. Desenho esquemático de um motor de passo. B1..B4 são os bits enviados ao motor. N e S os polos dos indutores.

Para calcular a quantidade de solução injetada, foi feita uma curva de

calibração em função da velocidade do motor, em porcentagem, que se refere ao

tempo de espera entre um pulso elétrico e outro enviado ao motor de passo. Note

que o sistema não é uma reta, pois existe um tempo gasto com os passos de

programação/execução do firmware gravado no PIC. Como a velocidade é

inversamente proporcional ao tempo, gera uma curva 1/t, semelhante à do gráfico.

10

0,0

0,1

0,2

0,3

0,4

0,5

0,6

0 10 20 30 40 50 60 70 80 90 100

Velocidade (%)

Inje

ção

(m

l/m

in)

Figura 9. Velocidade de injeção de solução em função da velocidade do motor, em porcentagem.

5.1.3. Circuitos de controle

O motor de passo foi conectado ao circuito controlador através de um circuito

isolador. Este circuito é composto por isoladores ópticos (CNY 74–4), que recebem

o bit correspondente do PIC 18F4550 e fazem o isolamento do PIC em relação à

fonte que envia o pulso para o motor de passo. O motor é conectado ao isolador

óptico através de um buffer (ULN 2803) que fornecerá a potência necessária ao

funcionamento do motor.

Figura 10. Diagrama do circuito de interface entre o PIC 18F4550 e o motor de passo.

O circuito controlador é baseado no microcontrolador PIC 18F4550. O

diagrama esquemático é mostrado na Figura 11. O PIC é conectado ao

microcomputador através da interface USB, que fornecerá a energia necessária para

11

o funcionamento do mesmo. Um oscilador (OSC) de 20MHz funciona como

temporizador para o PIC, conectado ao aterramento (GND) através dos capacitores

C2 = 15 pF. A Porta B do microcontrolador, ajustada para saída digital, controla o

motor de passo (byte alto – 16 a 128) e o potenciômetro digital (byte baixo = 1 a 8).

Os detalhes do firmware utilizado no PIC estão no Anexo A.1. Os passos do motor

são enviados sequencialmente (bits ..., 16, 32, 64, 128, 16,...) para o motor no

sentido horário de rotação ou a sequência inversa para o sentido anti–horário. A

velocidade do motor é determinada por um intervalo de tempo com todos os bits

desligados, entre um bit e outro. Quanto maior a velocidade, menor o tempo de

intervalo. O sistema propulsor possui ainda dois sensores de posição (máximo e

mínimo) para a seringa totalmente cheia ou vazia.

O potenciômetro digital (X9C102) possui 100KΩ divididos em 100 partes, isto

é, 1KΩ para cada passo (STEP). Para enviar um passo, o bit CS deve estar em

baixa (0V) e o bit de STEP deve executar uma transição de baixa para alta (0 V para

5V). O bit (UP/DOWN) determina se o passo é para baixo (0 V) ou para cima (5V).

O potenciômetro digital é ligado em 5V fornecendo, portanto, uma referência de

tensão de 5/100 V. Este valor é amplificado 2 vezes através do amplificador

operacional 741, que fornece o sinal de referência à fonte de alta tensão (HV–REF–

IN). Portanto, a fonte receberá passos de 2x5/100 V, em um intervalo de 0 a 10V,

que equivalem a 0 a 30 KV. Portanto cada passo corresponde a 30/100 KV ou 300

V.

A porta D do PIC é utilizada para 3 funções específicas. Através dos bits D0

e D1, ajustados para portas de entrada digital, o PIC recebe informações dos

sensores de posição (Sensor Motor). Sempre que o sensor é acionado, o bit é

colocado em alta (5 V), permitindo que o PIC interrompa o curso do motor de passo.

Já os bits D6 e D7 são utilizados, respectivamente, como chaves para ligar a alta

tensão no sistema (HV ON/OFF) e alterar a polaridade da alta tensão (HV POL +/–).

O ajuste da tensão de entrada da fonte (HV–REF–IN) necessita ser conferido.

Desta forma é utilizado o Conversor Analógico Digital (DAC) do PIC. A leitura é feita

através dos bits A0 e A1 da porta A, que são ajustados para entrada analógica. O

sinal HV–REF–IN é conectado no pino A0 enquanto que a referência, fornecida pela

fonte de alta tensão é conectada no pino A1.

12

Figura 11. Diagrama do circuito controlador baseado no PIC 18F4550.

5.1.4. Software de controle

O software de controle (ou programa) foi elaborado na linguagem de

programação visual basic 6.0. Este programa possui duas partes distintas, um

módulo principal e um módulo de controle (Anexo A.8.2). O módulo de controle

possui todos os procedimentos e funções necessárias à comunicação, via porta

USB, com o PIC. Ao conectar o circuito controlador ao microcomputador, o sistema

operacional instala um driver ou biblioteca, fornecido pelo fabricante, que converte a

comunicação com a porta USB em uma porta Serial. O acesso à porta serial é

facilitado pela simplicidade de programação deste tipo de porta.

A partir daí foi construído um protocolo de comunicação. O protocolo consiste

no envio de caracteres específicos que serão interpretados pelo firmware do PIC. Os

caracteres e a respectiva função são mostrados na Tabela 2.

13

Tabela 2. Caracteres enviados pelo programa do microcomputador para o PIC.

Caractere Função

Descrição

I Inicialização do sistema

Conecta com a porta USB e envia este comando para teste do PIC.

T Velocidade do motor

Ajusta a velocidade do motor de passo, enviando o valor do intervalo de tempo entre os

pulsos.

B Ajuste dos bits da porta B

Ajusta o valor dos bits da porta digital B.

D Ajuste dos bits da porta D

Ajusta o valor dos bits da porta digital D.

M Ajuste e acionamento do motor de passo

Ajusta os parâmetros do motor de passo como o motor (0 ou 1, no caso de 2 motores), a

direção de giro (horário ou anti–horário), o número de passos e se responde ao sensor de

posição. Logo após inicia a execução.

A Ajuste e início/finalização da aquisição

Define a quantidade de canais do conversor analógico digital – DAC a serem lidos e o

número de amostras para a média. Além disso inicia a aquisição de um único sinal ou de

forma contínua.

Como exemplo, se for necessário enviar um comando para acionar o motor

de passo, deve–se mandar o seguinte comando, na forma de um vetor de caracteres

ou String, para o PIC.

String = "M"+Chr(Motor)+Chr(Direcao)+Chr(NP \ 256)+Chr(NP Mod 256) +

Chr(Sensor).

O caractere M identifica o comando para acionar o motor. A função Chr(V) é o

código ASCII (tabela internacional de caracteres) correspondente ao valor da

variável V. Por exemplo, a letra “A” corresponde ao código 65 da tabela, isto é, para

obter o caractere “A” é necessário fazer A = Chr(65). Portanto, o valor de Motor (0

ou 1), Direção (0 ou 1) e Sensor (0 ou 1) serão convertidos em caracteres ASCII.

Já a variável NP corresponde ao Número de Passos do motor. Como os caracteres

ASCII estão limitados a valores de 0 a 255 (ou 256 possibilidades), um número

maior que 255 deve ser convertido em 2 bytes ou caracteres. Para fazer isto,

dividimos NP em dois: um caractere com os múltiplos de 255 (a parte inteira de NP

14

dividido por 256 = NP \ 256) e o resto da divisão (=NP Mod 256). O PIC receberá os

números e fará a conversão novamente em um número maior que 255.

O PIC processará a informação e enviará a resposta da execução do

comando. Existem duas possibilidades de resposta do PIC ao programa:

Tabela 3. Caracteres recebidos do PIC, após o envio dos comandos da tabela 2.

Caractere Função

Descrição

XC Execução com sucesso

Envia dois caracters, X para execução com sucesso e C que corresponde a função

executada, que pode assumir as funções da tabela anterior, isto é, C igual a B, I, T, D, A

ou M

0CCCCCCC Resposta da aquisição do DAC

Ao fazer a conversão, o PIC envia um vetor cujo comprimento é de 8x(Número de

canais). Os oito caracteres (ou byte) começam com o número zero seguido de sete

caracteres (0CCCCCCC), onde C é um dígito de 0 a 9. Este byte representa a média dos

valores lidos do canal, que é convertido em volts. Por exemplo: 01276820 corresponde

ao valor 1,27682 volts.

No módulo principal estão os comandos necessários para a interface com o

usuário. A interface gráfica é mostrada na Figura 12. Na região superio, à direita é

mostrada a resposta do DAC do PIC para dois canais, o sinal enviado para a

referência de tensão da fonte e o sinal efetivamente aplicado pela fonte na ponta da

agulha. Na parte central estão os comandos relacionados a injeção da solução pela

seringa (Motor). Na parte inferior esquerda estão as informações referentes a alta

tensão. O ajuste dos bits em Porta B e D pode ser feita manualmente através dos

módulos na parte superior esquerda.

Figura 12. Interface gráfica do programa principal para controle do sistema de eletrofiação.

15

Para obter a amostra da Figura 6 foi utilizado este programa e o sistema de

eletrofiação descritos acima. O sistema ainda necessita de aperfeiçoamentos.

A lista com os códigos de programação e todas as funções e procedimentos

estão no anexo A.

5.2. Dificuldades encontradas

O trabalho com alta tensão é sempre complicado pois pequenas descargas

elétricas provocam danos. Na eletrofiação, devido as suas características, é

necessário aplicar alta tensão em um sistema cuja corrente não é linear e está

sujeita às variações de atmosfera entre a ponta da agulha e a base, principalmente

devido à variação da pressão de vapor de solvente.

Portanto, foi necessário o esforço adicional para isolar o circuito controlador

da fonte de alta tensão e do motor de passo. Isto foi feito com os isoladores ópticos

e com uso de um notebook, desconectado da rede, para evitar flutuações de tensão

que interrompessem a comunicação USB com o microcomputador.

Outra dificuldade foi a falta de experiência que foi melhorada ao longo do

tempo.

6. Conclusões

O sistema foi construído e colocado em operação, demonstrando ser robusto,

na medida do possível, para fazer os filmes eletrofiados.

O filme produzido ainda tem imperfeições, mas que serão sanadas em

trabalhos futuros.

7. Referências Bibliográficas

[1] Deitzel, J.; Kleinmeyer, J., Harris, D., & Beck Tan, N. (2001). The effect of

processing variables on the morphology of electrospun nanofibers and textiles.

Polymer , 261-272.

[2] Calíope, P. G. (2009). Caracterização de nanofibras através de técnicas de

processamento de imagens. Escola Politécnica da Universidade de São

Paulos. Tese.

16

[3] Lyons, J., Li, C., & Ko, F. (2004). Melt-electrospinning part I: processing

parameters and geometric properties. Polymer , 7597-7603.

[4] Theron, S., Zussman, E., & Yarin, A. (2004). Experimental investigation of the

governing parameters in the electrospinning of polymer solutions. Polymer ,

2017-2030.

[5] Zhang, Y.; Lim, C. T. & Ramakrishna, S. (2005). Recent development of

polymer nanofibers for biomedical and biotechnological application. Journal of

Materials science: Materials in Medicine. 16. 933- – 946.

[6] Choi, S. W., Kim, J. R., Ahn, Y. R., Jo, S. M., & Cairns, E. J. (2007).

Characterization of Electrospun PVdF Fiber-Based Polymer Electrolytes.

Chemistry of Materials , 104-115.

[7] Gasparini, T. M.; Bretas, R. E. S.; Silva, A. B.; Filho, R. G. (2012). Processing

and Characterization of Oriented Electrospun Poly(vinylidene fluoride) Mats.

Journal of Polymer Science, 1304–1311.

[8] PIC 18/f4550 – Manual do Fabricante disponível em

http://ww1.microchip.com/downloads/en/DeviceDoc/39632e.pdf

[9] Y. Zhang, C.T. Lim, and S. Ramakrishna, "Recent development of polymer

nanofibers for biomedical and biotechnological applications," Journal of

Materials Science: materials in medicine 16 (2005 ) 933 – 946

17

8. ANEXO A – Código fonte dos softwares

8.1. Código do microcontrolador PIC 18F4550.

O código do firmware foi desenvolvido em linguagem C18.

Bibliotecas pré–definidas incluídas no programa principal.

#include "usb.h" #include "usb_function_cdc.h"

#include "usb_config.h"

#include "usb_device.h"

#include "HardwareProfile.h"

#include "GenericTypeDefs.h" #include "Compiler.h"

#include "programa.h"

O procedimento e definições a seguir são necessários para ajustar o PIC 18F4550, como o reendereçamento de memória das interrupções de hardware..

void USBDeviceTasks(void); void YourHighPriorityISRCode();

void YourLowPriorityISRCode();

/** VECTOR REMAPPING ***********************************************/

#define REMAPPED_RESET_VECTOR_ADDRESS 0x1000

#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x1008 #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x1018

extern void _startup (void);

#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS

void _reset (void)

asm goto _startup _endasm

#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS void Remapped_High_ISR (void)

_asm goto YourHighPriorityISRCode _endasm

#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS void Remapped_Low_ISR (void)

_asm goto YourLowPriorityISRCode _endasm

18

#pragma code HIGH_INTERRUPT_VECTOR = 0x08

void High_ISR (void)

_asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm

#pragma code LOW_INTERRUPT_VECTOR = 0x18 void Low_ISR (void)

_asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm

#pragma code

#pragma interrupt YourHighPriorityISRCode

void YourHighPriorityISRCode()

#if defined(USB_INTERRUPT) USBDeviceTasks();

#endif

#pragma interruptlow YourLowPriorityISRCode

void YourLowPriorityISRCode()

#pragma code

O procedimento main é a parte principal de execução da programação.

void main(void)

USBDeviceInit();

TRISB=0; TRISD=0b00000011;

while(1)

#if defined(USB_INTERRUPT)

if(USB_BUS_SENSE && (USBGetDeviceState() == DETACHED_STATE))

USBDeviceAttach();

#endif

USBDeviceTasks();

programa();

CDCTxService();

19

O procedimento USER_USB_CALLBACK_EVENT_HANDLER é para implementação futura de resposta a eventos da comunicação USB.

BOOL USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, WORD size)

switch(event)

case EVENT_TRANSFER:

break;

case EVENT_SOF:

break; case EVENT_SUSPEND:

break;

case EVENT_RESUME:

break;

case EVENT_CONFIGURED:

CDCInitEP(); break;

case EVENT_SET_DESCRIPTOR:

break;

case EVENT_EP0_REQUEST:

USBCheckCDCRequest();

break; case EVENT_BUS_ERROR:

break;

case EVENT_TRANSFER_TERMINATED:

break;

default:

break;

return TRUE;

#pragma udata

unsigned long NPtos=2000;

char UsbOut[64];

char UsbIn[64];

BYTE NBytes; BYTE Passo_Atual[2]=3,3;

BYTE Tempo=50;

BYTE TempoOn=20;

BYTE Channels=1;

BYTE AqsContinua=0;

20

#pragma code

O procedimento SendWord envia um vetor de caracteres, com N caracteres, para a porta USB.

void SendWord(BYTE N)

USBDeviceTasks();

CDCTxService();

if (USBUSARTIsTxTrfReady())

putUSBUSART(UsbOut,N);

return;

O procedimento AtualizaPorta atualiza o Valor da porta P (B ou D). Bites se refere a um bit específico da porta ou, se Bites = 8, o byte todo da porta P será atualizado com o Valor.

void AtualizaPorta(BYTE P, BYTE Valor, BYTE Bites)

switch(Bites)

case 8:

switch(P)

case 'B' : PORTB=Valor;

break;

case 'D' :

PORTD=Valor;

break;

break;

case 7:

switch(P)

case 'B' :

PORTBbits.RB7=Valor;

break; case 'D' :

PORTDbits.RD7=Valor;

break;

break; case 6:

switch(P)

case 'B' :

PORTBbits.RB6=Valor;

break;

case 'D' : PORTDbits.RD6=Valor;

break;

break;

case 5:

switch(P)

21

case 'B' :

PORTBbits.RB5=Valor; break;

case 'D' :

PORTDbits.RD5=Valor;

break;

break; case 4:

switch(P)

case 'B' :

PORTBbits.RB4=Valor;

break; case 'D' :

PORTDbits.RD4=Valor;

break;

break;

case 3: switch(P)

case 'B' :

PORTBbits.RB3=Valor;

break;

case 'D' :

PORTDbits.RD3=Valor; break;

break;

case 2:

switch(P)

case 'B' : PORTBbits.RB2=Valor;

break;

case 'D' :

PORTDbits.RD2=Valor;

break;

break;

case 1:

switch(P)

case 'B' :

PORTBbits.RB1=Valor; break;

case 'D' :

PORTDbits.RD1=Valor;

break;

break;

22

case 0:

switch(P) case 'B' :

PORTBbits.RB0=Valor;

break;

case 'D' :

PORTDbits.RD0=Valor;

break;

break;

return;

O procedimento ADCRead realiza a leitura dos canais analógicos. A variável Channels define quantos canais serão lidos e a variável NPtos define de quantos pontos será a média do valor. O valor médio de cada canal lido será enviado no formato 0XXXXXXX, onde X são os dígitos (de 0 a 9) que corresponde ao valor em microvolts.

void ADCRead(void) unsigned long TT;

unsigned long iTmp;

char ADDados[7];

float Temp[7];

float Aux;

BYTE i; BYTE j;

BYTE ch;

ADCON2 = 0b10001010;

ADCON0 = 0x00;

for (i=0; i<8*Channels; i++) UsbOut[i]=48;

for (ch=0;ch<Channels; ch++)

Temp[ch]=0;

iTmp=0;

ch=0;

while (iTmp<NPtos)

ADCON0 = (ch << 2);

ADCON0bits.ADON = 1;

ADCON0bits.GO = 1; while (ADCON0bits.NOT_DONE);

ADCON0bits.ADON = 0;

if (ADRESH<4)

Aux=(256*ADRESH)+ADRESL;

Temp[ch]=Temp[ch]+(Aux/1023);

ch=ch+1; if (ch==Channels)

23

ch=0; iTmp=iTmp+1;

for (ch=0;ch<Channels; ch++)

Temp[ch]=(float)(Temp[ch]/iTmp);

TT=(unsigned long)5000000*Temp[ch];

for (i=0; i<=6; i++) ADDados[i]=0;

ultoa(TT,ADDados);

i=7;

j=8*(ch+1)-1; while (i>0)

i=i-1;

if ((ADDados[i]>47) && (ADDados[i]<58))

UsbOut[j]=ADDados[i];

j=j-1;

SendWord(8*(Channels)-1);

return;

O procedimento Sensor faz a leitura dos bits 0 e 1 da Porta D. Estes estão ligados a sensores que definem o início e o fim do curso máximo do êmbolo da seringa.

BYTE Sensor(BYTE NumMotor)

BYTE V;

switch (NumMotor)

case 0: V=PORTDbits.RD0;

break;

case 1:

V=PORTDbits.RD1;

break;

return V;

O procedimento MovimentaMotores executa a rotação do Motor (0 ou 1) na direção (0 ou 1 – horário ou anti–horário) o número de passos definido em Count=256*HighBYTE+LowBYTE. ActiveSensor define se o sensor de posição do motor esta ativo(0 = inativo, 1=ativo).

void MovimentaMotores(BYTE Motor, BYTE iDirecao, BYTE HighBYTE, BYTE LowBYTE, BYTE ActiveSensor)

unsigned long Count;

unsigned long Ref;

unsigned long Delta; BYTE iPasso;

24

BYTE pPasso;

BYTE Direcao; BYTE SensorAtivo;

Direcao=iDirecao;

SensorAtivo=ActiveSensor;

Count=256*HighBYTE+LowBYTE;

Delta=(unsigned long)Count/5;

if (Delta<5) Delta=Count;

Ref=Count-Delta;

UsbOut[0]='M'; UsbOut[1]=0;

iPasso=Passo_Atual[Motor]; while (Count>0)

CDCTxService();

switch(iPasso)

case 9:

iPasso=12-9*Direcao;

break; case 12:

iPasso=6+3*Direcao;

break;

case 6:

iPasso=3+9*Direcao;

break; case 3:

iPasso=9-3*Direcao;

break;

pPasso=iPasso;

if (Motor == 1) pPasso<<=4;

PORTB=pPasso;

Count=Count-1;

if (Count==Ref) Ref-=Delta; UsbOut[1]+=20;

SendWord(2);

if ((Sensor(Motor) > 0) && (SensorAtivo > 0))

UsbOut[0]='S';

SendWord(1); Count=5;

SensorAtivo=0;

Direcao=1-Direcao;

Delay10KTCYx(TempoOn);

PORTB=0;

25

if (Tempo>TempoOn)

Delay10KTCYx(Tempo-TempoOn);

Passo_Atual[Motor]=iPasso;

return;

O procedimento programa é a parte principal que faz a leitura da USB e direciona para o procedimento específico. Também envia, se AqsContinua > 0, o(s) valor(es) do(s) canal(is) lido(s) do conversor analógico, de forma periódica e contínua. Se este valor é igual a 2, envia somente uma leitura e interrompe o envio (AqsContinua = 0).

void programa(void) if (AqsContinua>0)

ADCRead();

if (AqsContinua==2)

AqsContinua=0;

NBytes = getsUSBUSART(UsbIn, 64);

if (NBytes > 0)

switch(UsbIn[0])

case 'B':

AtualizaPorta(UsbIn[0],UsbIn[1],UsbIn[2]);

break; case 'M':

MovimentaMotores(UsbIn[1],UsbIn[2],UsbIn[3],UsbIn[4],UsbIn[5]);

break;

case 'T':

Tempo=UsbIn[1]; TempoOn=UsbIn[2];

break; case 'D':

AtualizaPorta(UsbIn[0],UsbIn[1],UsbIn[2]);

break;

case 'I':

TRISB=0; TRISD=0b00000011;

PORTD=0;

PORTB=0;

break;

case 'A':

Channels=UsbIn[1]; NPtos=(unsigned long)50*UsbIn[2];

AqsContinua=UsbIn[3];

break;

case 'U':

switch (UsbIn[1])

case 'A': TRISA=UsbIn[2];

26

break;

case 'B': TRISB=UsbIn[2];

break;

case 'D':

TRISD=UsbIn[2];

break;

break;

UsbOut[0]='X';

UsbOut[1]=UsbIn[0];

SendWord(2); NBytes=0;

8.2. Código fonte do software de controle instalado no microcomputador

O código fonte do programa de controle instalado no microcomputador foi

elaborado em linguagem Visual Basic 6.0. O programa possui um módulo principal,

com interface com o usuário, e um módulos de controle para a comunicação com a

USB.

Programa principal

Option Explicit

Const HVDir_Bit = BitsOptions.Bit2

Const CS_Bit = BitsOptions.Bit0

Const HVStep_Bit = BitsOptions.Bit1

Const HVOn_Bit = BitsOptions.Bit3 Const BitLigado = 1

Const BitDesligado = 0

Const HV_Up_Dir = 1

Const HV_Down_Dir = 0

Dim USB_ON As Boolean Dim NewAqs As Boolean

O procedimento AjustarPotenciometro envia NPassos ou pulsos para o potenciômetro digital. A variável Direcao indica se o potencial subirá ou descerá (HVDir_Bit).

Private Sub AjustarPotenciometro(NPassos As Byte, Direcao As Long)

Dim i As Byte USB.Atualiza_BYTE_Porta Porta_B, BitDesligado, CS_Bit

USB.Atualiza_BYTE_Porta Porta_B, Direcao, HVDir_Bit

27

For i = 1 To NPassos

USB.Atualiza_BYTE_Porta Porta_B, BitLigado, HVStep_Bit USB.Atualiza_BYTE_Porta Porta_B, BitDesligado, HVStep_Bit

Next i

End Sub

O procedimento AtualizarHV_Click chama o procedimento AjustarPotenciometro para ajustar o valor determinado pelo usuário para a fonte de alta tensão.

Private Sub AtualizarHV_Click()

Dim i As Integer

Dim j As Long

i = 0

If CSng(HV.Value) > CSng(ChanValue(0).Caption) Then While (CSng(HV.Value) > CSng(ChanValue(0).Caption)) And i < 100

NewAqs = False

AjustarPotenciometro 1, HV_Up_Dir

Do

DoEvents

Loop Until NewAqs = True i = i + 1

Wend

Else

While CSng(HV.Value) < CSng(ChanValue(0).Caption) And i < 100

NewAqs = False

AjustarPotenciometro 1, HV_Down_Dir Do

DoEvents

Loop Until NewAqs = True

i = i + 1

Wend

End If End Sub

O procedimento HVOnOff_Click liga ou desliga a saída de alta tensão da fonte.

Private Sub HVOnOff_Click()

HVOnOff.Tag = 1 - HVOnOff.Tag If HVOnOff.Tag = 1 Then

HVOnOff.Caption = "HV" & vbCrLf & "ON"

HVOnOff.BackColor = &H8080FF

Else

HVOnOff.Caption = "HV" & vbCrLf & "OFF"

HVOnOff.BackColor = vbButtonFace End If

USB.Atualiza_BYTE_Porta Porta_B, HVOnOff.Tag, HVOn_Bit

End Sub

O procedimento MovimentaMotor_Click ajusta a posição do motor de passo.

Private Sub MovimentaMotor_Click()

28

USB.Movimenta_Motor MotorBit16to128, -CInt(DirecaoOpt(1).Value), Passos.Text, Sensor.Value

End Sub O procedimento USB_USBData recebe os dados do conversor analógico digital do microcontrolador PIC18F4550 e coloca na tela.

Private Sub USB_USBData(ByVal Ponto As Long, ByVal Valor As Variant, ByVal Delay As Variant)

Dim i As Long

NewAqs = True For i = 0 To 1

ChanValue(i).Caption = Format(Valor(i), "#0.00")

Next i

DoEvents

End Sub O procedimento Btn_Click finaliza o programa.

Private Sub Btn_Click()

USB.Iniciar_Aquisicao 2, Stop_Acquisition

Do

DoEvents Loop Until USB.FuncaoDone

USB.Desconectar

End

End Sub

O procedimento VelocidadeMotor_Change e VelocidadeMotor_LostFocus calculam a velocidade do motor e colocam na tela.

Private Sub VelocidadeMotor_Change(Value As String)

Dim v As Single

v = VelocidadeMotor.Value

Injecao.Caption = Format(0.0000105228 * v ^ 2 + 0.0000080252 * v + 0.0316547716, "0.0000") & " ml/min" End Sub

Private Sub VelocidadeMotor_LostFocus()

Dim v As Single

v = VelocidadeMotor.Value USB.Velocidade_Motor 254 * v / 100

Injecao.Caption = Format(0.0000105228 * v ^ 2 + 0.0000080252 * v + 0.0316547716, "0.0000") & " ml/min"

End Sub

O procedimento Form_Activate inicializa as variáveis do programa.

Private Sub Form_Activate()

HVOnOff.Caption = "HV" & vbCrLf & "OFF"

VelocidadeMotor.Tag = 0

USB_ON = USB.Conectar(1)

If USB_ON Then

USB.Atualiza_BYTE_Porta Porta_B, BitDesligado, AllBits USB.Iniciar_Aquisicao 2, Continuous_Acquisition, 200

29

End If

End Sub

Controle para comunicação com a USB

Public Enum BitsOptions

Bit0 = 0 Bit1 = 1

Bit2 = 2

Bit3 = 3

Bit4 = 4

Bit5 = 5

Bit6 = 6 Bit7 = 7

AllBits = 8

End Enum

Public Enum MotorOptions

MotorBit1to8 = 0 MotorBit16to128 = 1

End Enum

Public Enum MotorSpinOptions

Clockwise = 0 AntiClockwise = 1

End Enum

Public Enum PortaDigital

Porta_B = 66

Porta_D = 68 End Enum

Public Enum AqsOptions

Stop_Acquisition = 0

Continuous_Acquisition = 1

Single_Acquisition = 2 End Enum

Private WithEvents FuncaoTimer As VB.Timer

Private WithEvents ContadorTimer As VB.Timer

Private WithEvents InfoTimer As VB.Timer Private Funcao As New Collection

Private USB_PORT As Integer

Private Work As String

Private Velocidade As Long

Private AqsCanais As Long

Private AqsCount As Long Private AqsType As AqsOptions

30

Private AqsMediaPtosPorCanal As Long

Private TempoAqs As Single Private TempoEspera As Long

Private TempoEsperaAux As Long

Private TempoDecorrido As Long

O procedimentos USBData e USBInfo são eventos gerados para serem enviados ao programa principa..

Public Event USBData(ByVal Ponto As Long, ByVal Valor As Variant, ByVal Delay As Variant)

Public Event USBInfo(ByVal Info As Variant)

O procedimento Conectar conecta o computador, via USB, ao microcontrolador PIC 18F4550

Public Function Conectar(Optional Porta As Integer = 1) As Boolean 'verifica conexao com o amostrador na Porta

Dim j As Long

Dim resp As String

On Error Resume Next

Do USB_PORT = Porta

Serial.RThreshold = 0

Do

Serial.CommPort = USB_PORT

If Not Serial.PortOpen Then Serial.PortOpen = True

Serial.Output = "I" j = 0

Do

j = j + 1

resp = Mid(Serial.Input, 1, 1)

Loop Until resp <> "" Or j > 1000

If resp = "X" Or resp = "0" Then ShowInfo ("Conectado na COM" & USB_PORT)

Serial.RThreshold = 1

Conectar = True

Exit Function

Else Serial.PortOpen = False

USB_PORT = USB_PORT + 1

End If

Loop Until USB_PORT > 15

Loop Until MsgBox("Sem conexão com o PIC!" & vbCrLf & "Verifique ...", vbCritical + vbRetryCancel, "Erro de conexão com o PIC") <> vbRetry ShowInfo "Falha ao Conectar..."

USB_PORT = 0

Conectar = False

End Function

Public Sub DesConectar() If Serial.PortOpen Then Serial.PortOpen = False

31

End Sub

Public Sub Atualiza_BYTE_Porta(Porta As PortaDigital, Optional Valor As Long = 0, Optional iBit As BitsOptions = AllBits)

FuncaoAdiciona Chr(Porta) & Chr(Valor) & Chr(iBit)

End Sub

Public Sub Velocidade_Motor(Optional Veloc As Long = 200, Optional TempoON As Long = 10) '0 a 255

If Veloc > 254 Then Veloc = 254

Velocidade = 255 - Veloc

FuncaoAdiciona "T" & Chr(Velocidade) & Chr(TempoON)

End Sub

Public Sub Iniciar_Aquisicao(Optional Canais As Integer = 1, Optional Tipo As AqsOptions = Single_Acquisition, Optional MediaPtosPorCanal As Integer = 1000) '0 a 255

If MediaPtosPorCanal \ 50 < 1 Then MediaPtosPorCanal = 50

If MediaPtosPorCanal \ 50 > 255 Then MediaPtosPorCanal = 255 * 50

AqsMediaPtosPorCanal = MediaPtosPorCanal AqsCanais = Canais

AqsCount = 0

AqsType = Tipo

FuncaoAdiciona "A" & Chr(AqsCanais) & Chr(AqsMediaPtosPorCanal \ 50) & Chr(AqsType)

End Sub

Public Sub Parar_Aquisicao()

AqsType = Stop_Acquisition

FuncaoAdiciona "A" & Chr(AqsCanais) & Chr(AqsMediaPtosPorCanal \ 50) & Chr(AqsType)

End Sub

Public Sub Movimenta_Motor(Motor As MotorOptions, Rotacao As MotorSpinOptions, Numero_Passos As Long, Optional Sensor As Long = 0)

FuncaoAdiciona "M" & Chr(Motor) & Chr(Rotacao) & Chr(Numero_Passos \ 256) & Chr(Numero_Passos Mod 255) & Chr(Sensor)

End Sub

Private Sub IniciaConTagemDeTempo(ByVal TempoDeEspera As Long)

TempoDecorrido = 0

TempoEspera = TempoDeEspera

ContadorTimer.Enabled = True

End Sub

Private Sub FinalizaConTagemDeTempo()

ContadorTimer.Enabled = False

TempoDecorrido = 0

End Sub

Private Sub ContadorTimer_Timer() TempoDecorrido = TempoDecorrido + 1

32

If TempoDecorrido = TempoEspera Then

ShowInfo (Work & "Erro!!") Work = ""

FuncaoTimer.Enabled = True

End If

End Sub

Private Sub FuncaoTimer_Timer() FuncaoTimer.Enabled = False

If Work <> "" Then Exit Sub

If FuncaoItens > 0 Then

Serial.Output = FuncaoStr

IniciaConTagemDeTempo (3) TempoAqs = Timer

Select Case FuncaoTipo

Case "I":

Work = "Inicializando o sistema..."

Case "T":

Work = "Velocidade do motor = " & CLng(100 * (255 - Asc(FuncaoChar(2))) / 255) & "%..."

Case "B":

Work = "Porta B = " & Asc(FuncaoChar(2)) & "..."

Case "D":

Work = "Porta D = " & Asc(FuncaoChar(2)) & "..."

Case "M": IniciaConTagemDeTempo (2 * Velocidade * (Asc(FuncaoChar(4)) * 0.256 + Asc(FuncaoChar(5)) / 1000))

Work = "Movendo o motor " & Asc(FuncaoChar(2)) & "..."

TempoAqs = Timer

Case "A":

Work = "Adquirindo dados..." IniciaConTagemDeTempo (20 * Asc(FuncaoChar(3)) / 1000)

TempoEsperaAux = TempoEspera

End Select

FuncaoRemove

ShowInfo Work ContadorTimer.Enabled = True

End If

End Sub

Private Sub Serial_OnComm()

Dim R As String Dim i As Long

Dim Potencial() As Single

If Serial.CommEvent = comEvReceive Then

R = Serial.Input

FinalizaConTagemDeTempo

Select Case Left(R, 1)

33

Case "X":

ShowInfo Work & "Ok", 5000 RaiseEvent USBInfo(Timer - TempoAqs)

Work = ""

Case "0":

AqsCount = AqsCount + 1

ReDim Potencial(Len(R) / 8 - 1)

For i = 0 To Len(R) / 8 - 1 Potencial(i) = CSng(Mid(R, i * 8 + 1, 8)) / 1000000

Next i

RaiseEvent USBData(AqsCount, Potencial, Timer - TempoAqs)

Work = ""

If AqsType = Continuous_Acquisition Then IniciaConTagemDeTempo TempoEsperaAux

ShowInfo "Adquirindo dados..."

Else

ShowInfo "Aquisicao completa."

End If

Case "M": ShowInfo Work & Asc(Mid(R, 2, 1)) & "%"

IniciaConTagemDeTempo TempoEspera

RaiseEvent USBInfo(Timer - TempoAqs)

Case "S": ShowInfo "Sensor acionado..."

IniciaConTagemDeTempo TempoEspera

End Select If Work = "" Then FuncaoTimer.Enabled = True

End If

End Sub

Private Sub ShowInfo(Info As String, Optional Tempo As Long = 0)

InfoControle.Caption = Info If Tempo > 0 Then

InfoTimer.Interval = Tempo

InfoTimer.Enabled = True

Else

InfoTimer.Enabled = False End If

RaiseEvent USBInfo(Info)

End Sub

Private Sub InfoTimer_Timer()

InfoControle.Caption = "" InfoTimer.Enabled = False

End Sub

Public Property Get COM_PORT() As Integer

COM_PORT = USB_PORT

End Property

34

Private Sub InfoControle_Change() UserControl_Resize

End Sub

Private Sub FuncaoAdiciona(ComandoStr As String)

If USB_PORT = 0 Then Exit Sub

Funcao.Add ComandoStr If Not FuncaoTimer.Enabled Then FuncaoTimer.Enabled = True

End Sub

Private Sub FuncaoRemove(Optional Item As Integer = 1)

If Funcao.Count > 0 And Item <= Funcao.Count Then Funcao.Remove (Item) End Sub

Private Function FuncaoItens() As Long

FuncaoItens = Funcao.Count

End Function

Private Function FuncaoStr() As String

FuncaoStr = Funcao.Item(1)

End Function

Private Function FuncaoTipo() As String

FuncaoTipo = FuncaoChar(1) End Function

Private Function FuncaoChar(ItemChar As Long) As String

FuncaoChar = Mid(Funcao.Item(1), ItemChar, 1)

End Function

Public Property Let ControlBorderStyle(ByVal newBorderStyle As Long)

UserControl.BorderStyle = newBorderStyle

End Property

Public Property Get FuncaoDone() As Boolean If Funcao.Count = 0 And Work = "" Then FuncaoDone = True Else FuncaoDone = False

End Property

Private Sub UserControl_Initialize()

Set FuncaoTimer = Controls.Add("VB.Timer", "FuncaoTimer1", Me)

FuncaoTimer.Interval = 5 FuncaoTimer.Enabled = False

Set ContadorTimer = Controls.Add("VB.Timer", "ContadorTimer1", Me)

ContadorTimer.Enabled = False

ContadorTimer.Interval = 1000

Set InfoTimer = Controls.Add("VB.Timer", "InfoTimer1", Me)

InfoTimer.Enabled = False

35

Work = ""

Velocidade = 50 End Sub

Private Sub UserControl_Resize()

UserControl.Height = InfoControle.Height

UserControl.Width = 1.02 * InfoControle.Width

End Sub