Çizgi izleyen araç

Mert Güner

MB Üyesi
Kayıt
9 Aralık 2015
Mesajlar
28
Tepkiler
1
Yaş
22
Meslek
Makine Mühendisi
Üniv
BAYBURT ÜNİVERSİTESI
İyi günler.Ben makina mühendisliği 3.sınıf öğrencisiyim.Çizgi izleyen araç üzerine çalışmalarım var.7 Nisanda da yarışmalara katılacağım.Ancak yazılımda bazı sıkıntılar yaşıyorum.Yaptığım kodlamada araç düz çizgide mükemmel gidiyor ve keskin virajları sorunsuz alıyor.Ancak kesikli çizgide yazdığım koddan dolayı gitmiyor.Daha sonra kodun için bir while döngüsü kurdum ve kesikli çizgide gitmeme sorunu çözdüm.Bu seferde araç keskin virajları alamamaya başladı hatta rotasında sapıyor.Şöyle diyeyim while döngüsü açıkken araç keskin virajları görüyor , virajı almaya çalışıyor ama sensörler bianda sapıtıyor ve araç yarım viraj alarak pistten dışarı çıkıyor.While döngüsü kapalı iken böyle bir sıkıntı yaşamıyorum bunu nasıl çözebilirim.
 

kocakus

MB Üyesi
Kayıt
15 Mart 2018
Mesajlar
31
Tepkiler
6
Yaş
38
Üniv
Orta Doğu Teknik Üniversitesi
hocam denetleyicin nedir? kodun nasıldır? biraz daha ayrıntı alalım. döngü içindeyken doğal olarak döngüden çıkana kadar içeride ne varsa onu yapacak. neden döngüye sokmak zorundasınız? çizgi yoksa konumunu koru diyebilirsiniz. dönüyorsan dönmeye devam et, düz gidiyorsan düz gitmeye devam et deseniz çözüm olmuyor mu?
 
Konu sahibi
Konu sahibi
Mert Güner

Mert Güner

MB Üyesi
Kayıt
9 Aralık 2015
Mesajlar
28
Tepkiler
1
Yaş
22
Meslek
Makine Mühendisi
Üniv
BAYBURT ÜNİVERSİTESI
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.)
 

kocakus

MB Üyesi
Kayıt
15 Mart 2018
Mesajlar
31
Tepkiler
6
Yaş
38
Üniv
Orta Doğu Teknik Üniversitesi
hocam elinizde sensörler kaç tane? konumlandırması nasıl? Proportional Integral Derivative denkleminiz olması gerektiği gibi mi? derivative tarafı biraz zayıf kalıyor olabilir. dolayısı ile rate of change (viraj durumu) büyük olsa bile hızlıca hatayı sıfıra çekemediği için virajdan çıkamıyor olabilirsiniz. bunu görmek için nrf gibi bir modül ile kablosuz haberleşme sistemi kursanız. size sürekli olarak hata Kp Ki Kd vs. değerlerini gönderse büyük ihtimalle göreceğiniz değerler sorunu çözmenizde yardımcı olacaktır. benzer sensörleri kullanmadığım için çok fazla yardımcı olamadım kusura bakmayın.
 
Yukarı Alt