Início›Projetos›Robô Controlado por Gestos com IA
⬤ Avançado · Projeto Integrado · Cenário LED

🤖 Robô Controlado por Gestos com IA

⏱️ 90 min📊 Avançado🏫 Cenário LED oficial
Seguidor linhaObstáculosPictoBlox

Nesta página

🎯 Objetivo do Projeto

Robô com dois modos de operação: modo autónomo (seguimento de linha + evitamento de obstáculos com Arduino) e modo gestos (controlado por reconhecimento de gestos via câmara usando IA no PictoBlox). O projeto introduz os conceitos de Machine Learning aplicado à robótica.

ℹ️
Este projeto requer hardware adicional não incluído no Kit B 37: um chassis de robô com dois motores DC e uma ponte H (L298N ou L9110). O Kit B 37 fornece os sensores — o mecanismo de movimento é construído ou adquirido separadamente.
MóduloPino do móduloPino ArduinoFunção
Sensor Seguidor Linha (#33)VCC / GND / DO5V / GND / D2Deteta linha — LOW sobre linha escura
Sensor Obstáculos (#37)VCC / GND / OUT5V / GND / D3Deteta obstáculo — LOW = obstruído
Motor esquerdo (L298N)IN1 / IN2 / ENAD4 / D5 / D6(PWM)Controlo de velocidade e direção
Motor direito (L298N)IN3 / IN4 / ENBD7 / D8 / D9(PWM)Controlo de velocidade e direção
LED RGB (#27)VCC / GND / R / G / B5V / GND / D10/D11/D12Indicador de modo e estado

🤖 Modo Autónomo — Arduino

robo_autonomo.ino
// ── Pinos motores (ponte H L298N) ───────────────────
#define M_ESQ_A   4
#define M_ESQ_B   5
#define M_ESQ_PWM 6
#define M_DIR_A   7
#define M_DIR_B   8
#define M_DIR_PWM 9

#define LINHA_PIN 2   // LOW = sobre linha
#define OBS_PIN   3   // LOW = obstáculo
#define VELOCIDADE 180

void mover(bool eA, bool eB, bool dA, bool dB) {
  digitalWrite(M_ESQ_A, eA); digitalWrite(M_ESQ_B, eB);
  digitalWrite(M_DIR_A, dA); digitalWrite(M_DIR_B, dB);
  analogWrite(M_ESQ_PWM, VELOCIDADE);
  analogWrite(M_DIR_PWM, VELOCIDADE);
}

void frente()    { mover(1,0,1,0); }
void recuar()    { mover(0,1,0,1); }
void virarEsq() { mover(0,1,1,0); }
void virarDir() { mover(1,0,0,1); }
void parar()     { analogWrite(M_ESQ_PWM,0); analogWrite(M_DIR_PWM,0); }

void setup() {
  for (int p : {M_ESQ_A,M_ESQ_B,M_DIR_A,M_DIR_B,M_ESQ_PWM,M_DIR_PWM})
    pinMode(p, OUTPUT);
  pinMode(LINHA_PIN, INPUT);
  pinMode(OBS_PIN,   INPUT);
  Serial.begin(9600);
}

void loop() {
  bool linha     = (digitalRead(LINHA_PIN) == LOW);
  bool obstaculo = (digitalRead(OBS_PIN)   == LOW);

  // Obstáculo tem prioridade sobre seguimento de linha
  if (obstaculo) {
    parar(); delay(200);
    recuar(); delay(400);
    virarDir(); delay(500);
    Serial.println("Obstáculo — desviando");
  } else if (linha) {
    frente();
    Serial.println("A seguir linha");
  } else {
    virarEsq(); delay(100);  // Procurar a linha
  }
}

🧠 Controlo por Gestos com PictoBlox

1

Instalar o PictoBlox

Descarrega em pictoblox.ai. É gratuito e disponível para Windows, macOS e Linux. Tem suporte nativo para Arduino e Python.

2

Criar extensão de gestos

No PictoBlox, abre um novo projeto. Adiciona a extensão Human Body Detection (requer câmara). Esta extensão usa ML para reconhecer posições do corpo em tempo real.

3

Definir os gestos

Treina 4 gestos: mão levantada (frente), mão abaixada (parar), braço esticado à esquerda (virar esquerda), braço esticado à direita (virar direita).

4

Enviar comandos ao Arduino

Usa a extensão Arduino do PictoBlox para enviar comandos via Serial ao Arduino. O Arduino lê os comandos e executa os movimentos correspondentes.

5

Testar e ajustar

Testa o reconhecimento com diferentes iluminações. O ML funciona melhor com fundo neutro e boa iluminação frontal.

🔗 Integração Modo Autónomo + Gestos

robo_dual_mode.ino
// Modo dual: autónomo (A) ou gestos via Serial (G)
#define LINHA_PIN 2
#define OBS_PIN   3
// [definições de motores igual ao sketch anterior]

char modo = 'A';  // 'A' = autónomo, 'G' = gestos

void setup() {
  Serial.begin(9600);
  // [pinMode dos motores e sensores]
}

void loop() {
  // Verificar comandos Serial do PictoBlox
  if (Serial.available()) {
    char cmd = Serial.read();
    switch(cmd) {
      case 'A': modo = 'A'; break;   // Mudar para autónomo
      case 'G': modo = 'G'; break;   // Mudar para gestos
      case 'F': if(modo=='G') frente();   break;
      case 'B': if(modo=='G') recuar();   break;
      case 'L': if(modo=='G') virarEsq(); break;
      case 'R': if(modo=='G') virarDir(); break;
      case 'S': parar(); break;
    }
  }
  if (modo == 'A') {
    // Lógica autónoma (igual ao sketch anterior)
  }
}

🏆 Para ir mais longe

Kit B 37 · PR.FT6_15 · Arduino UNO · Raspberry Pi · Início · led.dge.medu.pt