collapse

* Posts Recentes

strobe lights por KammutierSpule
[25 de Outubro de 2019, 11:08]


Robot Extreme - Lisboa Games Week 2019 por guilhermexbot
[15 de Outubro de 2019, 15:21]


tecnologias web para servidor num MCU por jm_araujo
[09 de Outubro de 2019, 14:47]


Limitador de corrente simples por jm_araujo
[08 de Outubro de 2019, 10:29]


Assemblagem de PCBs - JLCPCB por jm_araujo
[06 de Outubro de 2019, 13:46]


"Arduino vs PIC" por jm_araujo
[06 de Outubro de 2019, 13:42]


UTC555D vs NE555N ? por jm_araujo
[03 de Outubro de 2019, 17:57]


Caixa de música por Alhiados
[02 de Outubro de 2019, 00:30]


Trituradora/Destruidora de cartão em tiras por m90mine
[01 de Outubro de 2019, 21:30]


Perfil 30x30 400mm? por brunus
[30 de Setembro de 2019, 23:35]

Autor Tópico: Robot de Busca e Salvamento![CONLUIDO]  (Lida 47576 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.616
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #45 em: 30 de Março 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
Avr fanboy

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #46 em: 30 de Março de 2010, 03:00 »
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.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.348
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #47 em: 02 de Abril de 2010, 22:49 »
Testes ao sensor QTR-8RC:


Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.348
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #48 em: 02 de Abril de 2010, 23:03 »
Teste de linha:



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

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Robot de Busca e Salvamento!
« Responder #49 em: 02 de Abril de 2010, 23:07 »
Posta o código, visto ser um exemplo simples pode ajudar muita gente :)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.348
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #50 em: 02 de Abril de 2010, 23:08 »
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.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Robot de Busca e Salvamento!
« Responder #51 em: 02 de Abril de 2010, 23:31 »
pensei que tivesses a usar o Arduino.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.348
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #52 em: 02 de Abril de 2010, 23:52 »


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

Código:
Código: [Seleccione]
#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);
}


Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #53 em: 03 de Abril de 2010, 12:58 »
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

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.348
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #54 em: 03 de Abril de 2010, 13:07 »
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:

Código: [Seleccione]
#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.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #55 em: 03 de Abril de 2010, 13:15 »
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

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #56 em: 06 de Abril de 2010, 20:25 »
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:

Código: [Seleccione]
#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..
« Última modificação: 06 de Abril de 2010, 20:27 por fred gomes »
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.348
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #57 em: 06 de Abril de 2010, 20:29 »
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.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #58 em: 06 de Abril de 2010, 20:33 »
estou a usar motores DC, as ligações estão feitas atraves de uma ponte H (L293D), a saidas PWM do arduino..
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.348
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #59 em: 06 de Abril de 2010, 20:34 »
A que pins? GateA 1 e 2 e GateB 1 e 2.