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.)