collapse

* Posts Recentes

HX711 por senso
[Ontem às 23:36]


LR, passado, presente e futuro por beirao
[Ontem às 22:54]


PCB de passadeira por beirao
[Ontem às 22:51]


Proteções gerais de um circuito por KammutierSpule
[Ontem às 17:33]


Led driver - Chinesices!!! por vasco
[Ontem às 15:10]


leitura de voltagens com o analogRead(A0) por vasco
[Ontem às 11:48]


Como calcular bobina por luisjustin
[16 de Outubro de 2018, 18:11]


Substituir um 78xx por um switching regulator ? por vasco
[16 de Outubro de 2018, 13:50]


BostonDynamics - Vai uma mãozinha? por TigPT
[16 de Outubro de 2018, 12:57]


Kit Completo Robô Inmoov 299€ por aldricnegrier
[15 de Outubro de 2018, 13:39]

Autor Tópico: Arduino - PID - Segue Linha - Controle  (Lida 2489 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.405
  • 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.405
  • 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.