Go Down

Topic: implementazione pid line follower (Read 624 times) previous topic - next topic

ntoniudra

salve a tutti. Ho recentemente realizzato un line follower, e funziona. Ora vorrei implementare l' algoritmo pid, per aumentarne la precisione e limitare le oscillazioni.
Il mio HW è composto da arduino uno, 5 sensori tcrt5000, motor shield ladyada e 2 motoriduttori, ora il problema è proprio di concezione del algoritmo, ovvero come devo impostarlo? il codice attuale è il seguente:
Code: [Select]
#include <AFMotor.h>
const int sensor1 = A0;
const int sensor2 = A1;
const int sensor3 = A2;
const int sensor4 = A3;
const int sensor5 = A4 ;// Analog input pin that the potentiometer is attached to
// Analog output pin that the LED is attached to
#define soglia 120
#define soglia1 500
#define rotazione1 30
#define cicalino 9
#define startSpeed 120
#define rotazione2 50
#define tempo 0
#define dist1 120
#define dist2 40
AF_DCMotor motor1(1,MOTOR12_8KHZ); //creato motore 1
AF_DCMotor motor2(2,MOTOR12_8KHZ); //creato motore 2

int triggerPort = 5;
int echoPort = 6;
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
int sensorValue4 = 0;
int sensorValue5 = 0;// value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
  Serial.println("hello world" );

  pinMode( triggerPort, OUTPUT );
  pinMode( echoPort, INPUT );
  Serial.begin( 9600 );
  Serial.println( "Sensore ultrasuoni: ");

  motor1.setSpeed(180);
  motor2.setSpeed(180);
  motor1.run(FORWARD);
  motor2.run(FORWARD);

}

void loop() {


  sensorValue1 = analogRead(sensor1);           
  Serial.print("sensor1= ");     
  Serial.println(sensorValue1);

  sensorValue2 = analogRead(sensor2);           
  Serial.print("sensor2= ");     
  Serial.println(sensorValue2);

  sensorValue3 = analogRead(sensor3);           
  Serial.print("sensor3= ");     
  Serial.println(sensorValue3);


  sensorValue4 = analogRead(sensor4);           
  Serial.print("sensor4= ");     
  Serial.println(sensorValue4);


  sensorValue5 = analogRead(sensor5);           
  Serial.print("sensor5= ");     
  Serial.println(sensorValue5);

  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(tempo);


  if (sensorValue2 > soglia){
    Serial.println("sensore2 alto");
    motor2.setSpeed(200);
    motor2.run(FORWARD);
    motor1.setSpeed(50);
    motor1.run(FORWARD);
  }   

  else if (sensorValue1 > soglia){
    Serial.println("sensore1 alto"); 
    motor2.setSpeed(220);
    motor2.run(FORWARD);
    motor1.setSpeed(50);
    motor1.run(BACKWARD);
  }   

  else if (sensorValue4 > soglia){
    Serial.println("sensore4 alto");
    motor1.setSpeed(200);
    motor1.run(FORWARD);
    motor2.setSpeed(50);
    motor2.run(FORWARD);
  }   

  else if (sensorValue5 > soglia){
    Serial.println("sensore5 alto"); 
    motor1.setSpeed(220);
    motor1.run(FORWARD);
    motor2.setSpeed(50);
    motor2.run(BACKWARD);
  }   

  else if (sensorValue3 > soglia){
    Serial.println("sensore3 alto");
    motor1.setSpeed(180);
    motor1.run(FORWARD);
    motor2.setSpeed(180);
    motor2.run(FORWARD);
  }   
}               


grazie in anticipo a chiunque mi aiuta!

uwefed

Sei sicuro che la ondulaione non dipende dalla distanza di montaggio dei sensori ottici?
Ciao Uwe

ntoniudra


Sei sicuro che la ondulaione non dipende dalla distanza di montaggio dei sensori ottici?
Ciao Uwe


intendi fra un sensore e l' altro oppure distanza da terra?

uwefed

Fra un sensore e l'altro.
Ciao Uwe

ntoniudra


Fra un sensore e l'altro.
Ciao Uwe


non so quello, ma non penso dato che sono relativamente vicini. Comunque come dovrei inserire la funzione PID nel mio programma? grazie

uwefed

Nel senso se hai i sensori per esempio con la distanza di 1 cm, il robottino deve andare fuori rotta almeno di 1 cm lateralmente per accorgersene che non é sulla linea.
Ciao Uwe

ntoniudra


Nel senso se hai i sensori per esempio con la distanza di 1 cm, il robottino deve andare fuori rotta almeno di 1 cm lateralmente per accorgersene che non é sulla linea.
Ciao Uwe

ah scusa non avevo capito intendessi quello  :), comunque i sensori sono circa 1 cm l' uno dall' altro, e sono 5, il problema è che nelle curve ampie tende a dare degli scossoni, e questo è migliorabile agendo sui parametri di velocità dell' una e dell' altra ruota, ma succede che, anche nelle rette, la correzione entra tipo in "risonanza", continua a dondolare e poi perde la linea. Ora mi sono informato e ho letto le guide sul PID e cercato di studiarlo, e fondamentalmente ho capito che potrei risolvere il mio problema con questo strumento, ora resta il problema di come aggiungerlo nel mio sketch per farlo funzionare.

Go Up