SUMOBOT Jose.
LOPEZ HERNANDEZ GUILLERMO.
GRUPO 5CV8.
INSTITUTO POLITECNICO NACIONAL
ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA
MÉXICO, CDMX
Lopezhernandezguillermo5@gmail.com
Objetivo
Raund 1: Sumos de frente.
Diseñar y construir un mini Sumobot autónomo
capaz de detectar y empujar a un robot oponente
fuera de un área delimitada, utilizando sensores y
motores controlados mediante programación, con el
fin de aplicar conocimientos de electrónica,
programación y robótica en un proyecto práctico y
competitivo Raund 2: Sumos de espaldas.
Resumen
El proyecto consiste en la elaboración de un mini
Sumobot, un robot móvil diseñado para competir en
combates de sumo robótico. Este robot debe ser
capaz de detectar a su oponente y los límites del área
de combate mediante sensores, para así maniobrar Raund 3: Sumos de costado.
estratégicamente y empujar al adversario fuera del
ring. Se integran componentes electrónicos como
motores, sensores ópticos o ultrasónicos, y un
microcontrolador programable (por ejemplo, Arduino
o PIC) para controlar el movimiento y la lógica de
combate.
Desarrollo. Especificaciones del dojo:
Dojo circular con un diámetro de 70 cm,
Construir un mini Sumobot
color negro mate, delimitado por una línea
1. Definir especificaciones y reglas del blanca
torneo.
Formato del torneo. • Peso máximo de 500g.
El torneo será a 3 raunds, el mini sumobot • Dimensiones de 10cm x 10cm.
deberá detectar el dojo y evitar salir de él,
también deberá detectar a su oponente y
empujarlo fuera del dojo. 2. Lista y adquisición de materiales
• Arduino nano.
• Motores pololu y llantas
• Sensores de línea infrarrojo
QRD1114
• Sensores de distancia sharp
• Puente H L293D.
• Chasis y estructura
• Batería lipo de 7.4v.
• Protoboard mini.
• Dip switch de 2 pines.
• Interruptor de 2 pines
• Chasis.
3. Diseño mecánico y montaje del chasis Estructura que conformara el
(FreeCAD). cuerpo del mini sumobot y donde
montadaestará la protoboard y el
• Base: sensor Sharp.
Hecha de aluminio, con 4 barrenos
circulares para los tornillos que
sostendrán la base de la batería y 2
barrenos rectangulares para los
sensores QRD1114, con un espesor
de 1cm
• Montar motores y ruedas en el
chasis
Llantas por debajo.
llantas de frente.
• Base de la pila.
Base impresa en 3d de material
PETG color gris oscuro, también
cumple con el propósito de sostener
los motores y esta va fija con
tornillos.
Llantas por detrás.
Llantas de lado.
4. Instalación de sensores
• Montar sensores de línea en la parte
inferior para detectar el borde del
ring
Tabla de conexiones.
6. Programación
Desarrollar el código para:
• Colocar sensores de distancia en
// === Pines del sensor Sharp ===
posiciones estratégicas para
detectar al oponente #define SENSOR_SHARP A0
// === Pines QRD1114 (sensores de
línea) ===
#define QRD_DERECHO A1
5. Conexiones.
#define QRD_IZQUIERDO A2
// === Pines L293D para motores ===
#define ENA 11
#define IN1 13
#define IN2 12
#define ENB 6
#define IN3 5
Esquema de conexiones.
#define IN4 4
// === Pines DIP Switch ===
#define DIP1 2
#define DIP2 3
// === Configuraciones === int qrdIzq =
analogRead(QRD_IZQUIERDO);
int umbralLinea = 500; // Umbral
para QRD (ajustable) int dip1 = digitalRead(DIP1);
float limiteDistancia = 70; // cm, ignora int dip2 = digitalRead(DIP2);
objetos más lejos
float umbralDetecta = 65; // cm,
considera oponente detectado Serial.print("Distancia: ");
Serial.print(distancia);
int velocidadMotor = 50; // velocidad
fija Serial.print(" | QRD Der: ");
Serial.print(qrdDer);
Serial.print(" | QRD Izq: ");
bool giroInicialHecho = false; Serial.print(qrdIzq);
Serial.print(" | DIP1: ");
Serial.print(dip1);
void setup() {
Serial.print(" | DIP2: ");
pinMode(ENA, OUTPUT); Serial.println(dip2);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT); if (qrdDer < umbralLinea || qrdIzq <
pinMode(IN3, OUTPUT); umbralLinea) {
pinMode(IN4, OUTPUT);
evitarCaer(qrdDer, qrdIzq);
giroInicialHecho = false;
pinMode(SENSOR_SHARP, INPUT);
} else {
pinMode(QRD_DERECHO, INPUT);
if (dip1 == 1 && dip2 == 1) { // Caso
pinMode(QRD_IZQUIERDO, 4: Atrás
INPUT);
if (!giroInicialHecho) { girar180();
giroInicialHecho = true; }
pinMode(DIP1, INPUT_PULLUP); buscarYAtacar();
pinMode(DIP2, INPUT_PULLUP); } else if (dip1 == 0 && dip2 == 1) {
// Caso 3: Derecha
if (!giroInicialHecho) {
Serial.begin(9600); girar90Derecha(); giroInicialHecho =
} true; }
buscarYAtacar();
void loop() { } else if (dip1 == 1 && dip2 == 0) {
// Caso 2: Izquierda
float distancia = leerDistanciaSharp();
if (!giroInicialHecho) {
int qrdDer = girar90Izquierda(); giroInicialHecho =
analogRead(QRD_DERECHO); true; }
buscarYAtacar();
} else { // Caso 1: De frente
buscarYAtacar(); void buscarYAtacar() {
giroInicialHecho = true; float distancia = leerDistanciaSharp();
} if (distancia < umbralDetecta &&
distancia < limiteDistancia) {
}
avanzar();
delay(50);
} else {
}
girar360HastaDetectar();
}
float leerDistanciaSharp() {
}
int adc =
analogRead(SENSOR_SHARP);
float voltaje = adc * (5.0 / 1023.0); void girar90Izquierda() {
float distancia = 13.86 / (voltaje - analogWrite(ENA, 0);
0.20);
analogWrite(ENB, velocidadMotor);
if (distancia > 150) distancia = 150; //
filtro para lecturas irreales digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
return distancia;
digitalWrite(IN3, HIGH);
} digitalWrite(IN4, LOW);
delay(500); // Ajusta según pruebas
reales
void avanzar() {
detener();
analogWrite(ENA, velocidadMotor);
}
analogWrite(ENB, velocidadMotor);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW); void girar90Derecha() {
digitalWrite(IN3, HIGH); analogWrite(ENA, velocidadMotor);
digitalWrite(IN4, LOW);
analogWrite(ENB, 0);
}
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
void detener() { digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW); delay(500);
digitalWrite(IN3, LOW); detener();
digitalWrite(IN4, LOW);
}
}
void girar180() { }
analogWrite(ENA, velocidadMotor);
analogWrite(ENB, velocidadMotor); void evitarCaer(int der, int izq) {
digitalWrite(IN1, HIGH); analogWrite(ENA, velocidadMotor);
digitalWrite(IN2, LOW);
analogWrite(ENB, velocidadMotor);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH); digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
delay(900);
digitalWrite(IN3, LOW);
detener(); digitalWrite(IN4, HIGH);
} delay(300);
void girar360HastaDetectar() { if (der < umbralLinea && izq >=
umbralLinea) {
for (int i = 0; i < 18; i++) { // 18 pasos
de 100ms aprox = giro completo girar90Izquierda();
float distancia = } else if (izq < umbralLinea && der
leerDistanciaSharp(); >= umbralLinea) {
if (distancia < umbralDetecta && girar90Derecha();
distancia < limiteDistancia) {
} else {
avanzar();
girar180();
return;
}
}
}
analogWrite(ENA, velocidadMotor);
Sumo terminado.
analogWrite(ENB, velocidadMotor);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(100);
detener();