Çizgi İzleyen Robot

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

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

#define ENB 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

int 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 sonHata; // Orantılı son değer. (Hatanın türevini hesaplamak için kullanılır.)
int hedef = 3500; // Sensörden gelen 0 - 7000 arası değerin orta noktası.

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

void setup() {
  qtr.setTypeAnalog();  //QTR-8A ayarla. (QTR-8RC için qtr.setTypeRC() fonksiyonu kullanılır.)
  qtr.setSensorPins((const uint8_t[]) {
    A0, A1, A2, A3, A4, A5, A6, A7
  }, 8);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  pinMode(LED, OUTPUT);
  pinMode(STBY, OUTPUT);

  delay(1000); //Araca enerji verince 1sn bekle
  kalibrasyon(1); // 0 elle, 1 otomatik kafa sallama.
}

void loop() {
  sensorOku();
  pd();
}

void sensorOku() {
  pozisyon = qtr.readLineWhite(sensor); // Beyaz çizginin pozisyonunu oku. (0 - 7000)
  hata = pozisyon - hedef; // Pozisyondan 3500 (hedef) çıkar. Hatayı bul.
  qtr.read(sensor); // Sekiz sensörün ham değelerini oku.
}

void pd() {
  turev = hata - sonHata; // Hatadan bir önceki hatayı çıkar.
  sonHata = hata; // Şimdiki hatayı kaydet.

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

  constrain(fark, -maxHiz, maxHiz); // fark en fazla maxHiz olsun.

  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 motor(int solMotorPWM, int sagMotorPWM) {
  digitalWrite(STBY, HIGH);

  if ( solMotorPWM >= 0 )  { // İleri.
    digitalWrite(BIN1, HIGH);
    digitalWrite(BIN2, LOW);
  }
  else  { // Negatifse geri döndür.
    digitalWrite(BIN1, LOW);
    digitalWrite(BIN2, HIGH);
    solMotorPWM *= -1;
  }
  analogWrite(ENB, solMotorPWM);

  if ( sagMotorPWM >= 0 )  { // İleri.
    digitalWrite(AIN1, HIGH);
    digitalWrite(AIN2, LOW);
  }
  else  { // Negatifse geri döndür.
    digitalWrite(AIN1, LOW);
    digitalWrite(AIN2, HIGH);
    sagMotorPWM *= -1;
  }
  analogWrite(ENA, sagMotorPWM);
}

void kalibrasyon(bool secim) { // 1 otomatik, 0 elle.
  if (secim) { // secim 1 ise otomatik kalibrasyon yap.
    byte hiz = 40; // Aracın kafasını sallama hızı.
    for (byte i = 0; i < 3; i++) {  // Sağa sola üç kez kafa salla.
      while (sensor[7] < 300) {
        motor(hiz, -hiz);
        qtr.calibrate();
        sensorOku();
      }
      while (sensor[7] > 700) {
        motor(hiz, -hiz);
        qtr.calibrate();
        sensorOku();
      }
      while (sensor[0] < 300) {
        motor(-hiz, hiz);
        qtr.calibrate();
        sensorOku();
      }
      while (sensor[0] > 700) {
        motor(-hiz, hiz);
        qtr.calibrate();
        sensorOku();
      }
      while (sensor[3] > 500)  { // Ortada dur.
        motor(hiz, -hiz);
        qtr.calibrate();
        sensorOku();
      }
    }
  } else { // secim 0 ise elle kalibrasyon yap.
    for ( byte i = 0; i < 70; 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();
    }
  }
  motor(0, 0);
  delay(2000); // Kalbirasyondan sonra 3 sn bekle.
}

dav

Benzer Temrinler & Yazılar

  • servo 0-180

    #include Servo servo; // servo isimli nesne oluşturuldu. byte derece = 0; // Servo derecesini tutan değişken. void setup() { servo.attach(9); // Servo motor 9 numaralı PWM çıkışına bağlı. } void loop() { for (derece = 0; derece <= 180; derece += 1) { // 0°’den 180°’ye birer derece git. servo.write(derece); // Servo motorun gideceği…

  • |

    Voltmetre ve ampermetre bağlamak

    Eleman Adı Değeri Katagorisi Alt-Katagorisi R1 RES 10k Resistors Gen ric R2 RES 5k Resistors Generic R3 RES 1k Resistors Generic DC CELL 9V Miscellaneous İşlem basamakları: Temrin 1’deki devreyi çiziniz. düğmesinden DC voltmetre ve ampermetre alarak devreye bağlayınız. Ampermetrenin üzerine çift tıklayarak özellikler penceresinden kademeyi miliamper ayarlayınız. 4.Besleme voltajını değiştirerek, R1 üzerindeki gerilimi ölçüp…

  • |

    Mikrodenetleyiciye Hex kodunu yüklemek.

    İşlem basamakları: Arduino kütüphansei yüklü değilse https://www.temrinler.com/?page_id=564 adresinden arduino ktüphanesini indirip dosyaları C:\Program Files\Labcenter Electronics\Proteus 8 Professional\LIBRARY klasörüne kopyalayın. Pick Devices ile arduino çağırıp devreyi çiziniz. Arduino üzerinde çift tıklayarak program file kısmından Hex dosyasını yükleyiniz. Hex dosyasını Arduino IDE’ye aşağıdaki kodu yazarak oluşturabilir veyahttps://www.temrinler.com/?attachment_id=3450 adresinden indirebilirsiniz.   void setup() { pinMode(13, OUTPUT); } void loop()…

  • Menzil hesaplama

    Gelişmiş EV Menzil Hesaplayıcı Gelişmiş EV Menzil Hesaplayıcı Nominal Batarya (kWh): Batarya Sağlığı (SOH %): Araç Boş Ağırlığı (kg): Araç Tipi (Sürtünme): Sedan / Aero (Cd ~0.23)Hatchback / Crossover (Cd ~0.28)Büyük SUV (Cd ~0.34)Minibüs / Ticari (Cd ~0.40) Yolcu Sayısı (75kg/kişi): İlave Yük / Bagaj (kg): Ortalama Seyir Hızı (km/h): Hava & İklim: İdeal (20°C…

19 Comments

  1. Merhaba, öncelikle paylaşımınız için teşekkürler. Motor tutucuların stl dosyası da var mıdır acaba?

  2. Merhaba hocam. Öncelikle böylesine güzel bilgileri paylaştığınız için teşekkür ederiz. Lipo pillerden gelen gerilimi 5V a dönüştürmek için Voltaj regülatörü kullanmak gerekir mi? Siz bu devrede kullanmamışsınız sanırsam

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

  4. 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 Yorum Yazın

E-posta adresiniz yayınlanmayacaktır. Gerekli alanlar * ile işaretlenmiştir.