Hot Posts

6/recent/ticker-posts

PID Algoritmalı Çizgi İzleyen Robot (PID Line Follower)


PID var olan bir problemin çözümünde  Oranı, integrali ve Türevi toplayarak bir hata oranı çıkarır ve bunu minimuma indirgemek için bir yol geliştirilir. Daha sonra PID'nin detaylı açıklamasını yaparım. Bu yazıdaki amacım hani hep gördüğünüz virajları çok hızlı dönen çizgi izleyenlerin nasıl yapıldıklarını nacizane göstermek.

Malzemeler:

  1. Arduino Nano veya UNO
  2. Pololu QTR 8RC Kızıl ötesi sensör dizisi
  3. Pololu TB6612FNG Motor Sürücü
  4. 2 Adet Redüktörlü 6V DC Motor
  5. 9V Tercihen Duracell Pil (Arduino beslemesi için)
  6. 11.1V bir Li-Po pil (Motor sürücü için)

    Bağlantı Şeması:


    Kaynak Kodu:


    #include <QTRSensors.h>

    #define Kp 0 // Kendi deneyimlerinizle bulmanız gerekli küçük bir değer ile başlayıp, büyütebilirsiniz en kararlı Kp değerini bulana kadar..
    #define Kd 0 // Bunu da küçük bir değerden başlatın ve deneyimleyerek büyütün. ( Not: Kp < Kd)
    #define rightMaxSpeed 200
    #define leftMaxSpeed 200
    #define rightBaseSpeed 150 // robot için kp ve kd değerlerini tutturduysanız şayet motorların dönmesi gereken hız budur
    #define leftBaseSpeed 150 // yukarıdaki değer ile aynıdır
    #define NUM_SENSORS 6 // kullanılan sensör numarası siz 8ini de kullanabilirsiniz.
    #define TIMEOUT 2500 // Sensörlerden başlangıçta kusursuz değerler almak için 2.5 sn. bekle
    #define EMITTER_PIN 2
    #define rightMotor1 3
    #define rightMotor2 4
    #define rightMotorPWM 5
    #define leftMotor1 12
    #define leftMotor2 13
    #define leftMotorPWM 11
    #define motorPower 8
    QTRSensorsRC qtrrc((unsigned char[]) {
      14,
      15,
      16,
      17,
      18,
      19 /*,20,21*/
    }, NUM_SENSORS, TIMEOUT, EMITTER_PIN);
    unsigned int sensorValues[NUM_SENSORS];
    void setup() {
      pinMode(rightMotor1, OUTPUT);
      pinMode(rightMotor2, OUTPUT);
      pinMode(rightMotorPWM, OUTPUT);
      pinMode(leftMotor1, OUTPUT);
      pinMode(leftMotor2, OUTPUT);
      pinMode(leftMotorPWM, OUTPUT);
      pinMode(motorPower, OUTPUT);
      int i;
      for (int i = 0; i < 100; i++) // tercihe bağlı alandır ya robotunuzu hatta yürüterek kalibre edin veya bunu otomatik yapın.
        /* otomatik kalibrasyon için burasının yorumunu kaldırın
         if ( i  < 25 || i >= 75 ) // sensörleri, karşılaşılabilecek en aydınlık ve en karanlık okumalara maruz bırakmak için sola ve sağa çevirin.
            turn_right();  
          else
            turn_left(); */
        qtrrc.calibrate();
      delay(20);
      wait();
      delay(1000); // Ana döngüye girmeden önce botu konumlandırmak için 1 saniye bekleyin
    }
    int lastError = 0;
    void loop() {
      unsigned int sensors[6];
      int position = qtrrc.readLine(sensors);
      int error = position - 2500;
      int motorSpeed = Kp * error + Kd * (error - lastError);
      lastError = error;
      int rightMotorSpeed = rightBaseSpeed + motorSpeed;
      int leftMotorSpeed = leftBaseSpeed - motorSpeed;
      if (rightMotorSpeed > rightMaxSpeed) rightMotorSpeed = rightMaxSpeed;
      if (leftMotorSpeed > leftMaxSpeed) leftMotorSpeed = leftMaxSpeed;
      if (rightMotorSpeed < 0) rightMotorSpeed = 0;
      if (leftMotorSpeed < 0) leftMotorSpeed = 0;
      {
        digitalWrite(motorPower, HIGH);
        digitalWrite(rightMotor1, HIGH);
        digitalWrite(rightMotor2, LOW);
        analogWrite(rightMotorPWM, rightMotorSpeed);
        digitalWrite(motorPower, HIGH);
        digitalWrite(leftMotor1, HIGH);
        digitalWrite(leftMotor2, LOW);
        analogWrite(leftMotorPWM, leftMotorSpeed);
      }
    }
    void wait() {
      digitalWrite(motorPower, LOW);
    }{codeBox}
    Her türlü soru ve sorununuz için aşağıya yorum bırakabilirsiniz...{alertSuccess}

    Post a Comment

    15 Comments

    1. Turnright turnleft fonksiyonları nerede?

      ReplyDelete
      Replies
      1. Hocam kodda direk sağ ve sol yok, sağın soldan daha hızlı veya daha yavaş sürülmesi var.

        Delete
    2. Hocam kodda direk sağ ve sol yok, sağın soldan daha hızlı veya daha yavaş sürülmesi var.

      ReplyDelete
    3. Pololu QTR 8RC Kızıl ötesi sensör dizisi yerine cny70 kızıl ötesi sensörlerden oluşan el yapmı bir kart kullanırsak aynı kütüphaneyi kullanabilir miyiz ? Ne yapmamız gerekiyor acaba ?

      ReplyDelete
      Replies
      1. Kullanabilirsiniz ama kütüphanenin derinlerine inip gerekli optimizasyonları manuel olarak set etmeniz gerekmekte.

        Delete
      2. kütüphane kullanımı şart mı ? bir de pıd ile kontrol konusunda çok bir bilgim yok nereden detaylı bilgi edinebilirim ilginiz için teşekkür ederim şimdiden sağolun .

        Delete
      3. Hayır şart değil, el ile de implement edebilirsiniz. PID algoritmasını da buradan anlayabilirsiniz:
        https://www.csimn.com/CSI_pages/PIDforDummies.html

        Delete
    4. Tekrardan merhabalar , qtr8a ile 1000 rpm motorlu bir çizgi izleyen robot geliştirdim bu robot yumuşak dönüşleri alırken 90 derecelik dönüşlerde sıkıntı yaşıyor.Ayrıca yavaş bir şekilde sürdüğüm zaman (bunu koddan ayarlıyorum 45 gibi bir değerden bahsediyorum ) 90 derecelik dönüşleri biraz zorla da olsa alabiliyor .Sizce sıkıntı kp kd değerlerinde midir ? Ne tarz kp kd değerleri atamalıyım acaba ?
      Şimdiden teşekkür ederim .

      ReplyDelete
      Replies
      1. Merhabalar. Hocam bende bir haftadır bu konuda çalışıyorum. İnternetteki neredeyse tüm kodlar QTR8RC ye göre yazılmış. Bende Analog 8A kullanmaya çalışıyorum ama kod optimizasyonunu yapamadım bir türlü. Sizden örnek kodları talep edebilir miyim ?

        Delete
    5. Merhaba, çalışma güzel olmuş ama birkaç sorum olacak. kp ve kd nedir? açılımları nedir ve neye göre bulacağız? neden positiondan 2500 çıkarıyoruz?

      ReplyDelete
    6. 18. satırda 'QTRSensorsRC' does not name a type diye bir hata alıyorum çözümünü bilen var mı

      ReplyDelete
    7. AYNI SORUN BENDE DE BULUNMAKTA SORUNUN ÇÖZÜMÜNÜ BİLEN ARKADAŞ YAZARSA ÇOK MÜTEŞEKKİR KALIRIM.

      ReplyDelete
    8. 18. satırda 'QTRSensorsRC' does not name a type diye bir hata alıyorum çözümünü bilen var mı

      ReplyDelete
    9. 'QTRSensorsRC' does not name a type hata alıyorum çözümü bulan var mı?

      ReplyDelete

    Konuyla ilgili yorum giriniz.