collapse

* Links de Robótica

* Posts Recentes

Medir Agua que está no Poço por filjoa
[Ontem às 20:58]


URGENTE - display de 7 segmentos com backpack por helderjsd
[20 de Setembro de 2017, 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Palavras Cruzadas por Njay
[19 de Setembro de 2017, 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]

Autor Tópico: Arduino - PID - Segue Linha - Controle  (Lida 1942 vezes)

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

Offline Gelson Filho

  • Mini Robot
  • *
  • Mensagens: 3
Arduino - PID - Segue Linha - Controle
« em: 03 de Julho de 2014, 07:04 »
E aí pessoal. Aí vai um código depois explico o problema:

Código: [Seleccione]
const int pwm_a = 3;  //controle PWM para motor A (saídas 1 e 2) no pino digital 3
const int pwm_b = 11;  //controle PWM para motor B (saídas 3 e 4) no pino digital 11
const int dir_a = 12;  //controle de direação para motor A (saídas 1 e 2) no pino digital 12
const int dir_b = 13;  //controle de direação para motor B (saídas 3 e 4) no pino digital 13

void setup()
{
  pinMode(pwm_a, OUTPUT);
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);
}
void loop()
{
  //leitura sensores refletância (para enxergar preto e branco / linha)
  int leitura_sensor2=analogRead(A2); 
  int leitura_sensor3=analogRead(A3);
 
  int ganho = 6;
 
  int proporcional = ((leitura_sensor2 - leitura_sensor3) / ganho);
   
  int acertoB = (75 + proporcional); //75 PWM mínimo do motor
  int acertoA = (75 - proporcional);

  digitalWrite(dir_a, HIGH);  //para motores irem para frente
  digitalWrite(dir_b, HIGH);
  analogWrite(pwm_a, acertoA);
  analogWrite(pwm_b, acertoB);
}

Estou com um problema aqui. Tenho um robô com dois motores DC comandados pela Shield Ardumoto. Microcontrolador Arduino. Dois sensores refletância que eu mesmo fiz. Eles tem uma variação de 650 a 950 no sinal analógico. Onde 950 é quando sensor está no branco, e 650 no preto. Os sensores obrigatoriamente estão a aproximadamente 1 cm do chão. E estou tentando aplicar um controle PROPORCIONAL no meu segue linha. Já fiz uma vez esse controle com um robô feito com LEGO e programado no NXT, e dava muito certo, então fiz os mesmos cálculos só que com o Arduino e adaptando a minha entrada (sensores) e saída (PWM dos motores). Mas não está dando muito certo. O controle PROPORCIONAL já bastaria pra mim, se eu conseguisse o PID por completo eu ficaria MUITO feliz, mas só o PROPORCIONAL já está de bom tamanho. Alguém poderia me ajudar???

Offline Gelson Filho

  • Mini Robot
  • *
  • Mensagens: 3
Re: Arduino - PID - Segue Linha - Controle
« Responder #1 em: 03 de Julho de 2014, 07:07 »
Achei também uma bilioteca que já faz todos os cálculos PID tudo certinho. Mas como adaptar iso ao meu problema? Teria que fazer 2 PID's? Como? Sendo que a variação de um sensor faz com que um motor ande mais que outro. Tipo são 2 PID's que se interligam, então como fazer??

Aí vai o exepmlo básico que já vem junto com a biblioteca....




Código: [Seleccione]
/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(0);
  Setpoint = 100;

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(0);
  myPID.Compute();
  analogWrite(3,Output);
}

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.124
  • NERD!
Re: Arduino - PID - Segue Linha - Controle
« Responder #2 em: 03 de Julho de 2014, 08:55 »
Um problema que vejo do teu código original é o a velocidade "base" ds motores, o valor '75'.

Dizes que é o mínimo PWM do motor, e depois adicionas ou subtrais o resultado do proporcional. Implica que um dos motores vai estar sempre parado, pelo que tornaste o controlo proporcional em "on-off".
Acho que devias escolher um valor mais elevado, para quando estiver na linha seguir em frente em vez de andar aos ziguezagues.

Quanto ao PID, é ler a documentação da biblioteca e escolheres o que queres controlar.



Offline Gelson Filho

  • Mini Robot
  • *
  • Mensagens: 3
Re: Arduino - PID - Segue Linha - Controle
« Responder #3 em: 04 de Julho de 2014, 05:38 »
eu tentei aumentando o pwm dos motores alí, troquei o 75 por 150, mas mesmo assim o acerto é muito pequeno, perde a linha facilmente.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.124
  • NERD!
Re: Arduino - PID - Segue Linha - Controle
« Responder #4 em: 04 de Julho de 2014, 08:37 »
Podes tentar várias coisas:
-Mudar o espaçamento dos sensores
-Aumentar a variável "ganho" para ficar menos sensível (que na realidade é diminuir o ganho)
-Inserir um delay de uns milissegundos no loop para diminuir o ritmo das atualização.