collapse

* Posts Recentes

Arame de Estendal por almamater
[Hoje às 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

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

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

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #120 em: 17 de Maio de 2010, 23:32 »
Mas que erro é que da????
É que é fácil dizer que dá erro, mas lê-lo e tentar corrigi-lo também não é difícil...

Isso é o mais normal do mundo, pois essa é a base do código binário.
Lê sobre sistemas de numeração, código binário e perceberás.

Pelo que disseste, já percebi que estás a ler bem os sensores (pelo menos os últimos)... Mas gostava que metesses o código que te enviei no loop para perceberes se à partida os valores sobre os quais estás a trabalhar estão correctos, pois se vamos corrigir o que está para a frente, corremos o risco de ter já uma propagação do erro.

Dica: print() e println() são funções da classe Serial

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #121 em: 17 de Maio de 2010, 23:38 »
Se fizer como disseste , no loop, o senval dá me sempre 0,

e tipo, quando acaba de lêr os 5 sensores (print (linha horizontal), coloca um 0 em baixo (linha vertical) e volta a ler os 5 sensores em linha horizontal..

não sei se percebeste, assim:

00000
0
00000 , etc.
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #122 em: 17 de Maio de 2010, 23:45 »
Posta aqui o código, sem código é o mesmo que ir buscar a bola de cristal para adivinhar, os valores 2048, 1024,512, são os valores de binário convertido para decimal, mas são valores um bocado altos só para 5bits de binário, mostra ai o teu código actual todo sff.
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #123 em: 17 de Maio de 2010, 23:48 »
Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i=0; i < nsensores; i++){
   Serial.print(senval[i]);
}
Serial.println();
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=5; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
    Serial.println (senval[i]);
    delay(500);
  }
  unsigned int valorsensor=senval[2]+senval[3]<<3+senval[4]<<4+senval[5]<<5+senval[6]<<6;   //o que isto faz é juntar os valores do array senval num numero só                                 //assim já podes fazer as comparações nos if's
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if(valorsensor == (0b00100 || 0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  Serial.println(valorsensor);
  delay(200);

  return error;
}
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #124 em: 17 de Maio de 2010, 23:52 »
Pronto, assim já temos onde pegar... Então é o seguinte...
Isso está a imprimir duas linhas, porque tens duas coisas a imprimir...
os 5 zeros são da parte do código que eu te passei...
o outro zero deve ser de outro println() que tenhas para lá... ( ?? Serial.println(errorval); ?? )

Bom...
Se tens uma linha perto dos sensores, algo se passa na leitura. Porque pelo menos 1 dos bits devia estar a 1.
Se tens os bits todos a 0, é normal que o erro dê sempre, 0.
Sabes porque? Porque dentro da função a primeira coisa que fazes é pôr a variável temporária a 0.0 e depois os if's que tens falham todos: não tens nenhum if para a situação em que eles estão todos a 0.

Não estou a dizer que está mal, estou só a explicar porque é que estás a obter sempre erro = 0.

Algo se passa com a ligação aos sensores... Pois nenhum deles está pelos vistos a retornar 1.

E tens demasiados prints, depois não sabes o que é o quê.

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #125 em: 17 de Maio de 2010, 23:57 »
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i=0; i < nsensores; i++){
   Serial.print(senval);
}
Serial.println();
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=5; i < nsensores; i++){
   
    senval = digitalRead (sensor);
    Serial.println (senval); <- está a mais... pois vamos imprimir todos os valores no loop()... tira
    delay(500); <- este delay aqui está a fazer o quê? qual é o objectivo?
  }
  unsigned int valorsensor=senval[2]+senval[3]<<3+senval[4]<<4+senval[5]<<5+senval[6]<<6; <- o teu array senval tem 5 posições, ou seja, os indices vao do 0 ao 4, nao é do 2 ao 6... Isto é uma asneira grave e percebe-se que ainda não entendeste o que estás a fazer.
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if(valorsensor == (0b00100 || 0b01110)){ <- Não sei se podes fazer isto
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  Serial.println(valorsensor); <- este print só vai confundir
  delay(200); <- também não percebo porque é que tens outro delay dentro da função... isto é delay em cima de delay

  return error;
}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #126 em: 18 de Maio de 2010, 00:01 »
Experimenta este código e tira ai umas fotos ao teu circuito se faz favor ;)
Este código foi compilado e não dá erros ;)

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  //estavas a imprimir uma tabela que está a 0 e que não é preenchida nesta função, logo não é preciso para nada
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(1000);    //mudei para 1000 para te mandar a leitura dos sensores de 1 em 1segundo, e mesmo assim deve ser muito rápdio
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;

  for (int i=5; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
Serial.println("Valor do array senval:");
for(int j=0; j<nsensores; j++){
Serial.print(senval[j]);
}

//convem que só imprimas os valores depois de os teres lidos todos, porque a função print é um bocado lenta e pode interferir na leitura
  unsigned int valorsensor=senval[2]+senval[3]<<3+senval[4]<<4+senval[5]<<5+senval[6]<<6;   //o que isto faz é juntar os valores do array senval num numero só                                 //assim já podes fazer as comparações nos if's
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if(valorsensor == (0b00100 || 0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  Serial.println();    //imprime uma linha em branco
  Serial.println("Valor do erro val:");
  Serial.println(valorsensor);

  return error;
}

« Última modificação: 18 de Maio de 2010, 00:03 por senso »
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #127 em: 18 de Maio de 2010, 00:05 »
o valor do array dá-me sempre 0 em tdos os sensores , mas seu eu usar aquele meu outro código, vejo que o problema não é da sligaçoes dos sensores, pq nesse consigo lêr os valores de forma correcta..

eu também acho que o valor que me deveria dar devia ser só uns, e não zeros, uma vez que tenho todos os sensores a HIGH

cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #128 em: 18 de Maio de 2010, 00:05 »
Senso lê a correcção que fiz, penso que o teu também não irá funcionar, por causa dos indices do array senval e os shifts, aquilo vai para ali uma confusão pegada...

unsigned int valorsensor=senval[4]+senval[3]<<1+senval[2]<<2+senval[1]<<3+senval[0]<<4;

Tenta com este...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #129 em: 18 de Maio de 2010, 00:07 »
Nem reparei que ele tinha alterado aquilo.
Nem percebo porque..

if(valorsensor == (0b00100 || 0b01110))
Pois, isto tem de ser antes assim:
if((valorsensor==0b00100) || (0b01110)));
« Última modificação: 18 de Maio de 2010, 00:09 por senso »
Avr fanboy

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #130 em: 18 de Maio de 2010, 00:12 »
Eu até percebo... Foi por causa da correcção que fizeste aos índices... E então toca a alterar todos...  ;D
Estou convicto que se leres um pouco sobre arrays não vais perder nada e vais perceber melhor o que estás a fazer.

Uma vez que são só 5, podes guardar isso em 5 variáveis independentes para não te criar confusão.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #131 em: 18 de Maio de 2010, 00:18 »
pronto já dá..
erro tão básico :-X , tenho de tomar mais atenção no que faço..

o código que tenho é este:

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i=0; i < nsensores; i++){
   Serial.print(senval);
}
Serial.println();
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=5; i < nsensores; i++){
   
    senval = digitalRead (sensor);
  }
  unsigned int valorsensor=senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if((valorsensor == (0b00100)||(0b01110))){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }

  return error;
}

antes de proceguir, expliquem-me uma coisa sff, aquele , serial.print(); faz o quê exactamente?

Ps: o erro está logo no inicio do loop, nao estava a fazer o digitalRead dos sensores..
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #132 em: 18 de Maio de 2010, 00:27 »
O serial.println();?
Esse imprime uma linha para que não fiques com os numeros todos seguidos numa linha e depois não sabes qual é qual.
Já agora, troca:
if(valorsensor == (0b00100 || 0b01110))

por:
if((valorsensor == 0b00100) || (valorsensor == 0b01110)))
Avr fanboy

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #133 em: 18 de Maio de 2010, 00:27 »
Oh fred... Vê lá se o que tens no for foi o que eu disse...

E pelos vistos também mexeste no for dentro da função...
Assim torna-se muito difícil ajudar-te. Mexes em 500 coisas ao mesmo tempo, pões o que está mal, bem, e o que está bem, mal... Assim nunca mais vais ter isso a funcionar...
« Última modificação: 18 de Maio de 2010, 00:29 por microbyte »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #134 em: 18 de Maio de 2010, 00:48 »
Uma pessoa da-lhe um código compilado para ele testar e está sempre a trocar tudo, assim não dá...
Amanha é outro dia lol
Avr fanboy