LusoRobótica - Robótica em Português
Robótica => Discussão geral sobre robótica => Tópico iniciado por: ALEX LUTHOR 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?
-
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.
-
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 (https://www.google.com/search?q=opamp+line+follower&tbm=isch) ou transístores (https://www.google.com/search?q=transistor+line+follower&tbm=isch)), 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).
-
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 ?
-
Alguém teria algum código seguidor de linha?ou sonar?
Já reparaste que na página desse robot (http://botnroll.com/onea/ (http://botnroll.com/onea/)), nos "Programas Exemplo", está incluído um Line Follower ?
::) ::) ::)
-
E so um robo com as varias opcoes para cada situaçao do desafio?
-
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.
-
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.
-
esse é o meu código
#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);
*/
}