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: PID seguidor de linha  (Lida 14304 vezes)

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

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
PID seguidor de linha
« em: 17 de Maio de 2013, 01:12 »
Boas pessoal,
Eu estou desenvolvendo um robô que deve seguir uma linha preta, e pensei em fazer o algorítmo PID para um melhor resultado.
Mas estou com uma dúvida, meu seguidor de linha é feito de 2 sensores que ficam externamente à linha, então, na hora que eu tenho que calcular a variavel ERRO do PID, eu estou em dúvida de quais valores colocar como o valor padrão e o valor recebido, já que eu tenho 2 sensores.

Offline pmj_pedro

  • Mini Robot
  • *
  • Mensagens: 328
Re: PID seguidor de linha
« Responder #1 em: 17 de Maio de 2013, 02:25 »
Boas pessoal,
Eu estou desenvolvendo um robô que deve seguir uma linha preta, e pensei em fazer o algorítmo PID para um melhor resultado.
Mas estou com uma dúvida, meu seguidor de linha é feito de 2 sensores que ficam externamente à linha, então, na hora que eu tenho que calcular a variavel ERRO do PID, eu estou em dúvida de quais valores colocar como o valor padrão e o valor recebido, já que eu tenho 2 sensores.

consegues ver a quantidade de luz reflectida, ou so se é preto ou branco

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Re: PID seguidor de linha
« Responder #2 em: 17 de Maio de 2013, 03:38 »
A quantidade de luz.

Preto = 1500
Branco = 120 em média (o valor é pego na calibração)

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: PID seguidor de linha
« Responder #3 em: 17 de Maio de 2013, 07:38 »
Muito interessado neste tópico.  :D

Não sei fazer loops PID.
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Re: PID seguidor de linha
« Responder #4 em: 17 de Maio de 2013, 12:21 »
Eu fiz um somente com o P por enquanto, e estou bem satisfeito, mas o código ainda não é bom, por[em funciona.

Offline pmj_pedro

  • Mini Robot
  • *
  • Mensagens: 328
Re: PID seguidor de linha
« Responder #5 em: 17 de Maio de 2013, 13:37 »
Eu fiz um somente com o P por enquanto, e estou bem satisfeito, mas o código ainda não é bom, por[em funciona.

lembro me de ter andado a procura de como isso funcionava, e cheguei a encontrar um site interessante mt bem explicado como o pdi funciona, tb tinha codigo para arduino, mas a explicação era suficiente para entederes

acho que encontrei o site procurando por "pdi arduino"
edit: http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/
« Última modificação: 17 de Maio de 2013, 13:40 por pmj_pedro »

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: PID seguidor de linha
« Responder #6 em: 17 de Maio de 2013, 14:00 »
Antes de calcular o erro vais ter de calcular a ''distância'' do robot à linha. Diz-me uma coisa, o valor do sensor aumenta de 120 a 1500 conforme o sensor esta afastado da linha e se aproxima desta ate estar totalmente em cima dela? Ou quando o sensor esta meio na linha meio fora o valor e aleatorio?

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Re: PID seguidor de linha
« Responder #7 em: 17 de Maio de 2013, 20:41 »
O sensor fora da linha retorna 120, e 100% na linha retorna 1500, e parcialmente vai aumentando de 120 até 1500.
Eu queria saber uma forma mais simples de fazer o PID, por enquanto eu fiz assim:

Código: [Seleccione]
// pseudo P
  /*if(sensorValues[0] > sensorValues[1])
    error = calibrateValue - sensorValues[0];
  else if(sensorValues[1] > sensorValues[0])
    error = calibrateValue - sensorValues[1];*/
 
  if(sensorValues[0] > sensorValues[1])
  {
    error = calibrateValue - sensorValues[0];
    int turn = Kp * error + Kd * (error - last_error);
    last_error = error;
   
    m0Speed = map(mSpeed + turn, -622, 762, 50, 100);             
    m1Speed = map(mSpeed - turn, -622, 762, 50, 100);
  }
  else
  {
    error = calibrateValue - sensorValues[1];
    int turn = Kp * error + Kd * (error - last_error);
    last_error = error;
   
    m0Speed = map(mSpeed - turn, -622, 762, 50, 100);             
    m1Speed = map(mSpeed + turn, -622, 762, 50, 100);
  }

Nesse código estou dependendo do valor de cada sensor, e isso eu quero evitar.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PID seguidor de linha
« Responder #8 em: 17 de Maio de 2013, 22:33 »
Soma/substrai/mete ai uma pequena fórmula que com o robot em cima da linha tens 0, e depois para a esquerda tens um valor negativo, e para a direita tens um valor positivo, assim juntas os dois valores num e torna-se mais simples.
Avr fanboy

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
Re: PID seguidor de linha
« Responder #9 em: 18 de Maio de 2013, 14:58 »
Tem aqui um exemplo simples de compreender...

http://www.pololu.com/docs/0J21/7.c
Cumprimentos,
André Carvalho.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: PID seguidor de linha
« Responder #10 em: 18 de Maio de 2013, 16:24 »
O sensor fora da linha retorna 120, e 100% na linha retorna 1500, e parcialmente vai aumentando de 120 até 1500.

Visto que isto acontece, ia-te dizer para fazeres algo como o senso já referiu. Antes do PID, calculas a distancia do robot à linha. Depois essa distancia é que é usada no PID.

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Re: PID seguidor de linha
« Responder #11 em: 18 de Maio de 2013, 17:37 »
Eu pensei nisso, mas achei que seria mais fácil desse jeito que comecei a fazer, mas já que estão dizendo que calculando a posição do robô na linha é mais fácil, então vou fazer.

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Re: PID seguidor de linha
« Responder #12 em: 10 de Julho de 2013, 00:26 »
Enfim estou conseguindo fazer o seguidor de linha com PID. Porém ainda não está 100% bom, acho que uns 60%. Ele faz algumas curvas, mas as vezes se perde e passa direto, e não estou conseguindo saber se isso é culpa da Proporcional, do Derivado, ou da Integral.

Estou usando
int mSpeed = 130;
float Kp = 0.105;
float Kd = 0.013;
float Ki = 0.002;

E o código do PID é:
int error = posicao; // -1000 com sensor da esquerda no preto, 0 no meio, 1000 com sensor da direita no preto
I = I + error;
D = error - last_error;
int turn = (Kp * error) + (I * Ki) + (D * Kd);
last_error = error;
if (error < 20)
  I = 0;

Estou fazendo algo de errado, ou tenho que mudar algumas das proporcionais? Sabem qual?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PID seguidor de linha
« Responder #13 em: 10 de Julho de 2013, 01:15 »
Isso está a ser executado num intervalo de tempo constante, ou foi atirar para o loop e siga?
Avr fanboy

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Re: PID seguidor de linha
« Responder #14 em: 10 de Julho de 2013, 01:37 »
Num loop mesmo, estou programando no arduino, e não estou colocando delay, para ser algo seguido.