top of page

TUTORIAL Minusumo

Introducción
Componentes Principales
Como ensamblar nuestro Robot
Pruebas de Funcionamiento
Estrategias del Sumo para competencias configuradas
Este es el código de Sumotronics para cargar usando Arduino IDE

//MOTOR IZQUIERDA POR FUNCION
#define MOTOR_PWMA 6
#define MOTOR_AIN2 8  // CAMBIAR SI LA DIRECCION MOTOR ESTA AL CONTRARIO 8 por 7
#define MOTOR_AIN1 7  // CAMBIAR SI LA DIRECCION MOTOR ESTA AL CONTRARIO 7 por 8

//MOTOR DERECHA POR FUNCION
#define MOTOR_PWMB 5
#define MOTOR_BIN1 11  // CAMBIAR SI LA DIRECCION MOTOR ESTA AL CONTRARIO 11 por 10
#define MOTOR_BIN2 10  // CAMBIAR SI LA DIRECCION MOTOR ESTA AL CONTRARIO 10 por 11

//SENSORES DE PISO
#define SENSOR_IN_P1 12
#define SENSOR_IN_P2 2

//LEDS
#define LED1 1
#define LED2 A5

//SENSORES DE BUSQUEDA DE OPONENTE
#define SENSOR_IN_LI 13  //LATERAL IZQUIERDA
#define SENSOR_IN_FI A0  //FRENTE IZQUIERDA
#define SENSOR_IN_FD A4  //FRENTE DERECHA
#define SENSOR_IN_LD A2  //LATERAL DERECHA

//SWITHES DE ESTRATEGIA
#define DIPSW2       A7
#define DIPSW3       3
#define DIPSW4       4

//MODULO DE INICIO POR CONTROL REMOTO
#define MODULOSTART  A1

//CONFIGURACION DE BUSQUEDA Y ATAQUE (MAX 255 Min 0)
#define VELOCIDAD_ATAQUE        250
#define VELOCIDAD_BUSQUEDA      200

//VARIABLES GLOBALES 

//Sensores
int cal_sp_l,cal_sp_d;
int sp_l,sp_d;
int SensorDistaciaCentral;
int detecto_oponente;

//estrategia
int dsw;
int oponente_det;
int bandera_inicio;
int timeout_str;

//Ataque
int a_ataque;
int a_ubicacion;
int control_md, control_mi;


void setup() {
  
  pinMode(MODULOSTART,INPUT);
 
  //PWM
  pinMode(MOTOR_PWMA,OUTPUT);
  pinMode(MOTOR_PWMB,OUTPUT);
  pinMode(MOTOR_AIN2,OUTPUT);
  pinMode(MOTOR_AIN1,OUTPUT);
  pinMode(MOTOR_BIN1,OUTPUT);
  pinMode(MOTOR_BIN2,OUTPUT);

  Control_Motores(0, 0);
  
  pinMode(SENSOR_IN_P1,INPUT);
  pinMode(SENSOR_IN_P2,INPUT);

  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  
  digitalWrite(LED2, HIGH);

  pinMode(DIPSW2,INPUT);
  pinMode(DIPSW3,INPUT);
  pinMode(DIPSW4,INPUT);
  
  pinMode(SENSOR_IN_LI,INPUT);
  pinMode(SENSOR_IN_FI,INPUT);
  pinMode(SENSOR_IN_FD,INPUT);
  pinMode(SENSOR_IN_LD,INPUT);
  
  //PARA DEBUGER
  Serial.begin(9600);
  
  //CALIBRAR SENSORES DE PISO
   cal_sp_l = 0;
   cal_sp_d = 0;
   cal_sp_l = Leer_Sensor_Piso(SENSOR_IN_P1,cal_sp_l );
   cal_sp_d = Leer_Sensor_Piso(SENSOR_IN_P2, cal_sp_d );
   
   //LEER ESTRATEGIA
   dsw = leer_dipsw();
   bandera_inicio = 1;
   switch(dsw)
   {
      case 0:
            {//ESPERAR DE FRENTE --2 3 4 OFF
               control_md =  30;
               control_mi =  30;
               timeout_str = 500;
               oponente_det = 110; //OPONENTE A IZQUIERDA
               break;
             }
      case 1:
            { //OPONENTE DE DERECHA DIAGONAL --2 ON 3 4 OFF
              control_md =  VELOCIDAD_ATAQUE*2/4;
              control_mi =  VELOCIDAD_ATAQUE;
              timeout_str = 300;
              oponente_det =  1; //OPONENTE A DERECHA
              break;
             }         
       case 2:
            { //OPONENTE DE ATRAS CENTRO DE PISTA - GIRO DE UNA --2 OFF 3ON 4 OFF
              control_md =   VELOCIDAD_ATAQUE;
              control_mi =  -VELOCIDAD_ATAQUE;
              timeout_str = 200;
              oponente_det = 1000; //OPONENTE A IZQUIERDA
              break;
             }         
       case 3:
            { //OPONENTE DE DERECHA GIRO COMPLETO --2 ON 3ON 4 OFF
              control_md = -VELOCIDAD_ATAQUE;
              control_mi =  VELOCIDAD_ATAQUE;
              timeout_str = 200;
              oponente_det = 1; //OPONENTE A DERECHA
              break;
             }         
       case 4:
            {
              //OPONENTE DE IZQUIERDA DIAGONAL --2 OFF 3 OFF 4 ON
              control_md = VELOCIDAD_ATAQUE;
              control_mi = VELOCIDAD_ATAQUE*3/4;
              timeout_str = 200;
              oponente_det = 100; //OPONENTE A IZQUIERDA
              break;
             }         
       case 5:
            { //OPONENTE DE FRENTE EN CENTRO DE PISTA --2 ON 3 OFF 4 ON
              control_md =  VELOCIDAD_ATAQUE;
              control_mi =  VELOCIDAD_ATAQUE;
              timeout_str = 100;
              oponente_det = 110; //OPONENTE A IZQUIERDA
              break;
             }         
       case 6:
            { //OPONENTE DE IZQUIERDA GIRO TOTAL --2 OFF 3 ON 4 ON
              control_md = -VELOCIDAD_ATAQUE;
              control_mi =  VELOCIDAD_ATAQUE;
              timeout_str = 200;
              oponente_det = 1000; //OPONENTE A IZQUIERDA
              break;
             }         
       case 7:
            { //OPONENTE ATRAS EN BORDE DE PISTA MINISUMO--2 3 4 ON
                control_md = -VELOCIDAD_ATAQUE;
                control_mi = -VELOCIDAD_ATAQUE;
                timeout_str = 400;
                oponente_det = 1000; //OPONENTE A IZQUIERDA
              break;
             }
         default:
        {
          oponente_det == 1000; //OPONENTE A IZQUIERDA
          break;
        }
             
   
   }
  
  //RETARDO DE INICIO DE CCOMPETENCIA
  delay(5000);

/*CODIGO PARA MODULO DE CONTROL REMOTO*/ //DESCOMENTAR PARA USAR
//   int Analogpw = digitalRead(MODULOSTART);
//   while(Analogpw == LOW)
//   {
//      //Serial.print(" POWER : ");
//      //Serial.println(Analogpw);
//      Analogpw = digitalRead(MODULOSTART);
//   }
   
   
  
}


void loop() {
  
  
 /*CODIGO PARA MODULO DE CONTROL REMOTO*/ //DESCOMENTAR PARA USAR  
//   int Analogpw = digitalRead(MODULOSTART);
//   //Serial.print(" POWER : ");
//   //Serial.println(Analogpw);
//   if(Analogpw == LOW )
//   {
//      Control_Motores(0, 0);
//      while(1); //SE APAGA
//   }
  
  
  
    /*LECTURA DE SENSORES*/
    a_ubicacion = Detectar_Ubicacion();
    sp_l = Leer_Sensor_Piso(SENSOR_IN_P1,cal_sp_l );
    sp_d = Leer_Sensor_Piso(SENSOR_IN_P2,cal_sp_d );
  
  
  /*ESTARTEGIA DE INICIO*/ //TIEMPO PARA MANTENER LA ESTARTEGIA
  if(bandera_inicio == 1)
  {
    if(timeout_str) //HAY TIEMPO
    {
      timeout_str --;
    }
  }
  if(timeout_str <= 0 )
  {
    bandera_inicio = 0;
  }
  
  ///////////////INICIO DE ESTRATEGIA DE BATALLA
  //PRIMERA PRIORIDAD 
  //SENSOR PISO
    
 if(abs(sp_l) > 150 || abs(sp_d) > 150)
  {
    detecto_oponente = 9;
    digitalWrite(LED2, HIGH);
    digitalWrite(LED1, HIGH);
    
    bandera_inicio = 1; 
    timeout_str =  200; //TIEPO DE RETROCESO
    oponente_det = 1000; //OPONENTE A IZQUIERDA

     if(abs(sp_l) > 150 && abs(sp_d) > 150)
     {
          control_md = -VELOCIDAD_ATAQUE;
          control_mi = -VELOCIDAD_ATAQUE;
     }
     else if(abs(sp_l) > 150)
     {
        control_md = -VELOCIDAD_ATAQUE;
        control_mi = -VELOCIDAD_ATAQUE;
     }
     else if(abs(sp_d) > 150)
     {
        control_md = -VELOCIDAD_ATAQUE;
        control_mi = -VELOCIDAD_ATAQUE;
     }
     
  }
  
  //SEGUNDA PRIORIDAD
  else if(a_ubicacion != -1) //-1 INDICA QUE NINGUN SENSOR ESTA DETECTANDO -- 
  {
    detecto_oponente = 1; // PARA DEBUGER
    
    bandera_inicio = 0; //SE ACABA ESTRATEGIA
    timeout_str = 0;
    
    //UBICACION ENTRE -200 y 200
    if(a_ubicacion > 100)
    {
      //OPONENTE A DERECHA
      control_md = -VELOCIDAD_ATAQUE;
      control_mi =  VELOCIDAD_ATAQUE;
      oponente_det = 1; //0001 --SENSORES - NUMERO PARA RECORDAR ULTIMA UBICACION
    }
    else if(a_ubicacion > 0)
    {// entre 100 y 0 -- oponente centro derecha
       control_md =  VELOCIDAD_ATAQUE/2;
       control_mi =  VELOCIDAD_ATAQUE;
       oponente_det = 10; //0010 --SENSORES
    }
    else if(a_ubicacion < -100) 
    {
      //OPONENTE A IZQUIERDA
       control_md =  VELOCIDAD_ATAQUE;
       control_mi = -VELOCIDAD_ATAQUE;
       oponente_det = 1000; //1000 --SENSORES 
    }
    else if(a_ubicacion < 0)
    {// entre -100 y 0 -- oponente centro izquierda
       control_md =  VELOCIDAD_ATAQUE;
       control_mi =  VELOCIDAD_ATAQUE/2;
       oponente_det = 100; //0100 --SENSORES
    }
    else
    { //OPONENTE AL CENTRO
        control_md = VELOCIDAD_ATAQUE;
        control_mi = VELOCIDAD_ATAQUE;
        oponente_det = 110; //0110
    }   
        
  }
  ///////////////////////////////////////////////////////////////////////
  else //NO OPONENTE - NO PISO
  {
  
    if(bandera_inicio == 1)
    {
      digitalWrite(LED2, HIGH);
      digitalWrite(LED1, HIGH);
    }
    else
    {
           digitalWrite(LED2, LOW);
           digitalWrite(LED1, LOW);
           
            detecto_oponente = 0;
            
            //bandera_inicio = 0; // AQI NOP, NO HA ENCONTRADO ENEMIGO
            
            if(oponente_det == 1 )
            {
              //OPONENTE A DERECHA
              control_md =  -VELOCIDAD_BUSQUEDA;
              control_mi =   VELOCIDAD_BUSQUEDA;
            }
            else if(oponente_det == 1000)
            {
              //OPONENTE A IZQUIERDA
               control_md =  VELOCIDAD_BUSQUEDA;
               control_mi = -VELOCIDAD_BUSQUEDA;
            }
            else
            { //OPONENTE AL CENTRO --  LO PERDI -- BUSCO  DE FRENTE HASTA LA LINEA
                control_md = VELOCIDAD_BUSQUEDA;
                control_mi = VELOCIDAD_BUSQUEDA;
            }
    }   
  }
  
    Control_Motores(control_mi, control_md);
    delay(1);
}


/////////////////////////////////////////////////////////////////
///FUNCIONES LOCALES
/////////////////////////////////////////////////////////////////

int Leer_Sensor_Piso(int pin, int cal)
{
  int PinState;
  int cnt;
  int sensor;
  
   pinMode(pin,OUTPUT);
   digitalWrite(pin, HIGH);
   delay(1);
  
   pinMode(pin,INPUT);

   cnt = 0;
   do{
     cnt ++;
     PinState = digitalRead(pin);
   }while(PinState == HIGH && cnt < 300);
     
   sensor = cnt - cal;
   return sensor;
}


void Control_Motores(int mi, int md)
{
 if(md > 255)
  {
    md = 255;
  }
  else if (md < -255)
  {
     md = -255;
  }
  
  if(md > 0)
  {
    digitalWrite(MOTOR_BIN1, HIGH);
    digitalWrite(MOTOR_BIN2, LOW);
    analogWrite(MOTOR_PWMB, abs(md));
  }
  else if(md < 0)
   {
    digitalWrite(MOTOR_BIN1, LOW);
    digitalWrite(MOTOR_BIN2, HIGH);
    analogWrite(MOTOR_PWMB, abs(md));
  }
  else
  {  //BREAK
     digitalWrite(MOTOR_BIN1, HIGH);
     digitalWrite(MOTOR_BIN2, HIGH);
  }
  
  //MOTOR IZQUIERDO
  if(mi > 255)
  {
    mi = 255;
  }
  else if (mi < -255)
  {
     mi = -255;
  }
  
  if(mi > 0)
  {
    digitalWrite(MOTOR_AIN1, HIGH);
    digitalWrite(MOTOR_AIN2, LOW);
    analogWrite(MOTOR_PWMA, abs(mi));
  }
  else if(mi < 0)
   {
    digitalWrite(MOTOR_AIN1, LOW);
    digitalWrite(MOTOR_AIN2, HIGH);
    analogWrite(MOTOR_PWMA, abs(mi));
  }
  else
  { //BREAK
     digitalWrite(MOTOR_AIN1, HIGH);
     digitalWrite(MOTOR_AIN2, HIGH);
  }
  
}

int leer_dipsw(void)
{
  int value;
  int buttonState = analogRead(DIPSW2);
  Serial.print("  SW2 : ");
  Serial.print(buttonState);
  if (buttonState > 500) 
    {
    digitalWrite(LED1, LOW);
    value = 0;
    }
    else 
    {
    digitalWrite(LED1, HIGH);
    value = 1;
    }
   
  buttonState = digitalRead(DIPSW3);
  Serial.print("  SW3 : ");
  Serial.print(buttonState);
  if (buttonState) 
    {
    digitalWrite(LED2, LOW);
    }
    else 
    {
    digitalWrite(LED2, HIGH);
     value = value + 2;
    }
  
  buttonState = digitalRead(DIPSW4);
  Serial.print("  SW4 : ");
  Serial.print(buttonState);
   if (buttonState) 
    {
     ; 
    }
    else 
    {
    value = value + 4;
    }
  Serial.print("  VALUE : ");
  Serial.println(value);
  return value; 
}

 

int Detectar_Ubicacion(void)
{
 int SensorState;
 int Oponente = 0;
 int num_sensores = 0;
 //SENSORES
  
  SensorState = digitalRead(SENSOR_IN_LI); //SENSOR NEGADO
  if(!SensorState )
  {
     Oponente = -200;
     num_sensores++;
  }
  
  
  SensorState = digitalRead(SENSOR_IN_FI);
   if(SensorState )
  {
     Oponente = Oponente -100;
     num_sensores++;
  }
  
  
  SensorState = digitalRead(SENSOR_IN_FD);
   if(SensorState  )
  {
     Oponente = Oponente + 100;
     num_sensores++;
  }
  
  SensorState = digitalRead(SENSOR_IN_LD); //SENSOR NEGADO
   if(!SensorState  )
  {
     Oponente = Oponente + 200;
     num_sensores++;
  }
   
  if(num_sensores)
  {
     return Oponente/num_sensores;
  }
  else
  {
     return -1;
  }
}

  

GALERÍA DE Sumotronics
Compra los componentes de nuestros proyectos en
www.moviltronics.com
bottom of page