MANUAL USUARIO

Presentación

En este proyecto se implementa una tarjeta STM32F411 para la implementación de el robot y el cual consiste en lo siguiente:

Un sensor de color (TCS3200), un buzzer, dos motores paso a paso, drivers para los motores y un joystick.

CONEXIONES

Sensor de color

/media/uploads/RICARDOandres/a.jpg

El sensor ( TCS3200) tiene 8 pines los cuales son:

  • VDD: Se conecta a 5v de la tarjeta
  • GND: Se conecta a GND o tierra de la tarjeta
  • S0 : Se conecta en a D7 de la tarjeta
  • S1 :Se conecta en a D6 de la tarjeta
  • S2 :Se conecta en a D5 de la tarjeta
  • S3: Se conecta en a D4 de la tarjeta
  • OUT: Se conecta en a D3 de la tarjeta

Conexión del buzzer

/media/uploads/RICARDOandres/b.jpg

  • Positivo (+): Se conecta a D9 de la tarjeta
  • Negativo (-): Se conecta a GND de la tarjeta

MOTORES PASO A PASO

Se utilizan dos motores paso a paso unipolares los cuales se conectan a dos drivers Drv8825 que son los que controlan la cantidad de pasos y dirección en las bobinas

Conexión de los drivers (dvr8825)

El driver se polariza de la siguiente forma:

/media/uploads/RICARDOandres/c.png

Para el primer driver se conecta:

  • step al D11
  • Dir al D12 el motor se conectan las bobinas a las fases del motor, en este caso:
  • bobinas 1 y 3 a B1 y B2 del driver.
  • bobinas 4 y 6 a A1 y A2 del driver.

Para el otro driver se concta:

  • step a D4
  • Dir al D3 el motor se conectan las bobinas a las fases del motor, en este caso:
  • bobinas 1 y 3 a B1 y B2 del driver.
  • bobinas 4 y 6 a A1 y A2 del driver.

/media/uploads/RICARDOandres/d.jpg

JOYSTICK

Se utiliza para el movimiento de los motores paso a paso y se crea una función principal "void mover joystick (uint16_t sentido, uint16_t num_pasos)" para el movimiento de estos según la información se compara y se le da inicio a la secuencia

Conexión del Joystick

  • VDD: Se conecta a 5v de la tarjeta
  • GND: Se conecta a GND o tierra de la tarjeta
  • VRx : Se conecta en a A0 de la tarjeta
  • VRy : Se conecta en a A1 de la tarjeta

PROGRAMACIÓN

Según la programación en la parte de comienzo se muestra como se declaran cada función en la que encontramos la velocidad que se define de forma individual también se nombran las funciones principales para el movimiento de los tele comandos y las telemetrías

include the mbed library with this snippet

  #include "mbed.h"
#include "scolor_TCS3200.h"

Serial command(USBTX,USBRX);
PwmOut mybuzzer(PC_7);
DigitalOut stepper_step(PB_4);
DigitalOut steppeer_dir(PB_5);
DigitalOut stepper_step_1(PA_7);
DigitalOut steppeer_dir_1(PA_6);
AnalogIn analogX(A0);
AnalogIn analogY(A1);

#define INITCMD 0xFF
#define CMD  0x00

#define VELOCITY1 3000 
#define VELOCITY2 9000 
#define VELOCITY3 15000 

#define DO  130
#define RE  150 
#define MI  160 
#define FA  180 
#define SO  200 

uint16_t parametro1;    

//                     S0,    S1,   S2,   S3,    OUT
scolor_TCS3200 scolor(PA_8, PB_10, PB_9, PB_8, PB_3);

// definición de las funciones
void setup_uart();
void leer_datos();
void leer_color();
void buzzer_on(uint16_t tono, uint16_t tiempo);
void mover_steper_nema(uint16_t sentido, uint16_t num_pasos);
void mover_joystick(uint16_t sentido, uint16_t num_pasos);
double meas_X;
double meas_Y;

uint8_t cmd;
uint8_t cmd1; 

int main()
 {
 
 
    setup_uart();
    
    while(1)
    {   
        
        
        leer_datos();
           
        if (cmd==0x00)
        {
          leer_color();
            
        }
        else if (cmd >=0x01 && cmd <=0x04)
        {
        buzzer_on(cmd, parametro1);
          } 
          else if(cmd >=0x05 && cmd <=0x06)
          {
            mover_steper_nema(cmd, parametro1);
          } 
        else if (cmd >=0x07 && cmd <= 0x09)
          {
            
            mover_steper_nema(cmd, parametro1); 
            
        
          }
          
          
        else if (cmd == 0x0A)
          {
            
            mover_joystick(cmd, parametro1); 
            
    
          }         
     }
     
}
void setup_uart()
{
    command.baud(115200);
}


void leer_datos(){
    while(command.getc()!= INITCMD);
    cmd=command.getc();
    parametro1=command.getc();
   

 
    
}
void buzzer_on(uint16_t tono, uint16_t tiempo){
    mybuzzer.write(0);
     switch(tono){
        case 1: mybuzzer.period_us(DO);break;
        case 2: mybuzzer.period_us(RE);break;
        case 3: mybuzzer.period_us(MI);break;
        case 4: mybuzzer.period_us(FA);break;
        default:mybuzzer.period_us(SO); break;
        }
     mybuzzer.write(0.5);
     
     wait(tiempo);
     mybuzzer.write(0);
     
}

void leer_color()
{
    
 
    
    long     red = scolor.ReadRed();
    long     green = scolor.ReadGreen();
    long     blue = scolor.ReadBlue();
    long     clear = scolor.ReadClear();
    
  //  printf("RED: %5d     GREEN: %5d     BLUE: %5d     CLEAR: %5d    \n ", red, green, blue, clear);
       
       if(green >= 6 && green <=15 && blue >=15 )
       {    
          printf("green");
          wait(1);
        }
       
      else if (blue >= 7 && blue <= 17 && green >= 20)
       {
    
           printf("blue");
           wait(1);
        }
  
    else if(red >= 3 && red <=10 && clear <6 )
       {
          
           printf("red");
           wait(1);
        }

    else if(red >=11 && blue > 21 && green > 21)
    
       {
                      
           printf("nothing");
           wait(1);
        }
    else if(cmd==!CMD)
    {
        
     mybuzzer.write(0);
        mybuzzer.write(2);
     
     mybuzzer.write(0);
}

}
void mover_steper_nema(uint16_t sentido, uint16_t num_pasos)
{

     
        int i; 
        int a;
        int b;
        
/* complementar el código necesario */

    if (cmd == 0x05) {
        steppeer_dir = 0;
        steppeer_dir_1 = 1;
    for(a=0;a<=200;a++){
        
    for (num_pasos=0;num_pasos<=parametro1;num_pasos++){
        i=num_pasos*a;
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
        }
        }
        
    }
    
    else if (cmd == 0x06)
     {
        steppeer_dir = 1;
        steppeer_dir_1 = 0;
    for(b=0;b<=200;b++)
    {
        
    for (num_pasos=0;num_pasos<=parametro1;num_pasos++)
    {
        i=num_pasos*b;
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
    }
    }
    }
   else if (cmd == 0x07 && parametro1 == 0x00) 
{
        steppeer_dir = 0;
        steppeer_dir_1 = 0;
    for(a=0;a<=100;a++)
    {
   
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
    
        }
        }
    else if (cmd == 0x08 && parametro1 == 0x00) 
    {
        steppeer_dir = 1;
         steppeer_dir_1 = 1;
    for(a=0;a<=100;a++)
    { 
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;

        }
        
    }
         
else if (cmd == 0x09 && parametro1 == 0x01) 
    {
        steppeer_dir = 1;
        steppeer_dir_1 = 0;
    for(a=0;a<=200;a++)
    {
        
  
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY3);
        stepper_step=0;
        stepper_step_1=0;

    }
    }
else if (cmd == 0x09 && parametro1 == 0x02) 
    {
        steppeer_dir = 1;
        steppeer_dir_1 = 0;
    for(a=0;a<=200;a++)
    {
        
  
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
        
    }
    }
else if (cmd == 0x09 && parametro1 == 0x03) 
    {
        steppeer_dir = 1;
        steppeer_dir_1 = 0;
    for(a=0;a<=200;a++)
    {
        
  
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY1);
        stepper_step=0;
        stepper_step_1=0;
        
    }
    } 
}
void mover_joystick (uint16_t sentido, uint16_t num_pasos)
{

     
        int i; 
        int a;   

  while(parametro1 != 0x02)   
  {
   

        meas_X = analogX.read(); 
        meas_Y = analogY.read();  
        wait(0.5); // 1 second
        printf("X = %0.3f Y = %0.3f \n", meas_X, meas_Y);
        if (meas_X >= 0.759)
        {
   steppeer_dir = 1;
        steppeer_dir_1 = 0;
    for(a=0;a<=200;a++)
    {
        
    for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++)
    {   
        i=num_pasos*a;
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
    }
        }  
       
   } 
    else if (meas_X <= 0.021)
        {
   steppeer_dir = 0;
        steppeer_dir_1 = 1;
    for(a=0;a<=200;a++)
    {
        
    for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++)
    {   
        i=num_pasos*a;
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
    }
        }  
       
   }
   else if (meas_Y == 0.763)
        {
   steppeer_dir = 0;
        steppeer_dir_1 = 0;
    for(a=0;a<=100;a++)
    {
        
    for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++)
    {   
        i=num_pasos*a;
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
    }
        }  
       
   }
      else if (meas_Y <= 0.026)
        {
   steppeer_dir = 0;
        steppeer_dir_1 = 0;
    for(a=0;a<=100;a++)
    {
        
    for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++)
    {   
        i=num_pasos*a;
        stepper_step=i;
        stepper_step_1=i;
        wait_us(VELOCITY2);
        stepper_step=0;
        stepper_step_1=0;
    }
        }  
       
   }
    
 }
}    


Please log in to post comments.