collapse

* Posts Recentes

+ LASERs por dropes
[20 de Junho de 2025, 16:01]


Cerca eléctrica por SerraCabo
[14 de Junho de 2025, 23:26]


Alguém arranja motores? por almamater
[10 de Junho de 2025, 22:34]


Condensador 4.7uF 0603 por brunus
[09 de Junho de 2025, 15:52]


Lenovo IdeaPad 3 Não liga por jm_araujo
[07 de Maio de 2025, 19:10]


Identificar Diodo Zenner por filjoa
[01 de Maio de 2025, 23:07]


Meu novo robô por dropes
[18 de Março de 2025, 14:51]


JBL partybox On-The-Go por almamater
[21 de Fevereiro de 2025, 23:32]


Talking Reverse Engineering with an Absolute Legend! por SerraCabo
[13 de Fevereiro de 2025, 09:56]


Motoserra Stihl 120C por brunus
[11 de Fevereiro de 2025, 16:29]

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

0 Membros e 2 Visitantes 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 #150 em: 19 de Maio de 2010, 13:16 »
Fico feliz por teres conseguido pôr o código a funcionar. Mas mais que isso, é fundamental que percebas o que tens no código que estás a usar...
Por isso, deixo aqui para futura referência, o que espero que seja o esclarecimento à tua dúvida.

Penso que as dúvidas se prendem com esta linha de código:
Código: [Seleccione]
valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
Primeiro - operador "<<" (left shift)
O que este operador faz é deslocar para a esquerda os bits N vezes, sendo que N é indicado a seguir ao operador.
Exemplos:
Imagina que tens o seguinte código em binário (base 2):
000001

Se fizeres 000001<<2 vais deslocar todos os bits 2 casas para a esquerda. Ficará 000100.
Ora nós fazemos este deslocamento um N (nº de vezes que deslocamos) diferente para cada valor armazenado dos sensores.

fazemos deslocar:
O valor do sensor 0, 0 vezes;
O valor do sensor 1, 1 vez;
O valor do sensor 2, 2 vezes;
O valor do sensor 3, 3 vezes;
O valor do sensor 4, 4 vezes;

Imagina o seguinte: tens todos os sensores a '1' = b1 = b01 = b00000000000001
Vamos entao fazer os deslocamentos:
sensor 0, 0 vezes => b00001
sensor 1, 1 vezes => b00010
sensor 2, 2 vezes => b00100
sensor 3, 3 vezes => b01000
sensor 4, 4 vezes => b10000

O que tu queres fazer é ter um código do tipo bABCDE, em que cada letra corresponde ao valor de cada um dos sensores.
Ora, se reparares, nos códigos acima, tens 5 "casas" e o valor de cada sensor está associado a uma "casa" diferente.
O que falta agora é juntar... Para isso usamos o operador "|" (bitwise OR)

Segundo - operador "|" (bitwise OR)
O que ele faz agora é juntar estes códigos binários num só - bit a bit, ou seja, não é uma soma... Ele compara cada bit e faz o OR desses dois bits.
Exemplo:
b00101 | b10110 = b10111
Porquê? Vamos meter a conta ao alto:
Código: [Seleccione]
00101
10110
-----
10111

Ora, tens de olhar para esta conta, por casas... Começas na casa da direita, e comparas o de cima com o de baixo... Se pelo menos um deles tiver '1', o resultado é '1', senao é '0'... E passas para a proxima "casa".

Ora, já deves estar a ver quando usas este operador com os resultados dos shifts.
Retomemos o exemplo em que tens todos os sensores a '1'.

Estes foram os resultados dos shifts, e no fundo, o resultado do operador "|" de todos eles:
Código: [Seleccione]
00001
00010
00100
01000
10000
-----
11111

Falando em termos de código, tens este valor na variável "valorsensor". E testas esta situação específica com o if:
Código: [Seleccione]
if( valorsensor == 0b11111 )

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #151 em: 19 de Maio de 2010, 18:39 »
Muito obrigado pelos esclarecimentos..

percebi tudo, a diferença de usar o "|" e o somador é que se por exemplo, tivesse (o que é impossivel),
Código: [Seleccione]
0001
0001
, o "|" iria dar 0001, mas com o somador daria, 00010. certo?..

muito obrigado pelas explicações :)
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.378
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #152 em: 19 de Maio de 2010, 18:42 »
Correcto!

Tens o somador... é o "+".
Código: [Seleccione]
b01010 +
b01001 =
b10011

já o or é o "|":
Código: [Seleccione]
b01010 |
b01001 =
b01011

« Última modificação: 19 de Maio de 2010, 18:44 por TigPT »

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #153 em: 19 de Maio de 2010, 19:03 »
sim, eu já percebi :)
muito obrigado..
cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #154 em: 20 de Maio de 2010, 22:19 »
Boas..
ainda tenho um problema que não consigo resolver, não acho que seja dificil, mas não o estou a conseguir resolver..

o quando tenho senval == 0b00001 (por exemplo) , tenho o robot a fazer uma curva apertada, mas se senval passar para 0b00000 o error vai passar a ser 0.0 e o robot vai girar com os dois motores á máxima velocidade e vai perder a linha,

para resolver isso fiz isto:

Código: [Seleccione]
else if (valorsensor == 0b00001){
    error = 1.0;
    lasterror = error;
  }
  else if (valorsensor == 0b00000){
    error = lasterror;
  }
  return error;
mas não funciona, não sei porquê, simplesmente a leitura não altera..

mas se fizer assim:

Código: [Seleccione]
else if (valorsensor == 0b00001){
    error = 1.0;
    lasterror = error;
  }
  else if (valorsensor == 0b00000){
if(lasterror < 0){
error = -1.0;
    error = lasterror;
else if[ (lasterror > 0){
error = 1.0;
lasterror = error;
}
  }
  return error;
o erro simplesmente é sempre 0.0,

não percebo pq as duas tentativas não funcionam.. :-\

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

Offline RicardoSantos

  • Mini Robot
  • *
  • Mensagens: 65
Re: Robot de Busca e Salvamento!
« Responder #155 em: 20 de Maio de 2010, 23:10 »
O código é o mesmo não? Qual a diferença?

Edit: Se quiseres vai ao IRC que tento resolver-te o problema...
Cumps
« Última modificação: 20 de Maio de 2010, 23:12 por RicardoSantos »

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #156 em: 20 de Maio de 2010, 23:17 »
enganei me a copiar o código, já corrigi.
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #157 em: 20 de Maio de 2010, 23:17 »
Porque tu no inicio da tua função lineError tens error=0, não te esqueças, logo quando entras na função o error passa a 0
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #158 em: 17 de Junho de 2010, 15:49 »
Boas.
Venho mostrar-vos como está a ficar o projecto:




a parte do seguidor de linhas está +/- concluida, ainda tenho um problema com o atrito das rodas (que é pouco) por resolver, e outro problema, que o breaduino me bloqueia de vez em quando, ficando o led verde aceso de forma permanente, alguêm alguma vez teve um problema deste tipo? se tiverem algsuguma estão do que poderá provocar isto, e alguma solução para resolver este problema afradeçia :)

em baixo deixo também a programação para quêm quiser vêr..

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;
int led_pin = 13;


/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 150;
double errorval = 0.0;
double lasterror = 0.0;
boolean SCstop = false;
boolean SCstart = 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();
 sensor_de_cores();

 if(SCstart){
   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);
 
  if (errorval == 0){
    SCstop = false;
  }
  else{
    SCstop = true;
  }
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
  }
  Serial.println(errorval);
  delay(100);
 }
}


// 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);
 
 
  switch (valorsensor){
    case 0b10000:
    error = -1.0; break;
    case 0b11000:
    error = -0.75; break;
    case 0b01000:
    error = -0.5; break;
    case 0b01100:
    error = -0.25; break;
    case 0b00100:
    case 0b01110:
    error = 0.0; break;
    case 0b00110:
    error = 0.25; break;
    case 0b00010:
    error = 0.5; break;
    case 0b00011:
    error = 0.75; break;
    case 0b00001:
    error = 1.0; break;
    case 0b00000:
    if(error == 0)
    error = lasterror;
    break;
    }
    lasterror = error;
    return error;


void sensor_de_cores(){
 
  int ldr_green = 0;
  int ldr_red = 1;
  int valor_green = 0;
  int valor_red = 0;
 
  valor_green = analogRead(ldr_green);
  valor_red = analogRead( ldr_red);
 
  // Detectar a cor verde;
 
  if (valor_green >=450 && valor_green <=650
  && valor_red >=550 && valor_red <=700){
    SCstart = false;
  }
 
  // Detectar a cor vermelha;
 
  else if (valor_red >=500 && valor_red <= 670
  && valor_green >650){
    SCstart = false;
    delay(10000);
    SCstart = true;
  }
  else{
    SCstart = true;
  }
}
   

espero resover rapidamente este problema do atrito e do bloqueio do breaduino para poder vos mostrar um video inicial do projecto :)
« Última modificação: 20 de Junho de 2010, 12:37 por TigPT »
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.378
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #159 em: 20 de Junho de 2010, 17:30 »
A montagem está a ficar com muito bom aspecto, contudo não é fácil ajudar-te em relação a esse problema com tão pouca informação.

Do que vejo na primeira foto.. vai ai uma grande confusão de soldaduras e fios.. possivelmente a fonte do problema.

Já montaste tudo numa breadboard para tentar perceber o que se está a passar?

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Robot de Busca e Salvamento!
« Responder #160 em: 20 de Junho de 2010, 19:26 »
Nunca me aconteceu isso do breaduino, poderá ter a ver com o cristal, e os seus condensadores, tens tudo bem montado? condensadores no regulador de tensão etc?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #161 em: 20 de Junho de 2010, 22:16 »
Não tens um unico condensador de decoupling pelo que me parece nas fotos, logo quando os motores ligam e desligam é ruido até mais não na alimentação do atmega e ele não gosta muito disso.
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #162 em: 20 de Junho de 2010, 23:04 »
senso desculpa.. o que é um condensador de doupling e para que serve? achas que é isso?..
eu nao descobri o problema e optei por montar de novo o breaduino (opção mais facil), ainda não acabei pq hoje estive a estudar para o exame de matematica de amanha, mas amanha acabo e digo se volta acontecer..

no entanto amanha depois de fazer o exame passava na loja de electronica e comprava um condensador de doupling (não deve ser caro), mas dizme expecificamente o que é isso e para que serve, nunca tinha ouvisto isso antes..
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.378
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #163 em: 20 de Junho de 2010, 23:06 »
Outro teste que podes fazer que o senso me fez lembrar, é de utilizar 2 fontes de alimentação. Uma pilha de 9V com o regulador de 5V para alimentar a parte lógica, e a alimentação que já tens para os motores. (com o gnd em comum claro) Assim os picos dos motores não afectam a parte lógica.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #164 em: 20 de Junho de 2010, 23:13 »
isso vai me trazer alguns problemas  de planificação do projecto... tenho ate dia 30 para o finalizar..
eu acho que os motores nunca afectam a parte logica, estou a alimentar a parte logica com 5 volts( usando um regulador) e os motores com 6 volts..

Ps: quer dizer , a parte logica naquela placa por acaso estava alimentada com 6 volts, pq o regulador estava danificado e como de 6 para 5 a diferença é pouca eu não me dei ao trabalho de o mudar (também pq nao tinha outro), mas acham que podesse ser isso que estava a bloquear o micro?, se for isso, acho que neste novo micro isso já nao vai acontecer..

cumprimentos,
Fred