Çizgi İzleyen Robot

Çizgi İzleyen Robot

#include <QTRSensors.h> //Qtr v4.0 

#define AIN1 4 //A sağ motor.
#define AIN2 3
#define PWMA 5

#define PWMB 6 //B sol motor.
#define BIN1 7
#define BIN2 8
#define STBY 9

#define sensorSayisi 8
#define sensorOrnekSayisi 4
#define emiterPini 11
#define LED 13

byte maxhiz = 70; // Motor pwm ayarı 0 - 255.

int hata = 0, turev = 0;
float KP = 0.03, KD = 0.5; // Oran (KP) ve türev (KD) sabitleri. (Her araca göre ayar yapılmalıdır.)

unsigned int pozisyon = 3500;

int fark = 0; // motorlara uygulanan fark
int son_hata; // Orantılı son değer (hatanın türevini hesaplamak için kullanılır)
int hedef = 3500; // Ayar noktası (8 sensör kullandığımız için pozisyon 0 ile 7000 arasında olmalıdır, bu yüzden ideal 3500)

QTRSensors qtr; // qtr isimli nesne oluşturuldu.
unsigned int sensor[sensorSayisi];

void setup() {
  qtr.setTypeAnalog();  //QTR-8A ayarla
  qtr.setSensorPins((const uint8_t[]) {
    A0, A1, A2, A3, A4, A5, A6, A7
  }, 8);
  pinMode(AIN1 , OUTPUT);
  pinMode(AIN2 , OUTPUT);
  pinMode(PWMA , OUTPUT);
  pinMode(BIN1 , OUTPUT);
  pinMode(BIN2 , OUTPUT);
  pinMode(PWMB , OUTPUT);
  pinMode(LED , OUTPUT);
  pinMode(STBY , OUTPUT);

  delay(1000); //Araca enerji verince 1sn bekle
  for ( int i = 0; i < 120; i++)  { // Dahili LED yanıp söndüğü sürece (3 sn) elle kalibrasyon yap.
    digitalWrite(LED, HIGH); delay(20);
    qtr.calibrate();
    digitalWrite(LED, LOW); delay(20);
    qtr.calibrate();
  }
  delay(3000); // Kalbirasyondan sonra 3 sn bekle.
}

void loop() {
  pozisyon = qtr.readLineWhite(sensor); // Beyaz çziginin pozisyonunu oku.
  hata = pozisyon - hedef; // Pozisyondan 3500 (hedef) çıkar. Hatayı bul.
  turev = hata - son_hata; // Hatadan bir önceki hatayı çıkar.
  son_hata = hata; // Şimdiki hatayı kaydet.

  int fark = ( hata * KP) + ( turev * KD ); // Motorlara uygulanacak farkı hesapla.

  if ( fark > maxhiz ) fark = maxhiz; // fark en fazla maxhiz olsun.
  else if ( fark < -maxhiz ) fark = -maxhiz;

  if ( fark < 0 ) // fark negatif ise
    motor(maxhiz, maxhiz + fark); // Sağ motorun hızını düşür.
  else // fark negatif değilse
    motor(maxhiz - fark, maxhiz); // Sol motorun hızını düşür.
}

void sagMotor(int pwm) {
  if ( pwm >= 0 )  {
    digitalWrite(AIN1, HIGH);
    digitalWrite(AIN2, LOW);
  }
  else  {
    digitalWrite(AIN1, LOW);
    digitalWrite(AIN2, HIGH);
    pwm *= -1;
  }
  analogWrite(PWMA, pwm);
}

void solMotor(int pwm) {
  if ( pwm >= 0 )  {
    digitalWrite(BIN1, HIGH);
    digitalWrite(BIN2, LOW);
  }
  else  {
    digitalWrite(BIN1, LOW);
    digitalWrite(BIN2, HIGH);
    pwm *= -1;
  }
  analogWrite(PWMB, pwm);
}

void motor(int sol, int sag) {
  digitalWrite(STBY, HIGH);
  solMotor(sol);
  sagMotor(sag);
}

9 cevap

  1. Anonim dedi ki:

    merhabalar robotun 3d model dosyasını atabilirmsiniz ?

  2. Nurullah dedi ki:

    Merhabalar Hocam!
    Öncelikle bu şekilde verimli ve faydalı paylaşımları yaptığınız için teşekkür ederim.
    Yukarıda paylaştığınız proteus görüntüsünün pin girişleri yazılı olan şekli varmı? ve L298N motor sürücülü şeklinde uyarlanması nasıl yapılabilir?
    Bu noktada yardımcı olursanız sevinirim.
    İyi çalışmalar.

  3. EMİRHAN İSPİR dedi ki:

    MERABA İYİ GÜNLER

    http://www.temrinler.com/wp-content/uploads/2018/12/cizgi_izleyen-400×406.jpg

    ACABA BU ŞEMANIN SİZDE YAPILMIŞ HALİ VARMI

    BÜTÜN PARCALARIYLA YADA SADECE KARTI DA OLABİLİR FİYATI NEDİR ACABA ÖĞRENEBİLİRMİYİM.

  4. Harun dedi ki:

    Kolay gelsin
    Acaba bu devre kartinin 2 yüzünün de dosyasi var mi siz de? Eger varsa paylasabilir misiniz?
    Iyi çalışmalar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.