Boas.
já consegui fazer a leitura dos sensores, utilizei o seguinte código:
#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...
#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:
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..