• Welcome to LusoRobótica - Robótica em Português.
 

Robot de Busca e Salvamento![CONLUIDO]

Started by fred gomes, 31 de January de 2010, 13:42

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

senso

As vezes vale mais saber o que estamos a fazer do que usar uma caixa negra, as vezes não digo sempre e usar a caixa negra sempre simplifica o nosso código
Avr fanboy

microbyte

Quote from: senso on 30 de March de 2010, 01:26
As vezes vale mais saber o que estamos a fazer do que usar uma caixa negra, as vezes não digo sempre e usar a caixa negra sempre simplifica o nosso código
Pois, só que pelo que ele me mostrou, ainda não está muito há vontade na programação. Tem ainda algumas dúvidas para avançar a fazer tudo à mão, por isso é que recomendei.

TigPT


TigPT

Teste de linha:

Pololu QTR-8RC line detect test

(desculpem a qualidade do vídeo mas só tenho o tlm para os fazer :S)

metRo_

Posta o código, visto ser um exemplo simples pode ajudar muita gente :)

TigPT

Não há código.. só alimentei o sensor com 5v e liguei a saida de um dos sensores a uma resistência e um led.

metRo_

pensei que tivesses a usar o Arduino.

TigPT

Pololu QTR-8RC line detect blink led

Pisca número de vezes diferente dependendo do sensor que tem a pista em cima.

Código:
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtr((unsigned char[]) {8, 9, 10, 1}, 4);

void setup()
{
  pinMode(13, OUTPUT);
  int i;
  for (i = 0; i < 250; i++)
  {
    qtr.calibrate();
    delay(20);
  }
}
void loop()
{
  unsigned int sensors[3];
  int number = 0;
  int position = qtr.readLine(sensors);
  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750)
  {
    return;
  }
  if( sensors[0] > 750)
    number = 1;

  else if( sensors[1] > 750)
    number = 2;

  else if( sensors[2] > 750)
    number = 3;

  else if( sensors[3] > 750)
    number = 4;

  for(int i=0;i< number;i++){
    digitalWrite(13,HIGH);
    delay(250);
    digitalWrite(13,LOW);
    delay(250);
  }
  delay(1000);
}


fred gomes

Boas ..
Obrigado pelo exemplo que postaste Tiago.. :D

dizme uma coisa, aqui: "  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750)" pq colocaste esses sensores? e não "  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750 && sensor[3])" por exemplo..

outra coisa, podes colocar no teu código para imprimir o valor de "position" e dizer me que valores obtens sff?
cumprimentos,
Fred

TigPT

Eu estava a utilizar o template da pololu e não me preocupei com o caso dos 3 sensores (ou 4) estarem com linha preta.

Fiz uns testes com este código:

#include <PololuQTRSensors.h>

// create an object for four QTR-xRC sensors on digital pins 0 and 9, and on analog
// inputs 1 and 3 (which are being used as digital inputs 15 and 17 in this case)
PololuQTRSensorsRC qtr((unsigned char[]) {
  8, 9, 10, 1}
, 4);

void setup()
{
  // optional: wait for some input from the user, such as a button press
  // then start calibration phase and move the sensors over both
  // reflectance extremes they will encounter in your application:
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  int i;
  for (i = 0; i < 250; i++) // make the calibration take about 5 seconds
  {
    qtr.calibrate();
    delay(20);
  }
}
// optional: signal that the calibration phase is now over and wait for further
// input from the user, such as a button press

void loop()
{
  unsigned int sensors[3];
  int number = 0;
  // get calibrated sensor values returned in the sensors array, along with the line position
  // position will range from 0 to 2000, with 1000 corresponding to the line over the middle sensor
  int position = qtr.readLine(sensors);
  Serial.print("0: ");
  Serial.println(sensors[0]);
    Serial.print("1: ");
  Serial.println(sensors[1]);
    Serial.print("2: ");
  Serial.println(sensors[2]);
    Serial.print("3: ");
  Serial.println(sensors[3]);
delay(2000);
  // if all three sensors see very low reflectance, take some appropriate action for this situation
  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750)
  {
    // do something.  Maybe this means we're at the edge of a course or about to fall off a table,
    // in which case, we might want to stop moving, back up, and turn around.
    return;
  }
  if( sensors[0] > 750)
    number = 1;

  else if( sensors[1] > 750)
    number = 2;

  else if( sensors[2] > 750)
    number = 3;

  else if( sensors[3] > 750)
    number = 4;

  for(int i=0;i< number;i++){
    digitalWrite(13,HIGH);
    delay(250);
    digitalWrite(13,LOW);
    delay(250);
  }
  delay(1000);

  // set motor speeds using the two motor speed variables above
}



Leio entre 0 e 10 decimal quando linha branca, e entre 500~1000 quando linha preta.

Tenho que fazer testes com o sensor no chão pois sinto que estou a ter mts interferências da luz ambiente visto estar perto de uma janela e com a barra de sensores virada para cima.

fred gomes

eu vou experimentar também esse código e vou ver o valor de "position" que obtenho, é que eu com o meu (mostrado em cima num dos post´s) os valores de position variam muito, tanto me dá certo, de 0 a 7000, como me dá valores estranhissimos (ao reiniciar a janela do serial monitor), mais logo eu experimento , e depois digo qualquer coisa ;)
cumprimentos,
Fred

fred gomes

#56
Boas.
já consegui obter o valor de error, (de -3500, a 3500) o erro que estava a cometer é que não estava a calibrar os sensores, após o reset ao arduino, daí ter dito que as vezes o position dava certo, e outras não (nos post´s anteriores disse isso), pois nas vezes que dava certo devia de estar a calibrar os sensores sem querer, lool. Os sensores são calibrados ao serem passados no preto e no branco, esse processo deve ser feito após o reset feito no arduino.. (Obrigado por meteres alertado sobre a calibração TigPT :) ).

agora deparo-me com outro problema, após ter conseguido obter o error como esperado, não consigo controlar as velocidades dos motores como pretendo, não sei se estou a usar algo de errado, ou as funções da Pololu possam estar erradas , pois as variaveis "KP", "KD", "int motorspeed" eu não faço ideia de como funcionam, são "informações escondidas" que a Pololu nos fornece, e nós limitamonos a copiar, sem saber ao certo o que estamos a fazer..

e o que eu queria que vissem é se acham que tenho algum erro no meu codigo (ou defino mal as velocidades dos motores), ou caso contrario, o erro é mesmo das variaveis que estou a usar..

o código é o seguinte:

#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;
  double KP = 0.1;
  int KD = 5;
  int motorspeed = KP * error + KD * (error - lastError);
  lastError = error;

  Serial.println (error);
  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 = 200;
   ltarguetval = 200;
   error = lastError;
}
else if (error > 500 ){
    rtarguetval = (int)motorspeed;
    ltarguetval = 200;
    error = lastError;
  }
  else if ( error < -500){
    ltarguetval = (int)motorspeed;
    rtarguetval = 200;
    error = lastError;
  }
  if(rtarguetval > rnowval){
    rnowval +=1;
  }else if (rtarguetval < rnowval){
    rnowval -=1;
  }
  if (ltarguetval > lnowval){
    lnowval +=1;
  }else if(ltarguetval < lnowval){
    lnowval -=1;
  }
  analogWrite (motor_right,rtarguetval);
  analogWrite(motor_left, ltarguetval);
}


experimentei fazer o print de motorspeed, e vejam os valores que obtive:

17850
17850
17850
12750
7650
2550
-2550
-7650
-17850
-17850
os valores variam consoante o sensor que vê preto,
sinseramente, parece me que o erro esteja aqui, e se assim for o erro está nas funções fornecidas pela Pololu., acho eu...

deixo aqui o link que me baseei para fazer este código,

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

agradeçia que me facultassem opiniões , e soluções  para o meu problema..
cumprimentos,
Fred

TigPT

As funções da pololu estão feitas possivelmente para o 3pi ou o orangus ou como se chama.

Para te podermos ajudar posta que motores estas a utilizar, e como é que estão feitas as ligações dos mesmos ao arduino.

fred gomes

estou a usar motores DC, as ligações estão feitas atraves de uma ponte H (L293D), a saidas PWM do arduino..
cumprimentos,
Fred

TigPT

A que pins? GateA 1 e 2 e GateB 1 e 2.