← Sair
Robô de Sumô Autônomo
Modo Bancada · Plugada

Robô de Sumô Autônomo

Robô de Sumô Autônomo

📶 Avancado · ⏱ 4 a 6 aulas

🎯 O desafio

Construir e programar um robô autônomo que detecta o oponente com sensores de distância e evita sair do ringue usando sensores de borda — desenvolvendo algoritmo, depuração e trabalho em equipe.

🧰 O que vamos usar

1x Arduino Uno 1x Ponte H (L293D) 2x Motor DC com caixa de redução 4x Sensor de distância Sharp 2x Sensor infravermelho de borda 1x Bateria/fonte (LiPo) 1x Chassi + cobertura + rodas (impressão 3D) 1x Jumpers e parafusos (opcional)

🔌 Montagem do robô

Placa: Arduino Uno

⬇ baixar SVG
🧰 Montagem do robôPlaca: Arduino Uno · 9 componentes · 30 ligações detectadas do códigoUSBATMEGA328PLARDUINO UNOAREFGND131211109876543210DIGITAL (PWM ~)IOREFRESET3V35VGNDGNDVINPOWERA0A1A2A3A4A5ANALOG INArduino Uno⚡ Barramento de alimentação · 5V (+) / GND (–)D3 · IN1 (motor A)D4 · IN2 (motor A)D5 · PWM velocidade AD7 · IN3 (motor B)D8 · IN4 (motor B)D9 · PWM velocidade BPonte H (L293D)OUT1·OUT2Motor DC esquerdoOUT3·OUT4Motor DC direitoA2 · distânciaSensor Sharp (lateralesq)A3 · distânciaSensor Sharp (frontalesq)A4 · distânciaSensor Sharp (frontaldir)A5 · distânciaSensor Sharp (lateraldir)A0 · bordaSensor de borda (dir)A1 · bordaSensor de borda (esq)LEGENDA DOS FIOSAlimentação (+5V)Terra (GND)Analógico (leitura)PWM (velocidade)Saída de motor
🧰 Montagem do robôArduino Unoplaca controladoraSensor Sharp (lateral esq)A25VGNDSensor Sharp (frontal esq)A35VGNDSensor Sharp (frontal dir)A45VGNDSensor Sharp (lateral dir)A55VGNDSensor de borda (dir)A05VGNDSensor de borda (esq)A15VGNDPonte H (L293D)D3D4D5D7D8D95VGNDMotor DC esquerdoOUT1OUT2Motor DC direitoOUT3OUT4
💻 O código
aula.ino
// === Pines del L293D ===
// Motor A (izquierdo)
const int motorA1 = 3;
const int motorA2 = 4;
const int enableA = 5;  // Control de velocidad PWM

// Motor B (derecho)
const int motorB1 = 7;
const int motorB2 = 8;
const int enableB = 9;  // Control de velocidad PWM

// === Pines sensores Sharp ===
const int sharpIzq = A2;     // Sensor lateral izquierdo
const int sharpFront1 = A3;  // Sensor frontal izquierdo
const int sharpFront2 = A4;  // Sensor frontal derecho
const int sharpDer = A5;     // Sensor lateral derecho

// === Sensores de piso digitales ===
const int pisoDer = A0; // Sensor de piso derecho
const int pisoIzq = A1; // Sensor de piso izquierdo

// === Parámetros de movimiento ===
int velocidadMax = 200;       // Velocidad máxima del robot
int velocidadCurva = 160;     // Velocidad al girar
int umbralOponente = 400;     // Valor analógico que indica proximidad (menor = más cerca)

void setup() {
  // Configurar pines de motores como salida
  pinMode(motorA1, OUTPUT);
  pinMode(motorA2, OUTPUT);
  pinMode(enableA, OUTPUT);

  pinMode(motorB1, OUTPUT);
  pinMode(motorB2, OUTPUT);
  pinMode(enableB, OUTPUT);

  // Configurar sensores de piso como entrada
  pinMode(pisoDer, INPUT);
  pinMode(pisoIzq, INPUT);

  // No es necesario configurar los pines analógicos de los sensores Sharp
  // Puedes habilitar Serial.begin(9600); si deseas monitorear sensores
}

void loop() {
  // Leer sensores de piso (devuelven HIGH o LOW)
  int sueloDer = digitalRead(pisoDer);
  int sueloIzq = digitalRead(pisoIzq);

  // Leer sensores Sharp (valores entre 0 y 1023)
  int valIzq = analogRead(sharpIzq);
  int valFront1 = analogRead(sharpFront1);
  int valFront2 = analogRead(sharpFront2);
  int valDer = analogRead(sharpDer);

  // === 1. Evitar salirse del ring ===
  // Si algún sensor detecta el borde (LOW = borde blanco o sin línea)
  if (sueloIzq == LOW || sueloDer == LOW) {
    retroceder();         // Retrocede rápidamente
    delay(300);           // Espera un poco
    girarDerecha();       // Gira para cambiar de dirección
    delay(300);           
    detener();            // Pausa antes de seguir
    return;               // Finaliza esta iteración del loop
  }

  // === 2. Estrategia de ataque ===
  if (valFront1 < umbralOponente || valFront2 < umbralOponente) {
    avanzar();            // Oponente detectado al frente
  } else if (valIzq < umbralOponente) {
    girarIzquierda();     // Oponente a la izquierda
  } else if (valDer < umbralOponente) {
    girarDerecha();       // Oponente a la derecha
  } else {
    buscar();             // No se detecta nada, buscar girando
  }
}

// === Funciones de movimiento ===

// Avanza recto
void avanzar() {
  digitalWrite(motorA1, HIGH);
  digitalWrite(motorA2, LOW);
  analogWrite(enableA, velocidadMax);

  digitalWrite(motorB1, HIGH);
  digitalWrite(motorB2, LOW);
  analogWrite(enableB, velocidadMax);
}

// Retrocede
void retroceder() {
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, HIGH);
  analogWrite(enableA, velocidadMax);

  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, HIGH);
  analogWrite(enableB, velocidadMax);
}

// Gira hacia la izquierda
void girarIzquierda() {
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, HIGH);
  analogWrite(enableA, velocidadCurva);

  digitalWrite(motorB1, HIGH);
  digitalWrite(motorB2, LOW);
  analogWrite(enableB, velocidadCurva);
}

// Gira hacia la derecha
void girarDerecha() {
  digitalWrite(motorA1, HIGH);
  digitalWrite(motorA2, LOW);
  analogWrite(enableA, velocidadCurva);

  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, HIGH);
  analogWrite(enableB, velocidadCurva);
}

// Detiene los motores
void detener() {
  analogWrite(enableA, 0);
  analogWrite(enableB, 0);
}

// Búsqueda: gira hacia la izquierda buscando oponente
void buscar() {
  girarIzquierda();
  delay(400);
  detener();
}
🖨️ Peças 3D

Toque para ver em 3D · gire com o dedo.

Chassi
Cobertura
Rodas
Pra fechar

Você chegou ao fim! 🎉

O que foi mais difícil? O que você faria diferente? Conte pra turma!

✓ Sair