Go Down

Topic: QTR-8RC reflectance sensor (Read 3414 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy