Transcript
UNIVERSIDADE DE SÃO PAULO –
ESCOLA POLITÉCNICA
DEPARTAMENTO DE ENGENHARIA MECATRÔNICA
PMR2450 – Projeto de Máquinas
Mini-Torno CNC
"Professores"Gilberto F. Martha de Souza "
": " "
" "Julio C. Adamowski "
" "Tarcisio Hess Coelho "
São Paulo
12 de dezembro de 2006
Índice
1 Introdução 6
2 Metodologia de Projeto 7
2.1 Divisão da Equipe 7
2.1.1 Gerente Geral 7
2.1.2 Gerente de Produção 7
2.1.3 Projeto 7
2.1.4 Construção 7
2.1.5 Ensaio 8
2.1.6 Programação 8
2.1.7 Documentação 9
2.2 Cronograma 10
2.3 Datas Importantes 11
3 Descrição do projeto e dos Requisitos Principais 12
4 Projeto da Máquina – Soluções Propostas 13
4.1 Estrutura 16
4.1.1 Alternativa I (Escolhida) 16
4.1.2 Alternativa 2 16
4.1.3 Alternativa 3 17
4.2 Mancais / rolamento / eixo 18
4.2.1 Alternativa 1 (Escolhida) 18
4.2.2 Alternativa 2 19
4.2.3 Alternativa 3 20
4.3 Polias / Correia 21
4.4 Montagem das guias / localização do porta-ferramenta 22
4.4.1 Alternativa 1 (Escolhida) 22
4.4.2 Alternativa 2 22
5 Escolha da Solução 24
5.1 Critérios de escolha das Estruturas 24
5.1.1 Simplicidade 24
5.1.2 Quantidade de peças 24
5.1.3 Facilidade de construção 24
5.1.4 Maior rigidez. 24
5.2 Matriz de decisão das Estruturas 24
5.3 Critérios para escolha dos Mancais 25
5.3.1 Simplicidade 25
5.3.2 Distância entre os rolamentos 25
5.4 Matriz de decisão dos Mancais 25
5.5 Critérios para escolha da Montagem das Guias 25
5.5.1 Simplicidade 25
5.5.2 Rigidez 25
5.5.3 Volume de Trabalho 26
5.6 Matriz de decisão da Montagem das Guias 26
6 Modelagem e Verificação 27
6.1 Análise de Vibrações 27
6.1.1 Análise da vibração na guia de 300 mm (Caso 1) 27
6.1.2 Análise da vibração na guia de 300 mm (Caso 2) 31
6.1.3 Análise da vibração (flexão) na guia linear de 600mm: 33
6.1.4 Análise da vibração (torção) na guia linear de 600mm: 36
6.1.5 Cálculo da freqüência de excitação: 39
6.2 Cálculo das Forças de Usinagem 40
6.2.1 Cálculos 40
6.2.2 Gráficos 42
7 Projeto Elétrico 44
7.1 Modelagem do Sistema 45
7.2 Programação – Software 45
7.3 Algoritmo de Bresenham 46
7.4 Código G 46
7.5 Software 46
7.5.1 Módulos de Programação 46
7.5.2 Interface Gráfica 47
8 Construção 52
9 Testes 54
9.1 O Ensaio 54
9.1.1 Movimentação nos eixos X e Z: 54
9.1.2 Usinagem (Verificação do conjunto) 54
9.2 Resultados 55
9.2.1 Movimentação 55
9.2.2 Usinagem 56
10 Discussões e Conclusões 58
11 Bibliografia 59
Anexo A (Desenhos das peças e de Conjunto) 60
Anexo B (Lista de peças do Mini-Torno CNC) 61
Anexo C (Código Dinamic C) 63
Anexo D (Códigos de Usinagem) 64
Índice de Figuras
Fig. 4.1 Esboço de solução 1 (Hugo) 13
Fig. 4.2 Esboço de solução 2 (Vitor) 13
Fig. 4.3 Esboço de solução 3 (Diogo) 14
Fig. 4.4 Estrutura Alternativa I 16
Fig. 4.5 Estrutura Alternativa 2 16
Fig. 4.6 – Estrutura Alternativa 3 17
Fig. 4.7 – Detalhes das polias e correia sincronizadora 21
Fig. 4.8 – Alternativa 1 para fixação das guias. 22
Fig. 4.9 – Alternativa 2 para fixação das guias. 22
Fig. 6.1 – Modelo simplificado da vibração da guia maior, porta-
ferramenta 28
Fig. 6.2 - Modelo simplificado da vibração da guia maior, lado do
atuador 32
Fig. 6.3 - Guia linear de 600mm 33
Fig. 6.4 – Eixo da guia linear e Modelo adotado para o eixo da guia
33
Fig. 6.5 – Guias lineares e fixação do porta-ferramenta 33
Fig. 6.6 – Modelo massa-mola correspondente 34
Fig. 6.7 – Modelo para análise usando T. de Castigliano 34
Fig. 6.8 – Momento fletor no eixo da guia linear 34
Fig. 6.9 – Posicionamento das guias para análise de vibração por
torção 36
Fig. 6.10 –Esquema de aplicação de forças no modelo 37
Fig. 6.11 – Esquema para cálculo de momento de inércia Jt 38
Fig. 7.1 – Diagrama de conexões elétricas 44
Fig. 7.2 - Janela "Splash" (Splash Screen) 47
Fig. 7.3 – Modo Manual 48
Fig. 7.4 - Janela Modo Automático 50
Introdução
Somos uma equipe de 15 pessoas com o objetivo de projetar e construir
um Mini-torno CNC. Concordamos em dividir a equipe em sub-equipes, cada
divisão com uma atividade especifica.
Cada um dos integrantes de cada divisão foi responsável por alguma
parte do processo, foi peça-chave e teve de cumprir com sua
responsabilidade. Apesar dessa divisão, todos os integrantes tiveram
conhecimento e participar de todo o processo, ajudando seus colegas, mesmo
estando em outra divisão.
Nossa equipe:
Bruno Luis Senon de Carvalho 4940910
Caio Cesar Fattori 3732180
Daniela Hofer dos Santos 4943097
Diogo Cao Pires 4941904
Emmanuel Freire de Siqueira 4944171
Hugo Ferreira Lopes 4939706
Leonardo Monteiro Mazzariol 4939690
Marcel Scarpim de Oliveira 4943292
Renan Kenzo Toishikawa Uratani 4939842
Renato Seiji Tavares 4941821
Ricardo Akio Kikkawa 4957613
Ricardo Yves da Cunha 4957589
Sérgio Rafael Del Giovannino Júnior 4940368
Tupã Negreiros 4943329
Vitor Neves Hartmann 4939686
Metodologia de Projeto
Primeiramente a equipe elegeu um Gerente. O gerente analisou o projeto
e verificou a importância e prioridade das diferentes divisões e etapas do
projeto. Depois analisou os integrantes e decidiu onde cada um deveria
atuar.
1 Divisão da Equipe
1 Gerente Geral
Responsável pelo planejamento, pela divisão da equipe, representa a
equipe perante os professores.
"Integrante: "Tupã Negreiros "
2 Gerente de Produção
Responsável por monitorar os integrantes quanto a prazos, métodos,
etc.
"Integrante: "Bruno Luis Senon de Carvalho "
3 Projeto
Projetar a estrutura da máquina de acordo com as especificações e o
material fornecido pelo departamento. Elaborar o desenho de conjunto e os
desenhos de fabricação no Solidworks, analisar as tensões na estrutura e as
freqüências naturais da estrutura completa e de todas as partes. Calcular
as tensões devido ao corte, obter as velocidades máximas dos motores.
"Integrantes "Ricardo Akio Kikkawa "
" "Hugo Ferreira Lopes "
" "Daniela Hofer dos Santos "
" "Sérgio Rafael Del Giovannino "
" "Júnior "
4 Construção
Construir todas as peças, com o auxilio dos técnicos da oficina. Obter
as peças necessárias com o departamento e as que não forem fornecidas,
comprá-las em lojas. Montar todo o equipamento. Fazer os ajustes
necessários vindos da equipe de Ensaio.
"Integrantes "Marcel Scarpim de Oliveira "
" "Emmanuel Freire de Siqueira "
" "Diogo Cao Pires "
5 Ensaio
Testar todas as movimentações da máquina. Idealizar e fazer ensaios
para verificar a velocidade, precisão, acurácia e repetitibilidade dos
movimentos e na usinagem de peças. Determinar possíveis ajustes e passar
para equipes de Programação e Construção.
"Integrantes "Renan Kenzo Toishikawa Uratani "
" "Bruno Luis Senon de Carvalho "
6 Programação
Definir as linguagens de programação de acordo com as conhecidas pelos
integrantes.
Escrever interface para Windows para comunicação serial com um
computador externo para envio de programa e movimentação manual. Escrever
código para a movimentação manual e automática, interpolação linear e
rosca, interpretação do código G, isso, conforme foi pedido pelo professor,
no microcontrolador da máquina. Elaborar o esquema de ligação e fazer as
ligações dos fios. Interpretar as funções das placas controladoras dos
motores para devida programação. Ajustar possíveis erros de movimentação
vindos da equipe de Ensaio.
"Integrante: "Caio Cesar Fattori "
" "Vitor Neves Hartmann "
" "Renato Seiji Tavares "
" "Ricardo Yves da Cunha "
" "Tupã Negreiros "
7 Documentação
Editar o relatório final, não redigi-lo, isso cabe a cada integrante
da equipe. Essa divisão é responsável por cobrar os outros integrantes
quanto a redação no devido tempo do relatório.
"Integrante: "Leonardo Monteiro Mazzariol "
2 Cronograma
O cronograma foi desenvolvido primeiro a partir da divisão da equipe,
segundo pelo próprio calendário exigido pelos professores da disciplina.
Houve alterações do cronograma, devido a atrasos da própria equipe e também
devido a alterações do calendário pelos professores. O Cronograma mostra
basicamente quando as sub-equipes estarão trabalhando. A equipe de
Documentação não é representada no cronograma pois seu trabalho deve ser
feito durante todo o curso do projeto.
Agosto
"22"33"33"
"9 "0 "1 "
" " " "
" " " "
" " " "
" " " "
Setembro
"11 "
"Azul: Construção "
"Verde: Programação "
"Vermelho: Ensaio "
3 Datas Importantes
22/08 Estudo de possíveis soluções para a máquina em projeto
29/08 Seleção da "melhor" solução, lay-out da solução escolhida,
diagrama de blocos.
12/09 Desenho de conjunto e esquema elétrico.
22/09 Detalhamento da estrutura mecânica, sistema de movimentação,
fixação da peça, fixação da ferramenta.
03/10 Desenho de conjunto, desenhos de fabricação, esquemas elétricos
detalhados, estrutura de software.
10/10 Entrega dos desenhos de conjunto e fabricação.
17/10 Software de acionamento dos motores, interpretação do código CN,
interpolação, interface com usuário.
27/10 Demonstração do acionamento de motores com curva de aceleração,
interpolação linear.
07/11 Verificação preliminar dos protótipos e verificação da interface
com usuário sistema.
17/11 Verificação preliminar dos protótipos.
28/11 Apresentação do trabalho e das atividades dos grupos, discussão
sobre o funcionamento da máquina.
05/12 Data limite para a apresentação dos protótipos e entrega do
relatório final do projeto.
Descrição do projeto e dos Requisitos Principais
A proposta é a construção de um mini-torno CNC, com 2 eixos movidos
por guias lineares que são acionadas através de motores de passo, além de
um outro motor AC, para rotação da castanha. Um encoder óptico também será
utilizado, para controle de posição.
Outros materiais serão disponibilizados pelo departamento, e o projeto
mecânico será desenvolvido com essa limitação de materiais, o que de certa
forma, facilita para a equipe, que não tem experiência com projetos do
tipo.
O torno deve apresentar um controle manual e automático (curvas de
aceleração dos motores) e interpretar um programa de usinagem (em linguagem
G).
O controlador utilizado será o "Jack Rabbit" e terá que fazer o
acionamento dos motores, a leitura dos sensores, bem como o controle de
trajetória.
Uma interface com o usuário também é necessária, para escolha do modo
de operação (manual ou automático) quanto para entrada dos códigos em G.
A comunicação serial com um computador também se faz necessária, tanto
para envio dos programas em G, quanto para monitoração de posição.
No final do projeto, o torno deve ser capaz de usinar um cilindro, um
cone, e fazer uma rosca. Isso testa as interpolações lineares em cada eixo
e as interpolações com os dois eixos, no caso da rosca.
Obviamente o nosso projeto não terá a mesma precisão de uma máquina
profissional. Devido ao passo dos motores e da precisão da guia, a
precisão, na melhor das hipóteses, seria da ordem de centésimos de
milímetros (0.01mm ou 10-5m). Porém a expectativa da equipe é que a máquina
tenha precisão da ordem de décimos de milímetros (0.1mm ou 10-4m).
Projeto da Máquina – Soluções Propostas
Com o enunciado do projeto em mãos, a equipe começou a pensar no
esboço das estruturas possíveis do torno, e numa reunião preliminar, alguns
esboços foram apresentados, para a escolha das alternativas de solução, que
depois foram apresentadas em sala. Três dos esboços estão a seguir, da
forma como foram apresentadas à equipe.
" "
Fig. 4.1 Esboço de solução 1 (Hugo)
" "
Fig. 4.2 Esboço de solução 2 (Vitor)
" "
Fig. 4.3 Esboço de solução 3 (Diogo)
Partindo-se dos esboços acima que constituem uma primeira análise e
discussão do problema proposto, bem como da lista de materiais que seriam
cedidos pelos professores (em anexo) e das dimensões das peças presentes no
próprio enunciado do projeto (rolamentos, placa universal de três castanhas
e guias), foram feitos os desenhos de todas as peças que compõe o torno,
aprimorando-os ao longo do tempo.
Os cálculos que justifiquem a escolha de dimensões e a escolha da
melhor alternativa para alguma determinada função ou seleção de elementos
padronizados (como rolamentos, correias, parafusos e polias) serão
apresentados depois. Por enquanto, apenas as alternativas de construção
serão exploradas.
Para facilitar a realização do desenho de conjunto, criou-se alguns
desenhos de subconjuntos, relacionados a partes de mesma função (elementos
da estrutura, por exemplo) ou partes que compõe uma mesma peça, mas que
haviam sido desenhadas em separado (partes das guias, por exemplo).
A maior preocupação da equipe talvez seja em relação à vibração, o que
prejudicaria em demasia a usinagem. Portanto resolveu-se adotar alguns
objetivos em relação aos projetos:
Minimizar o tamanho da correia que ligaria o motor a castanha e;
Minimizar a altura da castanha, de forma a reduzir a altura da massa
girante que excitaria a vibração da máquina.
Para facilitar a definição das alternativas, o torno será dividido em
4 itens sendo que a união das melhores alternativas de cada um resultará no
sistema final que será construído. A alternativa "eleita" será apresentada
em primeiro lugar, para posterior comparação com as outras.
1 Estrutura
1 Alternativa I (Escolhida)
Fig. 4.4 Estrutura Alternativa I
Essa estrutura é feita apenas com os tubos quadrados de 100mm de lado,
ligados em I. As principais vantagens são:
Estrutura mais simples, ou seja, modelagem e construção serão mais
simples;
Facilidade de corte e posicionamento das partes;
Facilidade de soldagem;
Menor número de peças;
Maior rigidez e freqüência natural.
2 Alternativa 2
Fig. 4.5 Estrutura Alternativa 2
Na segunda alternativa, pensou-se em utilizar os tubos quadrados de
100 mm (para a barra principal) e os de 80mm (para as demais), sendo que
as principais vantagens eram:
A diminuição da altura da castanha, o que diminuiria um pouco os
problemas decorrentes da massa girando a uma altura muito grande;
Também as guias ficariam a uma altura menor.
As desvantagens, porém seriam as seguintes:
Dificuldade no corte do tubo central para posicionamento dos de 80 mm;
Soldagem é um pouco mais complexa;
Maior número de peças, devido à necessidade de um tubo adicional para
a fixação do motor AC;
Menor rigidez / freqüência natural em relação Alternativa 1.
3 Alternativa 3
Fig. 4.6 – Estrutura Alternativa 3
Na ultima estrutura, os tubos de 100 mm (corpo principal) e de 50 mm
seriam utilizados, a vantagem é a mesma do anterior, potencializada pela
menor altura dos tubos. Porém, novamente as mesmas desvantagens foram
encontradas, além do fato de que esta estrutura deve ser ainda menos rígida
que as duas anteriores. Os tubos de 50mm só chegaram depois, por isso esta
foi a última opção que foi analisada.
2 Mancais / rolamento / eixo
Os rolamentos que serão utilizados foram fornecidos pelos professores.
Portanto não existe alternativa. Apenas foram feitos os cálculos para
garantir que são adequados , sem necessidade de escolher alternativas.
Quanto aos mancais para eixo, é sabido que é recomendável que a
relação L/D > 3, sendo L a distância entre os centros dos rolamentos e D o
diâmetro menor do rolamento. Para os mancais, três alternativas foram
consideradas:
1 Alternativa 1 (Escolhida)
" " " "
" " "Fig. 4.9 "
"Fig. 4.7 "Fig. 4.8 " "
A primeira alternativa é um cilindro de 92 mm de diâmetro, com
alojamento para o rolamento e com um menor diâmetro apenas para encaixe no
tubo de 100mm (é o sistema de centralização). Rebaixo para evitar contato
do anel interno do rolamento com o mancal (separa as partes móveis das
estáticas), furo central para o eixo e três furos dispostos em 120º para os
três parafusos de fixação. As vantagens são:
Os rolamentos não são embutidos no tubo quadrado;
Carga é suportada pelos 3 parafusos e pelo próprio mancal;
L = 112 mm e D = 45 mm; L/D = 2,5 (abaixo do recomendável, mas está
mais próximo que a Alternativa 3).
2 Alternativa 2
" " " "
" "Fig. 4.11 - "Fig. 4.12"
"Fig. 4.10 - Montagem dos Mancais "Mancal. "– Mancal."
" " "Perfil. "
Montagem mancais / rolamentos / eixo / tubo quadrado / placa Mancal
A segunda alternativa consiste num cilindro de 92 mm de diâmetro, com
alojamento para o rolamento, furo central para o eixo e três furos
dispostos em 120º para os três parafusos de fixação. As vantagens são:
Mais simples;
Rolamento não é embutido no tubo de 100 mm de lado, ficando apenas
alojado no mancal, e comprimido entre este tubo e o mancal;
L = 112 mm e D = 45mm; L/D = 2,5 (abaixo do recomendável, mas está
mais próximo que a Alternativa 3).
Os problemas encontrados são:
Carga é suportada somente pelos 3 parafusos;
Não possui sistema de centralização do mancal, o que geraria problemas
na montagem e perda de precisão no funcionamento do torno (o eixo que
sustenta a placa e, portanto, a peça, poderia girar descentralizada).
Centralização seria feita pelos próprios parafusos, o que não é
correto em um projeto de engenharia.
3 Alternativa 3
" " " "
" " "Fig. 4.15 – "
"Fig. 4.13 - Montagem dos Mancais"Fig. 4.14 – Mancal."Mancal, "
" " "Perfil. "
A última alternativa consiste num cilindro de 92 mm de diâmetro, com
alojamento para o rolamento e com um menor diâmetro na região de fixação do
rolamento, para encaixe no tubo de 100mm (é o sistema de centralização).
Rebaixo para evitar contato do anel interno do rolamento com o mancal
(separa as partes móveis das estáticas), furo central para o eixo e três
furos dispostos em 120º para os três parafusos de fixação. As vantagens
são:
Possui um sistema de centralização;
Carga é suportada pelos 3 parafusos e pelo próprio mancal;
Evita contato do anel interno do rolamento com o mancal.
Por outro lado, as desvantagens são:
Geometria mais complexa;
Os rolamentos são embutidos no tubo de 100mm de lado, diminuindo a
distância entre estes;
L = 88 mm e D = 45 mm; L/D = 2 (mais distante do recomendável, menos
favorável que Alternativa 1 e 2)
3 Polias / Correia
O sistema de transmissão entre o motor AC e o eixo já estava
praticamente estabelecido em função dos materiais disponibilizados pelos
professores. Isto é, a seleção das polias foi realizada em função daquelas
disponibilizadas pelo departamento à equipe.
Para efetuar a transmissão entre o motor AC e o eixo da castanha optou-
se por utilizar uma correia sincronizadora, mas a correia disponível na
oficina, apesar de possuir o passo correto, não apresentava a largura e o
comprimento adequado ao projeto em questão. Isto posto, foi preciso comprar
uma correia nas dimensões ideais.
As polias possuem largura de 22 mm, i.e., 7/8", e a largura da correia
da oficina é de 1/2". E o comprimento é de 46", sendo que o torno exige uma
correia entre 22,4" e 24,7", dado pelo rasgo de fixação do motor.
Portanto foi comprada uma correia de largura 7/8" e de comprimento
23,2", de modelo padrão disponibilizado por fabricantes, dentro da faixa
acima, e de passo idêntico ao da correia da oficina.
Fig. 4.7 – Detalhes das polias e correia sincronizadora
4 Montagem das guias / localização do porta-ferramenta
1 Alternativa 1 (Escolhida)
Fig. 4.8 – Alternativa 1 para fixação das guias.
Essa alternativa propõe a fixação da guia menor na maior através do
bloco central da guia maior e do bloco central da guia menor. O porta
ferramenta fica em um dos suportes da guia menor. As vantagens são:
Mais simples;
Menor número de peças;
Maior rigidez / freqüência natural em relação a Alternativa 2.
2 Alternativa 2
Fig. 4.9 – Alternativa 2 para fixação das guias.
Essa alternativa propõe a fixação da guia menor na maior através do
bloco central da guia maior, dos suportes da guia menor e de uma chapa de
alumínio. O porta ferramenta fica no bloco central da guia menor.
As desvantagens são:
Mais complexo;
Maior número de peças;
Utilização de uma placa de alumínio como base diminui a rigidez /
freqüência natural;
Fixação da guia menor leva a menor rigidez / freqüência natural em
relação a Alternativa 1.
Escolha da Solução
1 Critérios de escolha das Estruturas
1 Simplicidade
A simplicidade do projeto facilita seu desenho, o cálculo de sua
resistência e de sua freqüência natural, bem como seu próprio entendimento.
2 Quantidade de peças
A quantidade de peças influencia no tempo de construção, e na
dificuldade de projetar, fabricar e construir o conjunto.
3 Facilidade de construção
A facilidade de construção diz respeito a menor necessidade de soldas
e ajustes de precisão pelos técnicos da oficina. A necessidade de maior
trabalho no corte da estrutura também influencia negativamente na
facilidade. Outro aspecto que é levado em consideração é a facilidade de
montagem, como a necessidade de apertar parafusos internos a estrutura.
4 Maior rigidez.
Estruturas mais reforçadas e mais pesadas são mais rígidas. Estruturas
esbeltas, compridas e estreitas, apresentam menor rigidez. A maior rigidez
é importante para evitar problemas com vibração, o que pode prejudicar ou
mesmo impedir a usinagem de peças.
2 Matriz de decisão das Estruturas
"Quesitos "Pesos "Alternativa 1 "Alternativa "Alternativa "
" " " "2 "3 "
"Simplicidade "3 "10 "9 "7 "
"Quantidade de "2 "9 "8 "7 "
"Peças " " " " "
"Facilidade de "3 "8 "7 "7 "
"Construção " " " " "
"Rigidez "4 "8 "6 "5 "
"TOTAL "12 "100 "88 "76 "
3 Critérios para escolha dos Mancais
1 Simplicidade
Como na matriz anterior, a simplicidade do sistema é importante, pois
implica na facilidade de projeto (desenho e cálculos) bem como o
entendimento deste. E no caso dos mancais, isso foi muito importante, pois
algumas das alternativas envolviam um esquema muito mais complexo que a que
foi escolhida.
2 Distância entre os rolamentos
No projeto de mancais para eixo, é recomendável que a relação L/D >3.
Isso não foi obtido com nenhuma das alternativas, porém, duas chegaram
próximas disso, e por isso, foram consideradas melhores.
4 Matriz de decisão dos Mancais
"Quesitos "Pesos "Alternativa 1 "Alternativa "Alternativa "
" " " "2 "3 "
"Simplicidade "2 "10 "8 "6 "
"Distância entre "1 "8 "8 "7 "
"os rolamentos " " " " "
"Total "3 "28 "24 "19 "
5 Critérios para escolha da Montagem das Guias
1 Simplicidade
Esse quesito se repete, pois é de grande importância num projeto
didático, como foi o caso desse torno CNC.
2 Rigidez
Como essa estrutura vai apoiar o porta-ferramenta, é imprescindível
que a rigidez dessa estrutura seja estudada. Uma estrutura pouco rígida
pode causar problemas na hora da usinagem, provocando vibrações, diminuindo
a precisão, entre outras conseqüências.
3 Volume de Trabalho
O posicionamento das guias influi diretamente nos limites do volume de
trabalho da máquina, e isso influenciou também na escolha da melhor
alternativa.
6 Matriz de decisão da Montagem das Guias
"Quesitos "Pesos "Alternativa 1 "Alternativa "
" " " "2 "
"Simplicidade "2 "9 "8 "
"Rigidez "3 "8 "7 "
"Volume de "1 "8 "8 "
"Trabalho " " " "
"TOTAL "6 "50 "45 "
Modelagem e Verificação
1 Análise de Vibrações
A análise da freqüência natural é uma consideração muito importante no
projeto de uma máquina CNC. Sabe-se que para qualquer sistema estrutural,
têm-se infinitas freqüências naturais e infinitas soluções possíveis para o
equilíbrio dinâmico em vibração livre. Sabe-se também que a freqüência de
excitação do sistema não deve, de maneira alguma, se aproximar das
freqüências naturais, caso contrário o funcionamento na máquina será
prejudicado.
A freqüência de excitação do sistema é conhecida, pois através da
rotação do motor AC pode-se chegar ao seu valor. Deve-se então calcular as
freqüências naturais que possivelmente terão os menores valores e verificar
se a freqüência de excitação não se aproxima destes valores. Para isso
devem-se determinar as regiões da máquina que possuem as menores
freqüências naturais, ou melhor, as regiões críticas.
Estas regiões estarão, certamente, nas guias lineares. Na guia de 600
mm serão analisadas as vibrações relativas a flexão e a torção. A guia de
300 mm será analisada como uma viga em balanço com uma massa concentrada na
extremidade livre. Essa massa pode ser o conjunto ferramenta mais porta
ferramenta, ou então o motor de passo (dependendo do lado que a guia for
analisada). Os valores referentes à massa (tidas como concentradas) foram
obtidos mediante pesagem e se encontram na Lista de Peças (Anexo B).
1 Análise da vibração na guia de 300 mm (Caso 1)
Primeiramente iremos analisar a situação em que a guia pode ser
considerada uma viga em balanço com a massa do conjunto ferramenta e porta
ferramenta concentrada na extremidade livre. Iremos utilizar no modelo uma
viga circular de diâmetro igual a 22 mm. Ou seja, a viga terá a mesma
secção de um dos eixos da guia (em favor da segurança, serão desprezados os
efeitos do fuso e do outro eixo da guia).
Em favor da segurança, iremos analisar a situação mais crítica de
trabalho, ou seja, a ponta da ferramenta está no centro da placa de fixação
da peça. Nesta situação temos que o comprimento da viga no modelo será
igual a 0,1m.
A situação descrita anteriormente está exemplificada na figura abaixo:
Fig. 6.1 – Modelo simplificado da vibração da guia maior, porta-
ferramenta
Onde:
L = 0,1m (distância mais crítica atingida pelo porta-ferramenta);
m = 0,84824 kg/m (massa distribuída da viga);
M = 1,9 kg (massa concentrada da ferramenta e porta ferramenta);
E = 71,7 GPa (modulo de elasticidade do alumínio);
(momento de inércia);
Para o modelo adotado, tem-se através da resistência dos materiais, a
seguinte equação diferencial:
;
Onde:
força de inércia/unidade de comprimento
força de amortecimento/unidade de comprimento
força elástica/unidade de comprimento
carregamento externo/unidade de comprimento
Na análise modal, temos que p(x, t) = 0 e c = 0. Portanto a equação
diferencial fica:
;
Onde:
Para realizar a solução dessa equação diferencial, deve-se utilizar
separação de variáveis, ou seja: v(x,t) = Ø(x)T(t)
Sendo assim, tem-se:
e,
Resolvendo a equação diferencial da esquerda, obtém-se:
Onde A e B são constantes que podem ser determinadas a partir das
condições iniciais.
Resolvendo a equação diferencial da direita, obtém-se:
Onde: e Ci determinados a partir das condições de contorno.
Utilizando = 22,4 ; e λ = βL , temos:
Aplicando as condições de contorno, obtemos:
1) v(0,t) = 0 Ø(0) = 0
"C2 + C4 = 0 "(1) "
2) vi(0,t) = 0 Ø'(0) = 0
"C1 + C3 = 0 "(2) "
3)vii(L,t) = 0 Ø''(L) = 0
"-C1sinλ+C2cosλ+C3sinhλ+C4coshλ "(3) "
"= 0 " "
4)
Assim
β3.(-C1cosλ+C2sinλ+C3coshλ+C4sinhλ) = -β3μλ(C1sinλ+C2cosλ+C3sinhλ+C4 coshλ)
(4)
Resultando em :
(μλsinλ-cosλ)C1+(μλcosλ+sinλ)C2+
+ (μλsinhλ+coshλ)C3 +
+ (μλcoshλ+sinhλ)C4=0
Juntando as eq.(1 a 4) obtemos o seguinte sistema:
C2 + C4 = 0
C1 + C3 = 0
-C1sinλ+C2cosλ+C3sinhλ+C4coshλ = 0
(μλsinhλ-cosλ)C1+(μλcosλ+sinλ)C2+(μλsinhλ+coshλ)C3+(μλcoshλ+sinhλ)C4=0
Colocando o sistema na forma matricial :
Deseja-se encontrar soluções não triviais, portanto deve-se impor detA
= 0. Como deseja-se encontrar a menor freqüência natural, deve-se obter a
solução que possui o menor valor de λ. Resolvendo numericamente, temos que
λ1 = 0,603365.
Depois de encontrado o menor valor de λ, pode-se determinar a
freqüência natural da seguinte maneira:
Dessa forma:
f = 180,6 Hz.
"Freqüência natural mínima na guia de "180,6 Hz"
"300 mm (caso 1): " "
2 Análise da vibração na guia de 300 mm (Caso 2)
Agora iremos analisar a situação em que a guia pode ser considerada
uma viga em balanço com a massa do motor de passo concentrada na
extremidade livre. Iremos utilizar no modelo uma viga circular de diâmetro
igual a 22mm. Ou seja, a viga terá a mesma secção de um dos eixos da guia
(em favor da segurança, serão desprezados os efeitos do fuso e do outro
eixo da guia).
Novamente em favor da segurança, iremos analisar a situação mais
crítica de trabalho, ou seja, quando a ponta da ferramenta está o mais
longe possível do centro da placa de fixação da peça, ou seja, o motor de
passo está o mais longe possível do bloco da guia. Nesta situação temos que
o comprimento da viga no modelo será igual a 0,23m.
A situação descrita anteriormente está exemplificada na figura abaixo:
Fig. 6.2 - Modelo simplificado da vibração da guia maior, lado do atuador
Onde:
L = 0,23m (distância mais crítica atingida pelo motor de passo)
m = 0,84824 kg/m (massa distribuída da viga)
M = 0,72kg (massa do motor de passo)
E = 71,7 GPa (modulo de elasticidade do alumínio)
(momento de inércia)
= 3,69
Utilizando o mesmo raciocínio utilizado na viga anterior temos que λ1
é aproximadamente 0,93495. Portanto :
f = 82Hz.
"Freqüência natural mínima na guia de "82 Hz "
"300 mm (caso 2): " "
3 Análise da vibração (flexão) na guia linear de 600mm:
Para analisar as vibrações, deve-se adotar um modelo para a guia
linear de 600 mm, ilustrada na figura abaixo:
Fig. 6.3 - Guia linear de 600mm
Para modelar a guia, iremos desprezar (em favor da segurança) a
influência do fuso e para cada um dos eixos, iremos adotar o seguinte
modelo:
Fig. 6.4 – Eixo da guia linear e Modelo adotado para o eixo da guia
O caso em que a freqüência natural (relativa à flexão) assume o seu
valor mais crítico é quando o bloco da guia de 600mm está posicionado no
centro. Portanto em favor da segurança iremos analisar este caso. A figura
abaixo ilustra a situação:
Fig. 6.5 – Guias lineares e fixação do porta-ferramenta
Adotando a hipótese de que metade da massa do fuso e dos eixos está
concentrada no centro das vigas, obtém-se a seguinte situação:
Fig. 6.6 – Modelo massa-mola correspondente
Onde m representa a massa do fuso (0,343kg) somada a massa dos eixos
(0,475kg cada um) da guia de 600 mm. M representa a massa do bloco da guia
de 600 mm (3,4kg), a massa da guia de 300 mm (4,5kg), a massa do motor de
passo (0,72kg), a massa da ferramenta e a massa do porta ferramenta
(1,9kg).
Portanto:
M = 10,52kg e
m = 1,29kg.
Para calcular a constante K iremos utilizar o do teorema de
Castigliano. Para isso devemos calcular a energia da viga ao ser solicitada
no centro por uma força P:
Fig. 6.7 – Modelo para análise usando T. de Castigliano
Resolvendo a estrutura hiperestática, obtém-se o seguinte diagrama de
momento fletor:
Fig. 6.8 – Momento fletor no eixo da guia linear
Agora podemos calcular a energia de deformação:
Pelo teorema de Castigliano:
e, portanto:
.
Como:
e
E = 71,7 GPa.
Temos:
Depois de encontrado o valor de K, pode-se calcular a freqüência
natural da seguinte maneira:
KT = K + K = 1802952 N/m
e assim,
f = 63,9 Hz.
"Freqüência natural mínima (flexão) na guia "63,9 Hz "
"linear de 600mm : " "
4 Análise da vibração (torção) na guia linear de 600 mm:
O caso em que a freqüência natural (relativa à torção) assume o seu
valor mais crítico é quando o bloco da guia de 600 mm está posicionado no
centro e quando a ponta da ferramenta está o mais longe possível do centro
da placa de fixação da peça, ou seja, o motor de passo está o mais longe
possível do bloco da guia de 300mm. Portanto em favor da segurança iremos
analisar este caso. A figura abaixo ilustra a situação:
Fig. 6.9 – Posicionamento das guias para análise de vibração por
torção
Para determinar K(, iremos imaginar que uma força P é aplicada sobre o
motor de passo. Assim iremos verificar qual o ângulo ( resultante da
torção. A figura abaixo ilustra a situação, note que RA e RB representam as
forças que serão aplicadas sobre os eixos da guia linear de 600 mm (os
efeitos do fuso da guia de 600 mm não serão considerados em favor da
segurança):
Fig. 6.10 –Esquema de aplicação de forças no modelo
Fazendo-se os cálculos temos que RA= 4,125P e RB = 3,125P
Sendo assim:
Agora devemos calcular o momento de inércia em relação ao eixo Z.
Fig. 6.11 – Esquema para cálculo de momento de inércia Jt
JT = JEixo1 + JEixo2 + JGL300+ JPF + JMotor
Onde:
JEixo1: momento de inércia do eixo1 da guia de 600 mm;
JEixo2: momento de inércia do eixo2 da guia de 600 mm;
JGL300: momento de inércia do fuso, eixo1 e eixo2 da guia de 300 mm;
JPF: momento de inércia do conjunto ferramenta e porta ferramenta;
JMotor: momento de inércia mo motor de passo da guia de 300 mm.
Considerando que a massa do fuso, eixo1 e eixo2 da guia de 300mm está
concentrada a 0,065m do eixo Z:
Considerando que a massa do porta ferramenta está concentrada a 0,09m
do eixo Z:
Considerando que a massa do motor está concentrada a 0,29m do eixo Z:
Portanto:
JT = 0,08kg.m2
Finalmente:
.
"Freqüência natural mínima (torção) na guia "30,3 Hz "
"linear de 600mm : " "
5 Cálculo da freqüência de excitação:
Utilizando a rotação do motor AC como 1720 rpm, sabendo que a polia
maior tem diâmetro DM = 107,8 mm e a polia menor tem diâmetro Dm = 77 mm,
temos que a freqüência de excitação é:
"Freqüência de excitação do "20,4 Hz "
"sistema: " "
Pode-se perceber que a freqüência de excitação do sistema (20,4Hz) é
bem inferior a menor freqüência natural da máquina (30,3Hz). Concluí-se
então que mesmo nas piores condições de operação, não ocorrerão problemas
de ressonância.
2 Cálculo das Forças de Usinagem
1 Cálculos
Foi montada uma tabela com os valores constantes e calculados para o caso
do torno CNC, utilizando-se das fórmulas apresentadas a seguir.
Velocidade de Corte (Vc):
sendo:
d - diâmetro da peça (mm)
n – rotação (em rpm)
e VC – em m/min
Força de Corte (Fc):
sendo:
KS – a pressão especifica de corte, calculada no item anterior, em
função do avanço.
Potência de Corte (PC):
Obtendo, assim, PC em kW, para VC em m/min.
Velocidade de Avanço (Vf):
sendo: f – avanço (em mm/volta)
Velocidade do Motor (Vmotor):
O motor tem uma transmissão por correia, portanto, pode-se calcular
sua velocidade utilizando as relações dos diâmetros das polias e da própria
castanha:
Volume de Trabalho (VT):
Volume da maior peça que pode ser trabalhada na máquina.
Sendo:
dm – diâmetro máximo,
Lm – comprimento máximo
A tabela obtida, com todos os valores pertinentes é apresentada a
seguir:
Tabela 6.1: Valores dos parâmetros.
"Dados constantes " " "
"Pc "= "386 "W "Potência de corte "
"Cw "= "161,4 " "Constante do PVC "
"π "= "3,142 " " "
"Dc "= "130 "mm "Diâmetro da castanha "
"De "= "108 "mm "Diâmetro da polia do eixo "
"Dm "= "78 "mm "Diâmetro da polia do motor "
" " " " " "
"Parâmetros de entrada " "
"D "= "100 "mm "Diâmetro do eixo a ser "
" " " " "usinado "
"ap "= "3 "mm "Profundidade de corte "
"f "= "3 "mm/rot "avanço "
" " " " " "
"Resultados " " " "
"Ks "= "95,6 "N/mm "Pressão específica de corte "
"Fc "= "860,4 "N "força de corte "
"n "= "85,69 "Hz "Rotação da castanha "
"T "= "4,505 "Nm "Torque "
"Vc "= "0,449 "m/s "Velocidade de corte "
"Vf "= "0,257 "m/s "Velocidade de avanço "
"Vcastanha"= "5570 "m/s "Velocidade da castanha "
"Vmotor "= "7712 "m/s "Velocidade do motor da "
" " " " "castanha "
"Vol T "= "294,52 "cm2 "Volume Máximo de Trabalho "
" " " " " "
" " " " " "
"n "= "118,6 "Hz "Rotação do Motor da Castanha"
"n "= "7119 "rpm "Rotação do Motor da Castanha"
" " " " " "
" " " " " "
"Vf "= "257,1 "mm/s "Velocidade de Avanço "
"Passo "= "5 "mm/volta "
"n "= "51,41 "Hz "Rotação do Motor de Passo X "
"n "= "3085 "rpm "Rotação do Motor de Passo X "
2 Gráficos
Pressão Específica de Corte (KS)
KS varia de acordo com as condições de operação, tais como ângulo de
posição da ferramenta, seu desgaste, material da peça, entre muitos
outros fatores. A AWF (Ausschuss für Wirtschefthiche Fertiging) sugere o
uso da constante CW (dependente do material) para o cálculo de KS:
Para alguns valores típicos do PVC (material a ser usinado na máquina)
tem-se que um valor médio de CW é 161,4447. Dessa forma, pode-se fazer um
gráfico com os valores esperados de pressão de corte KS em função de
alguns valores de avanço:
Gráfico 6.1: Pressão Específica de Corte em função do Avanço.
Potência do motor (PM)
Dessa forma, foi possível construir um gráfico de torque x rotação
para o motor da castanha.
Gráfico 6.2: Torque x Rotação do motor da castanha.
Projeto Elétrico
Fig. 7.1 – Diagrama de conexões elétricas
1 Modelagem do Sistema
Um modelo de sistema pode ser escrito como:
No caso do torno, essa divisão se dá dessa forma:
Usuário - é o próprio operador da máquina;
Monitoramento - é feito pelo usuário também;
Comando - é um programa de interface com usuário
Controlador - é o Jack Rabbit + PAMP (placa de acionamento de
motor de passo) + Inversor de Freqüências;
Atuador - é o tono que estamos construindo;
Sensoriamento - apenas o encoder óptico como sensor de posição;
Objeto - a peça a ser usinada.
2 Programação – Software
O programa do controlador é feito em C e Assembly (a vantagem deste é
que com ele é possível ter um melhor controle do tempo).
O encoder óptico será usado apenas para rosca por guarda a posição do
início da rosca no eixo.
A PAMP recebe 4 tipos de informação referente a cada motor de passo
(uma PAMP pode controlar até 2 motores de passo):
"Passo "Define se estamos trabalhando em FULL ou HALF STEP, "
" "ou seja, se o motor dá 200 ou 400 pulsos por volta "
" "(no nosso caso a PAMP já vem jumpeada para HALF STEP,"
" "ou seja, 400 pulsos por volta) "
"Enable "Define se o motor está ativado ou não "
"Sentido "Define se é sentido horário ou anti-horário "
"Pulso "Dá um pulso no motor a cada borda de subida "
O Inversor de Freqüência é um controlador para o motor AC, e o
utilizado possui 10 velocidades pré-programadas e as informações que ele
recebe são referentes a ENABLE e qual das velocidades a ser usada. No caso
essa velocidade é definida pelo usuário e aproximada, pelo Rabbit, para uma
rotação pré-programada.
O sistema funciona assim:
O usuário envia um comando manual ou toda a string de código G
do modo automático;
O Rabbit calcula os dados e parâmetros de usinagem e envia os
dados para PAMP e para o Inversor de freqüências.
Durante o corte, o motor de passo usa a curva de PULL IN, por se
tratar de baixas rotações (segundo essa curva, para baixas rotações o
torque é aproximadamente igual ao torque máximo). E quando em avanço
rápido, o motor usa a curva de PULL OUT, que permite atingir maiores
rotações quando não há muita carga sendo requerida.
3 Algoritmo de Bresenham
O algoritmo de Bresenham utilizado por nosso sistema é o de
interpolação linear, que consiste basicamente em:
Dada uma malha definida de pontos (resolução de passos do motor de
passo), e dois, um sendo a posição atual e outro sendo a posição
desejada;
O algoritmo deve verificar por meio do ângulo do movimento em relação
ao eixo que causa seu menor valor, qual é a tangente do mesmo e se
andar na direção do ponto mais próximo da malha oposto ao atual.
Ou seja, se em um segmento de reta que liga 2 pontos vizinhos, o nosso
código vai avançar na direção do ponto mais próximo destes.
4 Código G
O código G básico usado por tornos normalmente tem os comandos de
avanço, velocidade do eixo arvore e controladores. No nosso sistema, todo o
código G é enviado para a máquina com critério de parada na espera do
caractere "?", por ser este pouco utilizado.
Após recebido o código, ele é desmembrado em comandos principais e
processado dentro de funções relativas a estes.
Os comandos principais estão presentes na tabela abaixo:
"G00 "Avanço rápido "
"G01 "Avanço com velocidade controlada "
"G20 "Define medidas em raio (Padrão) "
"G21 "Define medidas em diâmetro "
"G70 "Define medidas em milímetros "
" "(Padrão) "
"G71 "Define medidas em polegadas "
"G90 "Define coordenadas absolutas "
"G91 "Define coordenadas incrementais "
" "(Padrão) "
"M02 "Finaliza a programação manual "
O critério de parada de uma função de comando é o aparecimento de um
novo comando, como no caso de se processar um comando G00 até o
aparecimento de uma letra G ou M.
7.4.1. G00
É o comando de avanço rápido, utiliza-se de uma função de espera para
os passos que foi determinada baseada na curva de pull-out, que permite se
alcançar maiores velocidades nos motores de passo.
A curva de pull-out é uma curva acelerada a partir da velocidade 0 em
pequenas variações de velocidades para se evitar o problema de perda de
passos por inércia da carga.
As variáveis de movimento do comando G00 são as coordenadas X (na
direção radial) e Z (na direção axial) e segue a máscara seguinte:
G00 X[num] Z[num]#
O formato de [num] depende da unidade de medidas e da presença do
caractere "." que se estiver ausente faz com que [num] seja dividido por
10000 (dez mil).
O algarismo sustenido ao final da linha indica término de um dos
comandos G00, quando a função recebe esse algarismo ela executa o movimento
com o último X e Z recebidos.
A ausência de uma ou mais variáveis de movimento, faz com que essa
assuma valor 0. Exemplo:
N30 G00 X-10. # //move o eixo X na direção e sentido do centro em 10
mm
N40 Z-50. # //move o eixo Z no sentido de afastamento da castanha
N50 X5000 Z50. # //move os dois eixos, sendo o eixo X movimentado
0.5mm
7.4.2. G01
É o comando de avanço controlado, utiliza-se de uma função de espera
para os passos que foi determinada baseada na curva de pull-in, que tem uma
implementação mais simples uma vez que a aceleração e absoluta, ou seja, o
eixo já começa a se mover na velocidade desejada no primeiro passo.
Como esse comando é usado durante a usinagem e esse é um processo de
baixas velocidades, não há grande variação no torque do motor, pois a
baixas velocidades, a curva de pull-in tem um comportamento semelhante ao
da curva d pull-out.
As variáveis de movimento do comando G01 são as coordenadas X (na
direção radial), Z (na direção axial) e F (velocidade de corte) e segue a
máscara seguinte:
G01 X[num] Z[num] F[num]#
O formato de [num] depende da unidade de medidas e da presença do
caractere "." que se estiver ausente faz com que [num] seja dividido por
10000 (dez mil).
O algarismo sustenido ao final da linha indica término de um dos
comandos G01, quando a função recebe esse algarismo ela executa o movimento
com o último X, Z e F recebidos.
A ausência de uma ou mais variáveis de coordenada, faz com que essa
assuma valor 0 e na ausência da variável de velocidade, essa assume o
ultimo valor dado a mesma desde o inicio do uso dessa função de comando.
Exemplo:
N30 G01X-10. F1. # //move o eixo X no sentido do centro à 1 mm/s
N40 Z-50. # //move o eixo Z no sentido de afastamento da castanha
N50 X5000 Z50. F2500 # //move os dois eixos à 0.25 mm/s
7.4.3. G90/G91
Esses comandos apenas definem o tipo de coordenada de movimento
utilizada como absoluta ou incremental. As coordenadas absolutas são em
relação ao centro da castanha e as incremenetais são em relação a posição
atual.
5 .Software
O software é dividido em dois sistemas, um de controle e outro de
interface, e cada um utilizou uma plataforma mais adequada para sua
programação. O software de controle foi ainda dividido em mais sub-
sistemas, como algoritmo de bressenham, timer, interpretação do código G,
comunicação serial, controle manual e movimentação de motores de passo.
1 Módulos de Programação
1 Comunicação Serial
A comunicação serial se dá através da RS232. O Dinamic C (compilador
usado para programar o controlador) já possui uma biblioteca para essa
comunicação.
O Dinamic C se comunica com a porta serial A do controlador e enquanto
está conectado a essa, ele se torna o set de Bios da mesma, ou seja,
enquanto não se desligar o modo programador, o controlador fica esperando
os comandos do Dinamic C.
A comunicação do controlador com a interface com o usuário é feita
pela porta serial B que sempre é usada com finalidade de comunicação e não
de programação.
2 Timer
O timer da máquina foi usado para oferecer maior controle no tempo de
espera para a movimentação dos motores.
O timer é uma programação feita em assembly que utiliza-se de uma
interrupção do controlador, no nosso caso, o timer usado foi o Timer B
com interrupções em meio per-clock, ou seja, a cada 135 microssegundos.
A função de timer então utilizava um contador que, cada vez que fosse
requisitada por uma função, receberia esse contador zerado.
Apenas duas funções tinham o controle sobre o timer, uma era um
temporizador para a curva de pull-in e outro para a curva de pull-out.
3 Movimentação Manual
A movimentação manual é uma comunicação direta e constante com a
interface com o usuário. Tem as funcionalidades de movimento nas 4 direções
em velocidade controlada e velocidade rápida e controle de velocidade.
A função recebe um caractere e verifica se esse é um caractere de
lista de funções. Caso não seja ela pega outro caractere.
Quando recebe um caractere de movimentação, esta inicia o movimento
relativo e só termina essa etapa ao receber um caractere de parada, tornado
um controle mais preciso e seguro do movimento do motor.
Uma particularidade é que os caracteres de parada de todos os
movimentos manuais são os mesmos. Isso foi feito para termos uma maior
segurança com relação a perdas temporárias na comunicação com a interface.
Os comandos de movimentação manual seguem essa tabela:
"'A' "Move o eixo X no sentido do centro em velocidade máxima "
"'B' "Move o eixo X no sentido de afastamento do centro em "
" "velocidade máxima "
"'C' "Move o eixo Z para a direita em velocidade máxima "
"'D' "Move o eixo Z para a esquerda em velocidade máxima "
"'E' "Move o eixo X no sentido do centro em velocidade controlada"
"'F' "Move o eixo X no sentido de afastamento do centro em "
" "velocidade controlada "
"'G' "Move o eixo Z para a direita em velocidade controlada "
"'H' "Move o eixo Z para a esquerda em velocidade máxima "
"'I' "Escolhe a velocidade de movimentação controlada da máquina "
"'Y' "Altera para o modo automático "
"'Z' "Sai do programa "
4 Movimentação de motores de Passo
Uma função genérica, que apenas recebe o número da porta do motor
desejado e executa a mudança na porta PA referente, muda o set da porta PD
para alterar o estado do pino que está conectado com a informação de pulso
do motor referente na PAMP e depois retorna ao estado anterior, repetindo
as mesmas etapas.
2 Interface Gráfica
A interface do torno foi feita em Microsoft Visual Basic 6.0, um
programa robusto para criar interfaces gráficas. Ela se comunica com o
controlador (Jack Rabbit) pela porta serial.
A interface criada possui 3 formulários diferentes, e funciona da
seguinte maneira: Ao abri-la, aparece uma tela splash com os nomes dos
integrantes da equipe e nomes dos professores. Em seguida, é aberta a tela
de modo manual do torno, onde devem ser ajustados os zeros da máquina;
poderá ser feito, então, o movimento manual da ferramenta entre outras
coisas. Também existe um botão para ir para modo automático do torno, onde
é possível a execução de um programa em linguagem G, ou o retorno ao modo
manual.
Fig. 7.2 - Janela "Splash" (Splash Screen)
1 Detalhamento da Janela Splash.
Sua finalidade é exibir o nome dos integrantes da equipe e nome dos
professores responsáveis. Ao executar a interface essa janela irá abrir e
ao clique do mouse em qualquer local da janela irá fechar a janela de
splash e abrir a janela de modo manual.
2 Detalhamento da Janela Manual.
É a janela onde é possível controlar manualmente o torno. É necessária
para movimentar a ferramenta manualmente.
Fig. 7.3 – Modo Manual
Botões da janela:
Alterar para Modo Automático: alterna para o modo automático.
Velocidade de avanço (mm/s): define a velocidade de avanço.
Direcionamento:
- Eixo X: movimenta o eixo na velocidade de avanço definida.
-- Eixo X: movimenta o eixo usando movimentação rápida.
+ Eixo X: movimenta o eixo na velocidade de avanço definida.
++ Eixo X: movimenta o eixo usando movimentação rápida.
- Eixo Z: movimenta o eixo na velocidade de avanço definida.
-- Eixo Z: movimenta o eixo usando movimentação rápida.
+ Eixo Z: movimenta o eixo na velocidade de avanço definida.
++ Eixo Z: movimenta o eixo usando movimentação rápida.
3 Detalhamento da Janela Automático.
Consiste na parte do programa onde é possível executar um programa em
linguagem G. Botões da janela:
Fig. 7.4 - Janela Modo Automático
Alternar para Modo Manual: alterna para modo manual.
Abrir Arquivo: abre um arquivo contento uma programação em linguagem G
na caixa de texto.
Salvar Arquivo: salva o arquivo da caixa de texto em algum local do
computador.
Executar: executa o programa em linguagem G que se encontra na caixa
de texto.
Vale ressaltar que todo o programa conta com avisos de segurança que
impedem o mau funcionamento do torno, como, por exemplo, enviar alguma
informação para o torno sem antes ter feito a conexão com a porta serial.
Construção
As primeiras peças do torno a serem construídas foram:
O eixo da castanha;
Mancais do eixo da castanha;
As duas chapas em formato de "L" (responsáveis pela fixação dos
motores de passo a as guias lineares);
A chapa em formato de "U" (responsável pela fixação do encoder e a
torre da estrutura).
Neste momento da construção, a principal dificuldade encontrada foi
manter as dimensões e tolerâncias impostas no projeto. Caso essas dimensões
e tolerâncias não fossem respeitados, teríamos problemas de interferência
ou folga entre o eixo, rolamentos e mancais.
No caso dos suportes dos motores de passo, poderíamos encontrar os
seguintes problemas: O eixo do motor de passo e o eixo da guia poderiam
ficar excêntricos, o motor e os parafusos poderiam não encaixar no suporte.
Já no suporte do encoder encontraríamos também o problema dos parafusos e o
próprio encoder não encaixarem no mesmo.
Para a construção da estrutura do torno, foi realizado o corte de
quatro tubos de seção transversal quadrada. Um desses tubos foi utilizado
para a construção da "torre", ou melhor, a parte da estrutura atravessada
pelo eixo do torno. Neste tubo foi usinado também um furo para a passagem
do eixo. A principal dificuldade encontrada nesta etapa foi manter as
dimensões e tolerâncias projetadas para o furo. Caso essas dimensões não
fossem respeitadas, poderíamos encontrar problemas de funcionamento do
eixo.
Em seguida, os tubos foram soldados para formar a estrutura do torno.
Nesta etapa, o desafio foi conseguir fazer com que a torre fosse soldada
perpendicularmente ao resto da estrutura, ou melhor, com ângulo muito
próximo de 90 graus (isso foi conseguido utilizando um esquadro).
Nesta etapa da construção foi detectado um erro no projeto: A
distancia entre os pés do motor AC real, possuíam valor diferente da
distância utilizada no projeto. Sendo assim, o motor não poderia mais ser
sustentado por apenas um tubo da estrutura. Para solucionar esse percalço,
foi usinada mais uma peça em formato de "L" que seria soldada à estrutura e
assim permitiria a sustentação do motor. Nesta solução, o motor teve um
pequeno deslocamento da sua posição inicial, portanto o eixo teve que ter
as suas dimensões alteradas, ou melhor, o seu comprimento foi aumentado em
8 mm.
Depois foram realizados furos na estrutura para fixação da guia linear
de 600 mm (esses furos precisavam ser concêntricos com os furos da guia,
caso contrário a guia não poderia ser unida à estrutura através de
parafusos), E também realizados rasgos na estrutura para a fixação do motor
(aqui, o cuidado foi manter a distância entre os rasgos igual à distância
projetada, caso contrário o motor não encaixaria na estrutura).
Neste momento o eixo, os mancais, os rolamentos e a castanha foram
montados na torre da estrutura.
Foram também usinados os acoplamentos para os motores de passo. Esses
acoplamentos foram feitos de aço, portanto são bastante rígidos. Sendo
assim, a equipe teve bastante dificuldade para fazer com que esses
acoplamentos permitissem uma boa transmissão de movimento entre os motores
de passo e a guia.
Finalmente, a correia foi colocada entre as polias do eixo e do motor.
Logo em seguida o encoder foi ligado ao eixo do torno (ele foi fixado pela
chapa em formato de "U").
No final de toda a montagem do torno, foi utilizado um relógio
comparador para posicionar a guia e evitar que ela ficasse desalinhada com
eixo.
Testes
1 O Ensaio
A verificação da funcionalidade do torno deverá ser feita a partir de
um ensaio controlado, seguindo uma rotina de ações previamente
estabelecidas. Estas ações dispostas a seguir:
1 Movimentação nos eixos X e Z:
Mover Eixo X pra posição zero-absoluto, no centro da castanha;
Mandar o software mover 200 mm;
Medir a distância movida real;
Repetir o teste 3 vezes, calcular a média;
Ajustar a constante do software;
Repetir enquanto for necessário;
Após o ajuste final, repetir o teste 10 vezes;
Calcular média e desvio padrão dos 10 valores;
Plotar um gráfico das medidas e desvio padrão. Disponibilizados no
item "Resultados".
Idem para o Eixo Z, movendo 150 mm.
2 Usinagem (Verificação do conjunto)
Usinar as seguintes peças, em ordem de importância, usinar todas
quanto possível:
1. Cilindro (diâmetro: 50 mm, altura: 150 mm), em coordenadas
absolutas;
2. Cilindro (mesmo tamanho), em coordenadas incrementais;
3. Cone (diâmetro da base: 50 mm, altura: 150 mm), em coordenadas
absolutas;
4. Cilindro (mesmo tamanho), com rosca (passo X mm, profundidade X
mm), em coordenadas absolutas;
5. Cone (mesmo tamanho), com rosca (mesmo tamanho), em coordenadas
absolutas;
Após cada usinagem, fazer as medidas de altura e de 3 medidas de
diâmetro, no caso do cilindro, em 3 pontos diferentes, ou 1 medida de
diâmetro, no caso do cone, na base do mesmo. Anotar todos os valores e
guardar as amostras, devidamente nomeadas. Anotar todas as medidas de cada
amostra para dispô-las em "Resultados". Os códigos G utilizados para tais
usinagens estão dispostos no anexo III.
2 Resultados
1 Movimentação
Eixo X
Tabela 9.1 – Medição da movimentação real do torno. Eixo X.
"Valor "1 "
"Altura " "
"Experimental/Teóric" "
"o " "
"Diâmetro (1ª " "
"medição) " "
"Diâmetro (2ª " "
"medição) " "
"Diâmetro (3ª " "
"medição) " "
"Média " "
"Desvio padrão " "
"Experimental/Teóric" "
"o " "
1 Cilindro (d: 50 mm, h: 150 mm) – Coord. Inc.
Tabela 9.4 – Medições do cilindro – coordenadas incrementais.
" "Valores em mm "
"Altura " "
"Experimental/Teóric" "
"o " "
"Diâmetro (1ª " "
"medição) " "
"Diâmetro (2ª " "
"medição) " "
"Diâmetro (3ª " "
"medição) " "
"Média " "
"Desvio padrão " "
"Experimental/Teóric" "
"o " "
2 Cone (d. da base: 50 mm, H: 150 mm) – Coord. Abs.
Tabela 9.5 – Medições do cone – coordenadas absolutas.
" "Valores em mm "
"Altura " "
"Diâmetro da base " "
3 Cilindro (d: 50 mm, h: 150 mm), com rosca (passo X mm, profundidade
X mm) – Coord. Abs.
Tabela 9.6 – Medições do cilindro com rosca – coordenadas
incrementais.
" "Valores em mm "
"Altura " "
"Experimental/Teóric" "
"o " "
"Diâmetro (1ª " "
"medição) " "
"Diâmetro (2ª " "
"medição) " "
"Diâmetro (3ª " "
"medição) " "
"Média " "
"Desvio padrão " "
"Experimental/Teóric" "
"o " "
4 Cone (d. da base: 50 mm, H: 150 mm), com rosca (passo X mm,
profundidade X mm) – Coord. Abs.
Tabela 9.7 – Medições do cone com rosca – coordenadas absolutas.
" "Valores em mm "
"Altura " "
"Diâmetro da base " "
Discussões e Conclusões
- Importância de lidar com o número de integrantes da equipe. Suas
habilidades e disponibilidades. Aproveitar ao máximo o potencial de cada
um.
- Lidar com os prazos.
- Complexidade da tarefa.
- O qto se aproximou de um projeto real.
- E, finalmente, o quanto isso foi importante para nossa formação
acadêmica.
- Ainda não estou inspirado....
Esse trabalho foi importante para a equipe, pois apresentou aos
integrantes a construção real de um projeto criado por eles próprios,
passando por todas as etapas, desde sua concepção até o seu ensaio.
Teve, também, de aprender a lidar com prazos e cronogramas, bem como
com o trabalho em uma equipe grande, de 15 integrantes; com suas
habilidades, de forma a aproveitar ao máximo o potencial de cada um,
colocando-os em divisões que permitiam e disponibilidades, com relação não
só a horários livres, mas quanto ao calendário de provas e trabalhos do
semestre.
Finalmente, o mais importante para a nossa formação acadêmica, a
equipe pode sentir a responsabilidade de um projeto com tal complexidade. O
projeto foi didático, de certa forma foi feito para cometermos erros e
assim aprender com eles.
Bibliografia
[1] GERE, J.. Mecânica dos Materiais. 5ª Ed. São Paulo: Thomson Learning,
2003.
[2] NORTON, Robert L. Projeto de Máquinas: Uma Abordagem Integrada. 2ª ed.
Bookman, 2003.
[3] NSK®: Rolamentos e movimentação linear. Disponível em: www.nsk.com.br
acessado dia 29/11/2006
[4] SKF®: Rolamentos e movimentação linear. Disponível em: www.skf.com.br
acessado dia 29/11/2006
[5] Notas de aula da Disciplina PMR 2450.
Anexo A (Desenhos das peças e de Conjunto)
As folhas referentes aos desenhos das peças e de conjunto dispõem de
numeração própria. Para simplificar a consulta, a seguir está apresentado
uma listagem do conteúdo de cada folha:
Tabela A.1 – Índice de Desenhos de Conjunto (Plotagens)
"Folha "Conteúdo "
"1 "Desenho de Conjunto (Isométrica) "
"2 "Desenho de Conjunto – Detalhes "
"3 "Desenho de Subconjuntos (Estrutura/ Sist. De Trasmissão/ Sist."
" "Fixação da Peça/ Sist. Fixação da Ferramenta) "
"4 "Desenho de Montagem (explodida) "
Tabela A.2 – Índice de desenhos de fabricação das peças
"Folha "Nº "Denominação "
"5 "1 "Base Central da estrutura "
"6 "2 "Cabeçote motor "
"7 "3 "Base transversal (Cabeçote motor) "
"8 "4 "Base transversal (lado oposto ao "
" " "cabeçote) "
"9 "5 "Mancal (lado da placa de 3 "
" " "castanhas) "
"10 "6 "Mancal (lado do encoder) "
"11 "8 "Eixo "
"12 "15 "Acoplamento do motor de passo "
"13 "16 "Suporte do motor de passo "
"14 "17 "Suporte do porta-ferramenta "
"15 "18 "Porta-ferramenta "
"16 "19 "Calço para suporte de motor de "
" " "passo "
"17 "20 "Chaveta (polia movida) "
"18 "22 "Chaveta (polia motora) "
Anexo B (Lista de peças do Mini-Torno CNC)
"Lista de peças do Mini-torno "
" "
"Número"Denominação "Quanti"Material e Dimensões "
" " "dade " "
"1 "Base central da estrutura "1 "aço, tubo quadrado 100 x "
" " " "100 x 480, esp. 3mm "
"2 "Cabeçote motor "1 "aço, tubo quadrado 100 x "
" " " "100 x 190, esp. 3mm "
"3 "Base transversal (cabeçote motor) "1 "aço, tubo quadrado 100 x "
" " " "100 x 570, esp. 3mm "
"4 "Base transversal (lado contrário ao "1 "aço, tubo quadrado 100 x "
" "cabeçote motor) " "100 x 570, esp. 3mm "
"5 "Mancal (lado da placa de 3 castanhas) "1 "aço, Ø92 x 20 "
"6 "Mancal (lado do encoder) "1 "aço, Ø92 x 20 "
"7 "Rolamento "2 "NSK6909 "
"8 "Eixo "1 "aço, Ø49 x 258 "
"9 "Placa universal de três castanhas "1 "aço, - "
"10 "Motor AC "1 "- "
"11 "Guia longitudinal "1 "alumínio, 600mm "
"12 "Guia transversal "1 "alumínio, 300mm "
"13 "Motor de passo "2 "NMB - 23LM "
"14 "Encoder "1 "- "
"15 "Acoplamento do motor de passo "2 "aço, Ø20 x 20 "
"16 "Suporte do motor de passo "2 "aço, chapa 145 x 130 x "
" " " "esp. 3mm "
"17 "Suporte do porta-ferramenta "1 "aço, chapa 130 x 72 x esp."
" " " "10mm "
"18 "Porta-ferramenta "1 "aço, bloco 72 x 50 x 50 "
"19 "Calço para chapa de fixação do motor de "2 "alumínio, bloco 130 x 20 x"
" "passo " "10 "
"20 "Chaveta (polia movida) "1 "aço, 10 x 10 x 36 "
"21 "Polia movida 36L "1 "aço, 36L "
"22 "Chaveta (polia motora) "1 "aço, 5 x 5 x 18 "
"23 "Polia motora "1 "aço, 26L "
"24 "Correia dentada "1 "borracha, 7/8" x 600mm "
"25 "Suporte do motor AC "1 "aço, chapa 180 x 130 x "
" " " "esp. 2,5mm "
"26 "Suporte do encoder "1 "aço, chapa 260 x 92 x esp."
" " " "2,5mm "
"27 "Parafuso para fixação dos mancais "6 "M4 x 30 "
"28 "Porca para fixação dos mancais "6 "M4 "
"29 "Parafuso para ferramenta "3 "M8 x 40 "
"30 "Parafuso para fixação do motor AC "4 "M6 x 16 "
"31 "Porca para fixação do motor AC "4 "M6 "
"32 "Parafuso para fixação do porta-ferramenta "1 "M16 x 80 "
" "no suporte " " "
"33 "Porca para fixação do porta-ferramenta no "1 "M16 "
" "suporte " " "
"34 "Parafuso para fixação do motor de passo no"8 "M5 x 13 "
" "suporte " " "
"35 "Porca para fixação do motor de passo no "8 "M5 "
" "suporte " " "
"36 "Parafuso para o acoplamento do motor de "2 "M3 x 8 "
" "passo na guia (lado motor) " " "
"37 "Parafuso para o acoplamento do motor de "2 "M3 x 6 "
" "passo na guia (lado guia) " " "
"38 "Parafuso para fixação da guia maior no "2 "M8 x 50 (embutido) "
" "tubo quadrado " " "
"39 "Porca para fixação da guia maior no tubo "2 "M8 "
" "quadrado " " "
"40 "Parafuso para fixação do suporte do motor "4 "M8 x 70 "
" "de passo e do calço na guia " " "
"41 "Porca para fixação do suporte do motor de "4 "M8 "
" "passo e do calço na guia " " "
"42 "Parafuso para fixação de uma guia na outra"4 "M6 x 95 (embutido) "
"43 "Porca para fixação de uma guia na outra "4 "M6 "
"44 "Parafuso para fixação do suporte do "2 "M8 x 65 "
" "porta-ferramenta na guia menor " " "
"45 "Porca para fixação do suporte do "2 "M8 "
" "porta-ferramenta na guia menor " " "
"46 "Parafuso para fixação do porta-ferramenta "2 "M4 x 10 "
" "no suporte " " "
"47 "Porca para fixação do porta-ferramenta no "2 "M4 "
" "suporte " " "
"48 "Parafuso para o acoplamento do encoder no "1 "M3 x 10 "
" "eixo " " "
"49 "Parafuso para fixação do encoder no "4 "M3 x 10 "
" "suporte " " "
Anexo C (Código Dinamic C)
Janela Principal:
Trabalha apenas com set e reset de portas e variáveis que serão usadas
durante o programa, alem de estabelecer a comunicação serial com a
interface e chamar a função de controle manual.
main(){
char aux[20];
k1 = 80; // k = 400/5 pulsos/mm
k2 = 80;
k3 = 80;
k4 = 80;
k5 = 7150; //k = 7150 pulsos/s
t[0] = 101; //tabela de tempos de espera para a curva de pull-
out
t[1] = 42;
t[2] = 32;
t[3] = 27;
t[4] = 24;
t[5] = 22;
t[6] = 20;
t[7] = 19;
t[8] = 18;
t[9] = 17;
t[10] = 16;
t[11] = 15;
t[12] = 14;
t[13] = 13;
t[14] = 12;
t[15] = 11;
t[16] = 10;
t[17] = 9;
t[18] = 8;
t[19] = 7;
t[20] = 6;
t[21] = 5;
t[22] = 4;
coordenadas = INCREMENTAL; //set de padrões de variáveis de
coordenadas
medidas = MILIMETROS;
tipoX = RAIO;
WrPortI(SPCR, &SPCRShadow, 0x84); //seta todas as portas PA
como saida
//Seta as Portas PD6 e PD7 como output para controlar o
multiplexador
WrPortI(PDFR, &PDFRShadow, 0x3f);
WrPortI(PDDCR, &PDDCRShadow, 0x3f);
WrPortI(PDDDR, &PDDDRShadow, 0xc0);
//Fim do set
//Zera todos os pinos, caso estejam em 1
WrPortI(PADR, &PADRShadow, 0x00);
BitWrPortI(PDDR, &PDDRShadow, 1, 6);
BitWrPortI(PDDR, &PDDRShadow, 0, 6);
WrPortI(PADR, &PADRShadow, 0x24); //da ENABLE nos dois
motores de passo
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
count = 0;
// seta o vetor de interrupção interna B para a função
timerb_isr
SetVectIntern(0x0B, timerb_isr);
WrPortI(TBCR, &TBCRShadow, 0x01); //seta o clock do timer B
para perclk/2
WrPortI(TBL1R, NULL, 0x00); // inicializa a
interrupção
WrPortI(TBM1R, NULL, 0x00);
WrPortI(TBCSR, &TBCSRShadow, 0x03); //ativa o timer
x = z = 0;
sair = NAO;
serBopen(9600); //seta e inicia a comunicação com a
porrta serial B
serBparity(PARAM_EPARITY);
serBdatabits(PARAM_8BIT);
sair = NAO; //variável de controle de estado de
saída
while(sair == NAO){
manual();
}
WrPortI(TBCSR, &TBCSRShadow, 0x00); //finaliza todos os sets
serBclose();
WrPortI(PADR, &PADRShadow, 0x00);
BitWrPortI(PDDR, &PDDRShadow, 1, 6);
BitWrPortI(PDDR, &PDDRShadow, 0, 6);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}// fim do main
Algoritmo de bressenham:
//recebe o número de passos que deve se mover em cada motor
void movG00(long xr, long zr){
long k; //variável de contagem de passos
double e, l; // a variável e refere-se a distância dos pontos a
reta e a l é a tangente dela
int sentx, sentz; //variáveis que definem o sentido de movimento
dos eixos
sentx = sentz = 1;
if(xr >= 0){
BitWrPortI(PADR, &PADRShadow, 0, 0); //gira eixo x no sentido
horário
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
else{
sentx = -1;
xr = -xr;
BitWrPortI(PADR, &PADRShadow, 1, 0); //gira eixo x no sentido
anti-horário
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
if(zr >= 0){
BitWrPortI(PADR, &PADRShadow, 1, 3); //gira eixo z no sentido
horário
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
else{
sentz = -1;
zr = -zr;
BitWrPortI(PADR, &PADRShadow, 0, 3); //gira eixo z no sentido
anti-horário
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
if(xr >= zr){
l = (double)(zr)/xr;
e = l - .5;
k = 0;
while(k < xr){
if(e > 0){
e = e - 1;
movPasso(4);
z = z + (double)(sentz)/k2;
}
k++;
e = e + l;
movPasso(1);
x = x + (double)(sentx)/k1;
if(k < xr/2)
espera1(k);
else
espera1(xr-k);
}
}
else{
l = (double)(xr)/zr;
e = l - .5;
k = 0;
while(k < zr){
if(e > 0){
e = e - 1;
movPasso(1);
x = x + (double)(sentx)/k1;
}
k = k + 1;
e = e + l;
movPasso(4);
z = z + (double)(sentz)/k2;
if(k < zr/2)
espera1(k);
else
espera1(zr-k);
}
}
}
//recebe o número de passos em cada eixo e o tempo de espera para cada
movimento do eixo principal
void movG01(long xr, long zr, long ti){
int k, tl;
double e, l;
int sentx, sentz;
sentx = sentz = 1;
if(xr >= 0){
BitWrPortI(PADR, &PADRShadow, 0, 0);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
else{
sentx = -1;
xr = -xr;
BitWrPortI(PADR, &PADRShadow, 1, 0);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
if(zr >= 0){
BitWrPortI(PADR, &PADRShadow, 1, 3);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
else{
sentz = -1;
zr = -zr;
BitWrPortI(PADR, &PADRShadow, 0, 3);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
if(xr >= zr){
l = (double)(zr)/xr;
tl = (int)(ti/xr);
e = l - .5;
k = 0;
while(k < xr){
if(e > 0){
e = e - 1;
movPasso(4);
z = z + (double)(sentz)/k4;
}
k++;
e = e + l;
movPasso(1);
x = x + (double)(sentx)/k3;
espera2(tl);
}
}
else{
l = (double)(xr)/zr;
tl = (int)(ti/zr);
e = l - .5;
k = 0;
while(k < zr){
if(e > 0){
e = e - 1;
movPasso(1);
x = x + (double)(sentx)/k3;
}
k = k + 1;
e = e + l;
movPasso(4);
z = z + (double)(sentz)/k4;
espera2(tl);
}
}
}
Timer:
//implementa a curva de pull-out recebendo a velocidade atual do motor
void espera1(long i){
int j;
if(i >= TMAX){ //verifica se a velocidade está em
aceleração/desaceleração
count = 0;
while(count < TMIN);
}
else{
j = (int)(i);
count = 0;
while(count < t[j]);
}
}
//implementa a curva de pull-in recebendo o número de interrupções que
a função deve esperar
void espera2(int ti){
count = 0;
while(count < ti);
}
//função que incrementa o contador entrando na interrupção
#asm
timerb_isr::
push af ; save registers
push hl
ld hl, (count)
inc hl ; increment counter
ld (count), hl
ld a, 00h
ioi ld (TBL1R), a ; set up next B1 match (at
timer=0000h)
ioi ld (TBM1R), a ; NOTE: you _need_ to reload
the match
; register
after every interrupt!
done:
ioi ld a, (TBCSR) ; load B1, B2 interrupt flags
(clears flag)
pop hl ; restore registers
pop af
ipres ; restore interrupts
ret ; return
#endasm
Interpretação do Código
void codigoG(char linha[MAX]){
int i, n;
n = strlen(linha);
i = 0;
while(i < n){
if(linha[i] == 'G' "" linha[i] == 'g'){
i++;
if(linha[i] == ' '){ //G00
i++;
i = G00(linha, i);
}
else{
if(linha[i] == '0'){
i++;
if(linha[i] == ' '){ //G00
i++;
i = G00(linha, i);
}
else{
if(linha[i] == '0'){ //G00
i++;
i = G00(linha, i);
}
else{
if(linha[i] == '1'){ //G01
i++;
i = G01(linha, i);
}
else
i++;
}
}
}
else{
if(linha[i] == '1'){ //G01
i++;
i = G01(linha, i);
}
else{
if(linha[i] == '2'){
i++;
if(linha[i] == '0'){ //G20
i++;
tipoX = DIAMETRO;
}
else{
if(linha[i] == '1'){ //G21
i++;
tipoX = RAIO;
}
else
i++;
}
}
else{
if(linha[i] == '7'){
i++;
if(linha[i] == '0'){ //G70
i++;
medidas=POLEGADAS;
}
else{
if(linha[i] == '1'){ //G71
i++;
medidas = MILIMETROS;
}
else
i++;
}
}
else{
if(linha[i] == '9'){
i++;
if(linha[i] == '0'){ //G90
i++;
coordenadas = ABSOLUTA;
}
else{
if(linha[i] == '1'){ //G91
i++;
coordenadas = INCREMENTAL;
}
else
i++;
}
}
else
i++;
}
}
}
}
}
} //Fim do G
else{
if(linha[i] == 'N' "" linha[i] == 'n'){
i++;
i = N(linha, i);
} //Fim do N
else{
if(linha[i] == '/'){
i++;
i = inibeBloco(linha, i);
}
else{
if(linha[i] == ';'){
i++;
i = comentario(linha, i);
}
else{
if(linha[i] == 'M' "" linha[i] == 'm'){
i++;
if(linha[i] == '0'){
i++;
if(linha[i] == '2'){ //M02
i++;
sair = SIM;
}
else
i++;
}
}
else
i++;
}
}
}
}
}}
int comentario(char linha[MAX], int i){
int k;
for(k = 0; linha[i+k] != '#'; k++);
return i+k;
}
int G00(char linha[MAX], int i){
int k, j;
double xr, zr, xr2, zr2;
char aux[MAX];
int xi, zi;
long xr3, zr3;
k = 0;
xi = zi = NAO;
while(linha[i+k] != 'G' && linha[i+k] != 'g' && linha[i+k] !=
'M' && linha[i+k] != 'm' && sair == NAO && linha[i+k] != '?'){
//verifica o aparecimento de um novo comando
if(linha[i+k] == 'N'){
k++;
k = N(linha, i+k) - i;
}
else{
if(linha[i+k] == 'X' "" linha[i+k] == 'x'){
k++;
j = 0;
zeraString(aux);
while(linha[i+k+j] != '.' && linha[i+k+j] != '
' && linha[i+k+j] != '#'){
aux[j] = linha[i+k+j];
j++;
}
k = k+j;
if(linha[i+k] == '.')
xr = atof(aux);
else
xr = atof(aux)/10000;
if(medidas == POLEGADAS)
xr = 2.54*xr;
if(tipoX == DIAMETRO)
xr = xr/2;
xi = SIM;
}
else{
if(linha[i+k] == 'Z' "" linha[i+k] == 'z'){
k++;
j = 0;
zeraString(aux);
while(linha[i+k+j] != '.' && linha[i+k+j]
!= ' ' && linha[i+k+j] != '#'){
aux[j] = linha[i+k+j];
j++;
}
k = k+j;
if(linha[i+k] == '.')
zr = atof(aux);
else
zr = atof(aux)/10000;
if(medidas == POLEGADAS)
zr = 2.54*zr;
zi = SIM;
}
else{
if(linha[i+k] == '#'){
if(xi == SIM)
xr2 = xr;
else
xr2 = 0;
if(zi == SIM)
zr2 = zr;
else
zr2 = 0;
if(coordenadas == ABSOLUTA){
xr2 = xr2 - x;
zr2 = zr2 - z;
}
xr3 = (long)(k3*xr2);
zr3 = (long)(k4*zr2);
movG00(xr3, zr3); //envia o
commando para interpolação
xr = zr = 0;
k++;
xi = zi = NAO;
}
else
k++;
}
}
}
}
return i+k;
}
int G01(char linha[MAX], int i){
int k, j;
long fr3;
double xr, zr, fr, xr2, zr2, fr2;
char aux[MAX];
int xi, zi, fi;
long xr3, zr3;
k = 0;
fr = 0;
xi = zi = fi = NAO;
while(linha[i+k] != 'G' && linha[i+k] != 'g' && linha[i+k] !=
'M' && linha[i+k] != 'm' && sair == NAO && linha[i+k] != '?'){
if(linha[i+k] == 'N'){
k++;
k = N(linha, i+k) - i;
}
else{
if(linha[i+k] == 'X' "" linha[i+k] == 'x'){
k++;
j = 0;
zeraString(aux);
while(linha[i+k+j] != '.' && linha[i+k+j] != '
' && linha[i+k+j] != '#'){
aux[j] = linha[i+k+j];
j++;
}
k = k+j;
if(linha[i+k] == '.')
xr = atof(aux);
else
xr = atof(aux)/10000;
if(medidas == POLEGADAS)
xr = 2.54*xr;
if(tipoX == DIAMETRO)
xr = xr/2;
xi = SIM;
}
else{
if(linha[i+k] == 'Z' "" linha[i+k] == 'z'){
k++;
j = 0;
zeraString(aux);
while(linha[i+k+j] != '.' && linha[i+k+j]
!= ' ' && linha[i+k+j] != '#'){
aux[j] = linha[i+k+j];
j++;
}
k = k+j;
if(linha[i+k] == '.')
zr = atof(aux);
else
zr = atof(aux)/10000;
if(medidas == POLEGADAS)
zr = 2.54*zr;
zi = SIM;
}
else{
if(linha[i+k] == 'F' "" linha[i+k] ==
'f'){
k++;
j = 0;
zeraString(aux);
while(linha[i+k+j] != '.' &&
linha[i+k+j] != ' ' && linha[i+k+j] != '#'){
aux[j] = linha[i+k+j];
j++;
}
k = k+j;
if(linha[i+k] == '.')
fr = atof(aux);
else
fr = atof(aux)/10000;
if(medidas == POLEGADAS)
fr = 2.54*fr;
fi = SIM;
}
else{
if(linha[i+k] == '#'){
if(xi == SIM)
xr2 = xr;
else
xr2 = 0;
if(zi == SIM)
zr2 = zr;
else
zr2 = 0;
if(coordenadas == ABSOLUTA){
xr2 = xr2 - x;
zr2 = zr2 - z;
}
if(fi == SIM)
fr2 =
sqrt(xr2*xr2+zr2*zr2)/fr;
xr3 = (int)(k3*xr2);
zr3 = (int)(k4*zr2);
fr3 = (long)(k5*fr2);
movG01(xr3, zr3, fr3);
xr = zr = 0;
k++;
xi = zi = NAO;
}
else
k++;
}
}
}
}
}
return i+k;
}
int inibeBloco(char linha[MAX], int i){
int k;
for(k = 0; linha[i+k] != '#'; k++)
return i+k;
}
int N(char linha[MAX], int i){
int k;
char aux[MAX];
for(k = 0; linha[i+k] != ' ' && linha[i+k] != '#'; k++)
aux[k] = linha[i];
bloco = atol(linha);
return i+k;
}
Comunicação Serial:
//Apenas zera uma string para evitar que um caractere usada em uma
string anterior atrapalhe na leitura dos caracteres da string atual
void zeraString(char linha[MAX]){
int i;
for(i=0; i < MAX; i++)
linha[i] = 0;
}
void recebeString(char linha[MAX]){
int c;
int i;
i = 0;
c = 0;
while (c != '?' && i < MAX) { // Sai com o caracter ?
c = -1;
while ((c = serBgetc()) == -1);
linha[i] = c;
i++;
}
}
Controle Manual:
void manual(){
char c, aux[MAX];
long k;
int ti;
double v;
ti = 100;
while(sair == NAO){
k=0;
c = serBgetc();
if(c == 'A'){
BitWrPortI(PADR, &PADRShadow, 1, 0);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ // Move motor x em sentido positivo em VMAX
movPasso(1);
espera1(k);
k = k+1;
c = serBgetc();
}
x = x + (double)(k)/k1;
}
if(c == 'B'){
BitWrPortI(PADR, &PADRShadow, 0, 0);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ //Move motor x em sentido negativo em VMAX
movPasso(1);
espera1(k);
k = k+1;
c = serBgetc();
}
x = x - (double)(k)/k1;
}
if(c == 'C'){
BitWrPortI(PADR, &PADRShadow, 1, 3);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ //Move motor z em sentido positivo em VMAX
movPasso(4);
espera1(k);
k = k+1;
c = serBgetc();
}
z = z + (double)(k)/k2;
}
if(c == 'D'){
BitWrPortI(PADR, &PADRShadow, 0, 3);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ //Move motor z em sentido negativo em VMAX
movPasso(4);
espera1(k);
k = k+1;
c = serBgetc();
}
z = z - (double)(k)/k2;
}
if(c == 'E'){
BitWrPortI(PADR, &PADRShadow, 1, 0);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ // Move motor x em sentido positivo em V
movPasso(1);
espera2(ti);
k = k + 1;
c = serBgetc();
}
x = x + (double)(k)/k3;
}
if(c == 'F'){
BitWrPortI(PADR, &PADRShadow, 0, 0);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ //Move motor x em sentido negativo em V
movPasso(1);
espera2(ti);
k = k + 1;
c = serBgetc();
}
x = x - (double)(k)/k3;
}
if(c == 'G'){
BitWrPortI(PADR, &PADRShadow, 1, 3);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ //Move motor z em sentido positivo em V
movPasso(4);
espera2(ti);
k = k + 1;
c = serBgetc();
}
z = z + (double)(k)/k4;
}
if(c == 'H'){
BitWrPortI(PADR, &PADRShadow, 0, 3);
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
while(c != 'P'){ //Move motor z em sentido negativo em V
movPasso(4);
espera2(ti);
k = k + 1;
c = serBgetc();
}
z = z - (double)(k)/k4;
}
if(c == 'I'){
recebeString(aux);
v = atof(aux);
ti = (int)(k5/(400*v));
}
if(c == 'Y') // modo automático
automatico();
if(c == 'Z')
sair = SIM;
}
}
Movimentação de Motores de Passo:
void movPasso(int motor){
BitWrPortI(PADR, &PADRShadow, 1, motor); //envia um pulso para o
motor
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
BitWrPortI(PADR, &PADRShadow, 0, motor); //volta a zero
BitWrPortI(PDDR, &PDDRShadow, 1, 7);
BitWrPortI(PDDR, &PDDRShadow, 0, 7);
}
Controle Automático: (apenas uma função auxiliar)
void automatico(){
char linha[MAX];
while(sair == NAO){
recebeString(linha);
codigoG(linha);
}
}
Anexo D (Códigos de Usinagem)
Código G de usinagem