ROBÔ SUMÔ AGV

by heloisaalves in Circuits > Arduino

64 Views, 0 Favorites, 0 Comments

ROBÔ SUMÔ AGV

Capa Robô.PNG
INTRODUÇÃO.PNG

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

componentes.PNG

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

montagem.PNG

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

diagrama 2.PNG
diagrama.PNG

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

}