quarta-feira, 8 de junho de 2011
Conclusão
Mesmo enfrentado diversas dificuldades conseguimos construir uma máquina que efetua cortes com distâncias e comprimentos programados, à um baixissímo custo. Os conhecimentos multiciplinares que se adiquire em um projeto como este, são muito importante para a formação profissional de qualquer ramo, porque além dos conhecimentos técnicos das diversas disciplinas aplicadas, temos que trabalhar nosso lado emocional, nossas relações humanas e nossa capacidade de tomar desisões, que na maioria das vezes, tem que ser muito rápida. Os trabalhos interdisciplinares sem sombra de dúvidas, supera nossas espectativas de aprendizado.
Mecânica.
Para a construção mecânica de nossa mesa, usamos madeira MDF e trilhos de gaveta para dar mobilidade à estrutura. A figura abaixo mostra a estrutura já montada.
Escrita do Programa
Segue escrita do programa em C. Obviamente que para enteder o que está escrito, é necessário conhecer a liguagem C.
Todas as definições do programa estão descritas abaixo.
// Descrição
#include <16F628A.h> // Inclui a biblioteca do microcontrolador.
#FUSES INTRC_IO // Habilita o oscilador interno.
#FUSES NOMCLR // Desabilita o uso do Master Clear, pino RA5 disponível para uso como I/O.
#FUSES NOPROTECT // Desabilita a proteção contra leitura do código.
#FUSES NOLVP // Desabilita a programação em baixa tensão, pino RB4 disponível para uso como I/O.
#FUSES NOBROWNOUT // Desabilita o reset por Brownout.
#FUSES NOCPD // Desabilita a proteção da EEPROM
#FUSES NOWDT // Desabilita o Watch Dog Timer
#FUSES NOPUT // Desabilita o Power Up Timer
#use delay(clock=4000000) // Seta a fequencia do oscilador em 4MHz
#define Servo1_RA0 // Definição da porta A0 para conrole do servo
#include <1Servo-MIB.h> // Inclusão da biblioteca desenvolvida pela Meca In Brasil.com
int qtd_passo, lib, qtd_corte, lib1, np, npx, nc;
int pen, sent_giro_my, corte = 3;
#define PROG input(PIN_A4) // Atribui o nome "MXH" à entrade RA4
#define COMP input(PIN_A3) // Atribui o nome "NUM_CORTE" à entrad RA5
#define NUM_CORTE input(PIN_A2)
#define START input(PIN_A2)
// Interrupção do Timer0 para utilização de servo-motor.
void STP_Y_AH() // Giro antihorario motor eixo Y
{
output_high(PIN_B4);
delay_ms(100);
output_low(PIN_B4);
delay_ms(100);
output_high(PIN_B5);
delay_ms(100);
output_low(PIN_B5);
delay_ms(100);
output_high(PIN_B6);
delay_ms(100);
output_low(PIN_B6);
delay_ms(100);
output_high(PIN_B7);
delay_ms(100);
output_low(PIN_B7);
delay_ms(100);
}
void STP_Y_H() // Giro horario do motor eixo Y
{
output_high(PIN_B7);
delay_ms(100);
output_low(PIN_B7);
delay_ms(100);
output_high(PIN_B6);
delay_ms(100);
output_low(PIN_B6);
delay_ms(100);
output_high(PIN_B5);
delay_ms(100);
output_low(PIN_B5);
delay_ms(100);
output_high(PIN_B4);
delay_ms(100);
output_low(PIN_B4);
delay_ms(100);
}
void STP_X_AH () // Giro antihorario motor X.
{
output_high(PIN_B0);
delay_ms(100);
output_low(PIN_B0);
delay_ms(100);
output_high(PIN_B1);
delay_ms(100);
output_low(PIN_B1);
delay_ms(100);
output_high(PIN_B2);
delay_ms(100);
output_low(PIN_B2);
delay_ms(100);
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);
}
void STP_X_H() // Giro horario motor X
{
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);
output_high(PIN_B2);
delay_ms(100);
output_low(PIN_B2);
delay_ms(100);
output_high(PIN_B1);
delay_ms(100);
output_low(PIN_B1);
delay_ms(100);
output_high(PIN_B0);
delay_ms(100);
output_low(PIN_B0);
delay_ms(100);
}
void STATUS_PEN(pen) //Controle da posição da caneta de corte
{
if (pen==1) //Caneta Alta
{
servo1=9;
}
if (pen==0) // Caneta Baixa
{
servo1=0;
}
}
void main()
{
init_servo(); // Inicialização do Servo
STATUS_PEN(1);
while(true) // Laço infinito para executar as instruções anteriores apenas uma vez
{
while (PROG == 1) // Laço de programação.
{
if (COMP == 1 && lib == 0)
{
++qtd_passo;
lib = 1;
}
if (COMP == 0 && lib == 1)
{
lib = 0;
}
if (NUM_CORTE == 1 && lib1 == 0)
{
++qtd_corte;
lib1 = 1;
}
if (NUM_CORTE == 0 && lib1 == 1)
{
lib1 = 0;
}
}
if (START == 1) // Início da rotina de comandos.
{
for (nc=1;nc<=qtd_corte;++nc) //Laço que representa a quantidade de cortes.
{
if (sent_giro_my == 0)
{
STATUS_PEN(0);
delay_ms(500);
for (np=0; np <= corte; np++)
{
STP_Y_AH();
}
sent_giro_my=1;
STATUS_PEN(1);
delay_ms(500);
for (npx=1;npx<=qtd_passo;++npx)
{
STP_X_H();
}
}
if (sent_giro_my == 1)
{
STATUS_PEN(0);
delay_ms(500);
for (np=0; np <= corte; np++)
{
STP_Y_H();
}
sent_giro_my=0;
STATUS_PEN(1);
delay_ms(500);
for (npx=1;npx<=qtd_passo;++npx)
{
STP_X_H();
}
}
}
qtd_corte=0;
qtd_passo=0;
}
}
}
Todas as definições do programa estão descritas abaixo.
// Descrição
#include <16F628A.h> // Inclui a biblioteca do microcontrolador.
#FUSES INTRC_IO // Habilita o oscilador interno.
#FUSES NOMCLR // Desabilita o uso do Master Clear, pino RA5 disponível para uso como I/O.
#FUSES NOPROTECT // Desabilita a proteção contra leitura do código.
#FUSES NOLVP // Desabilita a programação em baixa tensão, pino RB4 disponível para uso como I/O.
#FUSES NOBROWNOUT // Desabilita o reset por Brownout.
#FUSES NOCPD // Desabilita a proteção da EEPROM
#FUSES NOWDT // Desabilita o Watch Dog Timer
#FUSES NOPUT // Desabilita o Power Up Timer
#use delay(clock=4000000) // Seta a fequencia do oscilador em 4MHz
#define Servo1_RA0 // Definição da porta A0 para conrole do servo
#include <1Servo-MIB.h> // Inclusão da biblioteca desenvolvida pela Meca In Brasil.com
int qtd_passo, lib, qtd_corte, lib1, np, npx, nc;
int pen, sent_giro_my, corte = 3;
#define PROG input(PIN_A4) // Atribui o nome "MXH" à entrade RA4
#define COMP input(PIN_A3) // Atribui o nome "NUM_CORTE" à entrad RA5
#define NUM_CORTE input(PIN_A2)
#define START input(PIN_A2)
// Interrupção do Timer0 para utilização de servo-motor.
void STP_Y_AH() // Giro antihorario motor eixo Y
{
output_high(PIN_B4);
delay_ms(100);
output_low(PIN_B4);
delay_ms(100);
output_high(PIN_B5);
delay_ms(100);
output_low(PIN_B5);
delay_ms(100);
output_high(PIN_B6);
delay_ms(100);
output_low(PIN_B6);
delay_ms(100);
output_high(PIN_B7);
delay_ms(100);
output_low(PIN_B7);
delay_ms(100);
}
void STP_Y_H() // Giro horario do motor eixo Y
{
output_high(PIN_B7);
delay_ms(100);
output_low(PIN_B7);
delay_ms(100);
output_high(PIN_B6);
delay_ms(100);
output_low(PIN_B6);
delay_ms(100);
output_high(PIN_B5);
delay_ms(100);
output_low(PIN_B5);
delay_ms(100);
output_high(PIN_B4);
delay_ms(100);
output_low(PIN_B4);
delay_ms(100);
}
void STP_X_AH () // Giro antihorario motor X.
{
output_high(PIN_B0);
delay_ms(100);
output_low(PIN_B0);
delay_ms(100);
output_high(PIN_B1);
delay_ms(100);
output_low(PIN_B1);
delay_ms(100);
output_high(PIN_B2);
delay_ms(100);
output_low(PIN_B2);
delay_ms(100);
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);
}
void STP_X_H() // Giro horario motor X
{
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);
output_high(PIN_B2);
delay_ms(100);
output_low(PIN_B2);
delay_ms(100);
output_high(PIN_B1);
delay_ms(100);
output_low(PIN_B1);
delay_ms(100);
output_high(PIN_B0);
delay_ms(100);
output_low(PIN_B0);
delay_ms(100);
}
void STATUS_PEN(pen) //Controle da posição da caneta de corte
{
if (pen==1) //Caneta Alta
{
servo1=9;
}
if (pen==0) // Caneta Baixa
{
servo1=0;
}
}
void main()
{
init_servo(); // Inicialização do Servo
STATUS_PEN(1);
while(true) // Laço infinito para executar as instruções anteriores apenas uma vez
{
while (PROG == 1) // Laço de programação.
{
if (COMP == 1 && lib == 0)
{
++qtd_passo;
lib = 1;
}
if (COMP == 0 && lib == 1)
{
lib = 0;
}
if (NUM_CORTE == 1 && lib1 == 0)
{
++qtd_corte;
lib1 = 1;
}
if (NUM_CORTE == 0 && lib1 == 1)
{
lib1 = 0;
}
}
if (START == 1) // Início da rotina de comandos.
{
for (nc=1;nc<=qtd_corte;++nc) //Laço que representa a quantidade de cortes.
{
if (sent_giro_my == 0)
{
STATUS_PEN(0);
delay_ms(500);
for (np=0; np <= corte; np++)
{
STP_Y_AH();
}
sent_giro_my=1;
STATUS_PEN(1);
delay_ms(500);
for (npx=1;npx<=qtd_passo;++npx)
{
STP_X_H();
}
}
if (sent_giro_my == 1)
{
STATUS_PEN(0);
delay_ms(500);
for (np=0; np <= corte; np++)
{
STP_Y_H();
}
sent_giro_my=0;
STATUS_PEN(1);
delay_ms(500);
for (npx=1;npx<=qtd_passo;++npx)
{
STP_X_H();
}
}
}
qtd_corte=0;
qtd_passo=0;
}
}
}
Programação.
Após montagem da placa é necessário programar o PIC. O PIC será o controlador de todas as ações dos motores, determinará quantos cortes e o distanciamento entre eles. Este programa irá traduzir o desejo do usuário para o circuito eletrônico através da linguagem C, o programa que usaremos é o C++ Builder.
Montagem da Placa
Para transferência da impressão do circuito para a placa, usamos papel glossy com a imagem impressa a laser. A transferência fooi feita usando um ferro de passar roupa sobre o papel. A imagem mostra o circuito impresso na placa.
Layout da Placa.
A figura mostra a distribuição dos componetes na placa, em 3D, recurso do Proteus que nos ajudará no momento da montagem física.
Construção das trilhas em Proteus.
Após simular o funcionamento do circuito, passamos para a construção das trilhas. A figura mostra essas trilhas.
Podemos ver na figura, o posicionamento dos componentes na placa. O próximo passo é imprimir as trilhas na placa de cobre e materializar nosso circuito.
Podemos ver na figura, o posicionamento dos componentes na placa. O próximo passo é imprimir as trilhas na placa de cobre e materializar nosso circuito.
Circuito Simulado no Proteus
O circuito abaixo mostra a simulação da montagem eletrônica da placa.
Podemos indentificar a instalação de dois motores de passo e servo motor, que será usado para realizar o movimento da caneta ou seja, o movimento do eixo Z.
Podemos indentificar a instalação de dois motores de passo e servo motor, que será usado para realizar o movimento da caneta ou seja, o movimento do eixo Z.
Assinar:
Postagens (Atom)