ROBÔ SUMÔ AGV


Bem vindo ao nosso manual, onde passamos pelo processo de fazer um robô lutador de sumô. Este projeto foi feito por 3 aprendizes do curso de Aprendizagem em Automação Industrial: Heloisa, Kael e Lorrayne.
Supplies

Para montagem do nosso robô sumô são utilizados os seguintes componentes:
01 un. | Arduino UNO R3 SMD + Cabo USB para conexão com Arduino;
02 un. | Mini motor DC com conjunto de redução;
02 un. | Bateria 18650 Li-ion recarregáveis;
01 un. | Carregador de baterias;
01 un. | Módulo Sensor de Distância Ultrassônico HC-SR04;
01 un. | Módulo Shield Ponte H L91105;
01 un. | Módulo Sensor de Obstáculo Infravermelho IR;
01 un. | Conjunto chassi + rodas;
01 un. | Kit Jumpers.
MONTAGEM

Para o robô, como passo inicial você pode utilizar o Fusion 360, uma plataforma de software de modelagem 3D, CAD, CAM, CAE e PCB na nuvem para construir a maioria das partes do robô.
No entanto, devido a recursos limitados, pode-se optar também por fabricar manualmente as partes do chassi do robô utilizando ferramentas tradicionais, incluindo furadeiras, calandra, guilhotina, morsa e alicates. Essas ferramentas básicas permitem modelar e montar as partes necessárias para o robô.
Além disso, utilizar a plataforma virtual Tinkercad para teste do código enquanto a montagem não está concluída pode agilizar o processo de funcionamento do robô.
A construção pode ser dividida em poucos passos:
1º Passo
Comumente, os motores para robôs e as baterias vêm sem os cabos de conexão soldados. Dessa forma, para fazer a condução de energia e acionar o motor e os demais componentes é necessário a soldagem. Liga-se dois pares de cabos em cada motor (positivo e negativo). Logo depois, um cabo em cada lado da bateria realizando uma ligação em série para somar a tensão suficiente para os dois motores funcionarem.
2º Passo
Aqui inicia-se o processo de criação das estruturas principais do robô.
Para a base, utiliza-se uma peça de MDF com recortes feitos pela máquina a laser.
No caso da armadura do robô, para garantir maior resistência e durabilidade, pode-se utilizar uma carcaça de gabinete de computador reciclada, em vez de materiais mais comuns, como MDF ou plástico. Esse material é escolhido por proporcionar uma vantagem em competições de robôs onde a resistência estrutural é essencial.
Ao realizar o corte das partes do gabinete, utilizando a guilhotina, é garantido que as medidas sejam precisas de acordo com as dimensões planejadas. Após o corte, as peças são submetidas a um processo de dobradura, utilizando uma morsa, para formar as laterais e a rampa de suporte.
3° Passo
Levando em consideração o tamanho da plataforma para fixação dos componentes,é ideal pensar em um layout onde todas as peças se encaixem. É aconselhável a estratégia de desenhar o local de cada componente e marcar os lugares para perfuração de parafusos, feito isso fura-se a base de acordo com o local já desenhado e logo após o processo de furação, fixa-se os componentes em seus respectivos lugares.
4° Passo
Após a construção do chassi e a fixação dos componentes, a próxima etapa consiste no encaixe das rodas, que são fundamentais para garantir a mobilidade do robô. Utilizamos rodas feitas por impressora 3D e enrolamos fios de barbante em sua circunferência para possuir boa tração.
5° Passo
Após a instalação dos motores, o próximo passo é realizar a ligação dos componentes eletrônicos. Para isso, utiliza-se jumpers (fios de conexão) para conectar os motores e outros componentes eletrônicos, como sensores, ponte H e a placa do Arduino.
DIAGRAMAS


Esse diagrama deve ser considerado caso você venha a utilizar uma Ponte H dupla CI l293D.
Utilidade dos sensores utilizados:
Sensor ultrassônico: é usado para medir a distância entre objetos, e também pode ser usado para detectar objetos em movimento. Sua utilidade no projeto era detectar possíveis ameaças em suas batalhas, assim determinando a direção que teria que prosseguir.
Sensor de Obstáculo Infravermelho IR: Quando algum obstáculo/objeto passa no ângulo de reflexão dentro da distância ajustada, o sensor indica tal situação colocando a saída em nível lógico BAIXO. Utiliza-se esse sensor para detectar o limite da arena, fazendo assim com que o robô não caísse da mesma. Ele executa essa função quando o sensor passava por cima da linha preta (limite da arena), mandando um sinal de lógica baixa para o programa, fazendo-o entender que ali é o limite para onde ele pode ir.
POSSÍVEIS MELHORIAS
Possíveis melhorias:
Além do barbante, adicionar uma camada de borracha ao redor das rodas pode melhorar a aderência.
Embora a utilização de um gabinete de computador reciclado tenha a vantagem de proporcionar resistência, poderia ser interessante explorar outros materiais que ofereçam boa resistência com menor peso.
CÓDIGO DA PROGRAMAÇÃO
#define NUM_READINGS 10 // Número de leituras para média móvel
long readings[NUM_READINGS]; // Array para armazenar leituras
int readIndex = 0; // Índice para a próxima leitura
long total = 0; // Somatório das leituras
long average = 0; // Média das leiturasv
// Definindo os pinos dos motores
#define motorA1 3 // Motor A, pino 1 (L298N)
#define motorA2 4 // Motor A, pino 2 (L298N)
#define motorB1 5 // Motor B, pino 1 (L298N)
#define motorB2 6 // Motor B, pino 2 (L298N)
// Definindo os pinos do sensor ultrassônico
#define trigPin 9 // Pino TRIG do HC-SR05
#define echoPin 10 // Pino ECHO do HC-SR05
// Definindo o pino do sensor IR para detectar a borda
#define sensorIRPin 7
long duracao;
int distancia;
int sensor;
void setup() {
// Inicializa os pinos dos motores como saída
pinMode(motorA1, OUTPUT);
pinMode(motorA2, OUTPUT);
pinMode(motorB1, OUTPUT);
pinMode(motorB2, OUTPUT);
// Inicializa os pinos do sensor ultrassônico
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(sensorIRPin, INPUT);
Serial.begin(9600);
// Inicializa o array de leituras
for (int i = 0; i < NUM_READINGS; i++) {
readings[i] = 0;
}
}
void loop() {
// Lê o valor do sensor IR para detectar a borda
sensor = digitalRead(sensorIRPin);
// Exibe o valor do sensor IR no monitor serial (para depuração)
Serial.print("Sensor IR: ");
Serial.println(sensor);
// Se o sensor IR detectar a linha preta (borda da arena), o robô para ou desvia
if (sensor == LOW) {
// Sensor IR detectou a linha preta (borda da arena)
Serial.println("Borda detectada! Desviando...");
parar();
delay(500); // Espera para evitar que o robô continue movendo-se para a borda
desviar(); // Função para desviar da borda
} else {
// Se o sensor IR não detectar a linha preta, o robô continua seu movimento normal
// Envia um sinal de 10 microsegundos no pino TRIG para iniciar a medição do ultrassônico
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Lê a distância
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.0344 / 2; // Converte o tempo em distância (cm)
// Subtrai a leitura mais antiga
total -= readings[readIndex];
// Adiciona a nova leitura
readings[readIndex] = distance;
total += readings[readIndex];
// Avança o índice e faz a circularidade
readIndex = (readIndex + 1) % NUM_READINGS;
// Calcula a média
average = total / NUM_READINGS;
// Exibe a média da distância no monitor serial
Serial.print("Distância média: ");
Serial.println(average);
// Se a distância for menor que 20 cm, o robô detecta o oponente e vai para frente
if (distancia< 20) {
moverFrente();
}
else {
procurarOponente();
}
}
delay(100);
}
void moverFrente() {
// Liga os motores para mover para frente
digitalWrite(motorA1, HIGH);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, HIGH);
digitalWrite(motorB2, LOW);
}
void parar() {
// Para os motores
digitalWrite(motorA1, LOW);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, LOW);
}
void desviar() {
// Gira o robô para a direita para se afastar da borda
digitalWrite(motorA1, HIGH);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, LOW);
// Aguarda 1 segundo
delay(1000);
parar();
}
void procurarOponente() {
//O robô gira para a direita até ele detectar o oponente
digitalWrite(motorA1, HIGH);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, LOW);
// Aguarda 1 segundo
delay(1000);
}