ROBÔ SUMÔ
 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
 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
 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
 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
 20.08.18_67887548.jpg)

Posicione os sensor ultrassonico no recorte feito no passo 1, utilizamos uma case impressa para acoplar o sensor.
Downloads
POSIÇÃO ARDUÍNO
 20.11.30_63569cb3.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
 20.14.09_c35c090f.jpg)
 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
 20.21.01_bc99ef3a.jpg)
Posicione as baterias na parte de cima da fonte e fixe com cola quente.
DIAGRAMA

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
}