Çizgi izleyen araç

Konu, 'Genel Sorular' kısmında Mrtgner tarafından paylaşıldı.

  1. Mrtgner

    Mrtgner MB Üyesi

    Kayıt:
    9 Aralık 2015
    Mesajlar:
    26
    Beğeniler:
    1
    Meslek:
    Makine Mühendisi
    En İyi Cevap:
    0
    Değerlendiriler:
    +2 / 0 / -0
    Üniversite:
    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.
     
  2. kocakus

    kocakus MB Üyesi

    Kayıt:
    15 Mart 2018
    Mesajlar:
    31
    Beğeniler:
    5
    En İyi Cevap:
    2
    Değerlendiriler:
    +5 / 0 / -0
    Üniversite:
    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?
     
  3. Mrtgner

    Mrtgner MB Üyesi

    Kayıt:
    9 Aralık 2015
    Mesajlar:
    26
    Beğeniler:
    1
    Meslek:
    Makine Mühendisi
    En İyi Cevap:
    0
    Değerlendiriler:
    +2 / 0 / -0
    Üniversite:
    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.)
     
  4. kocakus

    kocakus MB Üyesi

    Kayıt:
    15 Mart 2018
    Mesajlar:
    31
    Beğeniler:
    5
    En İyi Cevap:
    2
    Değerlendiriler:
    +5 / 0 / -0
    Üniversite:
    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.