Go Down

Topic: QTR-8RC reflectance sensor (Read 2 times) previous topic - next topic

Fred Gomes

#15
Mar 29, 2010, 07:56 pm Last Edit: Mar 29, 2010, 08:07 pm by Fred_Gomes Reason: 1
esqueçe o meu psit anterior,
eu ja percebi essa minha duvida, eu a definir "position -3500) estou a dizer que o se tiver o ultimo sensor da esquerda tapado tenho -3500, e de seguida esse valor vai variar de 1000 em 1000, consecutivamente, e a partir desse valor defino o "meu estado dos sensores" para que o robot ande à maxima velocidade...

mas fiz este codigo...

Code: [Select]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtr((unsigned char[]) {9,8,7,6,5,4,3,2}, 8);
int motor_right = 10;
int motor_left = 11;

//variaveis auxiliares.

int ltarguetval = 0;// valor a desejar no motor left.
int rtarguetval = 0;// valor a desejar no motor right.
int lnowval = 0;    // valor actual no motor left.
int rnowval = 0;    // valor actual no motor right.

void setup(){
 Serial.begin(9600);

 pinMode (motor_right, OUTPUT);
 pinMode (motor_left, OUTPUT);

 int i;
 for (i = 0; i < 250; i++)
 {
   qtr.calibrate();
   delay(20);
 }
}


void loop(){
 unsigned int sensors [8];
 int position = qtr.readLine(sensors);
 int error = position -3500;
 int lastError = 0;
 int maxspeed = 130;
 double KP = 0.1;
 int KD = 5;
 int motorspeed = KP * error + KD * (error - lastError);
 lastError = error;

 Serial.println (position);
 delay(500);


 if(sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750 && sensors[3] > 750 && sensors[4] > 750 && sensors[5] > 750 && sensors[6] > 750 && sensors[7] > 750)
 {
   return;
 }

if(error >-500 && error < 500){
  rtarguetval = (int)maxspeed;
  ltarguetval = (int) maxspeed;
  error = lastError;
}
else if (error > 500 ){
   rtarguetval = (int)motorspeed;
   ltarguetval = maxspeed;
   error = lastError;
 }
 else if ( error < -500){
   ltarguetval = (int)motorspeed;
   rtarguetval = maxspeed;
   error = lastError;
 }
   if(rtarguetval > rnowval){
   rnowval +=1;
 }else if (rtarguetval < rnowval){
   rnowval -=1;
 }
 if (ltarguetval > lnowval){
   lnowval +=1;
 }else if(ltarguetval < lnowval){
   lnowval -=1;
 }
}






parece me estar correcto (vê e comenta sff), mas não funciona...

eu ao fazer o print de position, os valores que eu vou obter, nao vao ser de -3500 a 3500, mas sim de 0 a 7000 ( os tais valores que cada sensor gera se estiver tapado, pq faz isso??

como altero o código para que o qtr.readline varie de -3500 a 3500?

e ainda há outra coisa estranhissima que me acontece :-X nunca me aconteceu isto antes... eu tenho o serial monitor aberto e esta me a gerar uns valores (correctos, de 0 a 7000) se fechar e abrir o monitor de novo, já pode não me ser gerado esses valores, ou gera so zeros, ou outros valores, mas diferentes... sabes algum motivo que possa estar a provocar isso?...

Radames

Olá Fred,
Você não declara esses valores de erros, a partir do valor da position você faz um reajusta
error = position - 3500, supondo que seu position funcione corretamente, 0, 1000, 2000, .... 7000, o error vai reajustar isso para uma valor entre -3500 e 3500, pois quando position = 0 , error = 0 - 3500  =0 ou quando position = 7000 entao error = 7000 - 3500 = 3500, certo?

até

Fred Gomes

sim isso eu entendi..
mas esses valores não estão reajustando..
eu só obtenho valores de 0 a 7000 consoante o sensor que estiver tapado.. e não valores de -3500 a 3500, o que estou fazendo de errado no codigo ?

Radames

vc precisa imprimir o error e não o position
Code: [Select]

Serial.println (error);


Fred Gomes

se eu fizer isso o unico valor que me gera é -3500 :-/

Radames

vc já me adicionou no gtalk? radamajna at gmai dot com
me passa seu contato

Fred Gomes

sim add..
fred_pgomes@hotmail.com

Go Up