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

Arduino Uno
Arduino Uno
🧰
Driver de motor TB6612
🧰
Receptor + controle sem fio PS2
Motor DC com caixa de redução
Motor DC com caixa de redução
Rodas (impressão 3D)
Rodas (impressão 3D)
Bateria (pack de pilhas ou LiPo)
Bateria (pack de pilhas ou LiPo)
Chassi (impressão 3D)
Chassi (impressão 3D)
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.