RoboFeed
Pensamento Computacional
PROJETO DE ROBÔ

Robô de Futebol (controle PS2)

por Equipe RoboFeed Nível Intermediario 2 a 3 aulas 7º ano8º ano9º ano1º ano (EM)2º ano (EM)3º ano (EM) Plugada 1
▶ Apresentar slide interativo · tela cheia, pra projetar 🔧 Modo Bancada · passo a passo, pro aluno no tablet
Habilidades BNCC Computação (13)
Pensamento Computacional
EF67CO01 Aplicar técnicas de decomposição, abstração e reconhecimento de padrões na resolução de problemas computacionais e cotidianos.
EF67CO02 Elaborar e implementar algoritmos com estruturas de controle (sequência, seleção e repetição), utilizando variáveis e operadores lógicos.
EF67CO03 Representar dados e estados de um sistema usando fluxogramas, tabelas-verdade e diagramas de estado.
EF89CO01 Desenvolver projetos computacionais que integrem decomposição, abstração, generalização e avaliação crítica da solução proposta.
EF89CO02 Implementar algoritmos com funções/sub-rotinas, listas/arrays e leitura de sensores, em linguagens de blocos ou textuais (C++, Python).
Mundo Digital
EF67CO04 Construir protótipos eletrônicos usando placas programáveis (Arduino, ESP32, micro:bit), sensores (ultrassônico, LDR, DHT) e atuadores (LED, servo, buzzer).
EF67CO05 Compreender como dados são representados no computador (binário, ASCII, imagem, áudio) e como circulam por redes (LAN, Wi-Fi, internet).
EF89CO03 Projetar e construir sistemas integrados que combinem hardware (placa, sensores, atuadores) e software (algoritmo) para resolver problemas reais.
EF89CO04 Avaliar arquiteturas de hardware (processador, memória, periféricos) e modelos de comunicação (cliente-servidor, IoT) em soluções tecnológicas.
Cultura Digital
EF67CO06 Analisar criticamente o uso das tecnologias digitais e sua influência no comportamento social, no consumo de informação e na privacidade.
EF67CO07 Identificar fontes confiáveis de informação em ambientes digitais, reconhecendo desinformação (fake news), deepfakes e manipulação algorítmica.
EF89CO05 Discutir aspectos éticos do uso de inteligência artificial (viés algorítmico, automação, direitos autorais, deepfakes) e propor princípios de uso responsável.
EF89CO06 Compreender legislações de proteção de dados (LGPD) e aplicar boas práticas de segurança digital, autoria e propriedade intelectual em produções escolares.

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

1×
Arduino Uno
Arduino Uno
1×
🧰
Driver de motor TB6612
1×
🧰
Receptor + controle sem fio PS2
2×
Motor DC com caixa de redução
Motor DC com caixa de redução
2×
Rodas (impressão 3D)
Rodas (impressão 3D)
1×
Bateria (pack de pilhas ou LiPo)
Bateria (pack de pilhas ou LiPo)
1×
Chassi (impressão 3D)
Chassi (impressão 3D)
1×
Jumpers e parafusos (opcional)
Jumpers e parafusos (opcional)

O desafio

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

📶 Intermediario · ⏱ 2 a 3 aulas

Passo a passo

1) Montar o chassi, as rodas e os motores. 2) Ligar o driver TB6612 (motor A: AIN1 D4 / AIN2 D3 / PWMA D9 · motor B: BIN1 D8 / BIN2 D7 / PWMB D5 · STBY no 5V) e a alimentação. 3) Ligar o receptor PS2 (CLK A3, CMD A1, ATT A0, DAT A2, VCC 3,3V, GND). 4) Instalar a biblioteca PS2X, parear o controle e carregar o código. 5) Testar a pilotagem. 6) Jogar / competir em equipe.

Montagem do robô

Placa: Arduino Uno

⬇ baixar SVG
🧰 Montagem do robôPlaca: Arduino Uno · 4 componentes · 16 ligações detectadas do códigoUSBATMEGA328PLARDUINO UNOAREFGND131211109876543210DIGITAL (PWM ~)IOREFRESET3V35VGNDGNDVINPOWERA0A1A2A3A4A5ANALOG INArduino Uno⚡ Barramento de alimentação · 5V (+) / GND (–)D9 · ENA (vel. A)D4 · IN1D3 · IN2D5 · ENB (vel. B)D8 · IN3D7 · IN4L298NSAÍDA ASAÍDA B+12VGND+5VENAIN1IN2IN3IN4ENBPonte H (L298N)OUT1·OUT2Motor DC esquerdoOUT3·OUT4Motor DC direitoA3 · clockA1 · comandoA0 · seleçãoA2 · dadosReceptor PS2 (sem fio)LEGENDA DOS FIOSAlimentação (+5V)Terra (GND)DigitalAnalógico (leitura)Saída de motor
🧰 Montagem do robôArduino Unoplaca controladoraReceptor PS2 (sem fio)A3A1A0A23,3VGNDL298NSAÍDA ASAÍDA B+12VGND+5VENAIN1IN2IN3IN4ENBPonte H (L298N)D9D4D3D5D8D7Motor DC esquerdoOUT1OUT2Motor DC direitoOUT3OUT4
as peças reagem: LED acende, botão é clicável, serial abaixo
🖥️ Monitor serial

⚡ Energia: uma bateria (pack de pilhas ou LiPo) alimenta os motores na entrada VM do driver TB6612; o VCC do TB6612 recebe 5V do Arduino (lógica) e o pino STBY fica ligado no 5V para habilitar o driver. ATENÇÃO: o receptor PS2 trabalha em 3,3V (ligar no 5V pode queimar). Todos os GND precisam ser comuns.
📋 Tabela de ligações (fio a fio)
Sistema motor
Ponte H (L298N)
fio → D9 ENA (vel. A)
fio → D4 IN1
fio → D3 IN2
fio → D5 ENB (vel. B)
fio → D8 IN3
fio → D7 IN4
Motor DC esquerdo
fio → OUT1 (Ponte H) tração esq
fio → OUT2 (Ponte H) tração esq
Motor DC direito
fio → OUT3 (Ponte H) tração dir
fio → OUT4 (Ponte H) tração dir
Outros
Receptor PS2 (sem fio)
CLK → A3 clock
CMD → A1 comando
ATT → A0 seleção
DAT → A2 dados
VCC → 3,3V alimentação (NÃO 5V!)
GND → GND terra
🔧 Passo a passo de ligação
  1. 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.
  2. Controle dos motores: AIN1→D4, AIN2→D3, PWMA→D9 (motor A); BIN1→D8, BIN2→D7, PWMB→D5 (motor B).
  3. Receptor PS2: CLK→A3, CMD→A1, ATT→A0, DAT→A2. ⚠️ Alimente o receptor em 3,3V (NUNCA 5V) e GND.
  4. Motores: o esquerdo nas saídas AO1/AO2; o direito nas BO1/BO2. Se um girar ao contrário, inverta os dois fios dele.
  5. 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

aula.ino
/*
 * 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));
}

Modelos 3D para impressão

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

⏳
Chassi do robô 📥 Baixar
⏳
Rodas (rines) 📥 Baixar

🤖 Transforme este projeto em aula

O Co-professor gera um plano de aula completo — ou uma sequência didática de 2 a 4 encontros — adaptado à sua turma. Cadastre-se grátis pra usar.

✨ Gerar aula ou sequência com IA

💬 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

Explorar mais aulas · RoboFeed — robótica e computação na escola, alinhado à BNCC.