Como o projeto está até agora....

Dependencies:   Servo TCS3200 X_NUCLEO_IHM01A1 mbed TextLCD2

Fork of QEI_HelloWorld by Aaron Berk

main.cpp

Committer:
Victor_Mirkhan
Date:
2017-05-12
Revision:
2:666ad168bacb
Parent:
1:30696e4d196b
Child:
3:77d4b108568c

File content as of revision 2:666ad168bacb:

#include "mbed.h"
#include "RPG.h"
#include "L6474.h"

// Seta o encoder utilizado. Precisa de duas entradas (D14 e D15) e uma terceira 
// que seria o seu botão. Como nosso encoder não tem um botão, declara-se qualquer
// pino, já que nem será utilizado.

RPG rpg1(D14,D15,PC_13); 

/*-----Declaração dos pinos e suas funções-----*/

//PINOS DE INTERRUPÇÃO.

// Pinos D15 e D14 são ligados ao encoder e setados como pinos de interrupção.
InterruptIn encod1(D15);
InterruptIn encod2(D14);

// Botão do usuario é setado para interrupção, especialmente para a fase de 
// prototipação.
InterruptIn usuario(PC_13);

//PINOS DE SAIDA DIGITAL.

// Declara o Led da placa como saída digital.
DigitalOut Led(D13); 

/*-----Declaração de variaveis globais do código-----*/

bool refer1 = false; // Parametro para o referenciamento do motor 1
bool refer2 = false; // Parametro para o referenciamento do motor 2
bool refer3 = false; // Parametro para o referenciamento do motor 3

int count;  // Contagem de pulsos do encoder
int change = 0;  // Numero que varia de 0 a 2, indicando qual set de velocidade será usado
int dirt = 0;  // Variavel que pega o estado presente do encoder

// Criação de uma struct (basicamente, uma classe) para sets de velocidades e acelerações
// diferentes. Cada objeto dessa struct possui os argumentos de velocidades max e min e 
// aceleração e desaceleração.

struct set_velocidades {
    int maxspeed;
    int minspeed;
    int ac;
    int dc;
};

struct set_velocidades set[3]; //Cria um objeto da struct set_velocidades com três
                               //objetos dentro dele (basicamente, um objeto triplo).

//Struct para sets de coordenadas, com argumentos de posição em x,y e z.
struct Coordenadas {
    int posx;
    int posy;
    int posz;
};

struct Coordenadas PickPos,DropPos[3]; //Cria objeto unico para posição de pick, e 
                                       //objeto triplo para posição de place.
                               
// Declaração dos motores utilizados.

L6474 *motor1;
L6474 *motor2;
L6474 *motor3;

/*-----Declaração de funções auxiliares----*/

// Função chamada ao atingir o sensor fim de curso. Para o motor e aciona o zera-
// mento ao alterar o valor da variavel refer.

void motor1_off(void) {
    motor1->hard_stop();
    printf("Interrupcao Feita!\r\n");
    refer1 = true;
}
   
// Função chamada na interrupção de um dos sentidos de rotação do encoder. Basicamente,
// desabilita as interrupções enquanto opera ("disable_irq()"), aumenta o contador e
// depois ativa as interrupções novamente ("enable_irq()"). 

void mais(void){
    encod2.disable_irq();
    encod1.disable_irq();
    count = count + 1                             ;
    wait(0.002);
    encod1.enable_irq();
    encod2.enable_irq();
}

// Função chamada na interrupção de um dos sentidos de rotação do encoder. Basicamente,
// desabilita as interrupções enquanto opera ("disable_irq()"), diminui o contador e
// depois ativa as interrupções novamente ("enable_irq()"). 

void menos(void){
    encod2.disable_irq();
    encod1.disable_irq();
    count = count - 1;
    wait(0.002);
    encod1.enable_irq();
    encod2.enable_irq();
}

// Função que seta para o motor 1 suas velocidades máxima e minima, aceleração
// e desaceleração.
 
void set_aceleracoes(int maxspeed,int minspeed,int ac,int dc) {
    motor1->set_max_speed(maxspeed);
    motor1->set_min_speed(minspeed);
    motor1->set_acceleration(ac);
    motor1->set_deceleration(dc);
}

void save_pick(void) {
    PickPos.posx = motor1->get_position();
    PickPos.posy = motor2->get_position();
    PickPos.posz = motor3->get_position();
    printf("Posicao de Pick:\r\n");
    printf("X = %d, Y = %d, Z = %d\r\n",PickPos.posx,PickPos.posy,PickPos.posz);
}
//Função que é chamada logo na inicialização do programa para realizar o zera-
// mento das posições dos motores. 

void seta_origem() {
    
    set_aceleracoes(7000,2000,1000,500); //Seta uma alta aceleração para o referenciamento
    usuario.rise(&motor1_off); //Chamada do fim de curso para a função de interrupção
    
    while(1) {
        
        //Motor continua andando em uma só direção enquanto variavel refer1 estiver
        // em FALSE
        
        if (refer1 == false){
            motor1->run(StepperMotor::BWD);
            motor1->wait_while_active();   
            }
        
        // Se a interrupção for chamada, a variavel refer1 se torna TRUE, acionando
        // os comandos a seguir.
        
        else {
            motor1->move(StepperMotor::FWD,1000); //Leve recuo
            motor1->wait_while_active();
            motor1->set_home(); // Seta posição de Home
            int HomePosition = motor1->get_position();
            printf("Posicao Home = %d\r\n",HomePosition); //Verificar que HomePosition = 0
            refer1 = false;
            break;   //Quebra do loop while, pois referenciamento do motor foi feito
            }
        
        }
}

// Função chamada para alternar entre os sets de velocidade.

void muda_velocidade() {
    change = change + 1;
    if (change == 3) {
        change = 0;
    }
    printf("Velocidade %d\r\n",change + 1);
    set_aceleracoes(set[change].maxspeed,set[change].minspeed,set[change].ac,set[change].dc);
}

int main() {
    
    //Prepara os 3 sets de velocidade, com velocidaes e acelerações variadas.
    
    set[0].maxspeed = 2000;
    set[0].minspeed = 1000;
    set[0].ac = 500;
    set[0].dc = 500;
    
    set[1].maxspeed = 4000;
    set[1].minspeed = 2000;
    set[1].ac = 750;
    set[1].dc = 750;
    
    set[2].maxspeed = 7000;
    set[2].minspeed = 5000;
    set[2].ac = 1000;
    set[2].dc = 1000;
    
    
    DevSPI dev_spi(D11, D12, D13);

    //Inicialização dos componentes dos motores
    motor1 = new L6474(D2, D8, D7, D9, D10, dev_spi);
    motor2 = new L6474(D2, D8, D4, D3, D10, dev_spi);
    motor3 = new L6474(D2, D8, D5, D6, D10, dev_spi);
    
    if (motor1->init() != COMPONENT_OK) {
        exit(EXIT_FAILURE);
    }
    if (motor2->init() != COMPONENT_OK) {
        exit(EXIT_FAILURE);
    }
    if (motor3->init() != COMPONENT_OK) {
        exit(EXIT_FAILURE);
    }
    
    // Após inicializar tudo, inicia o zeramento.
    seta_origem();
    
    //Seta a velocidade inicial como a primeira combinação do set
    set_aceleracoes(set[0].maxspeed,set[0].minspeed,set[0].ac,set[1].dc);
    
    while(1) {
           
        //Declara as funções a serem chamadas nas bordas se subida de cada entrada.
        
        encod1.rise(&mais);
        encod2.rise(&menos);
        usuario.rise(&muda_velocidade);
        //usuario.rise(&save_pick);
        
        /*---PAR DE LOOPS PARA O JOG---*/
        
        // Esse loop faz com que, caso e enquanto o contador for menor que zero,
        // o motor proporcione o movimento BACKWARD.
        
        if (count < 0) {
            while(count < 0) {
                motor1->run(StepperMotor::BWD);
                wait(0.1);
                count = count + 1;  //Acrescenta 1 ao contador a cada 0.1seg, aproximando-o de zero.
                if (count >= 0) {   //Se o contador mudar para 0 ou positivo, motor para e quebra o while.
                    motor1->hard_stop(); 
                    count = 0;
                    break;
                }
            }
        }
        
        // Esse loop faz com que, caso e enquanto o contador for maior que zero,
        // o motor proporcione o movimento FOWARD.
        
        if (count > 0) {
            while(count > 0) {
                motor1->run(StepperMotor::FWD);
                wait(0.1);
                count = count - 1; //Decrescenta 1 ao contador a cada 0.1seg, aproximando-o de zero.
                if (count <= 0) {  //Se o contador mudar para 0 ou negativo, motor para e quebra o while.
                    motor1->hard_stop();
                    count = 0;
                    break;
                }
            }
        }
        
        count = 0;
        
    }
}