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: Arduino - PID - Segue Linha - Controle  (Lida 4281 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.947
  • 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.947
  • 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.