Robô de Futebol (controle PS2)
🎯 Objetivos de aprendizagem
- Montar e programar um robô de futebol controlado por um controle sem fio (PS2): ler o controle e traduzir os comandos em movimento dos dois motores — frente, trás e giro (direção diferencial).
🧭 Habilidades BNCC Computação (13)
Habilidades dos anos selecionados (7º ano, 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 robô de futebol pilotado por um controle sem fio (PS2). Pergunta: como o controle 'conversa' com o robô e vira movimento? Compare com o seguidor de linha (autônomo) — este é TELEOPERADO.
1) Montar o chassi, as rodas e os 2 motores. 2) Ligar o driver TB6612 (motor A: AIN1 D4, AIN2 D3, PWMA D9 · motor B: BIN1 D8, BIN2 D7, PWMB D5). O pino STBY vai no 5V para habilitar o driver. 3) Ligar o receptor PS2: CLK A3, CMD A1, ATT A0, DAT A2. ⚠️ Alimente o receptor em 3,3V (NUNCA 5V). Alimentação: bateria na entrada VM do TB6612, o VCC do TB6612 no 5V do Arduino, GND comum.
Instalar a biblioteca PS2X. Carregar o código. Explicar a leitura dos joysticks (map, zona morta) e a DIREÇÃO DIFERENCIAL: velocidade do motor A = base − giro, motor B = base + giro. Parear o controle com o receptor.
Testar a pilotagem. Depurar em equipe: se o robô anda torto, confira/inverta os fios de um motor; ajuste a zona morta; se não responde, cheque os fios CLK/CMD/ATT/DAT do receptor.
Roda de conversa: o que é teleoperação? Qual a diferença entre robô autônomo (seguidor) e teleoperado (este)? Onde cada um é melhor? Encerrar com uma partida de robô-futebol.
🔌 Montagem do robô
Placa: Arduino Uno
🖥️ Monitor serial
📋 Tabela de ligações (fio a fio)
🔧 Passo a passo de ligação
- Energia: bateria na entrada VM e GND do driver TB6612; o VCC recebe 5V do Arduino e o STBY também vai no 5V (habilita o driver); GND comum entre tudo.
- Controle dos motores: AIN1→D4, AIN2→D3, PWMA→D9 (motor A); BIN1→D8, BIN2→D7, PWMB→D5 (motor B).
- Receptor PS2: CLK→A3, CMD→A1, ATT→A0, DAT→A2. ⚠️ Alimente o receptor em 3,3V (NUNCA 5V) e GND.
- Motores: o esquerdo nas saídas AO1/AO2; o direito nas BO1/BO2. Se um girar ao contrário, inverta os dois fios dele.
- Instalar a biblioteca PS2X, parear o controle, conferir o GND comum e o STBY em nível alto, e carregar o código.
💻 Código
/*
* Robô de Futebol — controle sem fio PS2 + driver TB6612 (Arduino UNO)
* Lê os joysticks do controle PS2 e move 2 motores com direção diferencial
* (frente, trás e giro no lugar). (código original; comentários em português)
*
* Driver TB6612: os pinos abaixo controlam AIN1/AIN2/PWMA (motor A) e
* BIN1/BIN2/PWMB (motor B). O pino STBY do TB6612 deve ficar em nível ALTO
* (ligado no 5V) para o driver funcionar. Os nomes IN/EN abaixo são herdados
* do código original e mapeiam direto nesses terminais.
*/
#include <PS2X_lib.h>
PS2X ps2x;
int error = 0;
byte vibrate = 0;
// Pinos do driver TB6612 (IN1/IN2->AIN1/AIN2, ENA->PWMA, IN3/IN4->BIN1/BIN2, ENB->PWMB)
const int IN1 = 4;
const int IN2 = 3;
const int IN3 = 8;
const int IN4 = 7;
const int ENA = 9;
const int ENB = 5;
void controlMotores(int velocidadMotorA, int velocidadMotorB);
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
delay(300);
// config_gamepad(clock A3, command A1, attention A0, data A2)
error = ps2x.config_gamepad(A3, A1, A0, A2, true, true);
}
void loop() {
ps2x.read_gamepad(false, vibrate);
// Ler o joystick direito (frente / trás)
int joyY = ps2x.Analog(PSS_RY) - 127;
if (joyY == -128) joyY = -127;
// Ler o joystick esquerdo (giros)
int joyX = ps2x.Analog(PSS_LX) - 127;
if (joyX == -128) joyX = -127;
// Ler os botões de direção (setas)
bool flechaIzq = ps2x.Button(PSB_PAD_LEFT);
bool flechaDer = ps2x.Button(PSB_PAD_RIGHT);
// Zona morta
if (abs(joyY) < 15) joyY = 0;
if (abs(joyX) < 15) joyX = 0;
// Velocidade base a partir do joystick direito
int velocidadBase = map(abs(joyY), 0, 127, 0, 255);
// Giro proporcional a partir do joystick esquerdo
int giro = map(joyX, -127, 127, -255, 255);
// Prioridade: se apertar as setas, substitui o giro
if (flechaIzq) giro = -200;
else if (flechaDer) giro = 200;
// Inicializar as velocidades
int velocidadMotorA = 0;
int velocidadMotorB = 0;
if (joyY < 0) {
// Avançar
velocidadMotorA = velocidadBase - giro;
velocidadMotorB = velocidadBase + giro;
} else if (joyY > 0) {
// Recuar
velocidadMotorA = -velocidadBase + giro;
velocidadMotorB = -velocidadBase - giro;
} else {
// Parado: permite girar no lugar
velocidadMotorA = giro;
velocidadMotorB = -giro;
}
// Limitar os valores
velocidadMotorA = constrain(velocidadMotorA, -255, 255);
velocidadMotorB = constrain(velocidadMotorB, -255, 255);
controlMotores(velocidadMotorA, velocidadMotorB);
delay(30);
}
void controlMotores(int velocidadMotorA, int velocidadMotorB) {
// Motor A
if (velocidadMotorA > 0) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
} else if (velocidadMotorA < 0) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
} else {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
// Motor B
if (velocidadMotorB > 0) {
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
} else if (velocidadMotorB < 0) {
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
} else {
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
// Velocidade
analogWrite(ENA, abs(velocidadMotorA));
analogWrite(ENB, abs(velocidadMotorB));
}
🔀 Fluxograma do algoritmo
🧱 Algoritmo em blocos
quando @greenFlag for clicado
configurar o controle PS2 e o driver TB6612
sempre
ler o controle (joysticks e setas)
aplicar a zona morta
calcular a velocidade base e o giro
se <joystick para frente> então
avançar (ajustando o giro)
senão
se <joystick para trás> então
recuar
senão
girar no lugar
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