Grupo T / Mbed OS GRUPOT

main.cpp

Committer:
lucasfontenla
Date:
2018-05-04
Revision:
7:27ea14e58788
Parent:
6:af32c68ff4cf
Child:
8:de64672c240f

File content as of revision 7:27ea14e58788:

#include "mbed.h"

// 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
DigitalIn endX1(D5);
DigitalIn endX2(D10);

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

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

// 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;

float ppsMax = 600.0;

int totalX = 0;
int totalY = 0;

float X = 0;
float Y = 0;

// machine parameters
float xPitch = 5.0;
float yPitch = 5.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 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);

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

int contador = 0;

int main(){
    printf("Starting...\r\n");
    
    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_dir = 0;
                }
                activeX = 1; 
                totalX-=1;    
            }
            else if(valX < 0.3){
                if(!x_dir){
                    x_dir = 1;   
                }
                activeX = 1;   
                totalX+=1;  
            }
            else{
                activeX = 0;
            }
            
            //----------------------------------------------------------------------
            
            if(valY > 0.7){
                if(!y_dir){
                    y_dir = 1;   
                }
                activeY = 1;  
                totalY+=1;   
            }
            else if(valY < 0.3){
                if(y_dir){
                    y_dir = 0;    
                }
                activeY = 1; 
                totalY-=1;   
            }
            else{
                activeY = 0;
            }
            
            //----------------------------------------------------------------------   
            
            if(!valZUp && valZDwn){
                if(z_dir){
                    z_dir = 0;
                    //totalZ-=1;    
                }
                activeZ = 1;    
            }
            else if(!valZDwn && valZUp){
                if(!z_dir){
                    z_dir = 1;
                    //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 {
        //Código de execução fora do JOG    
    }
    
}

// FUNCTIONS ----------------------------------------------------------------

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