LusoRobótica - Robótica em Português
Robótica => Projectos de robótica => Projectos em desenvolvimento => Tópico iniciado por: DiogoPainho em 26 de Maio de 2011, 20:03
-
Boas. A minha ideia e construir um robo seguidor de linha.
Ja consegui desenvolver um algoritmo, no entanto, quando faço a leitura dos sensores, estes dão-me bons valores para trabalhar, mas quando insero no algoritmo onde actuam os motores, os valores oscilam bastante sem ter um valor aceitavel para trabalhar. Como posso corrigir o problema?
Eis o algoritmo:
int motorleft1 = 9;
int motorleft2 = 8;
int motorright1 = 7;
int motorright2 = 6;
int pwml = 10;
int pwmr = 11;
int front = 4;
int left = 5;
int right = 3;
int cruzl = 2;
int cruzr = 1;
int fc = 0;
int botton1 = 1;
int botton2 = 2;
int botton3 = 3;
int botton4 = 4;
int botton5 = 5;
int buzzer = 6;
// ————————————————————————— Motores
void setup()
{
pinMode(pwml, OUTPUT);
pinMode(pwmr, OUTPUT);
pinMode(motorleft1, OUTPUT);
pinMode(motorleft2, OUTPUT);
pinMode(motorright1, OUTPUT);
pinMode(motorright2, OUTPUT);
pinMode(buzzer, OUTPUT); //------------------ Buzzer
pinMode(fc,INPUT); //------------------ Sensor Parede
Serial.begin(9600); //Para podermos ver o valor na consola
}
// ————————————————————————— Loop
void loop()
//Ler Sensores
{
front = analogRead(front);
right = analogRead(right);
left = analogRead(left);
cruzl = analogRead(cruzl);
cruzr = analogRead(cruzr);
Serial.println(analogRead(left));
//-------------------------Andar para a frente
{
if(front > 30)
{
analogWrite(pwml, 170);
analogWrite(pwmr, 170);
digitalWrite(motorleft1, HIGH);
digitalWrite(motorleft2, LOW);
digitalWrite(motorright1, HIGH);
digitalWrite(motorright2, LOW);
delay (1000);
}
//-------------------------Andar para traz
if(fc = 0)
{
analogWrite(pwml, 127);
analogWrite(pwmr, 127);
digitalWrite(motorleft1, LOW);
digitalWrite(motorleft2, HIGH);
digitalWrite(motorright1, HIGH);
digitalWrite(motorright2, LOW);
digitalWrite(buzzer, HIGH);
delay(1000);
}
//--------------------------Virar à esquerda
if (left < 30)
{
analogWrite(pwml, 170);
analogWrite(pwmr, 170);
digitalWrite(motorleft1, LOW);
digitalWrite(motorleft2, HIGH);
digitalWrite(motorright1, HIGH);
digitalWrite(motorright2, LOW);
delay (1000);
}
//-------------------------Virar à direita
if(right < 30)
{
analogWrite(pwml, 170);
analogWrite(pwmr, 170);
digitalWrite(motorleft1,HIGH);
digitalWrite(motorleft2, LOW);
digitalWrite(motorright1,LOW);
digitalWrite(motorright2, HIGH);
delay (1000);
}
//---------------------- Fim
// if(left >10)
// if(front >10)
// if(right >10)
// {
// analogWrite(pwml, 0);
// analogWrite(pwmr, 0);
// digitalWrite(motorleft1,LOW);
// digitalWrite(motorleft2, LOW);
// digitalWrite(motorright1,LOW);
// digitalWrite(motorright2, LOW);
}
//------------ Cruzamentos e salas
//if (bottom1 = 0)
//{
// if(cruzl <200);
//}
// analogWrite(pwml, 200);
// analogWrite(pwmr, 200);
// digitalWrite(motorleft1, HIGH);
// digitalWrite(motorleft2, LOW);
//digitalWrite(motorright1, LOW);
//digitalWrite(motorright2, HIGH);
//if (bottom2 = 0)
//{
// if(cruzr <200)
//{
// analogWrite(pwml, 200);
// analogWrite(pwmr, 200);
// digitalWrite(motorleft1, HIGH);
// digitalWrite(motorleft2, LOW);
// digitalWrite(motorright1, LOW);
// digitalWrite(motorright2, HIGH);
//}
//}
//if (bottom3 = 0)
//{
// if(cruzr <200)
//{
// analogWrite(pwml, 200);
// analogWrite(pwmr, 200);
// digitalWrite(motorleft1, HIGH);
// digitalWrite(motorleft2, LOW);
// digitalWrite(motorright1, LOW);
// digitalWrite(motorright2, HIGH);
//}
// if(cruzl <200)
//{
// analogWrite(pwml, 200);
// analogWrite(pwmr, 200);
// digitalWrite(motorleft1, HIGH);
// digitalWrite(motorleft2, LOW);
// digitalWrite(motorright1, LOW);
// digitalWrite(motorright2, HIGH);
delay (1000);
}
-
n precebo o codigo que se usa no arduino, mas o mais provavel é estares a misturar valor dos motores com o dos sensores
-
Aqui:
if(fc = 0)
Devia ser == e não =, == é para comparar,= é para atribuir o valor á variavel, logo o teu isse vai dar sempre true e não comparar com 0.
Que sensores estás a usar?
É normal que os valores oscilem, podes ter usar alguma filtragem nos sensores, mas sem mais informação é dificil de saber.
-
Estou a usar sensores IV. Quanto ao código é esse o unico reparo que tem a fazer? De resto a lógica está boa? Sou iniciante...
-
O teu problema é que o teu código é demasiado simples e muito susceptivel a erros..
Tens um if(left<30) e outro com right<30, o que acontece se o valor desses 2 sensores for <30 ao mesmo tempo? O robot vai andar a oscilar e provavelmente tu não vais saber porque.
-
Então para além de por left > 30 tenho de por left > 30 && front <30 && right > 30, por exemplo...? Porém a minha dificuldade é que os sensores quando são lidos através do programa simples que é possivel encontrar em vários foruns, obtenho valores que dao para tabalhar, ou seja, 0 quando esta no preto e 30 quando está no branco. Porém quando transporto isso para este codigo, obtenho valores como por exemplo 20 110 50 10, tudo muito inconstante :s
Já agora pode-me relembrar qual e o programa que se usa para fazer o esquema das ligações, ja o tive, mas perdi-lhe o rumo ...
-
Fritzing é o nome do programa.
Que sensores são?
Se mexeres os sensores depressa com a mão tambem deves obter esses valores assim mais elevados, é que uma coisa é com os sensores parados e tudo bonito, mas a mexer é outra coisa.
-
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg804.imageshack.us%2Fimg804%2F443%2Fesquemaligaoesbb.jpg&hash=4a111dca850f67fac533800f8bd6092bf609dec7) (http://imageshack.us/photo/my-images/804/esquemaligaoesbb.jpg/)
É este o esquema das nossas ligações. So não estao representados os emissores de IV
-
Os sensores são tres para de emissores e receptores de IV, como utiliza o Qu-Bot... Mesmo assim, simulando o movimento dos sensores pela linha e pelas zonas brancas os valores são aceitaveis para trabalhar, no entanto, quando trabalham em conjunto com os motores, esses valores são mesmo inconstantes. vai de 8 a 80 em cima do branco e do preto, quase nao há diferença...
-
tens condensadores de decoupling nisso?
-
Os unicos condensadores que uso é no regulador de tensão, ou seja, um condensador de 100 microF(Electrolito) à entrada e um de 100 nanoF (Poliester) à saida
-
Ui, devias ter ai mais meia duzia deles...
-
Vou testar por um ou dois para os sensores a ver se as mediçoes ficam mais estáveis.