← Sair
Robô de Sumô Autônomo
RoboFeed · aula plugada

Robô de Sumô Autônomo

Robô de Sumô Autônomo

🎓 8º ano · 9º ano · 1EM · 2EM · 3EM 🧭 🧭 🧭
Capa da aula
🎯 Nossa missão hoje

O que vamos conseguir fazer

1

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 temos na bancada

Peças e materiais

Arduino Uno Arduino Uno
Ponte H (L293D) Ponte H (L293D)
Motor DC com caixa de redução Motor DC com caixa de redução
Sensor de distância Sharp Sensor de distância Sharp
Sensor infravermelho de borda Sensor infravermelho de borda
Bateria/fonte (LiPo) Bateria/fonte (LiPo)
Chassi + cobertura + rodas (impressão 3D) Chassi + cobertura + rodas (impressão 3D)
Jumpers e parafusos Jumpers e parafusos
🔌 Como as peças se ligam

O mapa do nosso robô

⬇ baixar SVG
🔧 Montagem do robôPlaca: Arduino Uno · 9 componentes · 30 ligações detectadas do códigoLEGENDAAnalógico (leitura)PWM (velocidade)DigitalSaída de motor5VGND ON L TX RX   DIGITAL (PWM ~) AREF GND 13 12 ~11 ~10 ~9 8 7 ~6 ~5 4 ~3 2 TX→1 RX←0   POWER ANALOG IN IOREF RESET 3.3V 5V GND GND Vin A0 A1 A2 A3 A4 A5 ARDUINO UNO SHARP GP2Y0A21SHARP GP2Y0A21SHARP GP2Y0A21SHARP GP2Y0A21TCRT5000LM393PWROUTSENSIB.VCCGNDOUTTCRT5000LM393PWROUTSENSIB.VCCGNDOUTL293DPONTE H DUPLASAÍDA ASAÍDA B+12VGND+5VENAIN1IN2IN3IN4ENBMOTOR TTMOTOR TTLi-ion 186503.7V 2600mAh+Li-ion 186503.7V 2600mAh2×18650 · 7.4VOUT1OUT2OUT3OUT4Sensor Sharp (lateral esq)Sensor Sharp (frontal esq)Sensor Sharp (frontal dir)Sensor Sharp (lateral dir)Sensor de borda (dir)Sensor de borda (esq)Ponte H (L293D)Motor DC esquerdoMotor DC direitoBateria 2×18650 (7,4 V)
🧰 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

cada fio colorido é uma ligação de verdade — o diagrama completo está na página da aula

Momento 1 de 5

Introdução

Apresente o desafio do Mini Sumô: um robô autônomo que detecta o oponente e não sai do ringue. Levante a pergunta: como o robô 'decide' atacar ou recuar?

Momento 2 de 5

Montagem / Hardware

1

Montar o chassi 3D e fixar motores e rodas.

Peça impressa em 3D
2

Ligar a ponte H L293D ao Arduino (motor A: D3/D4/D5 · motor B: D7/D8/D9).

Ponte H (L298N / L293D)
3

Conectar os 4 sensores Sharp (A2–A5) e os 2 sensores de borda (A0/A1).

Sensor de Distância (Sharp GP2Y0A21)
Momento 3 de 5

Programação

Sensor de Distância (Sharp GP2Y0A21)

Carregar o código (Sensores_SHARP.ino). Explicar a lógica: ler os sensores de borda para NÃO sair do ringue, e os Sharp para atacar o oponente. Ajustar o limiar de detecção (umbralOponente) e as velocidades.

Momento 4 de 5

Teste e ajustes

Testar no ringue: o robô deve recuar ao detectar a borda branca e avançar/girar atrás do oponente. Depurar a estratégia em equipe.

Momento 5 de 5

Encerramento

Roda de conversa: o que é um algoritmo de ataque/defesa? Como melhorar a estratégia? Discutir velocidade × precisão.

🔀 O plano do robô

Como ele decide o que fazer

flowchart TD A(["Início"]) --> B{"Sensor de borda detectou a linha?"} B -->|Sim| C["Recuar, girar à direita e parar"] B -->|Não| D{"Oponente à frente?"} D -->|Sim| E["Avançar"] D -->|Não| F{"Oponente à esquerda?"} F -->|Sim| G["Girar à esquerda"] F -->|Não| H{"Oponente à direita?"} H -->|Sim| I["Girar à direita"] H -->|Não| J["Procurar (girar no lugar)"] C --> B E --> B G --> B I --> B J --> B
💻 O cérebro do robô

O código da aula

// === 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();
}

role dentro da caixa · o código completo está na página da aula

🥊

Bora construir!

dúvidas? a página completa da aula tem tudo: montagem, código e materiais.