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.
| Módulo | Pino do módulo | Pino Arduino | Função |
|---|---|---|---|
| Sensor Seguidor Linha (#33) | VCC / GND / DO | 5V / GND / D2 | Deteta linha — LOW sobre linha escura |
| Sensor Obstáculos (#37) | VCC / GND / OUT | 5V / GND / D3 | Deteta obstáculo — LOW = obstruído |
| Motor esquerdo (L298N) | IN1 / IN2 / ENA | D4 / D5 / D6(PWM) | Controlo de velocidade e direção |
| Motor direito (L298N) | IN3 / IN4 / ENB | D7 / D8 / D9(PWM) | Controlo de velocidade e direção |
| LED RGB (#27) | VCC / GND / R / G / B | 5V / GND / D10/D11/D12 | Indicador de modo e estado |
// ── 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
}
}Descarrega em pictoblox.ai. É gratuito e disponível para Windows, macOS e Linux. Tem suporte nativo para Arduino e Python.
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.
Treina 4 gestos: mão levantada (frente), mão abaixada (parar), braço esticado à esquerda (virar esquerda), braço esticado à direita (virar direita).
Usa a extensão Arduino do PictoBlox para enviar comandos via Serial ao Arduino. O Arduino lê os comandos e executa os movimentos correspondentes.
Testa o reconhecimento com diferentes iluminações. O ML funciona melhor com fundo neutro e boa iluminação frontal.
// 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)
}
}