collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


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


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


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]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Robot de Busca e Salvamento![CONLUIDO]  (Lida 70234 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 #60 em: 06 de Abril de 2010, 20:36 »
não :-\
pinos 9 e 10 para o motor right e left respectivamente , so estou a usar um sentido..pois so pretendo que o robot ande numa direcção..
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #61 em: 06 de Abril de 2010, 20:43 »
Ok, e já vi que estás a utilizar analogWrite()

Vamos pensar como espirito crítico em vez de simplesmente martelar umas coisas.

Citar
analogWrite(pin, value)

Parameters

pin: the pin to write to.

value: the duty cycle: between 0 (always off) and 255 (always on).

Logo o valor que vamos meter em value vai ser entre 0 e 255.
Se queremos um valor entre 0 e 255 e que 0 é tudo desligado e 255 é tudo ligado, temos que nos if - elses gerar estes valores!

Para simpleficar vamos só ver se a linha está à esquerda ou direita, e só mais tarde pensamos em quão distante está já que isto depende até das distancias entre eixos e da distancia que a barra sensorial está do eixo ou até do tipo de motores e da alimentação que lhe estamos a dar.

Tens:
Código: [Seleccione]
else if (error > 500 ){
    rtarguetval = (int)motorspeed;
    ltarguetval = 200;
    error = lastError;
  }
  else if ( error < -500){
    ltarguetval = (int)motorspeed;
    rtarguetval = 200;
    error = lastError;
  }

Mas queres algo como:
 
Código: [Seleccione]
else if (error > 500 ){
//vira à esquerda
    rtarguetval = 0;
    ltarguetval = 255;
  }
  else if ( error < -500){
//vira à direita
    rtarguetval = 255;
    ltarguetval = 0;
  }

Não sei se o sentido está certo que depende de qual está ligado onde mas é esta a lógica.

Só depois de ele se mover aos S's por andar sempre a um lado e outro é k vale a pena então começar a complicar para melhorar o desempenho.

OK fred!?

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #62 em: 06 de Abril de 2010, 20:48 »
certo!
posso usar esssa tua sugestão, mas fazendo assim, no fundo estou a usar dois sensores para controlar o robot, e nao 8, como o array têm, lool., assim não estarei a aporveitar bem as potêncialidades do array :P , mas acho que o melhor é fazer assim, ou algo do genero sem usar as variaveis que a pololu fornece..
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #63 em: 06 de Abril de 2010, 21:28 »
Usa-la dentro do setup(), que corre no arranque.
Experimenta, depois de voltares a abrir a janela do Serial, carregar no "reset".
Já te tinha alertado para a calibração... -.-' enfim...
Os KP, KD são constantes de PID. Se ainda não te deparaste com isto nenhuma vez, não avances por aí... ;)

Quanto ao erro, deves sim usá-lo para teres uma condução mais suave, mas deves primeiro entender as coisas simples para passares para as coisas mais complicadas :D

Vai postando aqui, que nós vamos ajudando...

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #64 em: 06 de Abril de 2010, 22:12 »
Eu disse para fazeres isso agora, e sim vai-se comportar como 2 sensores mas para depois alterares para mais complexo.

Se não sabes conduzir micromachines, não vais conduzir buragos ou carros reais.

Temos que começar a fazer sentido com as coisas por baixo e só depois aumentar a complexidade.

Como o microbyte disse, não nos vamos meter em derivação proporcional integral se não sabemos que os valores máximos de uma função de controlo de motores é de 0 a 255. e como os controlar.

Algumas das abordagens que faço, por vezes a criticar ou a picar, não são para te mostrar uma solução, mas para te ensinar a observar e a aprenderes como chegar às soluções para que não sejas como colegas meus de faculdade que quando algo não funciona, antes de pensar martelam.

Força com isso... vai postando novidades ;)

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #65 em: 07 de Abril de 2010, 15:53 »
ja idealizei a tua sugestão TigPT, e funcionou..
usei o seguinte código:

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.

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 velmax= 255;

  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 = velmax;
    ltarguetval = velmax;
  }
  else if (error > 500 ){
    rtarguetval = 0;
    ltarguetval = velmax;
  }
  else if ( error < -500){
    ltarguetval = 0;
    rtarguetval = velmax;
  }
  analogWrite (motor_right,rtarguetval);
  analogWrite(motor_left, ltarguetval);
}

agora, será que alguem me consegue explicar como posso converter os valores de motorspeed para valores de 0 a 255?

eu tinha pensado em algo do genero: 

Código: [Seleccione]
val = motorspeed;
val = map(val,17850,2550,255,0);

mas acho que isos não é possivel, e já expeirmentei e não funcionou...
pois eu quero converter os valores mais altos em valores proximos de 0, e valores mais baixos em valores proximos de 255.

http://www.pololu.com/docs/0J19/3

neste código, dizme como posso fazer para nao ter valores abaixo de 0.

Código: [Seleccione]
# int m1Speed = M1 + motorSpeed; 
#   int m2Speed = M2 - motorSpeed; 
#   
#   // it might help to keep the speeds positive (this is optional) 
#   // note that you might want to add a similiar line to keep the speeds from exceeding 
#   // any maximum allowed value 
#   if (m1Speed < 0) 
#     m1Speed = 0; 
#   if (m2Speed < 0) 
#     m2Speed = 0; 

no entanto, acho que eu não posso fazer o mesmo para nao ter valores acima de 255, pois so irei obter valores 0 e 255 apenas!, alguem me pode ajudar a fazer esta conversão?
cumprimentos,
Fred

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Robot de Busca e Salvamento!
« Responder #66 em: 07 de Abril de 2010, 16:22 »
Citar
map(value, fromLow, fromHigh, toLow, toHigh)

Em vez de:
Código: [Seleccione]
val = motorspeed;
val = map(val,17850,2550,255,0);

Se dizes que:
Citar
experimentei fazer o print de motorspeed, e vejam os valores que obtive:

17850
17850
17850
12750
7650
2550
-2550
-7650
-17850
-17850

O que queres é:
Código: [Seleccione]
val = map(motorspeed,-17850,17850,255,0);Embora isto vá fazer com que o robot quando tem a linha do meio só anda a metade da velocidade, gera o que pretendes.

para o outro motor fazes os valores ao contrário para que ande mais lento quando a linha está do seu lado:
Código: [Seleccione]
val = map(motorspeed,-17850,17850,0,255);

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #67 em: 07 de Abril de 2010, 17:03 »
eu acho que te enganaste a fazer isso Tiago, eu fiz:

Código: [Seleccione]
val = map(motorspeed,17850,2550,0,255);
 val = map(motorspeed,-17850,-2550,0,255);


  Serial.println (val);
  delay(500);
porque eu quero que a velocidade seja de 0 a 255 num lado (de 17850 a 2550) e igual no lado oposto(de -17850, a -2550), para assim os motores andarem à maxima velocidade quando está o sensor no centro..

esse meu exemplo demonstrado em cima deveria estar correcto, , funciona bem no lado esquerdo, mas no direito nao funciona, continua a aumentar,
no entanto se eu fizer assim:

 
Código: [Seleccione]
val = map(motorspeed,17850,2550,0,255);

  Serial.println (val);
  delay(500);

funciona no lado direito bem mas no esquerdo não..
a solução que eu queria era colocar tipo, valor absoluto de 2550 e 17850, assim o - era ignorado.. entendem? ..
mas não estou a conseguir fazer isso, eu tentei colocar abs 17850 e abs 2550, mas aponta erro..
sabem me dizer como se faz isso?

cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #68 em: 07 de Abril de 2010, 22:08 »
também ja experimentei fazer isto:

Código: [Seleccione]
  if (motorspeed == -motorspeed){
    motorspeed == motorspeed;
   
  }
 
  val = map(motorspeed,2550,17850,255,0);

e não funciona, alguem me consegue ajudar?
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #69 em: 07 de Abril de 2010, 22:13 »
Essa condição nunca vai acontecer, pois se o valor for negativo, ao colocares o - fica positivo, e vice-versa, deves querer algo do género de :
Citar
  if (motorspeed < 0){
    motorspeed = abs(motorspeed); //o == é uma comparação e não uma atribuição de um valor num registo
   
  }
 
  val = map(motorspeed,2550,17850,255,0);
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #70 em: 07 de Abril de 2010, 22:38 »
ahh nao sabia que isso ia acontecer..
assim como disseste já funciona:D, era isso que estava a perguntar ao bocado como fazia, eu estava a tentar fazê-lo de forma diferente ( a colocar o abs dentro do motor speed, lool,  e estava a complicar tudo..

amanha monto o circuito todo e texto e posto aqui novidades..

obrigado pela ajuda :)
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #71 em: 07 de Abril de 2010, 22:55 »
Eu diria que nem precisas da condição...
se fizeres abs(motorspeed) apenas, ficas sempre com valores positivos.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #72 em: 10 de Maio de 2010, 20:22 »
Boas.
ja consegui fazer os motores funcionarem numa breadboard( aumentarem /diminuirem a velocidade consoante o erro, e ja montei as placas tdas..

so que ao textar as placas os motores puxam demasiada corrente da fonte, acabando por sobreaquecer o circuito, pq isso acontece? na breadboard nao aconteceu, e tenho tudo bem colocado..

outra coisa, na breadboard ligava os motores /sensores  proograma parava cerca de 5 segundos para fazer a calibração e depois continuava, ali nao, esta sempre andar e sem respeitar qualquer codigo, tentei ler os valores  no pc  e nem os calibrar direito consigo, e o serial monitor demora mto mais tempo a responder do que quando tinha o circuito na breadboard, alguem me consegue ajudar?.. eu ja estou a ficar sem saber o que fazer.. e nao consigo mesmo entender o que possa estar acontecer.. após aquilo ter funcionado na breadboard pensei que ja tivesse tdos os problemas resolvidos , mas não! e não consigo perceber porquê..

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

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #73 em: 10 de Maio de 2010, 20:42 »
outra coisa,
eu na alimentação uso uma bateria de 6Volts, 3.2A , alimento o breduino com 5 volts e a parte dos motores (ponte H) com os 6 volts..

tenho 4 pinos em paralelo, dois deles tem o regulador à sua frente e vao alimentar o breduino e sensores, e os outros dois estao em paralelo com os outros dois que contem a alimentação e vao ligar ao array dos motores..., acham que o problema pode ser dai? eu acho que não,mas nao sei nada:/
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Robot de Busca e Salvamento!
« Responder #74 em: 11 de Maio de 2010, 13:01 »
Como é que estás a alimentar o Arduino? Com esses 6v? Ou meteste um regulador para 5v?
É que se estás a regular 6v para 5v, não vai funcionar...

Os reguladores para 5v funcionam normalmente de 7v para cima.