collapse

* Posts Recentes

Loja online "McMaster" na europa? por Alfredo Garcia
[Ontem às 23:17]


Fabricantes de PCB e Assemblage (produção em massa) por senso
[Ontem às 21:18]


Stepper Motor HEM-17D3003 por jm_araujo
[15 de Julho de 2019, 09:22]


Bucha Berbequim por SerraCabo
[14 de Julho de 2019, 22:45]


Video Porteiro do Prédio por Hugu
[08 de Julho de 2019, 23:05]


Medidor de indutâncias por Hugu
[08 de Julho de 2019, 22:57]


Perfis V-Slot vs C-Beam vs Bosch vs 8020 por Hugu
[08 de Julho de 2019, 22:46]


Ressuscitar Bateria Li-On 36V por jm_araujo
[26 de Junho de 2019, 17:23]


Pequenas chapas de Aluminio - Onde comprar? por Hugu
[24 de Junho de 2019, 16:39]


Cupão 5% no Pi Supply, alguém interessado? por Hugu
[24 de Junho de 2019, 16:25]

Autor Tópico: Robot de Busca e Salvamento![CONLUIDO]  (Lida 45707 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 #90 em: 16 de Maio de 2010, 22:03 »
também experimentei este código:

Código: [Seleccione]
int sensor1 = 2;
int sensor2 = 3;
int sensor3 = 4;
int sensor4 = 5;
int sensor5 = 6;
double errorval = 0.0;

void setup(){
  Serial.begin(9600);
  digitalWrite(sensor1, HIGH);
  digitalWrite(sensor2,HIGH);
  digitalWrite(sensor3,HIGH);
  digitalWrite(sensor4,HIGH);
  digitalWrite(sensor5,HIGH);
}

void loop(){
 
  if(digitalRead(sensor1 == 1)){
    errorval = 1.0;
  }
  else if (digitalRead(sensor2 == 1)){
    errorval = 0.5;
  }
  else if (digitalRead(sensor3 == 1)){
    errorval = 0.0;
  }
  else if (digitalRead(sensor4 == 1)){
    errorval = -0.5;
  }
  else if(digitalRead (sensor5 == 1)){
    errorval = -1.0;
  }
  Serial.println(errorval);
  delay(500);
}
 

e o errorval não me varia de 1.0, não consigo mesmo perceber porque isto acontece :-\ , se alguem me conseguir ajudar agradeçia, deixo aqui também o meu codigo "base" que o errorval também não varia não sei porqquê.. :-\

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 (0, INPUT);
  pinMode (1, INPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  digitalWrite (0, HIGH);
  digitalWrite (1, HIGH);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
}
void loop(){
 
  //1º lemos o valor dos sensores
  readALLsensores();
 
  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);
  Serial.println(errorval);
  delay(500);
 
}

//FUNÇOES:
void readALLsensores(){
  for (int i=0; i < nsensores; i++)
  {
    senval[i] = digitalRead (sensor[i]);
  }
}

// escolher o sensor que esta sobre a linha
int bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval[i] == 1){
      best = i;     
    }
  }
  return best;
}
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best== 0){
    error = -1.0;
  }
  else if(best== 1){
    error = -0.5;
  }
  else if( best == 2){
    error = 0.0;
  }
  else if(best == 3){
    error = 0.5;
  }
  else if(best == 4){
    error = 1.0;
  }
  return error;
}

desde já agradeço as ajudas;)


Por exemplo, aqui:
if(digitalRead(sensor1 == 1))

estás a meter uma condição no argumento da funcao... ou seja, primeiro o Arduino vai ver se a variável "sensor1" é igual a "1", depois mete esse resultado (TRUE/FALSE) no argumento do digitalRead();

O que tu queres fazer é o digitalRead() do "sensor1" e depois comparar com "1", ou seja:
if(digitalRead(sensor1) == 1){

Talvez por isto, o primeiro if seja sempre TRUE e por isso recebes sempre erro = 1.0

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.608
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #91 em: 16 de Maio de 2010, 23:36 »
Tens outro erro, na função error estás a criar uma tabela senval nova e não a que tem o valor dos teus sensores, e mais outra coisa:
Código: [Seleccione]
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best== 0){
    error = -1.0;
  }
  else if(best== 1){
    error = -0.5;
  }
  else if( best == 2){
    error = 0.0;
  }
  else if(best == 3){
    error = 0.5;
  }
  else if(best == 4){
    error = 1.0;
  }
  return error;
}
O teu indice dos best== não é 1,2,3,4 mas sim 2,3,4,5,6.
Avr fanboy

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Robot de Busca e Salvamento!
« Responder #92 em: 16 de Maio de 2010, 23:38 »
Correcto!
OxyGen #

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #93 em: 17 de Maio de 2010, 00:39 »
Sim... Se espreitaram o código do meu XMasRoBot verão que muitas funções são retiradas de lá. Não me estou a gabar, muito menos a queixar, se eu as disponibilizei é para as usarem à vontade. Mas muitas vezes o pessoal limita-se ao Copy/paste e nem percebe o que está a fazer...

Vai dando notícias fred...

PS: ET na vanguarda xD

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #94 em: 17 de Maio de 2010, 00:53 »
sim, o microbyte tem razão no que disse, eu deixei mais atras também que segui o tutorial dele para fazer este código..

o problema não me parece ser disso dos sensores , acho que se define mesmo pela ordem que eu fiz (0,1, etc), e já experimentei alterar mas mesmo assim não funciona..

quanto ao código anterior, o erro era esse que disseste microbyte, ja funciona.. estou agora a tentar que funcione este..

segundo o que disseste anteriormente , eu acho que o meu erro esta aqui:

Código: [Seleccione]
    if(senval[i] == 1){
      best = i;     
    }
  }

mas experimentei fazer :
Código: [Seleccione]
senval[i] == digitalRead (sensor[i]);
    if (senval[i] = 1){
      best = i;
e mesmo assim não dá..
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #95 em: 17 de Maio de 2010, 01:04 »
É assim... Não te podes esquecer que no meu caso, tinha os sensores ligados ao conversor analógico.
E eu achava o "best" - o sensor mais próximo da linha - como o que tinha o valor mais "preto"... Espero que isto esteja claro para ti.

Quando passas para uma abordagem digital, passas a ter 0 e 1 apenas, não podes comparar com algo entre 0 e 1023.
Vais ter de encontrar outra forma de encontrar o "erro"... Com 5 sensores, podes ter estas situações, EXEMPLOS:
01110 -> o best seria o 3 -> erro 0.0
00100 -> o best é o 3 -> erro 0.0
10000 -> o best é o 1 -> erro -1.0
11000 -> a linha estará no meio das linhas -> o erro estará algures no meio dos dois -0.75
11110 -> pode ser o 2 ou o 3, aqui tu é que decides também ->
11111 -> deves ter especial atenção a esta situação

As situações ideais são aquelas em que só um deles está a 1, mas pode acontecer facilmente que mais do que um "veja" a linha e tu tens de pensar numa forma de contornar essas situações e pensar em todas elas...

Uma coisa que deves fazer é no papel primeiro e só depois passares para a programação, porque só consegues fazer um programa se souberes exactamente a solução para o problema que está à tua frente.

Espero ter-te dado algumas dicas.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #96 em: 17 de Maio de 2010, 01:12 »
eu pensei nisso, mas estava a contar que apenas um sensor visse a linha (so nos cruzamentos é que mais que 1 poderia ver a linha (tendo a linha pouca expessura), e para resolver isso estava a pensar em algo do tipo " se mais que um sensor tiver o valor 1 mais de 200 ms { robot para), ainda não sei bem como o programar, não sei se um AND de 1 com 1 basta, mas acho que não pq tenho 5 sensores..

mas a minha forma de pensar era essa, daí so ter colocado assim..
mas eu ja percebi o que quiseste dizer,
dizme so uma coisa, eu para fazer o print de errorval não vou necessitar de chamar a função de error no loop()??

algo do tipo:

Código: [Seleccione]
void loop(){
 
 
  //1º lemos o valor dos sensores
  readALLsensores();
  for (int i = 0; i < nsensores; i++){    //este loop não está aqui a fazer nada
  }
  double error();
   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);

etc.
« Última modificação: 17 de Maio de 2010, 07:05 por fred gomes »
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.608
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #97 em: 17 de Maio de 2010, 17:38 »
Código: [Seleccione]
senval[i] == digitalRead (sensor[i]);
    if (senval[i] = 1)   //mais um erro aqui, para ser uma comparação é com == assim estás a atribuir o valor 1 á variavel e não a comparar com 1{
      best = i;
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #98 em: 17 de Maio de 2010, 19:26 »
ja alterei o código,mas aponta me alguns erros que não consigo corrigir..

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 (0, INPUT);
  pinMode (1, INPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  digitalWrite (0, HIGH);
  digitalWrite (1, HIGH);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
}
void loop(){
 
  //1º lemos o valor dos sensores
  readALLsensores();
 
  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);
  Serial.println(errorval);
  delay(500);
 
}

//FUNÇOES:
void readALLsensores(){
  for (int i=0; i < nsensores; i++)
  {
    senval[i] = digitalRead (sensor[i]);
  }
}

// escolher o sensor que esta sobre a linha
int bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval) == 00100){
      best = 2;
    }
    else if (senval) == 01110){
      best = 2;
    else if (senval) == 11000){
      best = 0 && best = 1;
    }
    else if (senval) == 00011){
      best = 3 && best = 4;
    }
    else if (senval) == 10000){
      best = 0;
    }
    else if (senval) == 00001){
      best = 4;
    }
    else if (senval) == 01100){
      best = 1 && best = 2;
    }
    else if (senval) == 00110){
      best = 2 && best = 3;
    }
    else if (senval) == 01000){
      best = 1;
    }
    else if (senval) == 00010){
      best = 3;
    }
  }
}
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best == 0){
    error = -1.0;
  }
  else if (best == 0 && 1){
    error = -0.75;
  }
  else if (best == 1){
    error = -0.5;
  }
  else if (best == 1 && 2){
    error = -0.25;
  }
  else if (best == 2){
    error = 0.0;
  }
  else if (best == 2 && 3){
    error = 0.25;
  }
  else if (best = 3){
    error = 0.5;
  }
  else if (best = 3 && 4){
    error = 0.75;
  }
  else if (best = 4){
    error = 1.0:
  }
  return error;
}

aqui:

Código: [Seleccione]
bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval) == 00100){
      best = 2;
porque me é apontado ume rro em função de intbestsensor(intsenval[])?,

também me é apontado um erro por ter isto

Código: [Seleccione]
if(senval) == 00100) , e não consigo perceber de onde vêem esses erros, alguem me consegue explicar isso para que eu os possa corrigir?

cumprimentos,
Fred

Offline Tyran

  • Mini Robot
  • *
  • Mensagens: 293
Re: Robot de Busca e Salvamento!
« Responder #99 em: 17 de Maio de 2010, 19:44 »
Falta-te um
Código: [Seleccione]
return best;
na função.

E esse if não tem os parêntesis bem, deveria ser
Código: [Seleccione]
if (senval == 00100)

E já agora, é mesmo esse valor em decimal ou queres em binário? Se for em binário tens de usar a nomenclatura 0b ficando 0b00100, pelo menos em C standard...

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #100 em: 17 de Maio de 2010, 19:58 »
não, eu não quero em linguagem nenhuma, tenho o senval que vai memorizar o valor digital de todos os sensores,  se calhar falta me uma virgula entre cada algarismo..

eu ja posto novidades..
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.608
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #101 em: 17 de Maio de 2010, 20:08 »
Estás a programar em C, logo convem saberes como é que se programa, certo?
Tens muitos muito problemas mais ou menos básicos, tais como distinguir numeros em base 10, de binários e assim e quando te digo isto não é para criticar pois ninguem nasce ensinado, é mesmo para ires procurar saber mais para melhorares os teus programas porque se meteres 00100 em vez de 0b00100, o compilador não te dá erro mas o teu programa tambem nunca funciona, estás a perceber?
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #102 em: 17 de Maio de 2010, 21:50 »
sim senso, tens razão.. eu ainda tenho algumas dificuldades básicas que estou a tentar corrigir..

eu ainda tenho algumas duvidas, tais como:

eu tenho :
Código: [Seleccione]
int senval[] = {0,0,0,0,0};
eu posso fazer
Código: [Seleccione]
if (senval) == 0b00000 , não deveria ser antes :
Código: [Seleccione]
if (senval) == (0,0,0,0,0) , a minha duvida no fundo é se o compilador vai ler o senval como um número binário..

ja alterei o meu código , no entanto não consigo corrigir os meus erros, talvez por causa dessas duvidas..

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 (0, INPUT);
  pinMode (1, INPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  digitalWrite (0, HIGH);
  digitalWrite (1, HIGH);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
}
void loop(){
 
  // 1º chamamos a função que cácula o erro;
 
  double 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);
 
  Serial.println(errorval);
  delay(500);
 
}
 
// escolher o sensor que esta sobre a linha

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


agradeçia a vossa ajuda e as vossas criticas também, eu não  as levo a mal, mas mais como um "abre olhos" , as criticas  fazem bem para podermos corrigi-las e aprender com elas..
« Última modificação: 17 de Maio de 2010, 22:01 por fred gomes »
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.608
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #103 em: 17 de Maio de 2010, 22:16 »
Então, ora vamos lá começar pelo mais simples:
Código: [Seleccione]
if(senval) ==0b00001){
bla bla bla}
Isto está errado, porque para começar abres só um parêntese, mas fechas dois, só ai tens logo um erro no compilador, tens de fazer assim:
Código: [Seleccione]
if (senval == 0b00001){
bla bla bla}
Isto já está correcto do ponto de vista do compilador, mas tens mais erros, para começar o senval é um array, ou seja uma lista de numeros, e se queres ler essa lista, tens de ler só um numero de cada vez e para isso usas o indice, que é o que fica entre os [ ]
dai quando les os sensores dentro do loop for, fazer senval, em que i é o indice em que vais ler/escrever no array, logo ao fazeres senval == 0b00001 é outro erro pois o compilador não sabe o que fazer com isso.
Se não te importas mostra aqui o código completo de onde copias-te essa função se faz favor, não tem mal em copiar, pois é uma maneira de se aprender, mas mostra aqui, como te disse, retira o int senval[] do argumento da função porque já tens uma tabela senval que crias-te no inicio do programa.
Se souberes ingles aconselho a ler :
http://www.smileymicros.com/
Andas com a página para baixo e do teu lado direito tem uma barra com o nome "Smiley's Workshop", saca esses ficheiros e começa a ler, são para outra plataforma, mas as bases de C que te são dadas são muito boas.
Isto aqui é uma tentativa de meter a tua função a funcionar,já foi compilado e compila sem erros, testa lá isto a ver se dá, já agora, antes de ligares os motores ao arduino, liga antes led's aos pinos onde vais ligar os motores, assim se tiveres um erro na ligação dos mesmos, pelo menos sabes que o teu código funciona:
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); //dizes que os teus sensores estão em 2,3,4,5,6 e depois usas os pinos 0,1,2,3,4?
  pinMode (3, INPUT); //ao usares o pino 0 e 1 que são usados para a ligação serial, estás a afectar essa mesma
  pinMode (4, INPUT); //comunicação assim como os valores lidos pelo sensor
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError(); //nunca estavas a chamar a função, logo como é que o loop ia saber o valor do error?

  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);
 
  Serial.println(errorval);
  delay(500); //acho que este valor de delay devia ser mais pequeno, pois meio segundo com o arduino a não fazer nada é muito tempo
}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=0; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  unsigned int valorsensor=senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4; //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;
  }

  return error;
}
« Última modificação: 17 de Maio de 2010, 22:20 por senso »
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #104 em: 17 de Maio de 2010, 22:31 »
muito obrigado por responderes senso, e obrigado pelo link que me mandaste, amanha vou começar a lê-lo e a tentar perceber melhor a linguagem C++.

tenho ainda algumas questões a fazer em relação ao código que postaste,

para chamar a função não devo fazer apenas "LineError();" ?? , é que no código que mostraste fizestes " Errorval = LineError();" e também experimentei no compilador e nesse fragmento é acusado erro..
 --
 a outra questão é aqui:

Código: [Seleccione]
unsigned int valorsensor=senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
isto nunca tinha visto em qualquer outro código, é a 1ª vez que vejo algo deste genero.. e não percebo.., não sei se te enganaste ou é mesmo assim..

não deveria ser assim:
Código: [Seleccione]
unsigned int valorsensor=senval[0]<<0+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;

digo isto pela lógica, se estou errado, pq no 1º termo dos sensores escreveste sem o sinal "<<" ??

PS: quanto ao código, vi na programação do XmasRobot, do microbyte ( http://lusorobotica.com/index.php?topic=1841.0 ).
« Última modificação: 17 de Maio de 2010, 22:33 por fred gomes »
cumprimentos,
Fred