Professional Documents
Culture Documents
Fecha de entrega:
Lunes 10/12/18
1
Índice:
1. Especificaciones técnicas del proyecto en forma completa …………………………..3
2. Diagrama de
bloques…………………………………………………………………………..6
3. Morfología del
sistema………………………………………………………………………...7
4. Esquemático completo del
sistema…………………………………………………………7
4.1 Esquemático del control de motor paso a
paso…………………………………………7
4.2 Esquemático del control de motor
DC………………………………………………........7
5. PCB de los circuitos con nombres de los
integrantes……………………………………8
6. Software de instalación……………………………………………………………………….8
6.1 Tareas
preestablecidas………………………………………………………………………8
6.2 Interfaz……………………………………………………………………………………........9
7. Aportes y aplicaciones en general………………………………………………………….9
8. Conclusiones y recomendaciones………………………………………………………….9
9. Anexos……………………………………………………………………………………........10
9.1 Fotos estructura CNC y placas
PCB……………………………………………………...10
9.2 Programa del PIC……………………………………………………………………………11
2
1. ESPECIFICACIONES TECNICAS DEL PROYECTO EN FORMA COMPLETA
El siguiente CNC se realizó según especificaciones que se requerían en el laboratorio
3
B. Motor PAP
En los motores paso a paso debemos diferenciar los motores unipolares de los bipolares.
Los motores unipolares se llaman así porque la corriente que circula por los diferentes
bobinados siempre circula en el mismo sentido. En los motores bipolares para que
el motor funcione la corriente que circula por los bobinados cambia de sentido
4
en función de la tensión que se aplica. Por lo que un mismo bobinado puede tener en uno
de sus extremos distinta polaridad (bipolar).
Algunos motores tienen los bobinados de tal manera que en función de puentes pueden
convertirse en unipolares o bipolares.
Lo más importante de un motor es saber el tipo de motor que es, la potencia, el número
de pasos, el par de fuerza, la tensión de alimentación y poco más si son motores
sencillos.
5
2. DIAGRAMA DE BLOQUES
PC
PIC 18F4550
Eje x, con un motor PAP y correderas telescópicas que mueven una perfil de
aluminio, dicho motor tiene una resolución de 36 pasos por milímetro
Eje y con un motor PAP y correderas telescópicas que mueven una base de mdf,
dicho motor tiene una resolución de 36 pasos por milímetro
Eje z con un motor DC.
4. ESQUEMATICO COMPLETO DEL SISTEMA
Conexión del PIC 18F4550 y los motores paso a paso usando los driver puente H.
4.1 ESQUEMATICO DEL CONTROL DE MOTOR PASO A PASO
7
5. PCB DEL LOS CIRCUITOS CON NOMBRES DE LOS INTEGRANTES
6. SOFTWARE DE INSTALACIÓN
El programa es completamente ejecutable, la comunicación se hace mediante puerto
USB.
Interfaz creado en Visual Basic, que nos permite crear nuestro entorno de manera fácil y
práctica, para nuestro entorno crearemos botones de acciones instantáneas,
Antes de todo, lo primero que tenemos que hacer es agregar la clase easyHID.csal
proyecto de Visual Basic que habíamos creado antes. A través de ella podremos llamar a
las diferentes funciones de control que se encuentran en easyHID.dll, una librería
proporcionada por la empresa MecaniqueUK para el control de dispositivos USB
mediante protocolo HID. Para poder agregar la clase tenemos que agregar al directorio
donde se encuentra nuestro proyecto 2 archivos: mcHID.dll (Librería de control) y
easyHID.cs(Clase con las funciones de control definidas).
Y después ya se puede empezar a programar en CCs
8
6.1 TAREAS PREESTABLECIDAS
- Empezar en el origen.
- Dibujar cuadrado.
- Dibujar triangulo: triángulo equilátero y triangulo rectángulo.
- Dibujar círculo.
- Dibujar rectángulo.
- Regresa a la posición inicial.
- Posicionarse en un punto de origen.
6.2. INTERFAZ
El siguiente trabajo tiene una muy confiable estabilidad lo que hace pueda tener
una aplicación más práctica.
Aplicaciones como una maquina fresadora, impresora 3D, etc.
8. CONCLUSIONES Y RECOMENDACIONES
9
9. ANEXOS
9.1 Fotos estructura CNC y placas PCB
10
9.2 Programa del PIC
#include <18F4550.h> // Definición de registros internos del PIC18F4550.
//#DEVICE ADC=8 // CAD a 8 bits, justificación a a la derecha.
//#DEVICE ADC=16 // CAD a 10 bits, justificación a a la izquierda.
#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
//=================================================================================================
=======
//=================================================================================================
=======
// Usamos fast_io.
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
void DistanciaDerechaX(void);
void DistanciaIzquierdaX(void);
void DistanciaDerechaY(void);
void DistanciaIzquierdaY(void);
void ActivaSalida(void);
void Cuadrado(void);
11
void Triangulo(void);
void TrianguloRectangulo(void);
void Circulo(void);
void EjeZSube(void);
void EjeZBaja(void);
void Origen(void);
void Acumulador(void);
float CalculaDer(float);
float CalculaIzq(float);
void USB_debug(){
OUTPUT_LOW(PIN_E0);
OUTPUT_HIGH(PIN_E1);
usb_wait_for_enumeration(); // Espera a ser enumerado por el host.
OUTPUT_HIGH(PIN_E0);
OUTPUT_LOW(PIN_E1);
}
//=====================================FUNCIONES==========================================
===================
// Variables globales.
float DDx,DIx,DDy,DIy,yTope1,yTope2,yTope3,yTope4,lado,base;
int32 i,j,k,l,t,p,inc,inc2,inc3,inc4;
float NumPasosDX,NumPasosIX,NumPasosDY,NumPasosIY,LadoC,LadoT,Radio,LadoTMedio;
float Altura,Bases;
float SumaDDx=0;
float SumaDDy=0;
float SumaDIx=0;
float SumaDIy=0;
int32 RestoDx,RestoIx,RestoDy,RestoIy;
int8 recibe[USB_EP1_RX_SIZE]; // Declaramos la variable recibe de 32 bytes.
int8 envia[USB_EP1_TX_SIZE];
int8 figura;
set_tris_b(0b00000000); //PortB
set_tris_a(0b11111000);
set_tris_d(0b00000000); //PortD
set_tris_e(0b00000000);
//PORTB = 0x00;
//PORTA = 0x00;
//PORTD = 0x00;
envia[2]=0;
envia[4]=0;
12
output_b(0x00);
//output_a(0xF8);
output_d(0x00);
OUTPUT_LOW(PIN_E0);
OUTPUT_LOW(PIN_E1);
// OUTPUT_LOW(PIN_E2);
//---------------------------------------------------------------------------
//CUADRADO
if (figura == 1)
{
delay_ms(5);
LadoC=lado;
EjeZBaja();
Cuadrado();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
//TRIANGULO
if (figura == 2)
{
delay_ms(5);
LadoT=lado;
EjeZBaja();
Triangulo();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
//CIRCULO
if (figura == 3)
{
delay_ms(5);
Radio=lado;
EjeZBaja();
Circulo();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
if (figura == 4)
{
delay_ms(5);
13
DIx=lado;
SumaDIx=DIx+SumaDIx;
EjeZBaja();
DistanciaIzquierdaX();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
if (figura == 5)
{
delay_ms(5);
DDx=lado;
SumaDDx=DDx+SumaDDx;
EjeZBaja();
DistanciaDerechaX();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
if (figura == 6)
{
delay_ms(5);
DDy=lado;
SumaDDy=DDy+SumaDDy;
EjeZBaja();
DistanciaDerechaY();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
if (figura ==7)
{
delay_ms(5);
DIy=lado;
SumaDIy=DIy+SumaDIy;
EjeZBaja();
DistanciaIzquierdaY();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
if (figura == 8)
{
delay_ms(5);
Altura=lado;
Bases=base;
EjeZBaja();
TrianguloRectangulo();
output_b(0x00);
output_d(0x00);
EjeZSube();
}
if (figura == 9)
{
delay_ms(5);
Origen();
output_b(0x00);
output_d(0x00);
EjeZBaja();
14
EjeZSube();
SumaDDx=0;
SumaDDy=0;
SumaDIx=0;
SumaDIy=0;
}
}
leer_datos:
{
if (usb_kbhit(1)) // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la
variable data.
{
usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE); // En el buffer lo tomamos del EP1 y lo
guardamos en la variable recibe....
lado = recibe[2];
figura = recibe[3];
base = recibe[4];
delay_ms(3);
goto mover_1era_coor;
}
goto leer_datos;
}
}
}
void Cuadrado(void ){
DDy=LadoC;
DistanciaDerechaY();
DIx=LadoC;
DistanciaIzquierdaX();
DIy=LadoC;
DistanciaIzquierdaY();
DDx=LadoC;
DistanciaDerechaX();
void Triangulo(void ){
LadoTMedio=LadoT*2;
for(t=0; t<LadoTMedio;t++){
DDy=sqrt(3)*0.25;
DistanciaDerechaY();
DIx=0.25;
DistanciaIzquierdaX();
DDy=sqrt(3)*0.25;
DistanciaDerechaY();
DIx=0.25;
DistanciaIzquierdaX();
15
DIy=sqrt(3)*0.25;
DistanciaIzquierdaY();
for(t=0; t<LadoTMedio;t++){
DIx=0.25;
DistanciaIzquierdaX();
DIy=sqrt(3)*0.25;
DistanciaIzquierdaY();
}
DDx=LadoT;
DistanciaDerechaX();
}
void TrianguloRectangulo(void){
DDx=Bases;
DistanciaDerechaX();
DDy=Altura;
DistanciaDerechaY();
for(p=0; p<Bases*4;p++){
DIx=0.25;
DistanciaIzquierdaX();
DIy=(Altura/Bases)*0.25;
DistanciaIzquierdaY();
}
void Origen(void){
if(SumaDDx>=SumaDIx){
DIx=SumaDDx-SumaDIx;
DistanciaIzquierdaX();
}
else{
DDx=SumaDIx-SumaDDx;
DistanciaDerechaX();
}
if(SumaDDy>=SumaDIy){
DIy=SumaDDy-SumaDIy;
DistanciaIzquierdaY();
}
else{
DDy=SumaDIy-SumaDDy;
DistanciaDerechaY();
}
}
void Circulo(void ){
for(inc=1; inc<=Radio*4;inc++){
16
DIx=0.25;
DistanciaIzquierdaX();
yTope1 = CalculaDer(inc*0.25);
DDy=yTope1;
DistanciaDerechaY();
}
yTope2 = CalculaIzq(inc2*0.25);
DIy=yTope2;
DistanciaIzquierdaY();
DIx=0.25;
DistanciaIzquierdaX();
}
DDx=0.25;
DistanciaDerechaX();
yTope3 = CalculaDer(inc3*0.25);
DIy=yTope3;
DistanciaIzquierdaY();
}
yTope4 = CalculaIzq(inc4*0.25);
DDy=yTope4;
DistanciaDerechaY();
DDx =0.25;
DistanciaDerechaX();
}
float CalculaDer(float x1 ){
float y1;
y1 = sqrt((pow(Radio,2))-(pow(Radio-x1,2)))-sqrt((pow(Radio,2))-(pow(Radio-x1+0.25,2)));
return y1;
float CalculaIzq(float x2 ){
float y2;
y2 = sqrt((pow(Radio,2))-(pow(x2-0.25,2)))-sqrt((pow(Radio,2))-(pow(x2,2)));
return y2;
17
void DistanciaDerechaX(void )
{
NumPasosDX = DDx*143;
for(i=0; i<NumPasosDX;i++){
RestoDx = i%4;
OUTPUT_B(VectorDerecha[RestoDx]);
ActivaSalida();
}
output_b(0x00);
}
void DistanciaIzquierdaX(void ){
NumPasosIX = DIx*143;
for(j=0;j< NumPasosIX;j++){
RestoIx = j%4;
OUTPUT_B(VectorIzquierda[RestoIx]);
ActivaSalida();
}
output_b(0x00);
}
void DistanciaDerechaY(void )
{
NumPasosDY = DDy*142;
for(k=0; k<NumPasosDY;k++){
RestoDy = k%4;
OUTPUT_D(VectorDerecha[RestoDy]);
ActivaSalida();
}
output_d(0x00);
}
void DistanciaIzquierdaY(void ){
NumPasosIY = DIy*142;
for(l=0;l< NumPasosIY;l++){
RestoIy = l%4;
OUTPUT_D(VectorIzquierda[RestoIy]);
ActivaSalida();
}
output_d(0x00);
}
void ActivaSalida(void)
{
delay_ms(5);
}
18
void EjeZSube(void){
OUTPUT_A(VectorZ[0]);
delay_ms(1200);
OUTPUT_A(VectorZ[2]);
delay_ms(1200);
}
void EjeZBaja(void){
OUTPUT_A(VectorZ[1]);
delay_ms(1200);
OUTPUT_A(VectorZ[2]);
delay_ms(1200);
19
20