PID sistem kullanıyorum.Elbette doğal oalrka yazdığım kodu uyguluyor cihaz ancak bi taarfı yapayım derken ister istemez diğer bir tarafı bozduk.İkisini bir arada bir türlü çalıştıramadık .
#include <QTRSensors.h>
#define sagmotor1 9
#define sagmotor2 10 
#define solmotor1 3
#define solmotor2 11
#define MZ80 5
#define IRALICI 12
#define startbuton 2
#define LED 4
#define Buzzer 13
QTRSensorsAnalog qtra((unsigned char[]) {  A0, A1, A2, A3, A4 , A5, A6, A7} , 8);
unsigned int sensors[8];
int tabanhiz=150; // buradaki ayar robotun sıfır hata ile giderken gittiği hızı gösterir. Pistteki virajlar arttıkça 80 e kadar düşürülebilir. En yüksek verilebilecek değer 255 tir. 
int maxhiz=255;
int sonhata = 0;
float Kp = 0.12;
float Kd = 0.7;
float Ki = 0.001;
int ekhiz = 0;
int sagmotorpwm = 0;
int solmotorpwm = 0;
int integral = 0;
int hata = 0;
int zemin=1;
char veri;
void setup()
{
  pinMode(sagmotor1, OUTPUT);
  pinMode(sagmotor2, OUTPUT);
  pinMode(solmotor1, OUTPUT);
  pinMode(solmotor2, OUTPUT);
  pinMode(Buzzer, OUTPUT);
  pinMode(MZ80, INPUT_PULLUP);
  pinMode(startbuton, INPUT_PULLUP);
  delay(1000);
  //**** kalibrasyon kodları kalibrasyon arduino üzerindeki led yanık oldugu sürece devam eder robotun çizgi sensörünü tam ortalayarak  yerleştirilmelidir
  int i;
  digitalWrite(LED, LOW);
  for (int i = 0; i < 150; i++)
  {
    if ( i >= 80  )  {
      frenle();
      delay(3);
    }
   
    qtra.calibrate();
    delay(1);
  }
   flashyap();
   digitalWrite(Buzzer, HIGH);
   delay(250);
   digitalWrite(Buzzer, LOW);
//  if (digitalRead(startbuton)==HIGH) { do frenle();  while(digitalRead(startbuton)==HIGH);}  // başlangıç işlemini buton kontrollü yapmak için aktifleştirmek gerekir
  if (digitalRead(MZ80)==LOW) { do frenle();  while(digitalRead(MZ80)==LOW);}  // başlangıçta engel varsa durup bekler. MZ80 sensörü vb takılı olmalıdır
Serial.begin(9600);
}
void loop(){ 
  //********Burada çizginin pozisyon hesabı zemine bağlı oalrak otomatik yapılmaktadır
  unsigned int sensors[8]; 
  unsigned int position = qtra.readLine(sensors,1,zemin); 
  /*
  for(int i = 0 ; i < 8 ; i++)
  {
    Serial.print(sensors);
    Serial.print(",");
  }
  Serial.println();
  delay(1000);
  */
  hata= position-3500;
  integral+=hata;   //çizgiden uzaklaştıkça hataları toplar
   //////////// motorlara verilecek hız düzeltme oran hesabı PID
   int duzeltmehizi = Kp * hata + Kd*(hata - sonhata) + Ki*integral;
  sonhata = hata;
  if (digitalRead(MZ80)==LOW) 
  {
    do 
    {
      frenle(); 
      delay(1);
    }while(digitalRead(MZ80)==LOW);
  } // yarış içinde engel engel varsa durup bekler. MZ80 sensörü vb takılı olmalıdır
 if (sensors[0]<200 && sensors[7]<200 )//beyaz zemin siyah çizgiyi tespit eder
 { 
     tabanhiz=82;
     zemin=0; 
 }
 if (sensors[0]>500 && sensors[7]>500 ) //siyah zemin beyaz çizgiyi tespit eder
 { 
    tabanhiz=150;
    zemin=1; 
    /*
    while(sensors[0]>750 && sensors[1]>750 && sensors[2]>750 && sensors[3]>750 && sensors[4]>750 && sensors[5]>750 && sensors[6]>750 && sensors[7]>750)
    { 
        qtra.readLine(sensors,1,zemin);
        motorkontrol(100,100);
    }
   */
 }
  //************* Motorlara uygulanacak kesin hız ayarları****
   sagmotorpwm = tabanhiz + duzeltmehizi + ekhiz  ;
   solmotorpwm = tabanhiz - duzeltmehizi + ekhiz ; 
   //********************
   
   /// motorlara hız ayarlarının uygulanması********
   sagmotorpwm = constrain(sagmotorpwm, -254, maxhiz); // Burada motorlara uygulanacak PWM değerlerine sınırlandırma getirilmiştir.
   solmotorpwm = constrain(solmotorpwm, -254, maxhiz);
   motorkontrol(solmotorpwm,sagmotorpwm);
   //**************
}
Hocalarımızın yardımıyla yazdığımız araç koduda burda(Şuan while döngüsünü yorum kısmına alıp kodu kapattım.)