← 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
🧰 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 (opcional) Jumpers e parafusos (opcional)
🔌 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

💻 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.