implementação da técnica de eletrofiação de filmes poliméricos
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