UNIVERSIDADE POSITIVO SISTEMA PARA DESENHO EM PLACA DE CIRCUITO IMPRESSO CURITIBA 2008 HANDY BORGES PAULO HENRIQUE VITORINO SISTEMA PARA DESENHO EM PLACA DE CIRCUITO IMPRESSO TCC apresentado à banca Examinadora do Curso de Engenharia Elétrica da Universidade Positivo, disciplina de Trabalho de Conclusão de Curso, como requisito à obtenção do grau de Engenheiro(a) Eletricista. Orientador: Prof. André Macário Barros CURITIBA 2008 "É melhor tentar e falhar, que preocupar-se e ver a vida passar; é melhor tentar, ainda que em vão, que sentar-se fazendo nada até o final. Eu prefiro na chuva caminhar, que em dias tristes em casa me esconder. Prefiro ser feliz, embora louco, que em conformidade viver ..." Martin Luther King Agradeço a meus pais Marco Tulio Borges e Marlene Palaoro Borges, pelos princípios e ensinamentos que guiaram minha educação. À minhas queridas irmãs Hallema e Hesly e meu namorado Ennio Guido Schiavon Jr. pelo carinho, compreensão, apoio e paciência durante minhas ausências. Handy Borges Quero primeiramente agradecer a Deus, por sua infinita e misericórdia bondade, por me conceder saúde e força para conclusão de mais uma etapa na minha vida. Aos meus pais, que me deram a vida e me ensinaram a viver com dignidade, sempre confiaram em mim e que muitas vezes renunciaram aos seus próprios sonhos para que eu pudesse realizar o meu! Paulo HenriqueVitorino Queremos agradecer também aos Mestres e Professores que fizeram parte de nosso aprendizado, sempre com muita dedicação e amor. Pelas grandes amizades e amigos conquistados nestes últimos anos, amigos estes que sempre lembraremos com muito carinho. SUMÁRIO LISTA DE FIGURAS ............................................................................iv LISTA DE TABELAS............................................................................iv LISTA DE ABREVIATURAS ...............................................................v 1. INTRODUÇÃO..................................................................................1 1.1. Problema.............................................................................................1 1.2. Justificativa.........................................................................................1 1.3. Objetivos específicos..........................................................................2 2. FUNDAMENTAÇÃO TEÓRICA ....................................................3 2.1. Plotter.................................................................................................3 2.2. TraxMaker ..........................................................................................3 2.3. Motor de Passo ...................................................................................3 3. ESPECIFICAÇÕES TÉCNICAS PRELIMINARES.....................6 3.1. Visão geral do projeto ........................................................................6 3.2. Descrição funcional dos blocos..........................................................6 3.2.1. Circuit Maker e TraxMaker............................................................7 3.2.2. O software do PC............................................................................8 3.2.3. Microcontrolador ............................................................................8 3.2.4. Comunicação Serial ........................................................................9 3.3. Dimensionamento e memorial de cálculo ........................................10 3.3.1. Tratamento dos parâmetros de referência.....................................10 3.3.2. Fonte de alimentação ....................................................................11 3.3.3. Driver’s para acionamentos Motores de Passo.............................12 3.4. Programação.....................................................................................12 3.4.1. Programa do PC ............................................................................12 3.4.2. Programa do PIC...........................................................................13 3.5. Planejamento ....................................................................................14 3.5.1. Cronograma ..................................................................................14 3.5.2. Custos............................................................................................14 4. IMPLEMENTAÇÃO.......................................................................16 4.1. Descrição da montagem ...................................................................16 4.2. Testes, medições e configurações ....................................................20 4.3. Código Fonte ....................................................................................24 4.3.1. Firmware ......................................................................................24 4.3.2. Software ........................................................................................24 4.4. Placas de circuito impresso ..............................................................25 4.5. Custo do projeto ...............................................................................25 4.5.1. Componentes e materiais ..............................................................25 4.5.2. Serviços contratados .....................................................................25 5. RESULTADOS.................................................................................26 6. CONCLUSÕES ................................................................................28 Apêndice A .............................................................................................29 Apêndice B .............................................................................................30 Apêndice C .............................................................................................31 ii Apêndice D .............................................................................................32 D.1 Linhas de código do Form principal: ...............................................32 D.2 Linhas de código do Form Valores: .................................................46 D.3 Linhas de código do Form Setup:.....................................................47 D.4 Linas de código do Form Comandos: ..............................................51 D.5 Linhas de comando do Form AnalisarDados:..................................54 D.6 Linhas de código do Form Serial: ....................................................56 Apêndice E .............................................................................................58 D.1 Linhas de código para PIC ...............................................................58 Apêndice F..............................................................................................71 REFERÊNCIA.......................................................................................72 iii LISTA DE FIGURAS FIGURA 1 - Diagrama de blocos do projeto.............................................2 FIGURA 2 - Relação deslocamento x pulso..............................................4 FIGURA 3 - Diagrama de blocos do sistema ............................................6 FIGURA 4 - Tela do programa TraxMaker...............................................7 FIGURA 5 - Tela do arquivo .pcb gerado pelo TraxMaker ......................8 FIGURA 6 - Identificação dos parâmetros de referência ........................10 FIGURA 7 - Diagrama de blocos do circuito de corrente. ......................11 FIGURA 8 - Fluxograma de funcionamento do programa do PC...........13 FIGURA 9 - Fluxograma de funcionamento do programa do PIC .........14 FIGURA 10 - Fotografia lateral do plotter ..............................................17 FIGURA 11 - Fotografia da plotter – visão do carro...............................17 FIGURA 12 - Fotografia da plotter – vista traseira.................................18 FIGURA 13 - Detalhes do mecanismo da pena.......................................19 FIGURA 14 - Interface manual de controle ............................................21 FIGURA 15 - Acesso da tela de configuração da plotter ........................21 FIGURA 16 - Tela de configuração da plotter ........................................22 FIGURA 17 - Visualização dos ângulos pré-definidos ...........................23 FIGURA 18 - Interface final do programa ..............................................24 FIGURA 19 - Gráfico de tempo de execução das linhas horizontais ......27 FIGURA 20 - Gráfico de tempo de execução das linhas verticais ..........27 FIGURA 21 - Circuito eletrônico ............................................................29 FIGURA 22 - Cronograma ......................................................................30 FIGURA 23 - Placa de potência do eixo Y..............................................71 FIGURA 24 - Desenho placa principal....................................................71 FIGURA 25 - Desenho do sensor óptico .................................................71 LISTA DE TABELAS TABELA 1 - Energização para movimentação do motor de passo...........4 TABELA 2 - Sentido horário do motor de passo ......................................5 TABELA 3 - Informações dos microcontroladores...................................9 TABELA 4 - Comparação das comunicações .........................................10 TABELA 5 - Tempo de execução de linhas horizontais .........................26 TABELA 6 - Tempo de execução de linhas verticais .............................26 TABELA 7 - Custos de componentes .....................................................31 iv LISTA DE ABREVIATURAS PCI - Placas de Circuito Impresso PC - Computador Pessoal I/O - Entrada e/ou Saída dpi - Dots per inch USART - Universal Synchronous Asynchronous Receiver Transmitte USB - Universal Serial Bus v 1 1. INTRODUÇÃO Existem várias maneiras de confeccionar uma placa de circuito impresso. Todas, porém requerem a passagem do desenho das trilhas para a placa de cobre. O método manual, por exemplo, requer que o desenho seja feito direto na placa, isso pode ser feito imprimindo o arquivo em papel especial e depois passado para a placa, fazendo o desenho diretamente na placa, entre outros. 1.1. PROBLEMA Atualmente placas de circuito impresso podem ser confeccionadas manualmente ou por empresas especializadas que, dependendo da quantidade desejada e do tempo desejado, pode apresentar alto custo de produção, onerando desta forma o projeto. Sendo assim, para alguns projetos, para viabilizar o mesmo com pequenas quantidades, o processo indicado é o manual. 1.2. JUSTIFICATIVA Métodos manuais de confecção de placas de circuito impresso são trabalhosos e demandam em torno de três horas, exigindo total atenção para a criação do mesmo. Por este motivo, faz-se necessário uma alternativa para produção de placas de circuito impresso. Como exemplo, pode-se citar a sala de prototipagem da Universidade Positivo, que consiste no método semi-manual de transferência térmica. Porém este processo exige a aquisição de uma impressora a laser ou a realização de fotocópias escurecidas, porém exige um cuidado extremo para que o desenho não saia borrado. Outro processo disponível, ainda na Universidade, é a utilização da fresa, o que exige conhecimentos de hardware e software específicos, para a transferência do desenho do circuito para o hardware e a aquisição de fresas, que apresentam alto custo, inviabilizando alguns projetos. 2 1.3. OBJETIVOS ESPECÍFICOS Pretende-se implementar e desenvolver um plotter para desenho de circuito impresso de baixo custo, para facilitar o desenvolvimento de protótipos de circuito impresso. O sistema será composto por um programa, desenvolvido em linguagem C++, e uma interface eletrônica que receberá os dados via comunicação serial. O desenho da placa será originado no programa TraxMaker (módulo do Circuit Maker) e o programa, desenvolvido em Borland Builder C++, irá decodificar o desenho gerado e enviará os dados pela interface serial do computador à um hardware constituído de um microcontrolador e motores de passo, que farão o desenho na placa de circuito impresso. Para a montagem da base do plotter, pretende-se fazer uso das peças de scanners e impressoras descontinuadas. O sistema está representado na Figura 1 . FIGURA 1 - Diagrama de blocos do projeto Fonte: Própria O sistema deverá apresentar: a) Motores de passo que permitam uma rotação máxima, definida pelo tipo de motor usado, que será o limitante para o hardware permitir uma velocidade maior ou menor de impressão; b) Hardware que permita desenho das trilhas, com distância entre estas de no mínimo 2,54 mm, e desenho de placas de até 20cm x 15cm. 3 2. FUNDAMENTAÇÃO TEÓRICA Neste item será contextualizado o funcionamento básico de um plotter, porém existem outros tipos de plotter e outras aplicações para a mesma. Serão abrangidos também alguns contextos interessantes para o entendimento do processo. 2.1. PLOTTER Plotter é uma impressora com especial aplicação na elaboração de plantas arquitetônicas, mapas cartográficos, projetos de engenharia e grafismo (WIKIPEDIA, 2008). Sua principal característica é a impressão de desenhos de grandes dimensões, que necessitam alta qualidade sem perda de detalhe. Pode ser encontrado hoje com qualidade de impressão de alta resolução, chegando a 2400 dpi de resolução. 2.2. TRAXMAKER Segundo LACERDA (2007), o TraxMaker é um módulo do software Circuit Maker, que se destina a criação de layout de placas de circuito impresso no computador, apresentando o recurso de autoroteamento, isto permite que, após o usuário selecionar alguns parâmetros básicos, o próprio TraxMaker faz algumas decisões sobre as melhores condições de colocação das trilhas. 2.3. MOTOR DE PASSO Um motor de passo é um componente eletromecânico que converte energia elétrica em movimento, controlado através de pulsos em suas bobinas. Isto possibilita que o deslocamento se dê por passos, onde passo é o menor deslocamento angular do mesmo, apresentam uma gama de rotação muito ampla, 4 podendo variar de zero até 7200 rpm. Uma de suas particularidades é a possibilidade da inversão de rotação em pleno funcionamento. O número de pólos determina o deslocamento angular por pulsos de entrada. A Figura 2 mostra a relação de deslocamento pelo pulso que, como dito acima, deve ser de forma seqüencial e determina assim o deslocamento angular. FIGURA 2 - Relação deslocamento x pulso Fonte: MEZENGA (2001) Para que um motor de passo desloque é necessário que suas bobinas sejam energizadas uma de cada vez. A Tabela1 exibe a seqüência de pulsos num motor de passo. TABELA 1 - Energização para movimentação do motor de passo Seqüência S1 S2 S3 S4 B1 0 0 0 1 B2 0 0 1 0 B3 0 1 0 0 B4 1 0 0 0 t t t Fonte: própria Para traçar uma reta em um plotter, seja ela em ângulo ou não, deve-se dar comando aos motores de passo na forma de pulsos. Como exemplo, para traçar uma reta em diagonal com ângulo de 45°, os dois motores de passos deverão ter o mesmo deslocamento e velocidade. A velocidade é dada pelo tempo em que cada seqüência é acionada, isto é, se for necessária uma velocidade alta, a seqüência de passos deve ser em menor tempo, lembrando que o quanto maior o ciclo de permutações, menor o torque do motor. O sentido de rotação é dado pelo sentido da seqüência da tabela. Para o sentido horário, por exemplo, deve-se seguir a seqüência mostrada na Tabela 2. 5 TABELA 2 - Sentido horário do motor de passo Seqüência S1 S2 S3 S4 Fonte: própria B1 1 0 0 0 B2 0 1 0 0 B3 0 0 1 0 B4 0 0 0 1 t t t 6 3. ESPECIFICAÇÕES TÉCNICAS PRELIMINARES Neste item são abordadas as principais partes do projeto, detalhando-os tecnicamente, além de definir cronograma e estudo de custos. 3.1. VISÃO GERAL DO PROJETO Deseja-se automatizar a realização de desenhos de placa de circuito impresso. Para tal pretende-se controlar uma caneta fixada em um mecanismo com motores de passo comandado por um microcontrolador. Este por sua vez recebe os dados do computador através de uma interface desenvolvida em linguagem C++, traduzindo os dados do programa TraxMaker, conforme a Figura 3 . FIGURA 3 - Diagrama de blocos do sistema Fonte: Própria 3.2. DESCRIÇÃO FUNCIONAL DOS BLOCOS Na seqüência são apresentadas descrições funcionais de cada bloco visto acima, assim como alguma parte integrante do projeto. 7 3.2.1. Circuit Maker e TraxMaker O software TraxMaker (PROTEL,2000) é um software que cria a informação das coordenadas das trilhas e pads 1 para o desenho da PCI e as salva em um arquivo de extensão ".pcb". Este arquivo pode ser aberto no aplicativo bloco de notas do Microsoft Windows, sendo de fácil identificação dos dados referentes ao desenho da placa. Outros programas foram analisados, como o Orcad (CADENCE, 2008) e o Cad, porém os arquivos gerados por estes são binários e apresentavam códigos mais complexos. Por este motivo se optou por utilizar o TraxMaker neste projeto. Na Figura 4 é possível ver a tela de criação, ou alteração dos desenhos da placa desejada. FIGURA 4 - Tela do programa TraxMaker Fonte: TraxMaker Na Figura 5 é possível ver como são os dados gerados pelo TraxMaker, estão identificadas as linhas, onde: a linha 1 indica o início do arquivo, as linhas 2 e 4 declaram o tipo de desenho que será feito na seqüência e as linhas 3 e 5 1 Segundo Protel International Limited PAD é um elemento para localizar e conectar o pinos dos componentes sobre uma PCI, também chamado de ilhas. 8 informam as coordenadas num plano cartesiano que serão explicadas com mais detalhes na seção 3.3.1. A linha 6 indica final de arquivo (ponteiro importante para o software identificar e finalizar a execução). FIGURA 5 - Tela do arquivo .pcb gerado pelo TraxMaker Fonte: Própria Nas linhas de parâmetro de referência do desenho são apresentadas as informações de espessura da linha e cor, juntamente com o início e fim do traço e localização no plano a partir da referência 0 para x e 0 para y. 3.2.2. O software do PC O software do PC será desenvolvido em linguagem C++, através do compilador Borland Builder C++ (ALVES, 2002). Este software fará a interface de interpretação dos dados gerados pelo TraxMaker e enviará para a porta serial do PC para o microcontrolador PIC. O fluxograma de funcionamento do software está apresentado no item 3.4.1. 3.2.3. Microcontrolador O microcontrolador deve atentar os seguintes critérios: a. Possuir fácil circuito embarcado para gravação (download); b. Pinagem disponível para interligar os I/O’s (Necessidade mínima de 12 pinos para conexão com os motores, 5 pinos para chaves fim 9 de curso e 2 pinos comunicação serial, totalizando um número mínimo de 19 I/O’s); c. Baixo custo devido a necessidade de pouca memória de programação, uma vez que o projeto não necessita de processamento no circuito embarcado. d. Protocolo para comunicação serial (USART) Na Tabela 3 é apresentada a comparação entre os possíveis microcontroladores. TABELA 3 - Informações dos microcontroladores Pinagem I/O Conhecimento Tipo de memória Quant. memória Preço PIC12F629 PIC16F628 8 18 6 16 OK OK FLASH FLASH 1.7kbytes 3.5kbytes R$ 4,00 R$ 6,50 PIC16F873A 28 22 OK FLASH 7kbytes R$ 13,30 PIC16F877A 40 33 OK FLASH 14kbytes R$ 16,00 8051 40 32 NÃO FLASH 64kbytes R$ 5,50 Fonte: própria O microcontrolador que melhor se adequou aos requisitos acima mencionados foi o PIC16F873A, por este motivo foi o usado neste projeto. A programação do microcontrolador deve ser desenvolvida de forma à atender o fluxograma de funcionamento, com descrito no item 3.4.2. Para verificar como o microcontrolador foi implementado no projeto veja o bloco microcontrolador do Apêndice A. 3.2.4. Comunicação Serial A comunicação serial foi escolhida porque apresenta características importantes para cumprir o proposto pelo projeto. Em comparação com a porta paralela, a porta serial permite desenvolver um protocolo de comunicação que apresenta velocidade adequada ao projeto. Pode-se verificar a Tabela 4 para diferenças entre estas duas comunicações. 10 TABELA 4 - Comparação das comunicações Caraterística Velocidade Custo Imunidade a ruído Distância Fonte: DUARTE (2008) Serial Paralela ↓ ↓ ↑ ↑ ↑ ↑ ↓ ↓ A implementação da comunicação USB apresentaria um aumento de custo. A comunicação USB permite também uma maior transferência de dados do que a interface serial, o que não se faz necessária neste projeto. Em projetos futuros, em que o custo não seja importante é possível implementar a comunicação USB. 3.3. DIMENSIONAMENTO E MEMORIAL DE CÁLCULO A seguir serão demonstrados os cálculos pertinentes ao projeto. 3.3.1. Tratamento dos parâmetros de referência Os parâmetros para as referências, da linha são apresentados como mostra a Figura 6 . FIGURA 6 - Identificação dos parâmetros de referência Fonte: Própria Com estas informações é possível saber onde começa e termina a linha, se possui ou não inclinação, se este for o caso, fazer os cálculos para saber a inclinação da mesma. Para isso utiliza-se a equação do feixe da reta: 11 y 2 y1 m x 2 x1 (1) A aprtir da equação (1) é posivel determinar a inclinação da reta (m): m y 2 y1 x 2 x1 (2) Em que x1 e y1 são as coordenadas iniciais de x e y, respectivamente, e x2 e y2 são as coordenadas finais da reta. 3.3.2. Fonte de alimentação A fonte de alimentação, mostrada na Figura 3 , foi dimensionada com base nos cálculos de consumo, devendo fornecer uma corrente de 2A para o circuito, conforme determinado pela corrente total do circuito mostrado na figura abaixo no diagrama de blocos da corrente. Através da Figura 7 é possível verificar os valores de consumo de cada macro-componentes do hardware. FIGURA 7 - Diagrama de blocos do circuito de corrente. Fonte: Própria No Apêndice A, pode ser vista a implementação da fonte de alimentação. 12 3.3.3. Driver’s para acionamentos Motores de Passo Para o driver de acionamento dos motores de passo, serão utilizados os seguintes transistores: a) BD135 para chavear as bobinas dos motores dos eixos “x” e “y” devido o consumo das bobinas serem em torno de 700mA (corrente máxima de coletor do transistor de 1,5A); b) BC548 para chavear as bobinas do motor da pena, consumo das bobinas serem em torno de 300mA (corrente máxima de coletor do transistor de 500mA). Para ver como os drivers estão posicionados no projeto veja o bloco drivers A e B do Apêndice A. 3.4. PROGRAMAÇÃO Na seqüência serão exibidos os fluxogramas das programações necessárias para a realização do projeto. 3.4.1. Programa do PC Conforme explicado no item 3.2.2, na Figura 8 é apresentado o fluxograma funcional do programa que será desenvolvido. 13 FIGURA 8 - Fluxograma de funcionamento do programa do PC Fonte: Própria O programa desenvolvido possui uma interface em que é possível o usuário selecionar o tipo de desenho que será feito, para este processo seguem os quadros 2, 3 e 5 do fluxograma. Depois desta etapa o programa faz a busca do item selecionado e então se dá inicio ao processo do desenho em conjunto com o hardware. 3.4.2. Programa do PIC No item 3.2.3 é comentada a programação que será realizada no microcontrolador. Na Figura 9 é apresentado o fluxograma para melhor entendimento. 14 FIGURA 9 - Fluxograma de funcionamento do programa do PIC Fonte: Própria 3.5. PLANEJAMENTO A seguir serão apresentados os itens referentes ao planejamento do projeto, tais como cronograma e expectativas de custos do mesmo. 3.5.1. Cronograma O projeto teve um prazo de aproximadamente 10 meses, abrangendo desde a parte de pesquisa até o desenvolvimento e implementação do sistema. Para o planejamento desejado veja o Apêndice B 3.5.2. Custos Os custos envolvidos neste projeto englobam os componentes eletrônicos, os componentes mecânicos e os custos do trabalho escrito. Para os detalhamentos dos custos estimados dos componentes eletrônicos e mecânicos, 15 com base em levantamentos feitos em lojas de eletrônica disponíveis em Curitiba, veja o Apêndice C. Para os custos estimados do trabalho escrito, levou-se em conta o custo de impressão, fotocópia, encadernação e encadernação em capa-dura. Fazendo levantamento de preço no mercado é possível estimar um gasto de R$ 350,00. Os custos somados chegam a um valor de aproximadamente R$ 505,00. 16 4. IMPLEMENTAÇÃO Neste capitulo serão apresentados os procedimentos para a execução do projeto, descrevendo problemas e dificuldades encontradas durante a montagem como um todo. 4.1. DESCRIÇÃO DA MONTAGEM A montagem consistiu em três partes, a mecânica, a eletrônica e a relacionada à programação. A parte mecânica consiste na montagem física do plotter. Na mecânica principal do projeto utilizou-se um scanner, da HP, descontinuado comprado em uma loja de equipamentos usados. Algumas outras partes do mesmo foram reaproveitadas no projeto. A mecânica do carro do eixo Y foi reaproveitado de uma impressora usada, também da HP modelo deskjet, também adquirida na mesma loja do scanner. Dois dos motores de passo comprados avulsos, também materiais reaproveitados, são os motores do eixo x e do eixo y. Já o motor de passo utilizado para o controle da pena, foi retirado de uma mini impressora. Para etapa de montagem foi necessário um estudo das partes mecânicas envolvidas. A parte eletrônica ocorreu de forma planejada, não sendo encontranda nenhuma dificuldade. Inicialmente os componentes do circuito foram montados e testados no protoboard, em seguida foram elaboradas as placas de circuito impresso e montados os componentes. A Figura 10 exibe a imagem do plotter, onde é possível observar: a) Fonte de alimentação; b) Motor de passo do eixo y; c) Motor de passo da pena; d) Placa de circuito impresso de potência do eixo Y; e) Placa de circuito impresso principal; f) Sensor óptico do eixo x; g) Motor de passo do eixo x; h) Área de plottagem 17 FIGURA 10 - Fotografia lateral do plotter Fonte: Própria Na Figura 11 é mostrada a localização dos seguinte itens: a) Placa de circuito impresso principal; b) Motor de passo do eixo y c) Base de rolagem do eixo y d) Detalhes do suporte da pena. FIGURA 11 - Fotografia da plotter – visão do carro Fonte: Própria 18 A Figura 12 apresenta outro ângulo da plotter, possibilitando ver os seguintes itens: a) Um dos sensores ópticos de fim de curso do eixo x; b) Motor de passo do eixo y; c) Um dos sensores ópticos de fim de curso do eixo y; d) Fita do Encoder do eixo y; e) Carro para facilitar a movimentação do eixo x; f) Placa de circuito principal; g) Placa de circuito de potência do eixo y. FIGURA 12 - Fotografia da plotter – vista traseira Fonte: Própria Para a fixação da pena foi utilizado um parafuso, e o mecanismo de altura da mesma é feito por um motor de passo, com ajuste fino de uma mola, estes detalhes podem ser vistos na Figura 13 . 19 FIGURA 13 - Detalhes do mecanismo da pena Fonte: Própria O desenvolvimento que apresentou maior dificuldade foi a programação. Inicialmente desenvolveu-se uma interface para comandos manuais, para facilitar a calibração e ajuste da parte mecânica. Na seqüência foi desenvolvida a interface que automatiza a plotagem da placa. A programação do PIC ficou responsável pela interpretação dos dados recebidos do PC para controlar a plotter. Para o desenvolvimento da parte de programação, foi utilizada linguagem C++ para a interface do PC e C para a programação do PIC. O primeiro problema enfrentado na parte da programação se deu com relação à transmissão serial de dados. As informações são enviadas byte a byte, sendo assim, o maior valor inteiro escrito em um byte é 256, porém existe a necessidade de enviar dados maiores que este. Sendo assim decidiu-se por dividir o dado desejado em três, sendo que, um dos dados seria o divisor, o segundo dado seria o dividendo e o último seria o resto da divisão. O divisor escolhido é 180 e os valores do dividendo podem variar de valores acima de 256, podendo chegar à 23.000. Desta forma este problema foi solucionado. A dificuldade seguinte diz respeito aos dados de retorno do PIC para o PC. Sabe-se que sempre que o PC envia um comando para o PIC, este aguarda confirmação do PIC de que o comando foi executado, para na seqüência poder enviar o próximo comando. Inicialmente as duas primeiras mensagens que o PIC 20 retornava ao PC eram os retornos de fim de curso do eixo X e Y, ao receber estes dados o PC enviava a próxima execução, porém, com isso faltavam dados para o PC fazer a interpretação dos dados, assim este perdia a referência e não conseguia dar continuidade. Para resolver esta situação, a seqüência dos dados de retorno do PIC para o PC foi alterada, colocando os dados de fim de curso de execução dos eixos como sendo as ultimas informações do pacote, para tal, foi alterada também a forma de recebimento dos dados pelo PC. Ao encontrar o problema de resolução do plotter, que apresentava alguns desvios das linhas, foi verificado que os motores não podem apresentar velocidade abaixo de dois e intervalo maior que 140, caso contrário perde a confiabilidade. Estes valores são ajustados na tela de configuração mencionada na seção 4.2. 4.2. TESTES, MEDIÇÕES E CONFIGURAÇÕES Os primeiros testes que puderam ser executados foram após a montagem da parte eletrônica. Antes de serem montados o MAX232 e o microprocessador, verificou-se a alimentação dos pinos. Em seguida foi feito um teste de pulsos, excitando os transistores de potência e verificando a alimentação dos motores de passo. Depois que os CIs, MAX232 e microprocessador foram montados, testouse a comunicação serial. Na seqüência foi feito teste para verificar a relação entre o deslocamento da pena em relação os valores inseridos no programa. Como parte seguinte de teste, foi feita uma interface de controle manual dos dispositivos sendo controlados pelo PC. A Figura 14 mostra a interface desenvolvida. Neste teste verificou-se a funcionalidade de comunicação do PC com a plotter. 21 FIGURA 14 - Interface manual de controle Fonte: Própria Através da tela apresentada na Figura 14 , digitava-se os valores de deslocamento desejado e verificava-se o deslocamento real, utilizando uma régua. Desenvolveu-se também uma interface de configuração dos parâmetros do plotter, apresentada na Figura 15 e na Figura 16 . FIGURA 15 - Acesso da tela de configuração da plotter Fonte: Própria Alguns parâmetros são necessários para ajustar o plotter , por exemplo, a constante de deslocamento dos motores X e Y, a distância entre cada pad para cada seqüência do componente plotado. Uma vez confirmados estes ajustes, o programa salva em arquivo os valores de cada parâmetro. 22 FIGURA 16 - Tela de configuração da plotter Fonte: Própria Para determinar como seriam feitos os ângulos das trilhas, foi necessário testar-se as possibilidades dos ângulos verificando um a um, para determinar a velocidade adequada dos motores, para as linhas não saírem serrilhadas. Para o ajuste adequado foram testados as variações de cada velocidade, para verificar o melhor resultado, para cada ângulo possível. Os testes resultaram em 90 ajustes possíveis. Uma vez determinados os valores, estes foram salvos em arquivo para futura busca, quando o programa estiver sendo executado em modo automático. Estes dados de configuração podem ser vistos através do programa desenvolvido, na parte de configurações, como mostrado na Figura 17 . 23 FIGURA 17 - Visualização dos ângulos pré-definidos Fonte: Própria Da Figura 17 é possível verificar os seguintes itens: a) Ângulo 0 b) Informações de velocidade e intervalo Do item b citado acima, temos respectivamente para 2 10 180 100 1 velocidade do motor x, velocidade do motor y, intervalo para o motor x e intervalo para o motor y. Em seguida foi desenvolvida uma interface que automatiza o desenho feito no TraxMaker e realiza o desenho. O código fonte é explorado no item 4.3. A interface do programa é mostrada na Figura 18 . 24 FIGURA 18 - Interface final do programa Fonte: Própria 4.3. CÓDIGO FONTE Na seqüência são apresentadas as linhas de códigos desenvolvidas. 4.3.1. Firmware O firmware destinado ao PIC, desenvolvido em C, segue o fluxograma apresentado no item 3.4.2. As linhas de código são apresentadas no Apêndice E. 4.3.2. Software Para o software do PC, desenvolvida em linguagem C++, foi seguido o raciocínio de desenvolvimento apresentado no item 3.4.1. O código fonte esta disponível no Apêndice D. O código utilizado para comunicação serial foi desenvolvido pelo Professor Leonardo Gomes Tavare, o arquivo de cabeçalho é mostrado no Apêndice D.6 Linhas de código do Form Serial:. 25 4.4. PLACAS DE CIRCUITO IMPRESSO As placas de circuito impresso deste projeto foram desenhadas pelo próprio plotter. Os desenhos são apresentados no Apêndice F, devidamente identificadas as suas partes. 4.5. CUSTO DO PROJETO O custo do projeto não excedeu o planejado, apresentado no item 3.5.2. Na seqüência é apresentado o detalhamento. 4.5.1. Componentes e materiais Conforme comentado anteriormente, o custo de componentes e materiais segue o que foi apresentado no item 3.5.2, detalhado no Apêndice B. 4.5.2. Serviços contratados Não foi contratado nenhum serviço. 26 5. RESULTADOS O presente projeto foi desenvolvido com meta principal de implementar um sistema para fazer desenhos de placas de circuito impresso, de forma a possibilitar projetos de baixo custo e a realização de protótipos em pequena escala. A área para a realização do desenho é limitada pela mecânica, que neste projeto se limita a placas de no máximo 25x14 cm. A espessura das linhas é definida de acordo com a caneta utilizada. No mercado foram encontradas apenas canetas de 1,0mm e 2,0mm, porém a caneta de 2,0mm utilizada apresentou melhor resultado nos desenhos executados. Fazendo testes, partindo de zero e indo até nove repetições, para quantidades variadas de linhas, partindo de 10 até 100, com intervalo de 10. Para linhas horizontais foram levantados os dados da Tabela 5 e para as linhas verticais os dados da Tabela 6 . TABELA 5 - Tempo de execução de linhas horizontais Horizontais Linhas Quantidade 10 20 30 40 50 60 70 80 90 100 Repetição 44 79 136 172 225 264 296 340 375 444 0 31 67 106 125 159 181 203 235 259 304 1 25 54 89 105 137 156 177 206 225 260 2 24 56 88 106 130 146 164 184 199 231 3 Tempo 23 21 55 48 85 76 101 91 125 106 141 122 158 138 177 154 192 169 219 191 4 5 21 52 79 94 108 129 145 162 177 197 6 21 52 74 90 111 128 142 158 172 202 7 20 47 75 88 101 117 131 147 161 181 8 20 50 79 93 114 130 145 162 175 199 9 22 46 70 94 121 146 171 197 226 253 7 21 46 70 94 119 144 170 196 222 250 8 21 45 69 93 118 143 168 194 220 247 9 Fonte: própria TABELA 6 - Tempo de execução de linhas verticais Verticais Linhas Qntade 10 20 30 40 50 60 70 80 90 100 Repetição Fonte: Própria 25 56 91 129 171 216 266 318 375 435 0 23 50 79 110 142 176 212 250 289 330 1 23 49 77 105 135 165 197 231 263 299 2 23 47 73 99 128 156 186 215 248 278 3 Tempo 22 22 46 47 71 71 97 97 124 124 151 149 179 177 207 206 237 232 267 262 4 5 23 46 71 96 121 148 173 202 229 259 6 27 Para as tabelas acima foram gerados os gráficos da Figura 19 e da Figura 20 , para mostrar graficamente o comportamente dos motores. FIGURA 19 - Gráfico de tempo de execução das linhas horizontais Tempo de execução das lnhas horizontais Tempo (seg) 450 400 10 linhas 20 linhas 350 30 linhas 40 linhas 300 50 linhas 250 60 linhas 70 linhas 200 80 linhas 90 linhas 150 100 linhas Repetições 100 50 0 0 1 2 3 4 5 6 7 8 9 Fonte: Própria FIGURA 20 - Gráfico de tempo de execução das linhas verticais Tempo de execução das linhas verticais Tempo (seg) 450 400 10 linhas 20 linhas 350 30 linhas 300 40 linhas 50 linhas 250 60 linhas 70 linhas 200 80 linhas 150 90 linhas 100 linhas 50 0 0 1 2 3 4 5 6 7 8 9 Repetições 100 Fonte: Própria A partir dos gráficos é possível verificar que o plotter atende os propósitos acadêmicos para que foi desenvolvida. 28 6. CONCLUSÕES O sistema proposto foi desenvolvido de forma a apresentar os resultados desejados. O software que foi criado apresenta todos os controles necessários para controle manual e automático, para a realização de desenhos de placas de circuito impresso. Foi desenvolvido um programa em linguagem C para o PIC e outro programa em linguagem C++, que roda no PC, para a interpretação dos dados. O programa que roda no PC possibilita a interpretação direta dos dados, para realização do desenho, e também apresenta uma interface de controle manual. Este mesmo programa possui as telas de setup para as configurações necessárias para o funcionamento previsto do plotter. Como é possível verificar, pelos objetivos específicos e a seção 5, todos os itens propostos foram alcançados. Durante o desenvolvimento do projeto, a pedido da banca, foi verificada a possibilidade de implementar um controle de realimentação de dados com um encoder, para controle de posicionamento, o que não foi possível por limitações do microcontrolador. Esta implementação não foi possível se fosse utilizado mais um microcontrolador para poder fazer o controle destes dados. Com esta implementação seria possível criar rotinas a mais no programa para tratamento de erros. Ao finalizar este projeto verificou-se a possibilidade de utilizar basicamente a mesma mecânica, fazendo pequenos ajustes mecânicos e de programação, para poder mudar a caneta por uma fresa. 29 APÊNDICE A FIGURA 21 - Circuito eletrônico Fonte: própria 30 APÊNDICE B FIGURA 22 - Cronograma Fonte: Própria 31 APÊNDICE C TABELA 7 - Custos de componentes Descrição Cap. Elet. Radial 470uF/25V Hitano Cap. Cerâmico 100pF (pacote com 10) Cap. Elet. Radial 1uF/50V Hitano Cap. Cerâmico 27pF (pacote com 10) 1N 4007 - 1 AMP LED Vermelho 5mm - TIL 228 LED Verde 5mm - TIL 234 RS 232 09 pinos femea 90G. - DBPN1F-09 PIC 16 F 873 A-I/SP BC 547 85412190 BD 135 Resistores diversos 1/4 W UA 7805 UA 7812 Cristal 4.000000 MHZ MAX 232 Placa fenolite FN 1 - 20 X 20 CM JACK - J-4 Soq.CI.16 pinos torneados celis SPT0.CB08 Soq.CI.16 pinos estampados SEE 16 - METALTEX Soq.CI.24 pinos torneados CELIS SPT0.CB12 Soq.CI.28 pinos estampado SEL 28 - METALTEX B.de pinos BPSC-40 1X40 180º METALTEX MODU MCS -40 1X40 180º - METALTEX Terminal modu MLTF - 2,54 MM - METALTEX PCST 1103 = PHCT 103 Chave ótica PCST 2103 = PHCT 203 Motor de passo (4 passos - 12V) Transformador Scaner sucateada Impressora sucateada Fonte: Própria Qtd 2 1 1 1 10 10 10 1 1 10 8 40 1 2 1 1 2 1 1 1 1 1 2 2 40 6 6 2 1 1 1 Und PC P10 PC P10 PC PC PC PC UND PC PC PC PC PC UND PC UND PC PC PC PC PC PC PC PC PC PC PC UND PC PC Unitário R$ 0,20 R$ 1,00 R$ 0,10 R$ 1,00 R$ 0,06 R$ 0,10 R$ 0,12 R$ 1,10 R$ 13,30 R$ 0,10 R$ 0,50 R$ 0,03 R$ 0,65 R$ 0,70 R$ 0,80 R$ 1,95 R$ 4,60 R$ 0,80 R$ 0,80 R$ 0,20 R$ 1,20 R$ 0,35 R$ 0,45 R$ 1,10 R$ 0,10 R$ 3,30 R$ 3,30 R$ 5,00 R$ 16,00 R$ 20,00 R$ 20,00 TOTAL Total R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ R$ 0,40 1,00 0,10 1,00 0,60 1,00 1,20 1,10 13,30 1,00 4,00 1,20 0,65 1,40 0,80 1,95 9,20 0,80 0,80 0,20 1,20 0,35 0,90 2,20 4,00 19,80 19,80 10,00 16,00 20,00 20,00 155,95 32 APÊNDICE D D.1 LINHAS DE CÓDIGO DO FORM PRINCIPAL: 1: //-----------------------------------------------------------------------2: #include <vcl.h> 3: 4: #include "Serial.h" 5: #include "FrmSetup.h" 6: #pragma hdrstop 7: 8: #include "Prog_Plotter.h" 9: //-----------------------------------------------------------------------10: #pragma package(smart_init) 11: #pragma link "CSPIN" 12: #pragma link "CGAUGES" 13: #pragma resource "*.dfm" 14: TFrmPlotter *FrmPlotter; 15: Serial serial; 16: 17: void AtualizaDados(void); 18: void AtualizaLinha(void); 19: void EnviaDados(int Dados); 20: void IncrementaLinha(void); 21: void IncrementaIlha(void); 22: void CalculeCompr(void); 23: void CalcularDados(void); 24: void PosicaoInicial(void); 25: void PosicaoPena(void); 26: void CalcDist(void);//unit Comando.cpp 27: 28: extern int Linha, Analisar, CorLinha, Passo, X, X0, Y, Y0; 29: 30: extern bool FT1, grau; 31: int Retorno=0, ProximoReg; 32: 33: bool teste; 34: //-----------------------------------------------------------------------35: void ReiniciaGauge(void) 36: { 37: FrmPlotter->CGauge1->ForeColor=clNavy; 38: FrmPlotter->CGauge2->ForeColor=clNavy; 39: FrmPlotter->CGauge3->ForeColor=clNavy; 40: FrmPlotter->CGauge1->Progress=0; 41: FrmPlotter->CGauge2->Progress=0; 42: FrmPlotter->CGauge3->Progress=0; 43: FrmPlotter->GaugeTotal=0; 44: FrmPlotter->GaugeLinhas=0; 45: } 46: void AtualizaLinha(void) 47: { 48: int i, menorLinha; 49: bool PrimFT=false; 50: AnsiString Letra; 51: 52: FrmPlotter->TamLinhas=0; 53: FrmPlotter->TamIlhas=0; 54: FrmPlotter->TamTotal=0; 55: 56: for(i=0;i<FrmPlotter->Memo->Lines->Count;i++) 57: { 58: Letra=FrmPlotter->Memo->Lines->Strings[i]; 59: if(Letra == "FT") 60: { 61: if(!PrimFT) 62: { 33 63: menorLinha=Y0; 64: PrimFT=true; 65: } 66: else 67: { 68: if(Y0<menorLinha) 69: menorLinha=Y0; 70: } 71: Linha=i; 72: CalcDist(); 73: if (CorLinha == FrmPlotter->CorLinhaEscolhida) 74: { 75: FrmPlotter->TamLinhas++; 76: FrmPlotter->TamTotal++; 77: } 78: } 79: if((Letra =="FP") || (Letra =="CP")) 80: { 81: FrmPlotter->TamIlhas++; 82: FrmPlotter->TamTotal++; 83: } 84: } 85: FrmPlotter->LbIlha->Caption="Pad 0 de "+ IntToStr(FrmPlotter->TamIlhas); 86: FrmPlotter->LbLinha->Caption="Linha 1 de "+IntToStr(FrmPlotter>TamLinhas); 87: FrmPlotter->LbTotal->Caption="Total 1 de "+IntToStr(FrmPlotter->TamTotal); 88: FrmPlotter->CGauge1->ForeColor= clNavy; 89: FrmPlotter->CGauge2->ForeColor= clNavy; 90: FrmPlotter->CGauge3->ForeColor= clNavy; 91: FrmPlotter->CGauge1->Progress=0; 92: FrmPlotter->CGauge2->Progress=0; 93: FrmPlotter->CGauge3->Progress=0; 94: } 95: void IncrementaLinha(void) 96: { 97: FrmPlotter->GaugeLinhas++; 98: FrmPlotter->LbLinha->Caption="Executando linha "+IntToStr(FrmPlotter>GaugeLinhas)+" de 99: 100: if(FrmPlotter->TamLinhas!= 0) 101: FrmPlotter->CGauge2->Progress=(100*FrmPlotter->GaugeLinhas)/FrmPlotter>TamLinhas 102: 103: FrmPlotter->GaugeTotal++; 104: FrmPlotter->LbTotal->Caption="Executando total "+IntToStr(FrmPlotter>GaugeTotal)+" de 105: 106: if(FrmPlotter->TamTotal!=0) 107: FrmPlotter->CGauge3->Progress=(100* FrmPlotter->GaugeTotal)/FrmPlotter>TamTotal 108: } 109: void IncrementaIlha(void) 110: { 111: FrmPlotter->GaugeIlhas++; 112: FrmPlotter->LbIlha->Caption="Executando illha "+IntToStr(FrmPlotter>GaugeIlhas)+" de " 113: 114: if(FrmPlotter->TamIlhas!=0) 115: FrmPlotter->CGauge1->Progress=(100*FrmPlotter->GaugeIlhas)/FrmPlotter>TamIlhas 116: 117: FrmPlotter->GaugeTotal++; 118: FrmPlotter->LbTotal->Caption="Executando total "+IntToStr(FrmPlotter>GaugeTotal)+" de 119: 120: if(FrmPlotter->TamTotal!=0) 121: FrmPlotter->CGauge3->Progress=(100* FrmPlotter->GaugeTotal)/FrmPlotter>TamTotal 122: } 123: void EnviaDados(int Dados) 124: { 34 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: BYTE x; x=Dados; serial.Send(&x,1); serial.ResetBuffer(); } void AtualizaDados(void) { int i; //na sequencia abaixo, envia à porta serial todas as informações neces//sárias para o PIC CalculeCompr();//Segmente o comprimento X e Y para enviar à porta serial if((FrmPlotter->RBCom1->Checked)||(FrmPlotter->RBCom2->Checked)) { EnviaDados(200); //Ind = 200 Sleep(1); EnviaDados(FrmPlotter->VelX); Sleep(1); EnviaDados(FrmPlotter->VelY); Sleep(1); EnviaDados(FrmPlotter->RetX); Sleep(1); EnviaDados(FrmPlotter->RetY); Sleep(1); EnviaDados(FrmPlotter->Var1X); Sleep(1); EnviaDados(FrmPlotter->Var2X); Sleep(1); EnviaDados(FrmPlotter->RestoX); Sleep(1); EnviaDados(FrmPlotter->Var1Y); Sleep(1); EnviaDados(FrmPlotter->Var2Y); Sleep(1); EnviaDados(FrmPlotter->RestoY); Sleep(1); EnviaDados(FrmPlotter->IntervX); Sleep(1); EnviaDados(FrmPlotter->IntervY); Sleep(1); EnviaDados(FrmPlotter->VlAtraso); Sleep(1); EnviaDados(FrmPlotter->TamPadX); Sleep(1); EnviaDados(FrmPlotter->TamPadY); Sleep(1); EnviaDados(FrmPlotter->OffSetPenaX); Sleep(1); EnviaDados(FrmPlotter->OffSetPenaY); Sleep(1); 35 193: 194: EnviaDados(FrmPlotter->ComprPn); 195: Sleep(1); 196: 197: EnviaDados(FrmPlotter->CMD); 198: } 199: else 200: Application->MessageBoxA("Porta Serial não conectada!","Erro", 48); 201: } 202: void CalculeCompr(void) 203: { 204: float DeslocamentoX, DeslocamentoY; 205: int DeslX_aux, DeslY_aux; 206: 207: DeslocamentoX = FrmPlotter->DeslX * StrToFloat(FormSetup->EditFatorX>Text); 208: DeslX_aux= StrToInt(FormatFloat('0',DeslocamentoX)); 209: 210: DeslocamentoY = FrmPlotter->DeslY * StrToFloat(FormSetup->EditFatorY>Text); 211: DeslY_aux= StrToInt(FormatFloat('0',DeslocamentoY)); 212: 213: if(DeslX_aux >150) 214: { 215: FrmPlotter->Var2X=150; 216: FrmPlotter->Var1X=DeslX_aux/FrmPlotter->Var2X; 217: FrmPlotter->RestoX=DeslX_aux % FrmPlotter->Var2X; 218: } 219: else 220: { 221: FrmPlotter->Var1X=DeslX_aux; 222: FrmPlotter->Var2X= 1; 223: FrmPlotter->RestoX= 0; 224: } 225: if(DeslY_aux>150) 226: { 227: FrmPlotter->Var2Y=150; 228: FrmPlotter->Var1Y=DeslY_aux / FrmPlotter->Var2Y; 229: FrmPlotter->RestoY=DeslY_aux % FrmPlotter->Var2Y; 230: } 231: else 232: { 233: FrmPlotter->Var1Y=DeslY_aux; 234: FrmPlotter->Var2Y=1; 235: FrmPlotter->RestoY=0; 236: } 237: } 238: //----------------------------------------------------------------------239: __fastcall TFrmPlotter::TFrmPlotter(TComponent* Owner) 240: : TForm(Owner) 241: { 242: } 243: //----------------------------------------------------------------------244: void __fastcall TFrmPlotter::TrackBar1Change(TObject *Sender) 245: { 246: Label14->Caption="Motor X = " + IntToStr(TrackBar1->Position); 247: VelX= 102 - TrackBar1->Position; 248: } 249: //----------------------------------------------------------------------250: void __fastcall TFrmPlotter::TrackBar2Change(TObject *Sender) 251: { 252: Label15->Caption="Motor Y = " + IntToStr(TrackBar2->Position); 253: VelY= 152 - TrackBar2->Position; 254: } 255: //----------------------------------------------------------------------256: void __fastcall TFrmPlotter::RBCom2Click(TObject *Sender) 257: { 258: bool Abrir; 36 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: serial.Close(); Abrir=serial.Open("COM2",CBR_9600); if(!Abrir) { Application->MessageBoxA("Erro ao Abrir a Porta","Porta Serial", 48); RBCom2->Checked=false; LbCom->Caption="COM2 Ocupado!"; } else { serial.ResetBuffer(); LbCom->Caption="COM2 Ativo!"; } } //----------------------------------------------------------------------void __fastcall TFrmPlotter::RBCom1Click(TObject *Sender) { bool Abrir; serial.Close(); Abrir=serial.Open("COM1",CBR_9600); if(!Abrir) { Application->MessageBoxA("Erro ao Abrir a Porta","Porta Serial", 48); RBCom1->Checked=false; LbCom->Caption="COM1 Ocupado!"; } else { serial.ResetBuffer(); LbCom->Caption="COM1 Ativo!"; } } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BtbSairClick(TObject *Sender) { if ((RBCom1->Checked) || (RBCom2->Checked)) serial.Close(); Close(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BitBtn2Click(TObject *Sender) { CMD= 114; RetY=0; AtualizaDados(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BitBtn5Click(TObject *Sender) { CMD= 110; RetX=0; AtualizaDados(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BitBtn8Click(TObject *Sender) { CMD= 116; RetY=0; AtualizaDados(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BitBtn7Click(TObject *Sender) { CMD= 112; RetX=0; AtualizaDados(); 37 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: } //----------------------------------------------------------------------void __fastcall TFrmPlotter::EditDeslcXChange(TObject *Sender) { if(EditDeslcX->Text!=" ")DeslX=(StrToInt(EditDeslcX->Text)/0.2538); // 2.38 * } //----------------------------------------------------------------------void __fastcall TFrmPlotter::EditDeslcYChange(TObject *Sender) { if(EditDeslcY->Text!=" ")DeslY= (StrToInt(EditDeslcY->Text)/0.2538); //0.943 * } //----------------------------------------------------------------------void __fastcall TFrmPlotter::FormCreate(TObject *Sender) { VelX= 2; VelY= 3; DeslX= 200; DeslY= 200; IntervX= 150; //Interrupção de X IntervY= 100; //Interrupção de Y RetX=0; //RetX RetY=0; ComprPn=60; Calcular=false; Analisar=false; Memo->Clear(); Memo->Color=clScrollBar; CMD=0; RetX=0; RetY=0; IntervX=StrToInt(EditT_InterX->Text); IntervY=StrToInt(EditT_InterY->Text); CorLinhaEscolhida=1; TabbedNotebook1->ActivePage="Automático"; VelX=3; VelY=3; LabelStatusComp->Caption=" "; } //----------------------------------------------------------------------void __fastcall TFrmPlotter::EditT_InterXChange(TObject *Sender) { if(EditT_InterX->Text!=" ")IntervX=StrToInt(EditT_InterX->Text); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::EditT_InterYChange(TObject *Sender) { if(EditT_InterY->Text!=" ")IntervY=StrToInt(EditT_InterY->Text); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BitBtn6Click(TObject *Sender) { CMD= 122; //x e y positivo RetX=0; RetY=0; AtualizaDados(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BitBtn3Click(TObject *Sender) { CMD= 124; //x positivo y negativo RetX=0; RetY=0; AtualizaDados(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BitBtn1Click(TObject *Sender) 38 395: { 396: CMD= 118; //x e y negativo 397: RetX=0; 398: RetY=0; 399: AtualizaDados(); 400: } 401: //----------------------------------------------------------------------402: void __fastcall TFrmPlotter::BitBtn4Click(TObject *Sender) 403: { 404: CMD= 120; //x negativo e y positivo 405: RetX=0; 406: RetY=0; 407: AtualizaDados(); 408: } 409: //----------------------------------------------------------------------410: void __fastcall TFrmPlotter::BtbZeraPosicClick(TObject *Sender) 411: { 412: PosicaoInicial(); 413: } 414: //----------------------------------------------------------------------415: void __fastcall TFrmPlotter::Configurar1Click(TObject *Sender) 416: { 417: FormSetup->ShowModal(); 418: } 419: //----------------------------------------------------------------------420: void __fastcall TFrmPlotter::BtbSobePenaClick(TObject *Sender) 421: { 422: CMD= 126; //comando sobe pena 423: AtualizaDados(); 424: } 425: //----------------------------------------------------------------------426: void __fastcall TFrmPlotter::BtbDescePenaClick(TObject *Sender) 427: { 428: CMD= 128; //comando desce pena 429: AtualizaDados(); 430: } 431: //----------------------------------------------------------------------432: void __fastcall TFrmPlotter::EditDeslcYExit(TObject *Sender) 433: { 434: 435: } 436: //----------------------------------------------------------------------437: void __fastcall TFrmPlotter::Edit_AltPenaChange(TObject *Sender) 438: { 439: if(Edit_AltPena->Text!=" ")ComprPn=StrToInt(Edit_AltPena->Text); 440: } 441: //----------------------------------------------------------------------442: void __fastcall TFrmPlotter::SBAbrirClick(TObject *Sender) 443: { 444: AnsiString nome; 445: if (OpenDialog1->Execute()) 446: { 447: Memo->Lines->LoadFromFile(OpenDialog1->FileName); 448: nome=OpenDialog1->FileName; 449: Caption="Plotter - "+nome; //insere o nome do arquivo no cabeçalho do programa 450: Memo->Color=clWhite; 451: BtBInicia->Enabled=true; 452: AtualizaLinha(); 453: } 454: } 455: //----------------------------------------------------------------------456: void __fastcall TFrmPlotter::BtBIniciaClick(TObject *Sender) 457: { 458: AnsiString hora; 459: hora=FormatDateTime("hh:mm:ss",Now()); 460: 461: if((FrmPlotter->RBCom1->Checked)||(FrmPlotter->RBCom2->Checked)) 39 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: { TimerMain->Enabled=true; BtbPausa->Enabled=true; //habilita botão Pausar BtBAvanca->Enabled=true; //habilita botão Anvaçar ReiniciaGauge(); ProximoReg=10; LinhasExecutadas=0; SBAbrir->Enabled=false; //desabilita botão de abrir arquivo Passo = 1; TimerMain->Enabled = true; Analisar=false;//iniciar a compilaçao Calcular = true; Linha = StrToInt(EditLinhaExec->Text); GaugeLinhas=0; GaugeIlhas=0; GaugeTotal=0; FT1 = false; } else Application->MessageBoxA("Porta Serial não conectada!","Erro", 48); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BtbPausaClick(TObject *Sender) { if (BtbPausa->Caption=="Pausar") { BtbPausa->Caption="Continuar"; BtBReinicia->Enabled=true; //habilita botão Reiniciar } else { BtbPausa->Caption="Pausar"; BtBReinicia->Enabled=false; //desabilita botão Reiniciar } } //----------------------------------------------------------------------void __fastcall TFrmPlotter::RBTopLayerClick(TObject *Sender) { CorLinhaEscolhida = 1; AtualizaLinha(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::RBBottomLayerClick(TObject *Sender) { CorLinhaEscolhida = 6; AtualizaLinha(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::RBTopOverlayClick(TObject *Sender) { CorLinhaEscolhida = 7; AtualizaLinha(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::RBBottomOverlayClick(TObject *Sender) { CorLinhaEscolhida = 8; AtualizaLinha(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::RBKeepOutLayerClick(TObject *Sender) { CorLinhaEscolhida = 12; AtualizaLinha(); } 40 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: //----------------------------------------------------------------------void __fastcall TFrmPlotter::CBIlhasClick(TObject *Sender) { TamTotal= TamIlhas + TamLinhas; if (!CBIlhas->Checked) TamTotal=TamLinhas; LbTotal->Caption="Total 1 de "+IntToStr(TamTotal); CGauge3->ForeColor=clNavy; CGauge3->Progress=0; } //----------------------------------------------------------------------void __fastcall TFrmPlotter::CBLinhasClick(TObject *Sender) { TamTotal= TamIlhas + TamLinhas; if (!CBLinhas->Checked) TamTotal=TamIlhas; LbTotal->Caption="Total 1 de "+IntToStr(TamTotal); CGauge3->ForeColor=clNavy; CGauge3->Progress=0; } //----------------------------------------------------------------------void __fastcall TFrmPlotter::TimerMainTimer(TObject *Sender) { int X01, Y01, X1, Y1; if(BtbPausa->Caption=="Pausar") { if (Passo==1) { if (Calcular) { RepeteLinha=false; Analisar=true; CalcularDados(); Calcular=false; RepLinha=0; } EdtCmdPlotter->Text="Passo 1: Zerando Posição."; PosicaoInicial(); Passo++; } if (Passo==2) //leve a pena no inicio do traço { if(Retorno==1) { Retorno=0; EdtCmdPlotter->Text="Passo 2: Posicionando pena no inicio do traço." Passo++; PosicaoPena(); if(Calcular) { RepeteLinha=false; Analisar=true; CalcularDados(); Calcular=false; } } } if(Passo==3) //leve a pena no inicio do traço { if(Retorno==1) { Retorno=0; Passo++; PosicaoPena(); 41 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: } } if(Passo==4) //Abaixar a pena { Passo++; //passo = 5 executa traço PosicaoPena(); } if(Passo==5) //Executa o traço { Passo++; } if(Passo==6) //Fim do traço { if(Retorno==1) { Retorno=0; EdtCmdPlotter->Text="Traço finalizado."; //ROTINA REPETE LINHAS if((RepLinha<NumRepeticao->Value)&&(CBRepeticao->Checked)) { CMD= 126; //comando sobe pena AtualizaDados(); Sleep(250); RepeteLinha=false; Linha++; EdtCoord->Text=Memo->Lines->Strings[Linha]; if((CBLinhas->Checked)&&(EdtCoord->Text=="FT")) { X1=X; Y1=Y; CalcDist(); if(CorLinhaEscolhida==CorLinha) { RepLinha++; EdtCoord->Text=Memo->Lines->Strings[Linha DeslX=X0-X1; DeslY=Y0-Y1; } RepeteLinha=true; Analisar=true; Calcular=true; Linha--; Passo=2; // IncrementaLinha(); Retorno=1; } else { RepLinha=0; FT1=false; RepeteLinha=false; Calcular=true; Passo=1; } } else { RepLinha=0; FT1=false; RepeteLinha=false; Calcular=true; Passo=1; } } } 42 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: } } //----------------------------------------------------------------------void __fastcall TFrmPlotter::CBRetXClick(TObject *Sender) { RetX=1; CBRetX->Checked=false; } //----------------------------------------------------------------------void __fastcall TFrmPlotter::CBRetYClick(TObject *Sender) { RetY=1; CBRetY->Checked=false; } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BtBReiniciaClick(TObject *Sender) { Analisar=false; Calcular=false; Linha=0; FT1=false; Passo=0; PosicaoInicial(); ReiniciaGauge(); SBAbrir->Enabled=true; BtBInicia->Enabled=true; BtbPausa->Enabled=false; BtBReinicia->Enabled=false; BtbPausa->Caption="Pausar"; BtBAvanca->Enabled=false; TimerMain->Enabled=false; EditLinhaExec->Text=0; } //----------------------------------------------------------------------void __fastcall TFrmPlotter::TimerIlha1Timer(TObject *Sender) { float CalErro; static int RegPos, PosPadX, PosPadY, PadX, PadY, VelPadX, VelPadY; bool CompHoriz; if((CBIlhas->Checked)&&(BtbPausa->Caption=="Pausar")) { if(PassoIlha==1) { PassoIlha++; Componente=0; RegPos=0; } if((PassoIlha==2)&&(Retorno==1)) { Retorno=0; VelX=StrToInt(FormSetup->EditVelocX->Text); VelY=StrToInt(FormSetup->EditVelocY->Text); IntervX=StrToInt(FormSetup->EditTIntX->Text); IntervY=StrToInt(FormSetup->EditTIntY->Text); //vá para o centro do pad DeslX = X0 - 25; DeslY = Y0 - 20; PosPadX=X0; PosPadY=Y0; PassoIlha++; CMD = 122;//vá para o inicio do pad RetX=0; RetY=0; AtualizaDados(); TamPadX = StrToInt(FormSetup->EditTamIlhaX->Text); TamPadY = StrToInt(FormSetup->EditTamIlhaY->Text); 43 734: //velocidade de ir de um pad ao outro(velocidade menor para dar precisão) 735: VelPadX = 3; 736: VelPadY = 8; 737: PadX=TamPadX; 738: PadY=TamPadY; 739: } 740: //vá para o inicio do pad 741: if((PassoIlha==3)&&(Retorno==1)) 742: { 743: Retorno=0; 744: VelX=StrToInt(FormSetup->EditVelocX->Text); 745: VelY=StrToInt(FormSetup->EditVelocY->Text)+5; 746: IntervX=StrToInt(FormSetup->EditTIntX->Text); 747: IntervY=StrToInt(FormSetup->EditTIntY->Text); 748: CMD= 128; //comando desce pena 749: AtualizaDados(); 750: Sleep(300); //tempo obrigatorio para esperar o proximo comando 751: PassoIlha++; 752: RetX=0; 753: RetY=0; 754: VelX = VelPadX; 755: VelY = VelPadY; 756: CMD = 132;//comando para fazer o PAD 757: AtualizaDados(); 758: } 759: if((PassoIlha == 4)&&(Retorno==1)) 760: { 761: Retorno=0; 762: PassoIlha++; 763: CMD=126; //Comando sobe pena 764: AtualizaDados(); 765: Linha++; 766: Linha++; 767: } 768: if(PassoIlha == 5) 769: { 770: EdtCoord->Text=Memo->Lines->Strings[Linha]; 771: if((EdtCoord->Text =="CP")||(EdtCoord->Text == "FP")) //repete comando 772: { 773: CalcDist(); 774: CompHoriz=false; 775: if(X0 == PosPadX) 776: { 777: CompHoriz=true; 778: if(PosPadY > Y0) 779: { 780: RegPos++; 781: Componente=1; 782: LabelStatusComp->Caption="Componente 1/Pos = " 783: if(RegPos ==4) 784: { 785: RegPos=0; 786: DeslY=(PosPadY - Y0)- StrToInt(FormSetup 787: } 788: else 789: DeslY=(PosPadY - Y0)- StrToInt(FormSetup 790: 791: OffSetPenaX=0;//Ainda não usado, a plotter não 792: OffSetPenaY=0;//Ainda não usado, a plotter não 793: CMD=114; //segue o carro através deslocamento X 794: TamPadX =StrToInt(FormSetup->EditTamX1->Text); 795: TamPadY =StrToInt(FormSetup->EditTamY1->Text); 796: } 797: else 798: { 799: RegPos++; 800: Componente=2; 801: LabelStatusComp->Caption="Componente 2/Pos = " 802: if(RegPos ==4) 44 803: { 804: RegPos=0; 805: DeslY=(Y0 - PosPadY)+ StrToInt(FormSetup 806: } 807: else 808: DeslY=(Y0 - PosPadY)+ StrToInt(FormSetup 809: 810: OffSetPenaX=0;//Ainda não usado, a plotter não 811: OffSetPenaY=0;//Ainda não usado, a plotter não 812: CMD= 116;//segue o carro através deslocamento X 813: TamPadX =StrToInt(FormSetup->EditTamX2->Text); 814: TamPadY =StrToInt(FormSetup->EditTamY2->Text); 815: } 816: IncrementaIlha();//atualiza o bargraf do pad 817: PosPadY=Y0; 818: VelX=StrToInt(FormSetup->EditVelocX->Text); 819: VelY=StrToInt(FormSetup->EditVelocY->Text)+5; 820: 821: RetX = 1; 822: RetY = 0; 823: AtualizaDados(); 824: RetX=0; 825: RetY=0; 826: PassoIlha=3; 827: } 828: //faça o pad no sentido vertical 829: if ((Y0 == PosPadY)&&(!CompHoriz)) 830: { 831: if(PosPadX > X0) 832: { 833: RegPos++; 834: Componente = 3; 835: LabelStatusComp->Caption="Componente 3/Pos = " 836: if(RegPos == 4) 837: { 838: RegPos=0; 839: DeslX = (PosPadX - X0) + StrToInt(FormSetup 840: } 841: else 842: DeslX = (PosPadX - X0) + StrToInt(FormSetup 843: 844: OffSetPenaX=0;//Ainda não usado, a plotter não 845: OffSetPenaY=0;//Ainda não usado, a plotter não 846: CMD= 110;//retorna o carro para a origem X 847: TamPadX =StrToInt(FormSetup->EditTamX3->Text); 848: TamPadY =StrToInt(FormSetup->EditTamY3->Text); 849: VelX=StrToInt(FormSetup->EditVelocX->Text); 850: VelY=StrToInt(FormSetup->EditVelocY->Text)+5; 851: } 852: else 853: { 854: RegPos++; 855: Componente=4; 856: LabelStatusComp->Caption="Componente 4/Pos = " 857: if(RegPos==4) 858: { 859: RegPos=0; 860: DeslX = (X0 - PosPadX) + StrToInt(FormSetup 861: } 862: else 863: DeslX = (X0 - PosPadX) + StrToInt(FormSetup 864: 865: OffSetPenaX=0;//Ainda não usado, a plotter não necessitou 866: OffSetPenaY=0;//Ainda não usado, a plotter não necessitou 867: CMD= 112;//leva o carro da origem X 868: TamPadX =StrToInt(FormSetup->EditTamX4->Text); 869: TamPadY =StrToInt(FormSetup->EditTamY4->Text); 870: VelX=StrToInt(FormSetup->EditVelocX->Text); 871: VelY=StrToInt(FormSetup->EditVelocY->Text)+5; 872: } 45 873: IncrementaIlha(); 874: PosPadX = X0; 875: RetX = 0; 876: RetY = 1; 877: AtualizaDados(); 878: PassoIlha=3; 879: RetX=0; 880: RetY=0; 881: } 882: if((X0 != PosPadX)&&(Y0!=PosPadY)) 883: { 884: PosicaoInicial(); 885: RetX=0; 886: RetY=0; 887: RegPos=0; 888: Linha--; 889: Linha--; 890: Calcular=true; 891: FT1=true; 892: TimerIlha1->Enabled=false; 893: TimerMain->Enabled=true; 894: } 895: } 896: else 897: { 898: PosicaoInicial(); 899: RetX=0; 900: RetY=0; 901: RegPos=0; 902: Calcular=true; 903: FT1=true; 904: TimerIlha1->Enabled=false; 905: TimerMain->Enabled=true; 906: } 907: } 908: } 909: } 910: //----------------------------------------------------------------------911: void __fastcall TFrmPlotter::TimerSerialTimer(TObject *Sender) 912: { 913: static int PosRec1, DadoRec,CalcX1, CalcX2, CalcX3, CalcY1,CalcY2,CalcY3, DeslocamX, DeslocamY 914: static boolean recebe; 915: 916: AnsiString hora; 917: hora=FormatDateTime("hh:mm:ss",Now()); 918: 919: if((FrmPlotter->RBCom1->Checked)||(FrmPlotter->RBCom2->Checked)) 920: { 921: if(serial.BytesInQueue()!= 0) 922: { 923: BYTE x; 924: serial.Receive(&x, 1, 1000); 925: DadoRec=x; 926: if((DadoRec==201)&&(!recebe)) 927: { 928: recebe=true; 929: PosRec1=0; 930: } 931: if(recebe) 932: { 933: PosRec1++; 934: switch(PosRec1) 935: { 936: case 2:CalcX1=DadoRec;break; 937: case 3:CalcX2=DadoRec;break; 938: case 4:CalcX3=DadoRec;break; 939: case 5:CalcY1=DadoRec;break; 46 940: 941: 942: 943: 944: 945: 946: 947: 948: 949: 950: 951: 952: 953: 954: 955: 956: 957: 958: 959: 960: 961: 962: 963: 964: 965: 966: 967: 968: 969: 970: 971: 972: 973: 974: 975: 976: 977: 978: 979: 980: 981: 982: 983: 984: 985: 986: 987: 988: 989: 990: 991: 992: 993: 994: case 6:CalcY2=DadoRec;break; case 7:CalcY3=DadoRec;break; case 8:FrmPlotter->RetX=DadoRec;break; case 9:FrmPlotter->RetY=DadoRec;break; case 10:Retorno=DadoRec; recebe=false; if(LinhasExecutadas==ProximoReg) { ProximoReg+=10; } break; } } } } } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BtbExecPadClick(TObject *Sender) { CMD= 132;//comando para executar pad TamPadX=StrToInt(EditTestePadX->Text); TamPadY=StrToInt(EditTestePadY->Text); AtualizaDados(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BtbExecLinhaClick(TObject *Sender) { Linha=StrToInt(EditLinhaExec->Text); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::BtBAvancaClick(TObject *Sender) { FT1=false; Analisar=true; CalcularDados(); } //----------------------------------------------------------------------void __fastcall TFrmPlotter::T_AtualizaShapeTimer(TObject *Sender) { if (RetX) Shape6->Brush->Color=clGreen; else Shape6->Brush->Color=clRed; if (RetY) Shape7->Brush->Color=clGreen; else Shape7->Brush->Color=clRed; if (Retorno==1) Shape8->Brush->Color=clGreen; else Shape8->Brush->Color=clRed; } //----------------------------------------------------------------------void __fastcall TFrmPlotter::CBRetornoClick(TObject *Sender) { Retorno=1; CBRetorno->Checked=false; } //----------------------------------------------------------------------- D.2 LINHAS DE CÓDIGO DO FORM VALORES: 1: 2: 3: 4: 5: 6: 7: 8: 9: //----------------------------------------------------------------------#include <vcl.h> #include <stdio.h> #pragma hdrstop #include "Prog_Plotter.h" int X, X0, Y, Y0, CorLinha, EspLinha; 47 10: 11: extern int Linha, ComprX, ComprY; 12: //----------------------------------------------------------------------13: 14: #pragma package(smart_init) 15: 16: void CalcDist(void) 17: { 18: AnsiString Valor; 19: Linha++; 20: Valor=FrmPlotter->Memo->Lines->Strings[Linha]; 21: sscanf(Valor.c_str(), "%d%d%d%d%d%d", &X0, &Y0, &X, &Y, &EspLinha, &CorLinha); 22: ComprX=(X-X0); 23: ComprY=(Y-Y0); 24: } 25: //----------------------------------------------------------------------- D.3 LINHAS DE CÓDIGO DO FORM SETUP: 1: //----------------------------------------------------------------------2: #include <vcl.h> 3: #include<stdio.h> 4: #pragma hdrstop 5: 6: #include "FrmSetup.h" 7: //----------------------------------------------------------------------8: #pragma package(smart_init) 9: #pragma resource "*.dfm" 10: TFormSetup *FormSetup; 11: 12: struct ArquivoDados{ 13: char TamanhoX1[5]; 14: char TamanhoY1[5]; 15: char TamanhoX2[5]; 16: char TamanhoY2[5]; 17: char TamanhoX3[5]; 18: char TamanhoY3[5]; 19: char TamanhoX4[5]; 20: char TamanhoY4[5]; 21: char OffsetX1[5]; 22: char OffsetY1[5]; 23: char OffsetX2[5]; 24: char OffsetY2[5]; 25: char OffsetX3[5]; 26: char OffsetY3[5]; 27: char OffsetX4[5]; 28: char OffsetY4[5]; 29: char FatorX[10]; 30: char FatorY[10]; 31: char TamPadX[5]; 32: char TamPadY[5]; 33: char VelocX[5]; 34: char VelocY[5]; 35: char TIntX[5]; 36: char TIntY[5]; 37: char Reserva1[5]; 38: char Reserva2[5]; 39: char Reserva3[5]; 40: char Reserva4[5]; 41: }; 42: 43: void CalculeAngulo(int angulo1); 44: 45: struct ArquivoDados DadosSetup; 46: char chrDados[1000]; 47: 48 48: FILE *fpDados; 49: //----------------------------------------------------------------------50: __fastcall TFormSetup::TFormSetup(TComponent* Owner) 51: : TForm(Owner) 52: { 53: } 54: //----------------------------------------------------------------------55: void GravaRegistros() 56: { 57: String strDados; 58: 59: strDados = Format("%-3s",ARRAYOFCONST((FormSetup->EditTamX1->Text)))+ 60: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamY1->Text)))+ 61: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamX2->Text)))+ 62: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamY2->Text)))+ 63: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamX3->Text)))+ 64: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamY3->Text)))+ 65: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamX4->Text)))+ 66: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamY4->Text)))+ 67: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset1_1->Text)))+ 68: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset1_2->Text)))+ 69: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset2_1->Text)))+ 70: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset2_2->Text)))+ 71: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset3_1->Text)))+ 72: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset3_2->Text)))+ 73: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset4_1->Text)))+ 74: Format("%-3s",ARRAYOFCONST((FormSetup->EditOffset4_2->Text)))+ 75: Format("%-9s",ARRAYOFCONST((FormSetup->EditFatorX->Text)))+ 76: Format("%-9s",ARRAYOFCONST((FormSetup->EditFatorY->Text)))+ 77: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamIlhaX->Text)))+ 78: Format("%-3s",ARRAYOFCONST((FormSetup->EditTamIlhaY->Text)))+ 79: Format("%-3s",ARRAYOFCONST((FormSetup->EditVelocX->Text)))+ 80: Format("%-3s",ARRAYOFCONST((FormSetup->EditVelocY->Text)))+ 81: Format("%-3s",ARRAYOFCONST((FormSetup->EditTIntX->Text)))+ 82: Format("%-3s",ARRAYOFCONST((FormSetup->EditTIntY->Text))); 83: sprintf(chrDados,"%s",strDados); 84: 85: fpDados = fopen("Setup.dat","w+"); 86: fputs(chrDados, fpDados); //grava o arquivo em disco 87: fflush(fpDados); 88: fclose(fpDados); 89: } 90: void LeRegistro() 91: { 92: if(FileExists("Setup.dat")) 93: { 94: fpDados = fopen("Setup.dat","r+"); 95: fgets(chrDados,100, fpDados); 96: 97: strncpy(DadosSetup.TamanhoX1,chrDados,3); 98: DadosSetup.TamanhoX1[5]='\0'; 99: FormSetup->EditTamX1->Text=DadosSetup.TamanhoX1; 100: 101: strncpy(DadosSetup.TamanhoY1,&chrDados[3],3); 102: DadosSetup.TamanhoY1[5]='\0'; 103: FormSetup->EditTamY1->Text=DadosSetup.TamanhoY1; 104: 105: strncpy(DadosSetup.TamanhoX2,&chrDados[6],3); 106: DadosSetup.TamanhoX2[5]='\0'; 107: FormSetup->EditTamX2->Text=DadosSetup.TamanhoX2; 108: 109: strncpy(DadosSetup.TamanhoY2,&chrDados[9],3); 110: DadosSetup.TamanhoY2[5]='\0'; 111: FormSetup->EditTamY2->Text=DadosSetup.TamanhoY2; 112: 113: strncpy(DadosSetup.TamanhoX3,&chrDados[12],3); 114: DadosSetup.TamanhoX3[5]='\0'; 115: FormSetup->EditTamX3->Text=DadosSetup.TamanhoX3; 49 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: strncpy(DadosSetup.TamanhoY3,&chrDados[15],3); DadosSetup.TamanhoY3[5]='\0'; FormSetup->EditTamY3->Text=DadosSetup.TamanhoY3; strncpy(DadosSetup.TamanhoX4,&chrDados[18],3); DadosSetup.TamanhoX4[5]='\0'; FormSetup->EditTamX4->Text=DadosSetup.TamanhoX4; strncpy(DadosSetup.TamanhoY4,&chrDados[21],3); DadosSetup.TamanhoY4[5]='\0'; FormSetup->EditTamY4->Text=DadosSetup.TamanhoY4; strncpy(DadosSetup.OffsetX1,&chrDados[24],3); DadosSetup.OffsetX1[5]='\0'; FormSetup->EditOffset1_1->Text=DadosSetup.OffsetX1; strncpy(DadosSetup.OffsetY1,&chrDados[27],3); DadosSetup.OffsetY1[5]='\0'; FormSetup->EditOffset1_2->Text=DadosSetup.OffsetY1; strncpy(DadosSetup.OffsetX2,&chrDados[30],3); DadosSetup.OffsetX2[5]='\0'; FormSetup->EditOffset2_1->Text=DadosSetup.OffsetX2; strncpy(DadosSetup.OffsetY2,&chrDados[33],3); DadosSetup.OffsetY2[5]='\0'; FormSetup->EditOffset2_2->Text=DadosSetup.OffsetY2; strncpy(DadosSetup.OffsetX3,&chrDados[36],3); DadosSetup.OffsetX3[5]='\0'; FormSetup->EditOffset3_1->Text=DadosSetup.OffsetX3; strncpy(DadosSetup.OffsetY3,&chrDados[39],3); DadosSetup.OffsetY3[5]='\0'; FormSetup->EditOffset3_2->Text=DadosSetup.OffsetY3; strncpy(DadosSetup.OffsetX4,&chrDados[42],3); DadosSetup.OffsetX4[5]='\0'; FormSetup->EditOffset4_1->Text=DadosSetup.OffsetX4; strncpy(DadosSetup.OffsetY4,&chrDados[45],3); DadosSetup.OffsetY4[5]='\0'; FormSetup->EditOffset4_2->Text=DadosSetup.OffsetY4; strncpy(DadosSetup.FatorX,&chrDados[48],9); DadosSetup.FatorX[10]='\0'; FormSetup->EditFatorX->Text=DadosSetup.FatorX; strncpy(DadosSetup.FatorY,&chrDados[57],9); DadosSetup.FatorY[10]='\0'; FormSetup->EditFatorY->Text=DadosSetup.FatorY; strncpy(DadosSetup.TamPadX,&chrDados[66],3); DadosSetup.TamPadX[5]='\0'; FormSetup->EditTamIlhaX->Text=DadosSetup.TamPadX; strncpy(DadosSetup.TamPadY,&chrDados[69],3); DadosSetup.TamPadY[5]='\0'; FormSetup->EditTamIlhaY->Text=DadosSetup.TamPadY; strncpy(DadosSetup.VelocX,&chrDados[72],3); DadosSetup.VelocX[5]='\0'; FormSetup->EditVelocX->Text=DadosSetup.VelocX; strncpy(DadosSetup.VelocY,&chrDados[75],3); DadosSetup.VelocY[5]='\0'; FormSetup->EditVelocY->Text=DadosSetup.VelocY; 50 184: 185: strncpy(DadosSetup.TIntX,&chrDados[78],3); 186: DadosSetup.TIntX[5]='\0'; 187: FormSetup->EditTIntX->Text=DadosSetup.TIntX; 188: 189: strncpy(DadosSetup.TIntY,&chrDados[81],3); 190: DadosSetup.TIntY[5]='\0'; 191: FormSetup->EditTIntY->Text=DadosSetup.TIntY; 192: 193: fclose(fpDados); 194: } 195: else Application->MessageBoxA("erro!","Erro ao abrir arquivo de Setup", MB_OK); 196: } 197: void CalculeAngulo(int angulo1) 198: { 199: bool Verifica; 200: int Linha1; 201: AnsiString Texto, Numero, ValorAngulo; 202: 203: FormSetup->VelocX=2; 204: FormSetup->VelocY=10; 205: FormSetup->InterX=100; 206: FormSetup->InterY=100; 207: 208: Verifica=false; 209: 210: Linha1 = 0; 211: ValorAngulo="<"+ IntToStr(angulo1)+">"; 212: 213: while (!Verifica) 214: { 215: 216: Texto=FormSetup->Memo1->Lines->Strings[Linha1]; 217: if (Texto==ValorAngulo) 218: { 219: Linha1++; 220: Texto=FormSetup->Memo1->Lines->Strings[Linha1]; 221: sscanf(Texto.c_str(), "%d%d%d%d", &FormSetup->VelocX, &FormSetup->VelocY 222: Verifica=true; 223: } 224: Linha1++; 225: } 226: } 227: //----------------------------------------------------------------------228: void __fastcall TFormSetup::EditTamX1Change(TObject *Sender) 229: { 230: BtbAceita->Enabled=true; 231: BtbCancela->Enabled=true; 232: } 233: //----------------------------------------------------------------------234: void __fastcall TFormSetup::BtbAceitaClick(TObject *Sender) 235: { 236: GravaRegistros(); 237: BtbAceita->Enabled=false; 238: BtbCancela->Enabled=false; 239: } 240: //----------------------------------------------------------------------241: void __fastcall TFormSetup::BtbCancelaClick(TObject *Sender) 242: { 243: LeRegistro(); 244: BtbAceita->Enabled=false; 245: BtbCancela->Enabled=false; 246: } 247: //----------------------------------------------------------------------248: void __fastcall TFormSetup::BtbOkClick(TObject *Sender) 249: { 250: if(BtbAceita->Enabled) 51 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: { BtbAceita->Enabled=false; BtbCancela->Enabled=false; GravaRegistros(); } Close(); } //----------------------------------------------------------------------void __fastcall TFormSetup::FormCreate(TObject *Sender) { LeRegistro(); Memo1->Lines->LoadFromFile("Angulo.txt"); BtbCancelaAngulos->Enabled = false; BtbAceitaAngulos->Enabled=false; } //----------------------------------------------------------------------void __fastcall TFormSetup::BtbAceitaAngulosClick(TObject *Sender) { Memo1->Lines->SaveToFile("Angulo.txt"); BtbCancelaAngulos->Enabled = false; BtbAceitaAngulos->Enabled=false; } //----------------------------------------------------------------------void __fastcall TFormSetup::BtbCancelaAngulosClick(TObject *Sender) { Memo1->Lines->LoadFromFile("Angulo.txt"); BtbCancelaAngulos->Enabled = false; BtbAceitaAngulos->Enabled=false; } //----------------------------------------------------------------------void __fastcall TFormSetup::Memo1Change(TObject *Sender) { BtbAceitaAngulos->Enabled=true; BtbCancelaAngulos->Enabled=true; } //----------------------------------------------------------------------void __fastcall TFormSetup::BtbOKAngulosClick(TObject *Sender) { if(BtbAceitaAngulos->Enabled) { BtbCancelaAngulos->Enabled = false; BtbAceitaAngulos->Enabled=false; Memo1->Lines->SaveToFile("Angulo.txt"); } Close(); } //----------------------------------------------------------------------- D.4 LINAS DE CÓDIGO DO FORM COMANDOS: 1: //----------------------------------------------------------------------2: #include <vcl.h> 3: #include <math.h> 4: //#include "Calcular.h" 5: #pragma hdrstop 6: 7: #include "Prog_Plotter.h" 8: #include "FrmSetup.h" 9: 10: void AtualizaDados(void); 11: 12: int Passo; 13: 14: extern int ComprX, ComprY, X, X0, Y, Y0, CorLinha, ResulVelX, 15: ResulVelY, ResulInterX, ResulInterY; 16: 17: extern bool grau; 52 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: //----------------------------------------------------------------------#pragma package(smart_init) void PosicaoPena(void) { if (Passo==3) //leve a caneta no inicio do traço { if(FrmPlotter->RepeteLinha==false) { FrmPlotter->VelX=StrToInt(FormSetup->EditVelocX->Text); FrmPlotter->VelY=StrToInt(FormSetup->EditVelocY->Text); FrmPlotter->IntervX= StrToInt(FormSetup->EditTIntX->Text); FrmPlotter->IntervY= StrToInt(FormSetup->EditTIntY->Text); if((ComprX<0)&&(grau==false)) FrmPlotter->DeslX=X; else FrmPlotter->DeslX=X0; if((ComprY<0)&&(grau==false)) FrmPlotter->DeslY=Y; else FrmPlotter->DeslY=Y0; FrmPlotter->CMD= 122; //x e y positivo FrmPlotter->RetX=0; FrmPlotter->RetY=0; AtualizaDados(); } //Fazer o traço com repetição if(FrmPlotter->RepeteLinha==true) { if((FrmPlotter->DeslX==0)&&(FrmPlotter->DeslY==0)) { FrmPlotter->RetX=1; FrmPlotter->RetY=1; FrmPlotter->CMD = 0; } else { FrmPlotter->RetX=0; FrmPlotter->RetY=0; } if ((FrmPlotter->DeslX==0)&&(FrmPlotter->DeslY<0)) { FrmPlotter->CMD= 114; FrmPlotter->RetX=1; FrmPlotter->RetY=0; } if ((FrmPlotter->DeslX==0)&&(FrmPlotter->DeslY>0)) { FrmPlotter->CMD= 116; FrmPlotter->RetX=1; FrmPlotter->RetY=0; } if((FrmPlotter->DeslX<0)&&(FrmPlotter->DeslY==0)) { FrmPlotter->CMD= 110; FrmPlotter->RetX=0; FrmPlotter->RetY=1; } if((FrmPlotter->DeslX>0)&&(FrmPlotter->DeslY==0)) { FrmPlotter->CMD= 112; FrmPlotter->RetX=0; FrmPlotter->RetY=1; 53 86: } 87: if((FrmPlotter->DeslX<0)&&(FrmPlotter->DeslY<0)) 88: FrmPlotter->CMD= 118; //x e y negativo 89: 90: if((FrmPlotter->DeslX>0)&&(FrmPlotter->DeslY<0)) 91: FrmPlotter->CMD= 124; //x positivo e y negativo 92: 93: if((FrmPlotter->DeslX>0)&&(FrmPlotter->DeslY>0)) 94: FrmPlotter->CMD= 122; //x e y positivo 95: 96: if((FrmPlotter->DeslX<0)&&(FrmPlotter->DeslY>0)) 97: FrmPlotter->CMD= 120; //x positivo y negativo 98: 99: if (FrmPlotter->DeslX<0) 100: FrmPlotter->DeslX*=-1; 101: 102: if (FrmPlotter->DeslY<0) 103: FrmPlotter->DeslY*=-1; 104: 105: FrmPlotter->VelX=StrToInt(FormSetup->EditVelocX->Text); 106: FrmPlotter->VelY=StrToInt(FormSetup->EditVelocY->Text)+ 3; 107: AtualizaDados(); 108: } 109: } 110: if (Passo==4) //abaixar a pena 111: { 112: FrmPlotter->CMD=128; 113: AtualizaDados(); 114: FrmPlotter->EdtCmdPlotter->Text="Passo 4: Fazendo o traço."; 115: Sleep(200); 116: } 117: 118: if (Passo==5) //inicio do traço 119: { 120: FrmPlotter->VelX=ResulVelX; 121: FrmPlotter->VelY=ResulVelY; 122: FrmPlotter->IntervX=ResulInterX; 123: FrmPlotter->IntervY=ResulInterY; 124: 125: if(!grau)//nao executa angulo 126: { 127: if(ComprX<0) 128: { 129: FrmPlotter->DeslX=ComprX*(-1); 130: FrmPlotter->CMD=110;// 131: FrmPlotter->RetX=0; 132: FrmPlotter->RetY=1; 133: } 134: if(ComprY<0) 135: { 136: FrmPlotter->DeslY=ComprY*(-1); 137: FrmPlotter->CMD=114;// 138: FrmPlotter->RetX=1; 139: FrmPlotter->RetY=0; 140: } 141: if(ComprX>0)//|. 142: { 143: FrmPlotter->DeslX=ComprX; 144: FrmPlotter->CMD=112; // 145: FrmPlotter->RetX=0; 146: FrmPlotter->RetY=1; 147: } 148: if(ComprY>0)//-> 149: { 150: FrmPlotter->DeslY=ComprY; 151: FrmPlotter->CMD=116;// 152: FrmPlotter->RetX=1; 153: FrmPlotter->RetY=0; 54 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: } AtualizaDados(); FrmPlotter->EdtCmdPlotter->Text="Passo 5: Executa traço."; } else //executa angulo { if((ComprX>0)&&(ComprY>0)) { FrmPlotter->DeslX=ComprX; FrmPlotter->DeslY=ComprY; FrmPlotter->CMD=122;// FrmPlotter->RetX=0; FrmPlotter->RetY=0; } if((ComprX>0)&&(ComprY<0)) { FrmPlotter->DeslX=ComprX; FrmPlotter->DeslY=ComprY*(-1); FrmPlotter->CMD=124;// FrmPlotter->RetX=0; FrmPlotter->RetY=0; } if((ComprX<0)&&(ComprY<0)) { FrmPlotter->DeslX=ComprX*(-1); FrmPlotter->DeslY=ComprY*(-1); FrmPlotter->CMD=118;// FrmPlotter->RetX=0; FrmPlotter->RetY=0; } if((ComprX<0)&&(ComprY>0)) { FrmPlotter->DeslX=ComprX*(-1); FrmPlotter->DeslY=ComprY; if(FrmPlotter->DeslY<13) FrmPlotter->DeslY=13; FrmPlotter->CMD=120; // FrmPlotter->RetX=0; FrmPlotter->RetY=0; } FrmPlotter->EdtCmdPlotter->Text="Passo 5: Executando traço."; AtualizaDados(); } } } void PosicaoInicial(void) { FrmPlotter->CMD= 126; //comando sobe pena AtualizaDados(); Sleep(250); FrmPlotter->CMD= 130;//Retornar posição inicial FrmPlotter->VelX=StrToInt(FormSetup->EditVelocX->Text); FrmPlotter->VelY= StrToInt(FormSetup->EditVelocY->Text); FrmPlotter->IntervX= StrToInt(FormSetup->EditTIntX->Text); FrmPlotter->IntervY= StrToInt(FormSetup->EditTIntY->Text); FrmPlotter->RetX=0; FrmPlotter->RetY=0; AtualizaDados(); } //----------------------------------------------------------------------- D.5 LINHAS DE COMANDO DO FORM ANALISARDADOS: 1: //----------------------------------------------------------------------2: //#include <vcl.h> 55 3: #include <math.h> 4: #pragma hdrstop 5: #include "Prog_Plotter.h" 6: #include "FrmSetup.h" 7: 8: void CalcDist(void); 9: void IncrementaLinha(void); 10: void IncrementaIlha(void); 11: void CalculeAngulo(int angulo1); 12: void PosicaoInicial(void); 13: 14: int Linha, ComprX, ComprY,ResulVelX, ResulVelY, ResulInterX,ResulInterY; 15: bool Analisar, FT1, grau; 16: 17: extern int CorLinha, Passo; 18: //----------------------------------------------------------------------19: #pragma package(smart_init) 20: void CalcularDados(void) 21: { 22: int AngInt; 23: float ang, Vl1, Vl2; 24: double R; 25: 26: if(Analisar) 27: { 28: FT1=false; 29: while(!FT1) 30: { 31: FrmPlotter->EdtCoord->Text=FrmPlotter->Memo->Lines->Strings[Linha]; 32: if(FrmPlotter->CBIlhas->Checked) 33: { 34: if((FrmPlotter->EdtCoord->Text=="FP")||(FrmPlotter->EdtCoord->T 35: { 36: CalcDist();//chama unit de calculo das distancias 37: FT1=true; 38: FrmPlotter->TimerMain->Enabled=false; 39: FrmPlotter->TimerIlha1->Enabled=true; 40: FrmPlotter->PassoIlha=1; 41: Passo=0; 42: IncrementaIlha(); 43: } 44: if((FrmPlotter->EdtCoord->Text=="CT")||(FrmPlotter->EdtCoord->T 45: FT1=false; 46: } 47: if(FrmPlotter->CBLinhas->Checked) 48: { 49: if(FrmPlotter->EdtCoord->Text=="FT") //LInhas 50: { 51: FT1=false; 52: CalcDist(); 53: if(FrmPlotter->CorLinhaEscolhida==CorLinha)//verificar 54: { 55: FrmPlotter->LinhasExecutadas++; 56: FT1=true; 57: FrmPlotter->EdtCoord->Text=FrmPlotter->Memo->Lines 58: if(FrmPlotter->RepeteLinha) 59: { 60: Passo=1; 61: } 62: Analisar=false; 63: IncrementaLinha(); 64: } 65: if ((ComprX!=0)&&(ComprY!=0)) 66: { 67: grau=true; 68: Vl1=ComprX; 69: Vl2=ComprY; 70: R=atan(Vl1 / Vl2); //em radianos 56 71: //conversão rad para graus 72: ang=(R/0.01745); //pi/180=0.01745 73: 74: if(ang<0) ang*=(-1); 75: AngInt= StrToInt(FormatFloat("000",ang 76: 77: CalculeAngulo(AngInt); 78: ResulVelX=FormSetup->VelocX; 79: ResulVelY=FormSetup->VelocY; 80: ResulInterX=FormSetup->InterX; 81: ResulInterY=FormSetup->InterY; 82: } 83: else 84: { 85: grau=false; 86: ResulVelX=StrToInt(FormSetup->EditVelocX->Text 87: ResulVelY=StrToInt(FormSetup->EditVelocY->Text 88: ResulInterX=StrToInt(FormSetup->EditTIntX->Text 89: ResulInterY=StrToInt(FormSetup->EditTIntY->Text 90: } 91: } 92: if((FrmPlotter->EdtCoord->Text=="FS")||(FrmPlotter->EdtCoord->T 93: FT1=false; 94: } 95: if (FrmPlotter->EdtCoord->Text=="ENDPCB") 96: { 97: FrmPlotter->Calcular=false; 98: Passo=0; 99: Linha=0; 100: FrmPlotter->CGauge1->ForeColor=clRed; 101: FrmPlotter->CGauge2->ForeColor=clRed; 102: FrmPlotter->CGauge3->ForeColor=clRed; 103: 104: FrmPlotter->BtBInicia->Enabled=true; 105: FrmPlotter->SBAbrir->Enabled=true; 106: 107: PosicaoInicial(); 108: FrmPlotter->TimerMain->Enabled=false; 109: FrmPlotter->BtbPausa->Enabled=false; 110: FrmPlotter->BtBAvanca->Enabled=false; 111: FrmPlotter->BtBReinicia->Enabled=false; 112: FT1=true; 113: } 114: if (!FT1) 115: Linha++; 116: } 117: FrmPlotter->EdtNLinha->Text= IntToStr(Linha); 118: FrmPlotter->EditLinhaExec->Text= IntToStr(Linha); 119: } 120: } 212: //----------------------------------------------------------------------- D.6 LINHAS DE CÓDIGO DO FORM SERIAL: 1: //----------------------------------------------------------------------2: // Projeto: 3: // Empresa: 4: //----------------------------------------------------------------------5: // 6: // Módulo: 7: // Arquivo: 8: // Autor: 9: // Descrição: 10: // Criado em: 11: // Histórico: 12: // 13: //----------------------------------------------------------------------14: 57 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: #ifndef _SERIAL_H_ #define _SERIAL_H_ //----------------------------------------------------------------------// // Inclusão de Arquivos // //----------------------------------------------------------------------#include <vcl.h> //----------------------------------------------------------------------// // Definições e Macros // //----------------------------------------------------------------------//----------------------------------------------------------------------// // Classes e Tipos // //----------------------------------------------------------------------class Serial { COMMTIMEOUTS m_OriginalTimeOuts; char m_szCom[256]; DCB m_dcb; HANDLE m_hSerial; public: Serial (void); ~Serial (void); BOOL Open (char * szCom, int nBaudRate); void Close (void); BOOL Send (BYTE * lpbyBuffer, int nBufferLength, int nTimeout = 1000); BOOL Receive (BYTE * lpbyBuffer, int nBufferLength, int nTimeout = 1000); BOOL ResetBuffer (void); DWORD BytesInQueue (void); }; #endif //_SERIAL_H_ 58 APÊNDICE E D.1 LINHAS DE CÓDIGO PARA PIC 1: // PLOTER PARA CIRCUITO IMPRESSO TCC 2: // 3: //Projeto Ploter para circuito impresso com comunicação Serial 4: // 5: // 6: //Programa desenvolvido por: PAULO HENRIQUE VITORINO & 7: // HANDY BORGES 8: // 9: // Revisão: 1.02 -- 03/10/2008 -10: // 11: // ATUALIZAÇOES: ACERTADO POSIÇÕES DOS MOTORES PARA A PLACA NOVA PCI 12: // 13: // 14: //--------------------------------------------------------------15: #include <16f873A.h> 16: #use delay(clock=4000000) 17: #fuses XT,NOPROTECT,NOLVP,NOBROWNOUT, PUT 18: #use rs232(BAUD=9600, XMIT=PIN_C6,RCV=PIN_C7,BITS=8) // obrigatorio para usar o serial 19: 20: // Definições I/O 21: 22: #define FimCursoYE PIN_A2//FIM DE CURSO Y MINIMO 23: #define FimCursoYD PIN_A1//FIM DE CURSO Y MAXIMO 24: #define FimCursoXE PIN_A0//FIM DE CURSO X MINIMO 25: #define FimCursoXD PIN_C5//FIM DE CURSO X MAXIMO 26: #define FimCursoPN Pin_A4//FIM DE CURSO ALTO DA PENA 27: #define PulsoX PIN_A3//ENCODER X 28: #define PulsoY Pin_A5//ENCODER Y 29: #define run PIN_C4//LED PISCA 'RUN' 30: 31: void Calcula_Desl(void); 32: void Calcula_Desl(void); 33: void tempoAtraz(void); 34: 35: //--------------------------------------------------------------36: 37: //declara as variaveis globais 38: int VelX, VelY, CalcX[4], CalcY[4]; 39: // Velx e y é velocidade dos dois motores, CalX são os pacotes de dados do comprimento de X, e o mesmo para CalcY 40: int valorRX, TamPadX, TamPadY; 41: // valorRX armazenamento dos dados da serial, TapPadX é comprimento do pad e TamPadY é a largura do pad 42: 43: //ponteiros ou flags do programa T para tempo, rx recebimento de dados, Eixo é moviemntação dos eixos, ExecPad faz o pad, Pad é flag de rotida de execução do flag 44: boolean T_FimX, T_FimY, T_FimPN, rxDados, EixoX1, EixoX2, EixoY1, EixoY2, SobePena, ExecPad, Pad, PenaUp ; 45: //Stop é para parar o motor, CmdZera manda os motores para a referencia, Flag atraso de um eixo para inicio junto quando comando de angulo, 46: boolean StopX, StopY, StopPN, CmdZeraX, CmdZeraY, Flag1, Flag2, Flag4, Flag5, led, 47: PenaDescanso, PenaAlta, Pulso1, Pulso2, Flag10, Flag11; 48: 49: int saida, saidaPn, RetX, RetY, Ret, RestoX, RestoY , AtrasoY1, AtrasoY2, ValorAtraso; 59 50: int i, d, m, n, p, PassoPad, TDescPena, OffSetPenaX, OffSetPenaY, DeslPn, ComprPn; 51: 52: unsigned int IntervX, IntervY; 53: // 16 bits = 32767 dec 54: int16 DeslX, DeslY, ComprX, ComprY, DeslPenaX, DeslPenaY, Var1X, Var2X, Var1Y, Var2Y; 55: 56: // XXXX 57: byte const tabela1[]={0b00010000,//0 58: 0b00110000,//1 59: 0b00100000,//2 60: 0b01100000,//3 61: 0b01000000,//4 62: 0b11000000,//5 63: 0b10000000,//6 64: 0b10010000,//7 65: 0b00010000,//8 66: 0b00110000,//9 67: 0b00100000,//10 68: 0b01100000,//11 69: 0b01000000,//12 70: 0b11000000,//13 71: 0b10000000,//14 72: 0b10010000,//15 73: }; 74: // YYYY 75: byte const tabela2[]={0b00000001,//0 76: 0b00000011,//1 77: 0b00000010,//2 78: 0b00000110,//3 79: 0b00000100,//4 80: 0b00001100,//5 81: 0b00001000,//6 82: 0b00001001,//7 83: 0b00000001,//8 84: 0b00000011,//9 85: 0b00000010,//10 86: 0b00000110,//11 87: 0b00000100,//12 88: 0b00001100,//13 89: 0b00001000,//14 90: 0b00001001,//15 91: }; 92: 93: //---------- S U B R O T I N A S -------------------------94: 95: void enviadadosPC() 96: { 97: putchar(201);//valor 201 é um código o programa do PC 98: //se preparar para receber os pacotes 99: delay_ms(4); 100: //envia dados das Posições 101: putchar(CalcX[1]); 102: delay_ms(2); 103: putchar(CalcX[2]); 104: delay_ms(2); 105: putchar(CalcX[3]); 106: delay_ms(2); 107: putchar(CalcY[1]); 108: delay_ms(2); 109: putchar(CalcY[2]); 110: delay_ms(2); 111: putchar(CalcY[3]); 112: delay_ms(2); 113: putchar(RetX); 114: delay_ms(2); 115: putchar(RetY); 60 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: delay_ms(2); putchar(Ret); delay_ms(2); } #INT_RDA void recebeRS232() { int i; boolean Calcule; ValorRx = getchar(); if (ValorRx == 200) { rxDados=true; i=0; Calcule=false; } if (rxDados)//recebe pacote de informações { i++; switch(i) { case 2: VelX=ValorRx;break; case 3: VelY=ValorRx;break; case 4: RetX=ValorRX;break; case 5: RetY=ValorRx;break; case 6: Var1X =ValorRx;break; case 7: Var2X =ValorRx;break; case 8: RestoX=ValorRx;break; case 9: Var1Y =ValorRx;break; case 10:Var2Y =ValorRx;break; case 11:RestoY=ValorRx; Calcule=true;break; case 12: IntervX= ValorRx;break; case 13: IntervY= ValorRx;break; case 14: ValorAtraso=ValorRX;break; case 15: TamPadX = ValorRx;break; case 16: TamPadY = ValorRx;break; case 17: OffSetPenaX=ValorRx;break; case 18: OffSetPenaY=ValorRx;break; case 19: ComprPn=ValorRX;break; case 20: T_FimX=false; T_FimY=false; if (ValorRx==110) { EixoX1=true; DeslX=0; } if (ValorRx==112) { EixoX2=true; DeslX=0; } if (ValorRx==114) //x positivo { EixoY1=true; flag1=false; atrasoY1=0; DeslY=0; } if (ValorRx==116) //y negativo { EixoY2=true; flag2=false; atrasoY2=0; DeslY=0; }; if (ValorRX==118)//para a referencia 61 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: { EixoX1=true; EixoY1=true; flag1=false; atrasoY1=0; DeslX=0; DeslY=0; } if (ValorRX==120) { EixoX1=true; EixoY2=true; flag2=false; atrasoY2=0; DeslX=0; DeslY=0; } if (ValorRX==122) { EixoX2=true; EixoY2=true; flag2=false; atrasoY2=0; DeslX=0; DeslY=0; } if (ValorRX==124) { EixoX2=true; EixoY1=true; flag1=false; atrasoY1=0; DeslX=0; DeslY=0; } if (ValorRx==126) Sobepena = true; if (ValorRx==128) Sobepena = false; if (ValorRx==130) //comando zerar pena { Sobepena = true; CmdZeraX = true; CmdZeraY = True; } if (ValorRx==132) { ExecPad = true; PassoPad=1; Pad = false; } rxDados=false;break; } } if (Calcule) { ComprX=((long)((Var1X * Var2X)+RestoX)); ComprY=((long)((Var1Y * Var2Y)+RestoY)); Calcule=false; } ValorRx=0;//zere o comando } #int_timer0 void trata_t0 () { static int conta, conta1, conta2; // reinicia o timer 1 em 175 set_timer0(IntervX); conta++; 62 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: conta1++; conta2++; if (conta >= velX)//intervalo eixo X { conta=0; T_FimX=true; } if(conta1>= 100) { led=!led; output_bit(run, led); } if(conta2>=3)//interrupção do motor da pena { conta2=0; T_FimPN=true; } } #int_timer2 void trata_t2 () { static int conta1, conta2, Atraso; // reinicia o timer 1 em 175 set_timer2(IntervY); conta1++; conta2++; atraso++; if (conta1 >= velY)//intervalo eixo Y { conta1=0; T_FimY=true; } if(atraso>=2) { atraso=0; if ((EixoY1)&&(!flag1))atrasoY1++; if ((EixoY2)&&(!flag2))atrasoY2++; } } void PulsoEncoderX(boolean frenteX) { //PULSO ENCODER EIXO X if((input(PulsoX))&&(!Pulso1))//PULSO ENCONDER X { Pulso1=true; if(frenteX)DeslPenaX++; else DeslPenaX--; } if((!input(PulsoX))&&(Pulso1)) { Pulso1=false; if(frenteX)DeslPenaX++; else DeslPenaX--; } } void PulsoEncoderY(int1 frenteY) { //PULSO ENCONDER EIXO Y if((input(PulsoY))&&(!Pulso2))//PULSO ENCONDER Y { Pulso2=true; if(frenteY)DeslPenaY++; else DeslPenaY--; } if((!input(PulsoY))&&(Pulso2)) { Pulso2=false; 63 320: if(frenteY)DeslPenaY++; 321: else DeslPenaY--; 322: } 323: } 324: void MotorPnUp() //subrotina para subir o motor da pena 325: { 326: if (p>10) p=3; 327: p++; 328: 329: saidaPn=saidaPn & 240; 330: saidaPn=tabela2[p]^saidaPn; 331: output_c(saidaPn); 332: output_float(pin_c7); 333: output_float(pin_c6); 334: output_float(pin_C5);//COLOCA O PINO RC5 EM ALTA IMPEDANCIA (INPUT PULSOX) 335: } 336: void MotorPnDn() //subrotina para descer o motor da pena 337: { 338: if (p<5) p=12; 339: p--; 340: 341: saidaPn=saidaPn & 240; 342: saidaPn=tabela2[p]^saidaPn; 343: output_c(saidaPn); 344: output_float(pin_c7); 345: output_float(pin_c6); 346: output_float(pin_C5);//COLOCA O PINO RC5 EM ALTA IMPEDANCIA (INPUT PULSOX) 347: } 348: void MotorXFrente() 349: { 350: /* entrada = 10111001 351: 11110000 & 352: 10111001 353: -------354: 10110000 result 355: 10110000 'xou' ou exclusivo 356: 00000011 357: -------358: 10110011 result 359: 360: saida 10110011 */ 361: 362: if(i<5)i=12; 363: i--; 364: 365: saida= saida & 240;//11110000 366: saida=tabela2[i] ^ saida; 367: output_b(saida); 368: } 369: void MotorXTras() 370: { 371: if(i>10)i=3; 372: i++; 373: 374: saida= saida & 240;//mascara '11110000' 375: saida=tabela2[i] ^ saida; 376: output_b(saida); 377: } 378: void MotorYFrente() 379: { 380: if(d<5)d=12; 381: d--; 382: 383: saida= saida & 15;//MASCARA '00001111' 384: saida=tabela1[d] ^ saida; 385: output_b(saida); 64 386: } 387: void MotorYTras() 388: { 389: if(d>10)d=3; 390: d++; 391: 392: saida= saida & 15;//00001111 393: saida=tabela1[d] ^ saida; 394: output_b(saida); 395: } 396: void ParaMotorX() 397: { 398: if(!StopX) 399: { 400: StopX=true; 401: saida= saida & 240;//mascara '11110000' 402: output_b(saida); 403: RetX=1; 404: Calcula_Desl(); 405: if(RetY) 406: { 407: Ret=1; 408: EnviaDadosPC(); 409: Ret=0; 410: } 411: } 412: } 413: void ParaMotorY() 414: { 415: if(!StopY) 416: { 417: StopY=true; 418: saida= saida & 15;//mascara '00001111' 419: output_b(saida); 420: RetY=1; 421: Calcula_Desl(); 422: if(RetX) 423: { 424: Ret=1; 425: EnviaDadosPC(); 426: Ret=0; 427: } 428: } 429: } 430: void ParaMotorPn() 431: { 432: if(!StopPn) 433: { 434: StopPn=true; 435: saidaPn= saidaPn & 240;//mascara '00001111' 436: output_c(saidaPn); 437: output_float(pin_c7); //seta pino para alta impedancia 438: output_float(pin_c6); //seta pino para alta impedancia (recebe dados da serial) 439: output_float(pin_C5);//COLOCA O PINO RC5 EM ALTA IMPEDANCIA (INPUT PULSOX) 440: } 441: } 442: void Calcula_Desl(void) 443: { 444: if (DeslPenaX>150) 445: { 446: CalcX[1]=150; 447: CalcX[2]= DeslPenaX / 150; 448: CalcX[3]= DeslPenaX % 150;//resto 449: } 450: else 451: { 65 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: CalcX[1]=DeslPenaX; CalcX[2]=1; CalcX[3]=0; } if (DeslPenaY>150) { CalcY[1]=150; CalcY[2]= DeslPenaY / 150; CalcY[3]= DeslPenaY % 150;//resto } else { CalcY[1]=DeslPenaY; CalcY[2]=1; CalcY[3]=0; } } void tempoAtraz() { delay_ms(150); } void main() { //configura o timer 0 para clock interno e prescaler dividindo por 4 setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_4 ); setup_timer_2 ( T2_DIV_BY_1, 0xc0, 2); set_timer0(150); // inicia o timer 0 em 150 set_timer0(150); // inicia o timer 2 em 150 enable_interrupts (global);// habilita interrupções enable_interrupts (int_timer0); enable_interrupts (int_Timer2); enable_interrupts (int_rda); m=12; n=5; i=5; d=5; ExecPad=false; Pad=false; DeslX=0; DeslY=0; DeslPenaX=0; DeslPenaY=0; EixoX1=false; EixoY1=false; EixoX2=false; EixoY2=false; VelX=2; VelY=7; IntervX=150; IntervY=150; OffSetPenaX=0; OffSetPenaY=0; SobePena= true; CmdZeraX=false; CmdZeraY=false; ValorAtraso=4;//valor teste para atrasar o eixo Y quando fazer diagonais TDescPena=0; atrasoY1=0; atrasoY2=0; Flag1=false; Flag2=false; Flag4=false; Flag5=false; PenaDescanso=false; PenaAlta=false; PenaUp=false; DeslPn=0; Ret=0; 66 520: //faça PENA subir na posição ALTA 521: while (!input(FimCursoPN)) 522: { 523: if(T_FimPn) 524: { 525: T_FimPn=false; 526: MotorPnUp(); 527: } 528: } 529: PenaUp=true; 530: DeslPn=0; 531: StopPn=false; 532: ParaMotorPn(); 533: 534: While(true) 535: { 536: //*************** E X E C U T A P A D **************************** 537: 538: if(ExecPad) 539: { 540: DeslX=0; 541: DeslY=0; 542: while(!Pad) 543: { 544: if(PassoPad==1) 545: { 546: if(T_FimX) 547: { 548: if(DeslX >= TamPadX) 549: { 550: TamPadX= TamPadX + OffSetPenaX; 551: saida= saida & 240;//mascara '11110000' 552: output_b(saida); 553: tempoAtraz(); 554: PassoPad=2; 555: DeslX=0; 556: } 557: else 558: { 559: DeslX++; 560: MotorXFrente(); 561: } 562: T_FimX=false; 563: T_FimY=false; 564: } 565: } 566: if(PassoPad==2) 567: { 568: if(T_FimY) 569: { 570: if(DeslY >= TamPadY) 571: { 572: saida= saida & 15;//mascara '00001111' 573: output_b(saida); 574: TamPadY= TamPadY + OffSetPenaY; 575: PassoPad=3; 576: DeslY=0; 577: tempoAtraz(); 578: } 579: else 580: { 581: DeslY++; 582: MotorYFrente(); 583: } 584: T_FimX=false; 585: T_FimY=false; 586: } 67 587: } 588: if(PassoPad==3) 589: { 590: if(T_FimX) 591: { 592: if(DeslX >= TamPadX) 593: { 594: saida= saida & 240;//mascara '11110000' 595: output_b(saida); 596: PassoPad=4; 597: DeslX=0; 598: tempoAtraz(); 599: } 600: else 601: { 602: DeslX++; 603: MotorXTras(); 604: } 605: T_FimX=false; 606: T_FimY=false; 607: } 608: } 609: if(PassoPad==4) 610: { 611: if(T_FimY) 612: { 613: if(DeslY >= TamPadY) 614: { 615: Pad=true; 616: ExecPad=false; 617: RetX=1; 618: RetY=1; 619: StopY=false; 620: PenaUp=false; 621: SobePena=true; 622: delay_ms(100); 623: ParaMotorY(); 624: DeslY=0; 625: } 626: else 627: { 628: DeslY++; 629: MotorYTras(); 630: } 631: T_FimY=false; 632: } 633: } 634: } 635: } 636: //*************** Z E R A P E N A S ********************************* 637: if (CmdZeraX) 638: { 639: if(T_FimX) 640: { 641: MotorXTras(); 642: T_FimX=false; 643: } 644: } 645: if (input(FimCursoXE)) 646: { 647: if (CmdZeraX) 648: { 649: StopX=false; 650: DeslPenaX=0; 651: DeslX=0; 652: ParaMotorX(); 653: CmdZeraX=false; 68 654: } 655: } 656: //-------------------------####-----------------------------------------657: if (CmdZeraY) 658: { 659: if(T_FimY) 660: { 661: MotorYTras(); 662: T_FimY=false; 663: } 664: } 665: if (input(FimCursoYE)) 666: { 667: if (CmdZeraY) 668: { 669: StopY=false; 670: DeslPenaY=0; 671: DeslY=0; 672: ParaMotorY(); 673: CmdZeraY=false; 674: } 675: } 676: //*********************************************************************** 677: // CONTROLE DA PENA 678: //*********************************************************************** 679: if((!Sobepena)&&(PenaUp)) //descer pena 680: { 681: if(T_FimPn) 682: { 683: T_FimPn=false; 684: if(DeslPn>ComprPn) //ComprPn é um valor que o borland envia (dado pelo usuário)distancia de descida da pena 685: { 686: PenaUp=false; 687: StopPn=false; 688: ParaMotorPn(); 689: DeslPn=0; 690: } 691: else 692: { 693: DeslPn++; 694: MotorPnDn(); 695: } 696: } 697: } 698: if((Sobepena)&&(!PenaUp)) //subir pena 699: { 700: if(T_FimPn) 701: { 702: T_FimPn=false; 703: if (input(FimCursoPN)) 704: { 705: PenaUp=true; 706: DeslPn=0; 707: StopPn=false; 708: ParaMotorPn(); 709: } 710: else 711: MotorPnUp(); 712: } 713: } 714: //*********************************************************************** 715: if(EixoX1)//retorna para origem 716: { 717: PulsoEncoderX(false); 718: if(T_FimX) 719: { 720: T_FimX=false; 69 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: if(DeslX>= ComprX) { EixoX1=false; StopX=false; ParaMotorX(); DeslX=0; } else { MotorXTras(); DeslX++; } } //Se encostou no sensor de zero, páre o motor if (input(FimCursoXE)) { T_FimX=0; EixoX1=0; DeslX=0; DeslPenaX=0; StopX=false; ParaMotorX(); } } if(EixoX2)//sai da origem { PulsoEncoderX(true); if(T_FimX) { T_FimX=false; if(DeslX >= ComprX) { EixoX2=false; StopX=false; ParaMotorX(); DeslX=0; } else { MotorXFrente(); DeslX++; } } //Se encostou no Fim curso máximo, páre o motor if (input(FimCursoXD)) { T_FimX=0; EixoX2=false; DeslX=0; StopX=false; ParaMotorX(); } } //***************************************************** if (EixoY1)//RETORNA PARA ORIGEM { flag1=true; if((input(PulsoY))&&(!Flag11))//PULSO ENCONDER Y { Flag11=true; DeslPenaY--; } if((!input(PulsoY))&&(Flag11)) { Flag11=false; DeslPenaY--; } if(T_FimY) 70 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: { T_FimY=false; if(DeslY >= ComprY) { EixoY1=false; StopY=false; ParaMotorY(); DeslY=0; } else { MotorYTras(); DeslY++; } } //Se encostou no sensor de zero, páre o motor if (input(FimCursoYE)) { T_FimY=0; EixoY1=false; DeslY=0; DeslPenaY=0; StopY=false; ParaMotorY(); } } if(EixoY2)//SAI DA ORIGEM { flag2=true; if(T_FimY) { T_FimY=false; if(DeslY>= ComprY) { EixoY2=false; StopY=false; ParaMotorY(); DeslY=0; } else { MotorYFrente(); DeslY++; } } //Se encostou no Fim curso máximo, páre o motor if (input(FimCursoYD)) { T_FimY=0; EixoY2=false; DeslY=0; StopY=false; ParaMotorY(); } } } } 71 APÊNDICE F FIGURA 23 - Placa de potência do eixo Y Fonte: Própria FIGURA 24 - Desenho placa principal Fonte: Própria FIGURA 25 - Desenho do sensor óptico Fonte: própria 72 REFERÊNCIA ALVES, W. P. C++ Builder 6: desenvolva aplicações para Windows. 2ª ed. São Paulo: Erica, 2002. LACERDA, J. M. Projetos eletrônicos com Circuitmaker (CM) e TraxMaker(TM). Disponível em: <http://academicos.cefetmg.br/admin/down loads/2115/apostilaCircTraxMakerAlfa-Parte1-18abril07.pdf> Acesso em: 14 abril 2008. MEZENGA, B. Mezenga's Home Page. 2001. Disponível em: <www.geocities.com/CollegePark/Dorm/8863/motordepasso.htm>. Acesso em: 07 de abril de 2008. PROTEL INTERNATOINAL LIMITED. TraxMaker User Manual 1993–2000. Disponível em: <www.circuitmaker.com/pdfs/tm_usermanual.pdf>. Acesso em: 14 abril 2008. TEXAS INSTRUMENTS. MAX232. Março de 2004. Disponível em: <www.alldatasheet.com/datasheet-pdf/pdf/27224/TI/MAX232.html> Acesso em: 23 de maio de 2008. DUARTE, R. O. Comunicação Paralela e Serial. Disponível em: <www.decom.iceb.ufop.br/prof/rduarte/CIC282/sem23.pdf> Acesso em: 23 de maio de 2008. WIKIPEDIA. Plotter. Disponível em <pt.wikipedia.org/wiki/Plotter> Acesso em: 23 de maio de 2008.