Go Down

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

Fred Gomes

Boa tarde.
estou a tentar construir um seguidor de linhas usando um array de 8 sensores RC, da Pololu, estou a tentar usar a biblioteca fornecida pela Pololu, mas não consigo proceder à leitura dos sensores, o único valor que consigo obter no ecra Serial é 0:/

os links da biblioteca em que me centrei são os seguintes:

http://www.pololu.com/docs/0J18/14
http://www.pololu.com/docs/0J19/3

e o código que idealizei foi:

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

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);
 
void setup(){
 Serial.begin(9600);
 int i;
 for ( i = 0; i < 250; i++){
   qtrrc.calibrate();
   delay(20);
 }
}

void loop(){
 qtrrc_read();
 // Imprimir os valores dos sensores.
 for (int i = 0; i < 8; i++){
   Serial.println (val_sensores[i]);
   delay(500);
 }
}
void qtrrc_read(unsigned int *vsensores, unsigned char readMode){
 
 for (int i=0; i < 8; i++){
   val_sensor[i] = qtrrc.read(vsensores[i]);
   delay(50);
 }
}


o compilador acusa-me um erro, diz que tenho muitas funções em função de void loop(){ , não percebo pq..

conseguem ajudar-me?
cumps
Fred

arilson

    Na documentação da biblioteca fala a respeito das funções de calibração, pode ter algo aí

    Outro coisa, sempre que começo a trabalhar com algo novo, como é o caso, utilizo  apenas um sensor, e tento saber o máximo sobre ele, depois replico a experiência, comigo sempre funciona!

Radames

Olá Fred,

Este é o código que você esta tentando compilar?
Bom, seria interessante passar o código completo, pelo que vejo neste ai faltam varias definições das portas onde os sensores supostamente deveriam estar. Mande o código completo!

Fred Gomes

Boas.
já consegui fazer a leitura dos sensores, utilizei o seguinte código:

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

   PololuQTRSensorsRC qtr((unsigned char[]) {9,8,7,6,5,4,3,2}, 8);

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

   void loop()
   {
     unsigned int readings[8];
     qtr.read(readings);
     Serial.print ("sensor1  ");
     Serial.println(readings[0]);
     delay(1000);
     Serial.print ("sensor2  ");
     Serial.println(readings[1]);
     delay(1000);
     Serial.print ("sensor3  ");
     Serial.println(readings[2]);
     delay(1000);
     Serial.print ("sensor4  ");
     Serial.println(readings[3]);
     delay(1000);
     Serial.print ("sensor5  ");
     Serial.println(readings[4]);
     delay(1000);
     Serial.print ("sensor6  ");
     Serial.println(readings[5]);
     delay(1000);
     Serial.print ("sensor7  ");
     Serial.println(readings[6]);
     delay(1000);
     Serial.print ("sensor8  ");
     Serial.println(readings[7]);
     delay(1000);
   }

   




agora, estou tentando fazer mover os motores consoante o código, eu ja fiz um código que calcula o erro e faz girar os motores mais ou menos consoante o erro, mas esse código só funciona em leituras digitais,

para usar estes sensores necessito de fazer leituras que a própia biblioteca define, eu ainda não percebi como essa biblioteca cálcula o erro automaticamente...

vou postar o código que fiz ( não funciona não sei porque), dizer porque tomei algumas decisões, e agradeçia muito a vossa ajuda...

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

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

//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 -1000;
 int lastError = 0;
 int maxspeed = 130;
 double KP = 0.1;
 int KD = 5;
 int motorspeed = KP * error + KD * (error - lastError);
 lastError = error;
 
 Serial.print (qtr.readLine (sensors));
 delay(500);


 if(sensors[3] > 750 && sensors[4] > 750)
 {
   return;
 }

if (error = 0){
  rtarguetval = (int)maxspeed;
  ltarguetval = (int) maxspeed;
}
else if (error < 0 ){
   rtarguetval = (int)motorspeed;
   error = lastError;
 }
 else if ( error > 0){
   ltarguetval = (int)motorspeed;
   error = lastError;
 }
}


   


bem , eu tenho 8 sensores, e eu acho que deve haver uma "função" que permite indicar o meu estado ideal dos sensores, isto é, o estado a que os sensores devem estar para os motores andarem à máxima velocidade, e que nesse apenas nesse estado o erro seja 0., eu defini isso aqui:

Code: [Select]
if(sensors[3] > 750 && sensors[4] > 750)
 {
   return;
 }
, desejo que apenas os dois sensores do meio vejam preto, isto está correcto? (eu acho que não, mas não encontro outra forma de fazer isto, por isso estou pedinso a vossa ajuda),

e entendi que se esse fragmento não se verificasse existiria um erro, erro esse que iria determinar a velocidade dos motores..

se me conseguirem ajudar agradçeia imenso..


Radames

qual é este erro que você quer calcular?
quais os sensores no array sensors[] ativam quais motores?
você quer apenas detectar valores acima de 750? isso implica claro ou escuro certo?
Baseado nisso posso te ajudar a criar uma função que dado os sensors e sensors[j] , ele move o robo para das direções desejadas

Go Up