Grupo T / Mbed OS GRUPOT

main.cpp

Committer:
lucasfontenla
Date:
2018-05-08
Revision:
16:3adab04d42a6
Parent:
15:4604a7ee9c77
Child:
17:55e6270adab5

File content as of revision 16:3adab04d42a6:

#include "mbed.h"

// MACHINE SETUP ---------------------------------------------------------------------------

// drivers output signal
DigitalOut enable(D2);

DigitalOut dirX(D3);
DigitalOut stepX(D4);

DigitalOut dirY(D5);
DigitalOut stepY(D6);

DigitalOut dirZ(D7);
DigitalOut stepZ(D8);

// hardware input signal
// end-of-stroke sensors
InterruptIn endX(A2);
InterruptIn endY(A3);
InterruptIn endZ(A4);

// IHM for development
AnalogIn joyX(A0);
AnalogIn joyY(A1);

DigitalIn zUp(D15);
DigitalIn zDwn(D14);

// variables definition
int modeStatus = 1;

float valX;
float valY;
int valZUp;
int valZDwn;

int activeX = 1;
int activeY = 1;
int activeZ = 1;

int x_dir;
int y_dir;
int z_dir;

int x_plus = 0;
int x_minus = 1;
int y_plus = 1;
int y_minus = 0;
int z_plus = 0;
int z_minus = 1;

int x_limit = 0;
int x_block_max = 0;
int x_block_min = 0;

int y_limit = 0;
int y_block_max = 0;
int y_block_min = 0;

int z_limit = 0;
int z_block_max = 0;
int z_block_min = 0;

float ppsMax = 600.0;

int totalX = 0;
int totalY = 0;
int totalZ = 0;

float X = 0;
float Y = 0;
float Z = 0;

int endX1Status;
int endX2Status;

// machine parameters
float xPitch = 3.0;
float yPitch = 3.0;
float zPitch = 3.0;

float motor_steps_by_rotation = 200.0;
float step_mode = 0.5;
float steps_by_rotation = motor_steps_by_rotation/step_mode;

// prototype functions
void setupPins();
void move(int pps, int x_dir, int y_dir, int z_dir, int x_step, int y_step, int z_step);
float distance(int steps, float pitch);

void endX_press(void);
void endX_release(void);

void endY_press(void);
void endY_release(void);

void endZ_press(void);
void endZ_release(void);

void zeroX(int pps);
void zeroY(int pps);

// MAIN PROGRAM ----------------------------------------------------------------

int contador = 0;

int main(){
    printf("\nStarting...\r\n");
    
    enable = 0;
 
    endX.fall(&endX_press);
    endX.rise(&endX_release);
    
    endY.fall(&endY_press);
    endY.rise(&endY_release);
    
    endZ.fall(&endZ_press);
    endZ.rise(&endZ_release);
    
    if(modeStatus){
        //Código de JOG
        printf("JOG Selected\n\r");
        while(1){        
            valX = joyX;
            valY = joyY;
            
            valZUp = zUp;
            valZDwn = zDwn;
            
            if(valX > 0.7){
                if(x_dir != x_plus){
                    x_dir = x_plus;
                }
                activeX = 1; 
                totalX+=1;    
            }
            else if(valX < 0.3){
                if(x_dir != x_minus){
                    x_dir = x_minus;   
                }
                activeX = 1;   
                totalX-=1;  
            }
            else{
                activeX = 0;
            }
            
            //----------------------------------------------------------------------
            
            if(valY > 0.7){
                if(y_dir != y_minus){
                    y_dir = y_minus;   
                }
                activeY = 1;  
                totalY+=1;   
            }
            else if(valY < 0.3){
                if(y_dir != y_plus){
                    y_dir = y_plus;    
                }
                activeY = 1; 
                totalY-=1;   
            }
            else{
                activeY = 0;
            }
            
            //----------------------------------------------------------------------   
            
            if(!valZUp && valZDwn){
                if(z_dir != z_minus){
                    z_dir = z_minus;    
                }
                activeZ = 1;  
                totalZ-=1;  
            }
            else if(!valZDwn && valZUp){
                if(z_dir != z_plus){
                    z_dir = z_plus;   
                }
                activeZ = 1; 
                totalZ+=1;   
            }
            else {
                activeZ = 0;    
            }
            
            //----------------------------------------------------------------------

            move(ppsMax, x_dir, y_dir, z_dir, activeX, activeY, activeZ);  
            X = distance(totalX, xPitch);
            Y = distance(totalY, yPitch);
            Z = distance(totalZ, zPitch);
            
            if(contador > 10000){
                printf("X: %.2f     Y: %.2f     Z: %.2f\r\n", X, Y, Z);
                contador = 0;
            }
            
            contador+=1;
        }
    }
    
    else {
        while(1){
            move(ppsMax, x_plus, y_plus, z_plus, 0, 0, 400);
            move(ppsMax, x_plus, y_plus, z_minus, 0, 0, 400);    
        }
    }  
}  

// FUNCTIONS ----------------------------------------------------------------
void endX_press(void){
    printf("X - press\n\r");
    if(dirX == x_plus){
        x_block_max = 1;
    }
    else {
        x_block_min = 1;
    }
}
void endX_release(void){
    printf("X - release\n\r");
    x_block_min = 0;
    x_block_max = 0;
}

void endY_press(void){
    printf("Y - press\n\r");  
    if(dirY == y_plus){
        y_block_max = 1;
    }
    else {
        y_block_min = 1;
    } 
}
void endY_release(void){
    printf("Y - release\n\r");
    y_block_min = 0;   
    y_block_max = 0;
}

void endZ_press(void){
    printf("Z - press\n\r");
    if(dirZ == z_plus){
        z_block_max = 1;
    }
    else {
        z_block_min = 1;
    }
}
void endZ_release(void){
    printf("Z - release\n\r");
    z_block_min = 0;
    z_block_max = 0;
}

void move(int pps, int x_dir, int y_dir, int z_dir, int x_step, int y_step, int z_step){
    float time = 1.0/pps/2.0;
    
    dirX = x_dir;
    dirY = y_dir;
    dirZ = z_dir;
    
    // X
    if((x_dir == x_plus) && x_block_max){
        x_step = 0;    
    }
    if((x_dir == x_minus) && x_block_min){
        x_step = 0;    
    }
    
    // Y
    if((y_dir == y_plus) && y_block_max){
        y_step = 0;    
    }
    if((y_dir == y_minus) && y_block_min){
        y_step = 0;    
    }
    
    // Z
    if((z_dir == z_plus) && z_block_max){
        z_step = 0;    
    }
    if((z_dir == z_minus) && z_block_min){
        z_step = 0;    
    }
    
    int max_val;
    
    // maior número de passos -------
    if(x_step > y_step){
        if(x_step > z_step){
            max_val = x_step;
        }
        else {
            max_val = z_step;
        }
    } else if(y_step > z_step){
        max_val = y_step;
    }
    else {
        max_val = z_step;    
    }
    
    for(int i = 0; i < max_val; i++){
        if(i >= x_step){
            stepX = 0;
        }
        else { stepX = 1; }
        
        if(i >= y_step){
            stepY = 0;
        }
        else {
            stepY = 1;}
        
        if(i >= z_step){
            stepZ = 0;
        }
        else { stepZ = 1; }
        
        wait(time);
        stepX = 0;
        stepY = 0;
        stepZ = 0;
        wait(time); 
    }
}
/*
void zeroX(int pps){
    float time = 1.0/pps/2.0;
    
    while(!x_limit_min){
        if(dirX != x_minus){
            dirX = x_minus;    
        }
        stepX = 1;
        wait(time);
        stepX = 0;
        wait(time);  
    }
    
    printf("X zero\n\r");
    
    totalX = 0.0;
}

void zeroY(int pps){
    float time = 1.0/pps/2.0;
    
    while(!y_limit_min){
        if(dirY != y_minus){
            dirY = y_minus;    
        }
        stepY = 1;
        wait(time);
        stepY = 0;
        wait(time);  
    }
    
    printf("Y zero\n\r");
    
    totalY = 0.0;
}*/

float distance(int steps, float pitch){
    float delta_S = (((float)steps)/steps_by_rotation)*pitch;
    return delta_S;
}