Pages: [1]   Go Down
Author Topic: implementazione pid line follower  (Read 528 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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!
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fra un sensore e l'altro.
Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley, 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.
Logged

Pages: [1]   Go Up
Jump to: