collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

Autor Tópico: seguidor de linha com obstaculos Robô Bot’n Rool ON  (Lida 6008 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline ALEX LUTHOR

  • Mini Robot
  • *
  • Mensagens: 3
seguidor de linha com obstaculos Robô Bot’n Rool ON
« em: 14 de Agosto de 2015, 14:39 »
Boas pessoal,

Sou novo neste fórum, e começo apresentando-me , Sou o Alexsandro, tenho 30 anos , estou a estudar na IFCE-campus Juazeiro do Norte-Ceará-Brasil , estou no quinto semestre do curso de automação industrial  .
A minha questão é sobre o Robô Bot’n Rool ONE,no a escola que eu estou trabalhando adquiriu, estamos programando ele para participar da olimpíada brasileira de robótica, estamos com dificuldade de programar, ele tem que fazer um percurso, desviar de obstáculos e resgatar, no caso uma bolinha, escrevemos o código mais ele não consegue seguir a linha correto.
As provas à prova da OBR são resgate e salvamento, seguimento de linha e prova de obstáculos. Queria uma ajuda para melhorar o código, e qual sensor usaria para identificar a cor prata da bolinha?Alguém teria algum código seguidor de linha?ou sonar?

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.480
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #1 em: 14 de Agosto de 2015, 14:59 »
Se a bolinha for mesmo prata, entao 'e altamente reflectora e devera ser possivel usando um sensor infravermelhos (IV / IR) detectar a alguns centrimetros.
Codigos, penso que o google ter'a. Mas terao de ser sempre adaptados ao vosso robot.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.943
  • NERD!
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #2 em: 14 de Agosto de 2015, 15:06 »
Tens 1001 exemplos de seguidores de linha, é um dos primeiros projetos que muita gente faz em robótica, e nem precisa de programação (a lógica é tão simples que até se consegue usando só ampops ou transístores), pelo que o programa tem de ser óbvio.

Se não te safas num projeto tão simples, tens de voltar às bases e ir estudar programação, não adianta estar-te a ajudar com código que não entendas, e se estás a estudar imagino que não seja esse o princípio do projeto (fazer as coisas sem as entender).

Quanto a detetar uma bola prateada, isso já é mais interessante e coloca um desafio engraçado se não for o único objeto no campo, porque não tem uma cor que a distinga (prateado é uma reflexão).




Offline Hugo

  • Mini Robot
  • *
  • Mensagens: 121
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #3 em: 14 de Agosto de 2015, 16:36 »
Quais sao as tuas duvidas ?
E o sensor que nao esta a dar os valores corretos ? Perde se da linha ? nao reconhece , nao faz nada ? Tas a usar um arduino ou outra plataforma?

Podes usar tambem flipflops , no youtube ha um professor que fez um assim ....

Sabes se a bola e metalica ?
« Última modificação: 14 de Agosto de 2015, 16:43 por Hugo »

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.943
  • NERD!
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #4 em: 14 de Agosto de 2015, 17:17 »
Alguém teria algum código seguidor de linha?ou sonar?

Já reparaste que na página desse robot (http://botnroll.com/onea/), nos "Programas Exemplo", está incluído um Line Follower ?
 ::) ::) ::)

Offline Hugo

  • Mini Robot
  • *
  • Mensagens: 121
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #5 em: 14 de Agosto de 2015, 18:02 »
E so um robo com as varias opcoes para cada situaçao do desafio?

Offline ALEX LUTHOR

  • Mini Robot
  • *
  • Mensagens: 3
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #6 em: 02 de Setembro de 2015, 20:02 »
Na realidade ,ele segue linha,mais quando adiciono mais sensores,como sonar e a garra ,ele fica fazendo leituras erradas do seguidor de linha,tipo processamento lento,é só um robô,que tem que executar varias tarefas,seguir linha,desvia de obstáculos e fazer o regaste,tou usando o  Bot'n Roll ONE ,me desculpem se não tenho o nível de conhecimento de muitos desse fórum,mais acho que perguntar não mata ninguém.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #7 em: 02 de Setembro de 2015, 20:08 »
Se partilhares pinos sim, vai correr mal, cada sensor terá de ter pinos separados para dar o seu sinal.
De resto é juntar o código todo de forma a que fique funcional, e ai existem mil e uma maneiras de lá chegar, umas melhores que outras.
Posta duvidas mais especificas ou deixa algum código e fotos de como está tudo ligado para pudermos ajudar mais qualquer coisa.
Avr fanboy

Offline ALEX LUTHOR

  • Mini Robot
  • *
  • Mensagens: 3
Re: seguidor de linha com obstaculos Robô Bot’n Rool ON
« Responder #8 em: 02 de Setembro de 2015, 23:30 »
esse é o meu código

Código: [Seleccione]
#include <BnrOneA.h>
#include<SPI.h> 
#include <Ultrasonic.h>
#include <Servo.h>
#include <Thread.h>
#include <ThreadController.h>
#include <NewPing.h>

BnrOneA one;

/***SERVOS***/
Servo servo1;
Servo servo2;
int pos1, pos2, pos3, pos4;
int obstgarra = 0;

#define SSPIN 2
#define M1 1
#define M2 2
#define smin 300
 
/***ULTRASSÔNICO***/
Ultrasonic ultrasonicInf(7, 8);
long msInf = 0;
float distCMInf = 0;

/***FUNÇÂO DE CONFIGURAÇÂO***/
void setup()
{
  Serial.begin(57600);
  one.spiConnect(SSPIN);
  delay(5);
  one.stop();
  delay(5);
 
  one.lcd1(" Colegio Objetivo");
  one.lcd2("Cupcake");

  servo1.attach(3);//servo de abertura/fechamento da garra
  servo2.attach(5);//servo de movimentação para baixo e para cima
  servo1.write(50);//inicia a garra aberta
  servo2.write(110);//inicia o a garra alta
  delay(500);
 
  //servo1
  pos1 = 130; //abertura
  pos2 = 10; //fechamento
  //servo2
  pos3 = 40; //baixo
  pos4 = 110; //alto
}
/****FUNAÇÂO PRINCIPAL*****/
void loop()
{
  ultrasonicInferior(); //chamada da função do ultrassônico
  linha();              //chamada da função do seguidor de linha
}
/****FUNAÇÂO SEGUIDOR DE LINHA*****/
void linha()

  int sensor0=one.readAdc(0);
  int sensor1=one.readAdc(1);
  int sensor2=one.readAdc(2);
  int sensor3=one.readAdc(3); //define cada sensorX correspondente ao valor da conversão ADC no readAdc(x)
  int sensor4=one.readAdc(4);
  int sensor5=one.readAdc(5);
  int sensor6=one.readAdc(6);
  int sensor7=one.readAdc(7);
  if(sensor0 > smin&&sensor1 > smin && sensor2 > smin && sensor3 > smin && sensor4 > smin && sensor5 > smin && sensor6 < smin && sensor7 < smin  )
   {                                                                                                       
     one.move(-30,30);  //movimenta os motores para esquerda com velocidade de 30
     delay(10);        //espera 10 ms
   }
    else if(sensor0 > smin && sensor1 > smin && sensor2 > smin && sensor3 > smin && sensor4 > smin && sensor5 < smin && sensor6 < smin && sensor7 < smin)
   {                                                                                                     
     one.move(-30,30);   //movimenta os motores para esquerda com velocidade de 30
     delay(10);         //espera 10 ms
   }
    else if(sensor0 > smin && sensor1 > smin && sensor2 > smin && sensor3 > smin && sensor4 < smin && sensor5 < smin && sensor6 < smin && sensor7 < smin )
    {                                                                                                       
      one.move(-30,30); //movimenta os motores para esquerda com velocidade de 30
      delay(10);       //espera 10 ms
   }
    else if(sensor0 > smin && sensor1 > smin && sensor2 > smin && sensor3 < smin && sensor4 < smin && sensor5 < smin && sensor6 < smin && sensor7 < smin )
   {                                                                                                       
     one.move(-30,30);  //movimenta os motores para esquerda com velocidade de 30
     delay(10);        //espera 10 ms
   }
   else if(sensor0 > smin && sensor1< smin && sensor2 < smin && sensor3 < smin && sensor4 < smin && sensor5 < smin && sensor6 < smin && sensor7 < smin )
  {
    one.move(-10,30);
    delay(10);
  }
  else if(sensor0 > smin && sensor1> smin && sensor2 < smin && sensor3 < smin && sensor4 < smin && sensor5 < smin && sensor6 < smin && sensor7 < smin )
  {
    one.move(-10,30);
    delay(10);
  }
  else if(sensor0 < smin && sensor1 > smin && sensor2 > smin && sensor3 < smin && sensor4 < smin && sensor5 < smin && sensor6 < smin && sensor7 < smin )
  {
    one.move(0,30);
    delay(10);
  }
  else if(sensor0<smin&&sensor1<smin&&sensor2>smin&&sensor3>smin&&sensor4<smin&&sensor5<smin&&sensor6<smin&&sensor7<smin )
  {
    one.move(18,30);
    delay(10);
  }
  else if(sensor0<smin&&sensor1<smin&&sensor2<smin&&sensor3>smin&&sensor4>smin&&sensor5<smin&&sensor6<smin&&sensor7<smin)
  {
    one.move(30,30);
    delay(10);
  }
  else if(sensor0<smin&&sensor1<smin&&sensor2<smin&&sensor3<smin&&sensor4>smin&&sensor5>smin&&sensor6<smin&&sensor7<smin )
  {
    one.move(30,18);
    delay(10);
  }
  else if(sensor0<smin&&sensor1<smin&&sensor2<smin&&sensor3<smin&&sensor4<smin&&sensor5>smin&&sensor6>smin&&sensor7<smin )
{
  one.move(30,0);
  delay(10);
}
 else if(sensor0<smin&&sensor1<smin&&sensor2<smin&&sensor3<smin&&sensor4<smin&&sensor5<smin&&sensor6>smin&&sensor7>smin)
 {
   one.move(30,-10);
   delay(10);
 }
 
  else if(sensor0<smin&&sensor1<smin&&sensor2<smin&&sensor3<smin&&sensor4<smin&&sensor5<smin&&sensor6<smin&&sensor7>smin )
 {
   one.move(30,-10);
   delay(10);
 }
 
 else if(sensor0 < smin && sensor1 < smin && sensor2 > smin && sensor3 > smin && sensor4 > smin && sensor5 > smin && sensor6 > smin && sensor7 > smin )
 {                                                                                                                                 
  one.move(30,-30);  //movimenta o carro para direita com velocidade de 30
  delay(10);        //execulta a instrução anterior por 10 ms
 }
  else if(sensor0 < smin && sensor1 < smin && sensor2 < smin && sensor3 > smin && sensor4 > smin && sensor5 > smin && sensor6 > smin && sensor7 > smin )
 {                                                                                                                                 
  one.move(30,-30);  //movimenta o carro para direita com velocidade de 30
  delay(10);        //execulta a instrução anterior por 10 ms
 }
   else if(sensor0 < smin && sensor1 < smin &&  sensor2 < smin && sensor3 < smin && sensor4 > smin && sensor5 > smin && sensor6 > smin && sensor7 > smin )
 {                                                                                                                                 
  one.move(30,-30);  //movimenta o carro para direita com velocidade de 30
  delay(10);         //execulta a instrução anterior por 10 ms
 }
 else if(sensor0 < smin && sensor1 < smin && sensor2 < smin && sensor3 < smin && sensor4 < smin && sensor5 > smin && sensor6 > smin && sensor7 > smin )
 {                                                                                                                                 
  one.move(30,-30);   //movimenta o carro para direita com velocidade de 30
  delay(10);         //execulta a instrução anterior por 10 ms
 }

/***SEM LINHA***/
else if(sensor0 < smin && sensor1 < smin && sensor2 < smin && sensor3 < smin && sensor4 < smin && sensor5 < smin && sensor6 < smin && sensor7 < smin )
 {
   one.move(20,20); //segue em frente(linha reta) com velocidade de 20
   delay(2);        //execulta a instrução anterior por 2 ms
 }
 else  if(sensor0 > smin && sensor1 > smin && sensor2 > smin && sensor3 > smin && sensor4 > smin && sensor5 > smin && sensor6 > smin && sensor7 > smin )
   {                                                                                                       
    one.move(20,20);  //segue em frente(linha reta) com velocidade de 20
    delay(2);         //execulta a instrução anterior por 2 ms
   }
}
/***FUNAÇÂO ULTRASSÔNICO ***/
void ultrasonicInferior()
{
  msInf = ultrasonicInf.timing();
  distCMInf = ultrasonicInf.convert(msInf, Ultrasonic::CM);
/*** CONDIÇÃO DE DESVIO DE OBSTACULOS ***/ 
 if (distCMInf >= 8 && distCMInf <= 10 &&  obstgarra <= 1) //distância entre 8 e 10 cm e o contador menor ou igual a 1 a condição é verdadeira
  {
   desvio();       //chamada da função desvio
   obstgarra ++;   //incrementa em uma unidade o contador,enquanto for menor ou igual a 1 
  }
/*** CONDIÇÃO DE DESVIO DA PARADE NO 3°  AMBIENTE ***/ 
  if(distCMInf <= 20 && distCMInf >= 15 && obstgarra == 2 )//distância entre 15 e 20 cm e o contador  igual a 2 a condição é verdadeira
  {
   one.stop();
   delay(1000);
   one.move(-20,-20);
   delay(800);
   one.stop();
   one.move(-30, 30);
   delay(480);
   one.stop();
   delay(1000);
   one.move(20,20);
   delay(550);
   one.stop();
   obstgarra ++;
  }
/***CONDIÇÃO PARA PEGAR O OBJETO DO RESGASTE ***/   
  if (distCMInf > 0 && distCMInf <= 6 && obstgarra == 3)
  {
    garra();       //chamada da função garra
    obstgarra ++;
  }
/***CONDIÇÃO PARA VARREDURA DO LUGAR PARA DEIXAR O OBJETO DO RESGASTE***/   
  if (distCMInf > 8 && distCMInf <=12 && obstgarra == 4)
   {
    girar();
   }
}
/*** FUNÇÃO DESVIO ***/
void desvio()
{
/**1**/
       
  one.stop();
  delay(1000);
  one.move(-10,-10);
  delay(500);
  one.stop();
  delay(1000);
  //*******************************************************************************************************************//
/**2**/ 
  one.move(-20,20); //vira para esquerda
  delay(500);       //execulta a instrução durante 500 ms
  one.stop();       //para os motores
  delay(1000);      //execulta a instrução durante  1s
  //*******************************************************************************************************************//
 /**3**/
  one.move(25,25);
  delay(700);
  one.stop();
  delay(1000);
  //*******************************************************************************************************************//
/**4**/ 
  one.move(20,-20); //vira para direita
  delay(450);
  one.stop();
  delay(1000);
  //*******************************************************************************************************************//
/**5**/ 
  one.move(20,20);
  delay(1000);
  one.stop();
  delay(1000);
  //*******************************************************************************************************************//
/**6**/ 
  one.move(20,-20);//vira para direita
  delay(400);
  one.stop();
  delay(1000);
  //*******************************************************************************************************************//
  one.move(20,20);
  delay(900);
  one.stop();
  delay(1000);
 
  one.move(-20,20);
  delay(400);
  one.stop();


/***FUNÇÃO GARRA ***/
void garra()

    one.move(-10,-10);
    delay(400);
    one.stop( );
    delay(700);
    servo2.write(pos3);// baixa
    delay(1000);
    servo1.write(pos2);//fechamento
    delay(800);
    servo2.write(80);// alto
    delay(800);
    one.move(10, 10);
    delay(2900);
}

void girar()
{
  one.move(-10,-10);
  delay(2500);
  one.stop();
  delay(220);
/***VIRAR PARA DIREITA***/ 
  one.move(20,-20);
  delay(300);
  one.stop();
  one.move(20,20);
  delay(1700);
  one.stop();
  delay(220);
  servo1.write(pos1); // abrir a garra
  delay(800);
  one.move(-10,-10);
  delay(2500);
  one.stop();
  delay(10000);
/***VIRAR PARA ESQUERDA***/
 /* one.move(-20,20);
  delay(300);
  one.stop();
  one.move(20,20);
  delay(1700);
  one.stop();
  delay(220);
  servo1.write(pos1); // abrir a garra
  delay(800);
  one.move(-10,-10);
  delay(2500);
  one.stop();
  delay(10000);
  */
/***LADO OPOSTO(DE FRETE A ENTRADA)***/
 /* one.move(20,-20);
  delay(1200);
  one.stop();
  one.move(20,20);
  delay(1700);
  one.stop();
  delay(220);
  servo1.write(pos1); // abrir a garra
  delay(800);
  one.move(-10,-10);
  delay(2500);
  one.stop();
  delay(10000);
  */
  }