collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[22 de Abril de 2024, 14:14]


Arame de Estendal por almamater
[18 de Abril de 2024, 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]


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 72672 vezes)

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

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #135 em: 18 de Maio de 2010, 18:56 »
eu ontem tinha me enganado a copiar o código, o código é 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++){
    senval[i] = digitalRead(sensor[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]);
  }
  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;
}
, e consigo lêr o senval em condições..

agora se eu fizer o print de valorsensor o valor que obtenho é sempre 0 :s , pq o valorsensor não varia?
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #136 em: 18 de Maio de 2010, 19:11 »
Tens de nos dizer que valores recebeste do array...
E onde no código puseste o print do valorsensor?

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #137 em: 18 de Maio de 2010, 20:12 »
sim, quando um o/os sensores vêem preto dá me o valor 1, quando branco 0, ..

o print do valor sensor coloquei  a seguir á instrução que calcula o valor sensor..

estou a usar este codigo:

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++){
    senval[i] = digitalRead (sensor[i]);
    Serial.println("senval");
    Serial.println(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;
  int valorsensor = 0;
  for (int i=0; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  valorsensor = senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);
  delay(3000);

  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;
}

quando o sensor 1 e 2 vêem preto (não em simultãneo), obtenho o valor 1024,
se o 1 e 2 virem preto em simultãneo obtenho 2048,

quando sensor 3 vê preto obtenho o valor 0,
quando sensor 4 vê preto obtenho 0,

quando sensor 3 e 4 vêem preto, valor  0 ,

quando sensor 5 , valor 0,

se 3 sensores do meio vêem preto (01110) , valor 4096,

se todos vêem preto, valor 16384,
se todos vêem branco, valor 0.

não sei se esta informação que postei é útil,
eu obtenho valores fixos (fiáveis) , mas não sei como trabalhar com eles, pois eu peço um número binário.. e estes números não correspondem ao valor décimal do binário em questão..

conseguem me ajudar?



« Última modificação: 18 de Maio de 2010, 20:14 por fred gomes »
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #138 em: 18 de Maio de 2010, 20:21 »
Normal que o erro dê 0, tu estás a fazer o print depois de leres os sensores, mas antes de correr pelos if's, logo a variavel tem o valor que lhe dás ao inicio da função, que é zero, faz antes assim:
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++){
    senval[i] = digitalRead (sensor[i]);
    Serial.println("senval");
    Serial.println(senval[i]);
  }
  Serial.println();
 
 errorval = LineError();

   Serial.println ("valor do erro: ");
  Serial.println(erroval);
  delay(3000);
 
  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;
  int valorsensor = 0;
  for (int i=0; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  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;
}
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #139 em: 18 de Maio de 2010, 20:27 »
dá te erro a compilar?
a mim dá.. diz que errorval não esta na função.. mas esta a ser chamado..

mas se colocar o print de errorval aqui:

Código: [Seleccione]
analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
  Serial.println ("valor do erro: ");
  Serial.println(errorval);
  delay(3000)
já não dá erro..

o errorval nunca me sai do 0.0:s
« Última modificação: 18 de Maio de 2010, 20:29 por fred gomes »
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #140 em: 18 de Maio de 2010, 20:34 »
Não compilei, pois não sei então, hoje não posso ajudar muito mais que estou cheio de sono, boa sorte ai com o debug disso ;)
Avr fanboy

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #141 em: 18 de Maio de 2010, 20:40 »
Vamos com calma.
Senso, primeiro queria perceber se os sensores estavam a funcionar... OK!
Depois, fizémos prints do array para saber os valores... OK!

Agora, precisamos de saber se aquele "valorsensor" está bem calculado.
Código: [Seleccione]
  valorsensor = senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);

Fizeste bem em por isto... Se dizes que está mal, vamos tentar outra coisa:
Código: [Seleccione]
  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);

Se não der, vais tentar substituir o "|" por "+".
Dizes depois o resultado de cada uma das experiências. Mas deixa claro de que experiência é que estás a falar...

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #142 em: 18 de Maio de 2010, 20:41 »
ok,

mas eu acho que o erro esta no valorsensor , pois não consigo obtr valores de apenas zeros e uns,

eu tinha pensado em fazer algo do tipo :
Código: [Seleccione]
int senval[] = {0,0,0,0,0};
valorsensor = senval;
if(senval) = (0,0,0,0,0;){ "não sei se está correcto, pois não sei bem como o fazer, dai estar a perguntar, era uma forma de tirar os números binários que acho que é o que está a perturbar a leitura de error."

depois quando tiveres mais disponivel responde, eu não deverei conseguir resolver o meu problema sozinho.. estou a procurar ajuda em outros foruns também (arduino.cc) , mas as respostas demoram e não esclarecem logo à 1ª ,
enquanto não resolvo este problema vou começar a trabalhar na construção do projecto..

obrigado pela ajuda senso, e microbyte também.. têem ajudado muito, e tenho vos tomado muito tempo..
cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #143 em: 18 de Maio de 2010, 20:45 »
agora sim :D
está me a dar o valor de senval em décimal..

Ps: o que faz o "|"?
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #144 em: 18 de Maio de 2010, 20:46 »
Ps: o que faz o "|"?
Operação OR: http://pt.wikipedia.org/wiki/%C3%81lgebra_booleana

PS - OR bit a bit... que OR de uma condição ou outra é
Código: [Seleccione]
||
« Última modificação: 18 de Maio de 2010, 20:48 por TigPT »

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #145 em: 18 de Maio de 2010, 20:49 »
eu sei que "||" é operação OR, aqui, se é, não percebo, pq ele faz:

valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
e não está a fazer um OR, mas sim a "juntar" todos os algarismos.. por isso perguntei.,.
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #146 em: 18 de Maio de 2010, 20:50 »
Está a jutar todos os algarismos com OR bit a bit e não de OR lógico.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #147 em: 18 de Maio de 2010, 20:52 »
desculpa a massada,
mas não queria dizer que percebi e decorar e no fundo não perceber..

qual a diferença entre o OR de bit a bit e o OR lógico?
cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #148 em: 18 de Maio de 2010, 22:40 »
já funciona ;D

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(){
 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(200);
  Serial.println(errorval);

}

// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
  for (int i=0; i < nsensores; i++){

    senval[i] = digitalRead (sensor[i]);
  }
  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);
  delay(500);


  if (valorsensor== 0b10000){
    valorsensor == 16;
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    valorsensor == 24;
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    valorsensor == 8;
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    valorsensor == 12;
    error = -0.25;
  }
  else if((valorsensor==0b00100) || (valorsensor=0b01110)){
    valorsensor == 4 ||14;
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    valorsensor == 6;
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    valorsensor == 2;
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    valorsensor == 3;
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    valorsensor == 1;
    error = 1.0;

  }
  return error;
}

muito obrigado microbyte e senso, este código é mais vosso que meu :P , obrigado mesmo pela ajuda..

mal tenha tempo vou lêr o documento de linguagem C que me enviaste senso , para melhorar alguns aspectos que já não devia errar, e vou deixando aqui novidades acerca do meu projecto.., espero colocar aqui fotos brevemente com o robot já a seguir a linha  :)

Ps: depois alguem que me esclareca só aquela minha questão anterior sff..
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #149 em: 18 de Maio de 2010, 22:53 »
2 || 1 = true
2 | 1 = 3 porque 2 em binário é b10 e 1 é b1, logo (2 | 1) = b11 = 3