Grupo T / Mbed OS GRUPOT

main.cpp

Committer:
lucasfontenla
Date:
2018-05-04
Revision:
9:d771a576e4fc
Parent:
8:de64672c240f
Child:
10:cd868ca9997c

File content as of revision 9:d771a576e4fc:

#include "mbed.h"

// Classes ---------------------------------------------------------------------------------
Timer debounce;

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

// drivers output signal
DigitalOut stepX(D2);
DigitalOut dirX(D3);

DigitalOut stepY(D8);
DigitalOut dirY(D9);

DigitalOut stepZ(D11);
DigitalOut dirZ(D12);

// hardware input signal
// end-of-stroke sensors
InterruptIn endX1(D5);
InterruptIn endX2(D13);

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

DigitalIn zUp(D7);
DigitalIn zDwn(D6);

// variables definition
int modeStatus = 0;

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 = 1;
int x_minus = 0;
int y_plus = 1;
int y_minus = 0;
int z_plus = 1;
int z_minus = 0;

int x_limit_min = 0;
int x_limit_max = 0;

float ppsMax = 600.0;

int totalX = 0;
int totalY = 0;

float X = 0;
float Y = 0;

int endX1Status;
int endX2Status;

// machine parameters
float xPitch = 3.0;
float yPitch = 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 endX1Int_press(void);
void endX1Int_release(void);

void endX2Int_press(void);
void endX2Int_release(void);

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

int contador = 0;

int main(){
    printf("Starting...\r\n");
    
    endX1.fall(&endX1Int_press);
    endX1.rise(&endX1Int_release);
    
    endX2.fall(&endX2Int_press);
    endX2.rise(&endX2Int_release);
    
    if(modeStatus){
        //Código de JOG
        printf("JOG Selected\n");
        while(1){        
            valX = joyX;
            valY = joyY;
            
            valZUp = zUp;
            valZDwn = zDwn;
            
            if(valX > 0.7){
                if(x_dir != x_minus){
                    x_dir = x_minus;
                }
                activeX = 1; 
                totalX-=1;    
            }
            else if(valX < 0.3){
                if(x_dir != x_plus){
                    x_dir = x_plus;   
                }
                activeX = 1;   
                totalX+=1;  
            }
            else{
                activeX = 0;
            }
            
            //----------------------------------------------------------------------
            
            if(valY > 0.7){
                if(y_dir != y_plus){
                    y_dir = y_plus;   
                }
                activeY = 1;  
                totalY+=1;   
            }
            else if(valY < 0.3){
                if(y_dir != y_minus){
                    y_dir = y_minus;    
                }
                activeY = 1; 
                totalY-=1;   
            }
            else{
                activeY = 0;
            }
            
            //----------------------------------------------------------------------   
            
            if(!valZUp && valZDwn){
                if(z_dir != z_minus){
                    z_dir = z_minus;
                    //totalZ-=1;    
                }
                activeZ = 1;    
            }
            else if(!valZDwn && valZUp){
                if(z_dir != z_plus){
                    z_dir = z_plus;
                    //totalZ+=1;   
                }
                activeZ = 1;    
            }
            else {
                activeZ = 0;    
            }
            
            //----------------------------------------------------------------------

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

// FUNCTIONS ----------------------------------------------------------------
void setupPins(){
    //endX1.mode(PullUp);
    //endX2.mode(PullUp);
}

void endX1Int_press(void){
    //if(debounce.read_ms() > 50)
    printf("X1 - press\n\r");
    x_limit_min = 1;
    //debounce.reset();    
}

void endX1Int_release(void){
    //if(debounce.read_ms() > 50)
    printf("X1 - release\n\r");
    x_limit_min = 0;
    //debounce.reset();    
}

void endX2Int_press(void){
    //if(debounce.read_ms() > 50)
    printf("X2 - press\n\r");
    x_limit_max = 1;
    //debounce.reset();    
}

void endX2Int_release(void){
    //if(debounce.read_ms() > 50)
    printf("X2 - release\n\r");
    x_limit_max = 0;
    //debounce.reset();    
}

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;
    
    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); 
    }
}

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