Arduino koduna motorları tanımlamak

Coder_1

Centipat
Katılım
13 Haziran 2022
Mesajlar
16
Daha fazla  
Cinsiyet
Erkek
C++:
// QTR kütüphanesini ekliyoruz ve sabitlerimizi tanimliyoruz
#include <QTRSensors.h>
#define tabanhiz 150
#define sagmotor1 10
#define sagmotor2 9
#define sagmotorpwmpin 11
#define solmotor1 6
#define solmotor2 7
#define solmotorpwmpin 5
#define MZ80 8
#define taktik 12
#define LED 13

// QTR8A sensörümü bağlı olduğu pinlere tanımlayıp

//sensorlerden gelen veriler igin sensor dizisi olusturuyoruz
QTRSensorsAnalog qtra((unsigned char[]) {A0, A1, A2, A3, A4 , A5, A6, A7} , 8);
unsigned int sensors[8];

// Degişkenlerimizi tanimliyoruz

float Kp = 0.04;   float Kd = 0.6;   float Ki = 0.0001;   int integral = 0;
int ekhiz = 0; int sonhata = 0; int hata = 0; byte K=0;
int sagmotorpwm =0; int solmotorpwm = 0; unsigned char zemin = 1;
int cizgisay=0; long baslamazamani=0; long doksanzamani=50000;

void setup()
{

  // Dijital olarak kullanacağımız pinlerin giriş veya çıkış olarak tanımlıyoruz
  pinMode(sagmotor1, OUTPUT);
  pinMode(sagmotor2, OUTPUT);
  pinMode(sagmotorpwmpin, OUTPUT);
  pinMode(solmotor1, OUTPUT);
  pinMode(solmotor2, OUTPUT);
  pinMode(solmotorpwmpin, OUTPUT);
  pinMode(MZ80, INPUT);
  pinMode(taktik, INPUT_PULLUP);
  delay(1000); // kalibrasyon başlamadan ek süre koyuyoruz
  //Kalibrasyon kodlari arduino üzerindeki led yanık olduğu sürece devama eder
  digitalWrite(LED, HIGH);
  // Kalibrsayonun otomatik gergeklesmesi robotumnza hafis sag sol kafa sallama yaptiriyoruz
  for (int i = 0; i < 150; i++)
  {
if ( 0 <= i && i < 5 ) hafifsagadon() ;
if ( 5 <= i && i  < 15 ) hafifsoladon () ;
if ( 15 <= i && i < 25 ) hafifsagadon () ;
if ( 25 <= i && i < 35 ) hafifsoladon () ;
if ( 35 <= i && i < 40 ) hafifsagadon () ;
if ( 40 <= i && i < 50 ) hafifsoladon () ;

    // Kalibrasyon dongusu 50yi astiktan sonra frenliyoruz bu esnada robotu
    // Arduino uzerindeki led flash yapana kadar elle de kalibre edebiliriz
    if ( i >= 50 ) {
      frenle(1);
      delay(3);
    }
    qtra.calibrate();
    delay(1);

  }

  // kalibrasyon döngüsünün çıktığını anlamak için Arduinoda bulunan yerleşik lede flaş yaptırıyoruz
  // Bu esnada robotumuzun çizgi sensörünü çizgiye ortalıyoruz
  flashyap();
  // başlangıçta engel varsa durup bekler. MZ80 sensörü takılı olmalıdır
  while (digitalRead(MZ80) == LOW) {frenle(1);}
  // Serial.begin(9600);

}

void loop() {
  sensoroku();
  //sensorlerioku_yaz();
  dikcizgioku();
  yol_ayrimi();
  sag_sol_90();
  engeldenatla();
 
  if (cizgisay==1 || cizgisay == 3 ) ekhiz = 100; else ekhiz = 0;
  if (cizgisay==3) K = 1;
  if (cizgisay==5) {frenle(10000);}


//90 dereceden alınan zamana göre hızlanma komtlarımız
if (200 < (millis() - doksanzamani) && (millis() - doksanzamani) < 1200 ) ekhiz = 100;
if (1200 < (millis() - doksanzamani) && (millis() - doksanzamani) < 2400 ) ekhiz = 30;
if (2400 < (millis() - doksanzamani) && (millis() - doksanzamani) < 5000 ) ekhiz = 100;


  // motorlara verilecek hız duzeltme oran hesebı PID
  integral += hata; //çizgiden uzeklastikça hatalari toplar
if (abs(hata) < 500)integral = 0;
int duzeltmehizi = Kp * hata + Kd * (hata - sonhata) + Ki * integral;
sonhata = hata;

// Motorlara uygulanacak kesin hız ayarları
sagmotorpwm = tabanhiz + duzeltmehizi + ekhiz ;
solmotorpwm = tabanhiz - duzeltmehizi + ekhiz ;
//***************

// motorlara hiz ayarlarinin uygulanması
// Burada motorlara uyqulanacek PWM degerlerine sınırlendırme getirilmiştir.
sagmotorpwm = constrain(sagmotorpwm, -50, 254);
solmotorpwm = constrain(solmotorpwm, -50, 254);
motorkontrol(solmotorpwm, sagmotorpwm);
}

void engeldenatla() {
  if (digitalRead(MZ80) == LOW ) {
  
    motorkontrol(0, 150); delay(300); // önce sol motora fren verip sağ ileri yapıyor ve sola yönleniyoyoruz
    motorkontrol(150, 150); delay(200); // biraz ileri gidiyor
    motorkontrol(150, 0); delay(250); // sağ motora fren verip sol ileri yapıyor ve sola yönleniyoruz
    motorkontrol(150, 150); delay(800); // biraz ileri gidiyor
    motorkontrol(150, 0); delay(100); // biraz daha sağa yöne robotumuzu yönlendiriyoruz
    do { sensoroku(); motorkontrol(150, 120); } //çizgi görene kadar kavis yaptırıyoruz
    while (hata == 0);
  }
}
void sag_sol_90() {
  // sağa 90 derece var ise şartımız alttaki şekilde olacaktır
  if (sensors[0] < 100 && sensors[1] < 100 && sensors[2] < 100 && sensors[3] < 100 && sensors[6] > 500 && sensors[7] > 700) {
    // motorkontrol(-lOO,-250); delay(25); eğer hızlı bir motor kullanılıyorsa aktif edin
    doksanzamani = millis(); // 90 derece geçişlerde zaman bilgisini alıyoruz
    // robotumuznun ön sensör boşa çıktığında hata -3500 olur ve hata -3500 olduğunca
    // sol motoru ileri sağ motoru geri çevirip sensör okumaya devam ediyoruz
    do {sensoroku(); motorkontrol(200, -50);}
    while (hata == -3500);
  }
  // sola 90 derece var ise şartımız alttaki şekide olacaktır
  if (sensors[7] < 100 && sensors[6] < 100 && sensors[5] < 100 && sensors[4] < 100 && sensors[1] > 500 && sensors[0] > 700 ) {
    // motorkontrol(-250,-100); delay(25); eğer hızlı bir motor kullanılıyorsa aktif edin
    doksanzamani = millis(); // 90 derece geçişlerde zaman bilgisini alıyoruz
    // robotumuznun ön sensör boşa çıktığında hata 3500 olur ve hata 3500 olduğunca
    // sağ motoru ileri sol motoru geri çevirip sensör okumaya devam ediyoruz
    do {sensoroku();motorkontrol(-50, 200);}
    while (hata == 3500);
  }
}
void yol_ayrimi() {
  // Eğer yol ayrımı var ise şartımız alttaki şekide olacaktır
 if (sensors[0] > 800 && sensors[2] < 600 && sensors[3] < 100 && sensors[4] < 100 && sensors[5] < 600 && sensors[7] > 800 ) {
  if(K == 0) {
      // Sol tarafa dönmek için
      motorkontrol(80, 180); delay(300);
    }
  if (K == 1) {
   // Sag tarafa dönmek için
   motorkontrol(180, 80); delay(300); }
  }
}

void sensoroku() {
  //Çizgi sensörü hesap kodları
  unsigned int position = qtra.readLine(sensors, 1, zemin);
  hata = position - 3500;
  // zemin değiştirme kodları
  if ( sensors[0] < 100 && sensors[7] < 100 ) { zemin = 0; } //beyaz
  if ( sensors[0] > 750 && sensors[7] > 750 ) { zemin = 1; } //siyah
}
void flashyap() {
  for (int x = 0; x < 6; x++) {
       digitalWrite(LED, HIGH); delay(200);
       digitalWrite(LED, LOW); delay(200);
    }
  }

  void dikcizgioku() {

  if (sensors[0] < 100 && sensors[1] < 100 && sensors[2] < 100 && sensors[3] < 100 &&
      sensors[4] < 100 && sensors[5] < 100 && sensors[6] < 100 && sensors[7] < 100 ) {
    cizgisay++; motorkontrol(tabanhiz, tabanhiz); delay(50);
  }
}

void sensorlerioku_yaz() {
  for (unsigned char z = 0; z < 8; z++)

  {

    Serial.print(sensors[z]);
    Serial.print('\t');

  }

  Serial.println();

  delay(250);
}

void motorkontrol(int solmotorpwm, int sagmotorpwm) {
  if (sagmotorpwm <= 0) {
    sagmotorpwm = abs(sagmotorpwm);
    digitalWrite(sagmotor1, LOW);
    digitalWrite(sagmotor2, HIGH);
    analogWrite(sagmotorpwmpin, sagmotorpwm);
  }

  else {
    digitalWrite(sagmotor1, HIGH);
    digitalWrite(sagmotor2, LOW);
    analogWrite(sagmotorpwmpin, sagmotorpwm);
  }

  if (solmotorpwm <= 0) {

    solmotorpwm = abs(solmotorpwm);
    digitalWrite(solmotor1, LOW);
    digitalWrite(solmotor2, HIGH);
    analogWrite(solmotorpwmpin, solmotorpwm);
  }

  else {
    digitalWrite(solmotor1, HIGH);
    digitalWrite(solmotor2, LOW);
    analogWrite(solmotorpwmpin, solmotorpwm);
  }
}
void frenle(int bekle){motorkontrol(0, 0), delay(bekle);}
void hafifsagadon() {motorkontrol(60, -60);}
void hafifsoladon() {motorkontrol(-60, 60);}

Üstte verdiğim koda atacağım şemadaki motor pinlerini tanımlayabilir misiniz? Bende 2 tane motor pini var fakat kodda 3 adet pin tanımlamamı söylüyor.
 

Dosya Ekleri

  • ÇizgiZade 2019 Pin Yapısı.jpg
    ÇizgiZade 2019 Pin Yapısı.jpg
    106,8 KB · Görüntüleme: 74

Technopat Haberler

Geri
Yukarı