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