Robô de Sumô Autônomo
🎯 Objetivos de aprendizagem
- 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.
🧭 Habilidades BNCC Computação (6)
Habilidades dos anos selecionados (8º ano, 9º ano, 1º ano (EM), 2º ano (EM), 3º ano (EM)) — Resolução CNE/CP nº 1/2022. Em turmas de Ensino Médio, mapear para EM13CO.
🧰 Materiais e componentes
🪜 Desenvolvimento da aula
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?
1) Montar o chassi 3D e fixar motores e rodas. 2) Ligar a ponte H L293D ao Arduino (motor A: D3/D4/D5 · motor B: D7/D8/D9). 3) Conectar os 4 sensores Sharp (A2–A5) e os 2 sensores de borda (A0/A1).
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.
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.
Roda de conversa: o que é um algoritmo de ataque/defesa? Como melhorar a estratégia? Discutir velocidade × precisão.
🔌 Montagem do robô
Placa: Arduino Uno
🖥️ Monitor serial
📋 Tabela de ligações (fio a fio)
🔧 Passo a passo de ligação
- Comece pela energia: leve o 5V do Arduino ao trilho vermelho (+) da protoboard e o GND ao trilho azul (−). Todo mundo vai buscar 5V e GND nesses trilhos.
- Sensores Sharp (os 4): em cada um, o fio vermelho (VCC) vai no trilho +, o preto (GND) no trilho −, e o amarelo (sinal) no pino do Arduino — A2, A3, A4 e A5, um por sensor.
- Sensores de borda (os 2): a mesma coisa — vermelho no +, preto no −, e o sinal em A0 (direito) e A1 (esquerdo).
- Ponte H L293D: ligue +5V no trilho + e GND no trilho − (o terra PRECISA ser comum com o Arduino!). Depois os controles: IN1→D3, IN2→D4, IN3→D7, IN4→D8; e a velocidade ENA→D5, ENB→D9.
- Motores: o motor esquerdo nas saídas OUT1 e OUT2 da Ponte H; o direito nas OUT3 e OUT4. Se algum girar ao contrário, é só inverter os dois fios daquele motor.
- Bateria (6 a 9V): o + na entrada de potência dos motores da Ponte H (VS/Vmotor) e o − no trilho − (o mesmo GND de tudo). ⚠️ Conecte a bateria só no final, com tudo já conferido.
- Antes de energizar, confira: todos os GND no mesmo trilho? A bateria está só nos motores (nunca no 5V do Arduino)? Se sim, ligue o Arduino ao computador e envie o código.
💻 Código
// === 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();
}
🔀 Fluxograma do algoritmo
🧱 Algoritmo em blocos
quando @greenFlag for clicado
sempre
se <borda à esquerda> ou <borda à direita> então
recuar
esperar 0.3 seg
virar à direita
esperar 0.3 seg
parar
senão
se <oponente à frente> então
avançar
senão
se <oponente à esquerda> então
virar à esquerda
senão
se <oponente à direita> então
virar à direita
senão
procurar girando
end
end
end
end
end🖨️ Modelos 3D para impressão
Toque para ver em 3D · gire com o dedo.
🤖 Quer essa aula do SEU jeito?
O Co-professor adapta esta aula pro seu ano e contexto — ou a estica numa sequência didática de 2 a 4 encontros — e gera um PDF pronto pra você. A estrutura da aula é preservada. Cadastre-se grátis pra usar.
✨ Adaptar e gerar PDF💬 Comentários
Entre na sua conta ou crie uma grátis pra comentar.
Seja o primeiro a comentar.
Gostou desta aula?
Monte aulas como esta em minutos, com ajuda da IA — e compartilhe com professores do Brasil todo. É grátis.
Criar minha conta grátis📲 Compartilhar no WhatsApp