ROBÔ SUMÔ

by guiplassmann in Circuits > Arduino

87 Views, 0 Favorites, 0 Comments

ROBÔ SUMÔ

Imagem do WhatsApp de 2024-11-27 à(s) 19.38.57_2a3c70f7.jpg

Projeto do curso de ciência e tecnologia da faculdade biopark.

Robô sumo autonômo feito com carcaça de fonte de computador velha, com objetivo de competir contra outros robôs em uma arena circular de forma totalmente autonôma, seu obetivo é empurrar o outro robô para fora da arena.

Supplies

Materiais:

1 - Carcaça de fonte de computador

1 - Ponte - H L298N 

2 - Rodas para robô

2 - rodas

1 - Arduino

1 - Sensor ultrasônico

2 - Sensores infra vermelho - IR TCRT5000

3 - Celulas de bateria de 4.2v

1 - Chave liga/desliga

Cabos


Ferramentas:

Chave borne

Cola quente

Estação de solda

Fita isolante

Alicate de corte

RECORTES

Imagem do WhatsApp de 2024-11-27 à(s) 20.08.17_51ad5312.jpg

Desmonte a fonte de computador deixando apenas a carcaça;

Corte o lugar onde ficarão as rodas;

Corte o lugar onde ficará o sensor ultrassonico (frente do robô);

Faça os furos para os sensores infra vermelho (abaixo do robô).

POSIÇÃO RODAS

Imagem do WhatsApp de 2024-11-27 à(s) 20.09.40_00c07b30.jpg

Posicione os acoplamentos com os motores e as rodas de forma que fiquem posicionadas adequadamente nos recortes. Após validada a posição cole os acoplamentos no lugar com cola quente.



POSIÇÃO DOS SENSORES IR

Imagem do WhatsApp de 2024-11-27 à(s) 20.10.43_07cdba67.jpg

Posicione os sensores infravermelhos para que fiquem apontados para baixo do robô pelos furos feitos no primeiro passo. Após posicionados cole na posição.

POSIÇAO SENSOR ULTRASSÔNICO

Imagem do WhatsApp de 2024-11-27 à(s) 20.08.18_67887548.jpg
rcw-0001_case_17150.png

Posicione os sensor ultrassonico no recorte feito no passo 1, utilizamos uma case impressa para acoplar o sensor.

POSIÇÃO ARDUÍNO

Imagem do WhatsApp de 2024-11-27 à(s) 20.11.30_63569cb3.jpg
download.jpg

Posicione o arduino acima dos acoplamentos e cole com cola quente, utilizamos uma base feita com impressora 3d para evitar o contato da placa com partes metalicas.

POSIÇÃO PONTE H E CHAVE LIGA/DESLIGA

Imagem do WhatsApp de 2024-11-27 à(s) 20.14.09_c35c090f.jpg
Imagem do WhatsApp de 2024-11-27 à(s) 20.14.17_d42b1b83.jpg

Posicione a ponte H e a chave liga/desliga na parte de traz da carcaça da fonte, para a ponte h foram utilizadas porcas espaçadoras para evitar o contato com partes metalicas.

POSIÇÃO DAS BATERIAS

Imagem do WhatsApp de 2024-11-27 à(s) 20.21.01_bc99ef3a.jpg

Posicione as baterias na parte de cima da fonte e fixe com cola quente.

DIAGRAMA

F5JLKB0JCGK7VR6.jpg

Faça as ligações confome o diagrama

PROGRAMAÇÃO

Com os componentes ligados faça o download do código:


// Definição dos pinos dos motores

#define IN1 10 // Motor esquerdo, direção 1

#define IN2 6 // Motor esquerdo, direção 2

#define IN3 5 // Motor direito, direção 1

#define IN4 9 // Motor direito, direção 2


// Definição dos pinos do sensor ultrassônico

#define TRIGGER_PIN A2

#define ECHO_PIN A3


// Definição do pino do sensor infravermelho

#define IR_PIN A0 // Sensor IR conectado ao pino analógico A0


// Potência dos motores (0 a 255)

#define POTENCIA 255 // Potência normal

#define POTENCIA_MAXIMA 255 // Potência máxima dos motores


// Limite para detecção da linha

#define LIMIAR_LINHA 100 // Ajuste conforme necessário para detecção de preto


unsigned long tempoMovendoParaTras = 0;

unsigned long tempoDeteccao = 0;

bool movendoParaTras = false;

unsigned long tempoObjetoDetectado = 0; // Tempo de início da detecção do objeto

bool objetoDetectadoContinuo = false; // Flag para saber se o objeto foi detectado continuamente


void setup() {

// Configurar os pinos dos motores como saída

pinMode(IN1, OUTPUT);

pinMode(IN2, OUTPUT);

pinMode(IN3, OUTPUT);

pinMode(IN4, OUTPUT);


// Configurar os pinos do sensor ultrassônico

pinMode(TRIGGER_PIN, OUTPUT);

pinMode(ECHO_PIN, INPUT);


Serial.begin(9600); // Inicializa a comunicação serial para depuração

delay(3700);

}


void loop() {

// Ler o sensor infravermelho no modo analógico

int leituraIR = analogRead(IR_PIN);


// Imprimir a leitura do sensor IR

Serial.print("Leitura IR: ");

Serial.println(leituraIR);


// Detectar a linha preta com base no valor do sensor IR

bool linhaDetectada = leituraIR < LIMIAR_LINHA; // Agora, detecta preto


// Se a linha preta for detectada

if (linhaDetectada) {

moverParaTras(); // Move para trás se a linha preta for detectada

}

// Caso contrário, medir a distância usando o sensor ultrassônico

else {

long distancia = medirDistancia();


Serial.print("Distância: ");

Serial.println(distancia);


// Se um objeto for detectado pelo ultrassônico

if (distancia < 50) {

if (!objetoDetectadoContinuo) {

// Inicia o cronômetro para detectar o objeto continuamente

tempoObjetoDetectado = millis();

objetoDetectadoContinuo = true;

}


// Verifica se o objeto foi detectado por mais de 2 segundos

if (millis() - tempoObjetoDetectado >= 2000) {

moverFrentePotenciaMaxima(); // Aumenta a potência dos motores para o máximo após 2 segundos

} else {

moverFrente(); // Avança com potência normal

}


}

// Se não houver objetos detectados

else {

tempoDeteccao = 0; // Reseta o tempo de detecção

girar(); // Gira ambos os motores se não houver objetos

objetoDetectadoContinuo = false; // Reseta a detecção contínua do objeto

}

}


// Verifica se está se movendo para trás

if (movendoParaTras) {

if (millis() - tempoMovendoParaTras >= 4000) { // Verifica se passou 4 segundos

parar(); // Para os motores após 4 segundos

movendoParaTras = false; // Reseta o estado

}

}

}


long medirDistancia() {

digitalWrite(TRIGGER_PIN, LOW);

delayMicroseconds(2);

digitalWrite(TRIGGER_PIN, HIGH);

delayMicroseconds(10);

digitalWrite(TRIGGER_PIN, LOW);


long duracao = pulseIn(ECHO_PIN, HIGH);

long distancia = duracao / 58.2; // Converte para centímetros


return distancia;

}


void moverFrente() {

// Motor esquerdo avança

analogWrite(IN1, 0);

analogWrite(IN2, (POTENCIA/2));


// Motor direito avança

analogWrite(IN3, (POTENCIA/2));

analogWrite(IN4, 0);

}


void moverFrentePotenciaMaxima() {

// Motor esquerdo avança com potência máxima

analogWrite(IN1, 0);

analogWrite(IN2, POTENCIA_MAXIMA);


// Motor direito avança com potência máxima

analogWrite(IN3, POTENCIA_MAXIMA);

analogWrite(IN4, 0);

}


void parar() {

// Para os motores

analogWrite(IN1, 0);

analogWrite(IN2, 0);

analogWrite(IN3, 0);

analogWrite(IN4, 0);

}


void girar() {

// Gira ambos os motores

analogWrite(IN1, 0); // Motor esquerdo avança

analogWrite(IN2, 0);

analogWrite(IN3, (POTENCIA/2)); // Motor direito avança

analogWrite(IN4, 0);

}


void moverParaTras() {

if (!movendoParaTras) {

// Motor esquerdo retrocede

analogWrite(IN1, (POTENCIA/2));

analogWrite(IN2, 0);


// Motor direito retrocede

analogWrite(IN3, 0);

analogWrite(IN4, (POTENCIA/2));


tempoMovendoParaTras = millis(); // Salva o tempo de início do movimento para trás

movendoParaTras = true; // Atualiza o estado para indicar que está se movendo para trás

}

}


void moverParaTrasGirando() {

// Motor esquerdo retrocede

analogWrite(IN1, POTENCIA);

analogWrite(IN2, 0);


// Motor direito avança

analogWrite(IN4, 0);

analogWrite(IN3, 0);


delay(200); // Ajuste o tempo conforme necessário para o movimento rápido

}

RESULTADOS