Programa araña

Dependencies:   mbed

main.cpp

Committer:
Yulied97
Date:
2018-11-20
Revision:
0:bf91ab2afeaf

File content as of revision 0:bf91ab2afeaf:

#include "mbed.h"
#include <Serial.h>
#include "Color.h"

//*****************************************************************************//
// Universidad ECCI - Ingenieria mecatronica
// Sistemas embebidos - Control por telecomandos
// Mario Esteban Galeano Rodriguez
//*****************************************************************************//

//*****************************************************************************//
//Declaración de variables
    
    uint8_t data [3];
    int color, ciclos;
    char status = 0;
    Serial pc(SERIAL_TX, SERIAL_RX, 9600);

//*****************************************************************************//
// Timer para lectura del sensor

    Timer timeRead;
    Timer timeSerial;
    AnalogIn value_y (A0);
    AnalogIn value_x(A1);
    
    float valor_y;
    float valor_x;
    
//*****************************************************************************//
// Posiciones movimientos
    
    int arriba = 5;
    int abajo = 25;

//*****************************************************************************//
// Otras variables

    int tiempo = 200;
    
//*****************************************************************************//
// Distribución pines servomotores

// Brazo derecho delante 
    PwmOut servo_1 (PA_10);     //D0
    PwmOut servo_2 (PB_3);      //D1

// Brazo derecho atras
    PwmOut servo_3 (PB_5);      //D8
    PwmOut servo_4 (PB_4);      //D9

// Brazo izquierdo adelante
    PwmOut servo_5 (PB_10);     //D10
    PwmOut servo_6 (PA_8);      //D11

// Brazo izquierdo atras
    PwmOut servo_7 (PA_9);      //D12
    PwmOut servo_8 (PB_6);      //D13

//*****************************************************************************//
// Función para el control de servomotores

void controlServo(int n_servo, int degrees)
{        
    int p_width = ((degrees*2000)/180)+500;
     
    switch (n_servo)
    {
        case 1:
            servo_1.pulsewidth_us(p_width);
            break;
            
        case 2:
            servo_2.pulsewidth_us(p_width);
            break;
        
        case 3:
            servo_3.pulsewidth_us(p_width);
            break;
            
        case 4:
            servo_4.pulsewidth_us(p_width);
            break;
        
        case 5:
            servo_5.pulsewidth_us(p_width);
            break;
            
        case 6:
            servo_6.pulsewidth_us(p_width);
            break;
        
        case 7:
            servo_7.pulsewidth_us(p_width);
            break;
            
        case 8:
            servo_8.pulsewidth_us(p_width);
            break;
        
        default:
            break;
    }
}

//*****************************************************************************//
// Funcion para movimiento de los brazos

void controlBrazo (int Brazo, int movimiento)
{
    if (Brazo == 0x01)
    {
        switch (movimiento)
        {
            case 1:// handRightUp
                controlServo(2, arriba-5);
                break;
            
            case 2:// handRightDown
                controlServo(2, abajo-5);
                break;
            
            case 3:// handRightForward
                controlServo(1, 70);
                break;
                
            case 4:// handRightReverse
                controlServo(1, 15);
                break;
            
            default:
                break;
        }
    }
    
    else if (Brazo == 0x02)
    {
        switch (movimiento)
        {
            case 1:// legRightUp
                controlServo(4, arriba-5);
                break;
            
            case 2:// legRightDown
                controlServo(4, abajo-10);
                break;
            
            case 3:// legRightForward
                controlServo(3, 150);
                break;
                
            case 4:// legRightReverse
                controlServo(3, 95);
                break;
            
            default:
                break;
        }
    }
    
    else if (Brazo == 0x03)
    {
        switch (movimiento)
        {
            case 1:// handLeftUp
                controlServo(6, arriba);
                break;
            
            case 2:// handLeftDown
                controlServo(6, abajo);
                break;
            
            case 3://handLeftForward
                controlServo(5, 60);
                break;
                
            case 4:// handLeftReverse
                controlServo(5, 118);
                break;
            
            default:
                break;
        }
    }
    
    else if (Brazo == 0x04)
    {
        switch (movimiento) 
        {
            case 1:// legLeftUp
                controlServo(8, arriba);
                break;
            
            case 2:// legLeftDown
                controlServo(8, abajo);
                break;
            
            case 3:// legLeftForward
                controlServo(7, 10);
                break;
                
            case 4:// legLeftReverse
                controlServo(7, 65);
                break;
            
            default:
                break;
        }
    }    
}

//*****************************************************************************//
//Funciones movimientos

void inicialPosition ()
{   
    controlServo(2,arriba);
    controlServo(1,50);
    wait_ms(80);
    controlServo(2,abajo-12);
    
    controlServo(4,arriba);
    controlServo(3,105);
    wait_ms(80);
    controlServo(4,abajo-12);
    
    controlServo(6,arriba);
    controlServo(5,80);
    wait_ms(80);
    controlServo(6,abajo);
    
    controlServo(8,arriba);
    controlServo(7,45);
    wait_ms(80);
    controlServo(8,abajo);    
}

void forward()
{       
    //*************************************************************//
    // POSICION INICIAL
                
    controlServo(5,118);    // Brazo 3 atras
    controlServo(7,5);      // Brazo 4 adelante
    wait_ms(tiempo);        // Tiempo en posicion
                
    //*************************************************************//
    // PRIMER PASO
                
    controlBrazo(3,1);      // brazo 3 arriba
    controlServo(7,50);     // Brazo 4 atras
    controlServo(5,50);     // Brazo 3 avanza
    controlServo(3,90);     // Brazo 2 atras 
    wait_ms(tiempo);        // tiempo en posicion arriba
                
    controlBrazo(3,2);      // Brazo 3 baja
    controlServo(1,25);     // Brazo 1 atras
    wait_ms(tiempo);
                
    //*************************************************************//
    // SEGUNDO PASO
                
    controlBrazo(2,1);      // Brazo 2 arriba
    controlServo(1,8);      // Brazo 1 atras
    controlServo(3,150);    // Brazo 2 adelante
    controlServo(7,50);     // Brazo 4 atras 
    wait_ms(tiempo);        // Tiempo en posicion arriba
                
    controlBrazo(2,2);      // brazo 2 abajo
    controlServo(5,100);    // Brazo 3 atras
                
    //*************************************************************//
    // TERCER PASO
                
    controlBrazo(1,1);      // Brazo 1 arriba
    controlServo(3,90);     // Brazo 2 atras
    controlServo(1,60);     // Brazo 1 adelante
    controlServo(7,65);     // Brazo 4 atras
    wait_ms(tiempo);
    controlBrazo(1,2);      // Brazo 1 abajo
    controlServo(5,118);
    
    //*************************************************************//
    // TERCER PASO            
    controlBrazo(4,1);
    controlServo(7,5);      // Brazo 4 adelante
    wait_ms(tiempo);
    controlBrazo(4,2);
}

void reverse()
{       
    //*************************************************************//
    // POSICION INICIAL
                
    controlServo(5,118);    // Brazo 3 atras
    controlServo(7,5);      // Brazo 4 adelante
    wait_ms(tiempo);        // Tiempo en posicion
                
    //*************************************************************//
    // PRIMER PASO
    
    controlBrazo(4,1);      // brazo 4 arriba
    controlServo(5,60);     // Brazo 3 atras
    controlServo(7,65);     // Brazo 4 avanza
    controlServo(1,70);     // Brazo 1 atras 
    wait_ms(tiempo);        // tiempo en posicion arriba
                
    controlBrazo(4,2);      // Brazo 4 abajo
    controlServo(3,120);    // Brazo 1 atras
    wait_ms(tiempo);
    
    //**************************************************************//
    // SEGUNDO PASO
    
    controlBrazo(1,1);      // Brazo 1 arriba
    controlServo(5,70);     // Brazo 3 atras
    controlServo(1,8);      // Brazo 1 adelante
    controlServo(3,150);    // Brazo 2 atras 
    wait_ms(tiempo);        // Tiempo en posicion arriba
                
    controlBrazo(1,2);      // brazo 1 abajo
    controlServo(7,35);     // Brazo 4 atras
                
    //*************************************************************//
    // TERCER PASO
    
    controlBrazo(2,1);      // Brazo 2 arriba
    controlServo(1,70);     //Brazo 1 adelante
    controlServo(3,95);     //Brazo 2 atras
    controlServo(5,60);     // Brazo 4 adelante
    wait_ms(tiempo);
    
    controlBrazo(2,2);      // Brazo 2 abajo
    controlServo(7,10);     // Brazo 4 adelante
    
    //*************************************************************//
    // TERCER PASO      
          
    controlBrazo(3,1);      //Brazo 3 arriba
    controlServo(5,118);    // Brazo 4 adelante
    wait_ms(tiempo);
    controlBrazo(3,2);
}

void right()
{
    //*************************************************************//
    // POSICION INICIAL
                
    controlServo(5,118);    // Brazo 3 atras
    controlServo(7,5);      // Brazo 4 adelante
    wait_ms(tiempo);        // Tiempo en posicion
    
    //*************************************************************//
    // PASO 1
    
    controlBrazo(3,1);
    controlServo(5,60);
    controlServo(1,70);
    controlServo(7,40);
    controlServo(3,130);
    wait_ms(tiempo);
    controlBrazo(3,2);
    
    // PASO 2
    controlBrazo(1,1);
    controlServo(1,8);
    controlServo(3,150);
    controlServo(5,80);
    controlServo(7,55);
    wait_ms(tiempo);
    controlBrazo(1,2);
    
    // PASO 3
    controlBrazo(2,1);
    controlServo(3,95);
    controlServo(1,30);
    controlServo(5,100);
    controlServo(7,65);
    wait_ms(tiempo);
    controlBrazo(2,2);
    
    //PASO 4
    controlBrazo(4,1);
    controlServo(7,10);
    controlServo(5,118);
    controlServo(1,45);
    controlServo(3,105);
    wait_ms(tiempo);
    controlBrazo(4,2);
}

void left()
{
    //*************************************************************//
    // POSICION INICIAL
                
    controlServo(1,8);      // Brazo 3 atras
    controlServo(3,150);    // Brazo 4 adelante
    wait_ms(tiempo);        // Tiempo en posicion
    
    //*************************************************************//
    // PASO 1
    
    controlBrazo(1,1);
    controlServo(3,105);
    controlServo(1,70);
    controlServo(5,60);
    controlServo(7,55);
    wait_ms(tiempo);
    controlBrazo(1,2);
    
    // PASO 2
    controlBrazo(3,1);
    controlServo(1,50);
    controlServo(5,118);
    controlServo(3,80);
    controlServo(7,15);
    wait_ms(tiempo);
    controlBrazo(3,2);
    
    // PASO 3
    controlBrazo(4,1);
    controlServo(5,100);
    controlServo(7,65);
    controlServo(3,95);
    controlServo(1,30);
    wait_ms(tiempo);
    controlBrazo(4,2);
    
    //PASO 4
    controlBrazo(2,1);
    controlServo(1,8);
    controlServo(3,150);
    controlServo(5,80);
    controlServo(7,45);
    wait_ms(tiempo);
    controlBrazo(2,2);
    controlBrazo(1,2);
    controlBrazo(3,2);
}

//*****************************************************************************//
// Funcion para la lectura de datos

uint8_t readComand()
{
    timeSerial.reset();
    timeSerial.start();
    
    while (timeSerial.read_ms() <= 120)
    {
        if(pc.readable())
        {
            char charRead = pc.getc();
            
            if (charRead == 0xFF)
            {            
                for (int i=0; i<3; i++)
                {
                    data[i] = pc.getc();
                }     
            }    
            
            charRead = pc.getc();
                
            if (charRead != 0xFD)
            {
                pc.printf("\nError al recibir comando, intente nuevamente\n");
                return 0;    
            }
                
            return 1;
        }
    }
    return 0;
}

void readSensor()
{
    valor_y = value_y.read();
    valor_y = valor_y*3300;
    //pc.printf("\nValor Y: %f\n",valor_y);
    
    valor_x = value_x.read();
    valor_x = valor_x*3300;
    //pc.printf("\nValor X: %f\n",valor_x);
}

void up (void)
{
    controlBrazo(1,2);
    controlBrazo(2,1);
    controlBrazo(3,2);
    controlBrazo(4,1);
}

// *********************************************************************************************************************************//
// Programa principal


int main ()
{
    inicialPosition ();
    wait(1);
        
    while (1)
    {
       // Lectura constante del color  
       color = readColor();
       
       // lectura del joystick cada 100 ms
       timeRead.start();
       
       if (timeRead.read_ms() >= 100)
       {
           readSensor();
           timeRead.reset();
       }
       
       while (readComand())
       {    
            // Codigo para comandos desde CoolTerm
       
            if (data[0] == 0x01)
            {
                // Codigo para movimiento independiente de los servomotores desde CoolTerm
                controlServo(data[1],data[2]);       
                pc.printf("\nNumero motor: %d", data[1]);
                pc.printf("\nGrados: %d\n", data[2]);
            }   
                   
            else if(data[0]==0x02)
            {
                // Codigo para movimiento de las extremidades desde CoolTerm
                pc.printf("\nNumero brazo: %d", data[1]);
                pc.printf("\nMovimiento: %d\n", data[2]);
                controlBrazo(data[1],data[2]);
            }
            
            else if (data[0] == 3)
            {
                // Codigo para llevar a posicion inicial desde CoolTerm
                inicialPosition ();
            }
            
            else if (data[0] == 4)
            {
                // Codigo para lectura de color desde CoolTerm
                color = readColor();
                pc.printf("\nColor: %d\n", color);
            } 
        }
               
        if (valor_y <= 1000)
        {
            // Codigo para movimiento adelante segun joystick
            
            if (readColor() == 1)
            {
                for (int i=0; i<2; i++)
                {
                    // Si el color es rojo gira a la derecha
                    right();
                }
            }
            
            else if(readColor() == 2)
            {
                for (int i=0; i<2; i++)
                {
                    // Si el color es azul gira a la izquierda
                    left();
                }
            }
            
            else
            {
                forward();
                status=1;
            }
        } 
                
        else if (valor_y >= 2000)
        {
            // Codigo para movimiento atras segun joystick
            reverse();
            status=1;
        }
                
        if (valor_x <= 1000)
        {
            // Codigo para giro derecho segun joystick
            
            if (readColor() == 3)
            {
                // Si el color es verde se "sienta"
                up();
            }
            
            else 
            {
                // Si el color es diferente de verde gira a la izquierda
                right();
                status=1;
            }
        } 
                
        else if (valor_x >= 2000)
        {
            // Codigo para giro izquierdo segun joystick
            
            if (readColor() == 3)
            {
                // Si el color es verde se "sienta"
                up();
            }
            
            else 
            {
                // Si el color es diferente de verde gira a la izquierda
                left();
                status=1;
            }
        }
                
        else if(status == 1)
        {
            inicialPosition ();
            status=0;
        }

    }
}