uji coba PID dengan sensor garis

pid.txt

Committer:
rizqicahyo
Date:
2015-11-08
Revision:
0:b31e672064ea

File content as of revision 0:b31e672064ea:

/*=================== Konfigurasi PIN di arduino =========================*/
const int selA = A2;  
const int selB = A3;   
const int selC = A4;    

const int m1a=2;        // pin motor1 untuk atur arah
const int m1b=3;        // pin motor1 untuk atur arah
const int pwm1=5;       // pin output pwm motor1 ke motor driver
int motor_ki;           // variabel nilai pwm motor1

const int m2a=4;        // pin motor2 untuk atur arah
const int m2b=7;        // pin motor2 untuk atur arah
const int pwm2=6;       // pin output pwm motor2 ke motor driver
int motor_ka;           // variabel nilai pwm motor2

/*============ Konfigurasi variabel dan konstanta PID + Sensor ===============*/ 
int batas = 860;            // nilai batas sensor
int pid,pv,error,error0;    // varibel-variabel untuk PID
int sp=0;                   // set point, sensor robot ditengah , sp=0
int ts=10;                  // time sampling, untuk waktu sampling pada konstanta I dan D
int kode;                   // variabel keadaan ketika robot keluar dari garis

int kp=50;                  // konstanta Proporsional
int ki=20;                  // konstanta Integral
int kd=70;                  // konstanta Deferensial
 
 
/*=========================== Program Utama =============================*/ 
void setup() {
    //Serial.begin(9600);
 
    pinMode(selA,OUTPUT);
    pinMode(selB,OUTPUT);
    pinMode(selC,OUTPUT);

    pinMode(m1a,OUTPUT);
    pinMode(m1b,OUTPUT);
    pinMode(m2a,OUTPUT);
    pinMode(m2b,OUTPUT);
}
 
void loop() {
  
  
  linefollower();

  //show_serial_sensor();
  //delay(1);
}
/*======================= Akhri Program Utama =============================*/
//
//                      DEKLARASI PROSEDUR DAN FUNGSI
//
/*========================= Pengendalian Motor =============================*/
void ff(void)  //prosedur untuk bergerak maju
{
  digitalWrite(m1a,HIGH);
  digitalWrite(m1b,LOW);

  digitalWrite(m2a,HIGH);
  digitalWrite(m2b,LOW);
}

void brake_left(void) //prosedur untuk mengerem motor kiri
{
  digitalWrite(m1a,LOW);
  digitalWrite(m1b,HIGH);

  digitalWrite(m2a,HIGH);
  digitalWrite(m2b,LOW);
}

void brake_right(void)      //prosedur untuk mengerem motor kanan
{
  digitalWrite(m1a,HIGH);
  digitalWrite(m1b,LOW);

  digitalWrite(m2a,LOW);
  digitalWrite(m2b,HIGH);
}

/*===================== Pengendalian Sensor Garis ============================*/ 
void selektor(int value)
{
  if( value == 0)
  {
    digitalWrite(selA,LOW);
    digitalWrite(selB,LOW);
    digitalWrite(selC,LOW);
  }
  else if( value == 1)
  {
    digitalWrite(selA,HIGH);
    digitalWrite(selB,LOW);
    digitalWrite(selC,LOW);
  }
  else if( value == 2)
  {
    digitalWrite(selA,LOW);
    digitalWrite(selB,HIGH);
    digitalWrite(selC,LOW);
  }
  else if( value == 3)
  {
    digitalWrite(selA,HIGH);
    digitalWrite(selB,HIGH);
    digitalWrite(selC,LOW);
  }
  else if( value == 4)
  {
    digitalWrite(selA,LOW);
    digitalWrite(selB,LOW);
    digitalWrite(selC,HIGH);
  }
  else if( value == 5)
  {
    digitalWrite(selA,HIGH);
    digitalWrite(selB,LOW);
    digitalWrite(selC,HIGH);
  }
  else if( value == 6)
  {
    digitalWrite(selA,LOW);
    digitalWrite(selB,HIGH);
    digitalWrite(selC,HIGH);
  }
  else
  {
    digitalWrite(selA,HIGH);
    digitalWrite(selB,HIGH);
    digitalWrite(selC,HIGH);
  }
}
 
bool SensorL(int x)
{
  bool nilai;
  selektor(x);
  if (analogRead(A0) < batas)
  {
    nilai = LOW;
  }
  else
  {
    nilai = HIGH;
  }
 
  return nilai;
}
 
bool SensorR(int x)
{
  bool nilai;
  selektor(x);
  if (analogRead(A1) < batas)
  {
    nilai = LOW;
  }
  else 
  {
    nilai = HIGH;
  }
 
  return nilai;
}

void show_serial_sensor()  //prosedur untuk menampilkan sensor dan PWM ke serial monitor
{
  Serial.print(SensorL(7));
  Serial.print(" ");
 
  Serial.print(SensorL(6));
  Serial.print(" ");
  
  Serial.print(SensorL(5));
  Serial.print(" ");
 
  Serial.print(SensorL(4));
  Serial.print(" ");
 
  Serial.print(SensorL(3));
  Serial.print(" ");
 
  Serial.print(SensorL(2));
  Serial.print(" ");
 
  Serial.print(SensorL(1));
  Serial.print(" ");
 
  Serial.print(SensorL(0));
  Serial.print("     ");
 
  Serial.print(SensorR(7));
  Serial.print(" ");
 
  Serial.print(SensorR(6));
  Serial.print(" ");
  
  Serial.print(SensorR(5));
  Serial.print(" ");
 
  Serial.print(SensorR(4));
  Serial.print(" ");
 
  Serial.print(SensorR(3));
  Serial.print(" ");
 
  Serial.print(SensorR(2));
  Serial.print(" ");
 
  Serial.print(SensorR(1));
  Serial.print(" ");
 
  Serial.print(SensorR(0));
  //Serial.println();

  Serial.print("  ");
  Serial.print(pv);
  Serial.print("  ");
  Serial.print(motor_ki);
  Serial.print("  ");
  Serial.println(motor_ka);
   
  delay(1);
}

/*===================  Line Follower dan pengendalian PID ===================*/
void linefollower(void)
{  
  if(SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S1");
    pv=(-15);
    kode=(-20);
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && SensorR(0))
  {
    //Serial.println("S16");
    pv=15;
    kode=20;  
  }
  else if(SensorL(7) && SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=(-14);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && SensorR(1) && SensorR(0))
  {
    pv=14;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
     //Serial.println("S2");
    pv=(-13);
    kode=0;
    ff();  
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && SensorR(1) && !SensorR(0))
  {
    //Serial.println("S15");
    pv=13;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && SensorL(6) && SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=(-12);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && SensorR(2) && SensorR(1) && !SensorR(0))
  {
    pv=12;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S3");
    pv=(-11);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && SensorR(2) && !SensorR(1) && !SensorR(0))
  {
     //Serial.println("S14");
    pv=11; 
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && SensorL(5) && SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=(-10);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && SensorR(3) && SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=10;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S4");
    pv=(-9);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S13");
    pv=9;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && SensorL(4) && SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=(-8);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && SensorR(4) && SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=8;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S5");
    pv=(-7);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S12");
    pv=7; 
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && SensorL(3) && SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=(-6);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && SensorR(5) && SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=6;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
     //Serial.println("S6");
     pv=(-5);
     kode=0;
     ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S11");
    pv=5;  
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && SensorL(2) && SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=(-4);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && SensorR(6) && SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=4;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && SensorL(1) && !SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S7");
    pv=(-3);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && !SensorR(7) && SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
     //Serial.println("S10");
    pv=3;  
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && SensorL(1) && SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=(-2);
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && SensorR(7) && SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    pv=2;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && SensorL(0) && !SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S8");
    pv=(-1);
    kode=0;
    ff();
  }else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && !SensorL(0) && SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //Serial.println("S9");
    pv=1;
    kode=0;
    ff();
  }
  else if(!SensorL(7) && !SensorL(6) && !SensorL(5) && !SensorL(4) && !SensorL(3) && !SensorL(2) && !SensorL(1) && SensorL(0) && SensorR(7) && !SensorR(6) && !SensorR(5) && !SensorR(4) && !SensorR(3) && !SensorR(2) && !SensorR(1) && !SensorR(0))
  {
    //CENTER
    pv=0;
    kode=0;
    ff();
  }
    
  
  if(kode == (-20))  // keadaan sensor keluar garis dari sebelah kiri
  {
     pv=(0);
     brake_left();
     //delay(10);
  }
  else if(kode == 20) //keadaan sensor keluar garis dari sebelah kanan
  {
    pv=(0);
    brake_right();
   // delay(10);
  }

  error = sp + pv; 

  pid = (kp*error)+(ki/10*(error+error0)*ts)+(kd/ts*(error-error0));
  error0=error;   //error pada keadaan lampau


    //melakukan perhitungan PWM dari nilai PID yang didapat
  motor_ki = 255 + pid;
  if (motor_ki > 255)
  {
    motor_ki=255;
  }
  else if (motor_ki < 0)
  {
    motor_ki=0;
  }
  else 
  {
    motor_ki = 255+pid;
  }

  motor_ka = 255 - pid;
  if (motor_ka > 255)
  {
    motor_ka=255;
  }
  else if(motor_ka < 0)
  {
    motor_ka = 0;
  }
  else 
  {
    motor_ka = 255-pid;
  }
  
  
  //output berupa sinyal PWM ke motor driver
  analogWrite(pwm1,motor_ki);
  analogWrite(pwm2,motor_ka);

  delay(ts);  //delay untuk time sampling
}