Arduino projesi ile ilgili sorularım var

UnknownUser01

Yeni üye
18 Haz 2021
28
7
İstanbul
arduino kullanarakbir proje yapmak istiyorum ama yazılım konusunda sorun yaşıyorum. yapmak istediğim proje şu şekilde:
bir robot olucak, bu robot üzerinde 3 cm çapında siyah noktalar olan beyaz kare bir alanı (1.5m x 1.5m) sistematik bir şekilde gezecek. (robot süpürge gibi zikzak yaparak) gezerken eğer yerde siyah bir nokta ile karşılaşırsa 1 saniye hareket etmeden bekleyecek, 2 saniye buzzerdan ses çıkartacak ve yoluna/aramaya devam edecek.(toplam 3 saniye duraklamış oldu). ben bu robotun hareket algoritmasını şöyle düşündüm:
ileri gitmeye başla, eğer siyah nokta görürsen 1 sn bekle,2sn buzzer çal ve yoluna devam et, eğer duvarla arandaki mesafe 5 cm den az kaldıysa o zaman duvarı kaçıncı kez gördüğünü kontrol et; eğer bu sayı çift ise olduğun yerde sola dön, 6-7 cm ileri git, tekrar olduğun yerde sola dön. ama eğer duvarla karşılaşma sayı tek ise o zaman olduğun yerde sağa dön, 6-7 cm ileri git, tekrar olduğun yerde sağa dön.(bu algoritma robotun bütün alanı sistematik bir şekilde taramasını sağlayacak) ama bu kod istediğim şeyi yapmıyor.bu kodda şikayetçi olduğum kısım duraksayarak ilerliyor/neredeyse hiç ileri doğru gitmiyor, engelle karşılaşma duvar sayacı gibi kısımlarda sorun yok gibi gözüküyor. benim istediğim şey bu robotun akıcı bir şekilde hareket ederken noktaları sistematik bir şekilde araması. yardım eden olursa sevinirim.

kullandığım malzemeler:
2 adet dc motor
1 adet l298 motor sürücü
1 adet ultrasonik mesafe sensörü (hc-SR04)
3 adet kızıl ötesi sensör ve bu sensörlerin sürücüsü (F233-01, genelde çizgi izleyen robotlarda kullanılanlardan)
1 adet buzzer
ve arduino uno


Kod:
int DuvarMesafe = 0;
const int sagMotorileri = 9;
const int sagMotorGeri = 10;
const int MotorEnableSag = 4;

const int solMotorileri = 2;
const int solMotorGeri = 3;
const int MotorEnableSol = 5;


const int infraredSensorPin1 = A0;
const int infraredSensorPin2 = A1;
const int infraredSensorPin3 = A2;
const int triggerPin = 7;        
const int echoPin = 8;          
const int buzzerPin = 6;

int karsilasmaSayaci = 0;  // Duvar ile karşılaşma sayısı

void setup() {
 
  pinMode(sagMotorileri, OUTPUT);
  pinMode(sagMotorGeri, OUTPUT);
  pinMode(MotorEnableSag, OUTPUT);

  pinMode(solMotorileri, OUTPUT);
  pinMode(solMotorGeri, OUTPUT);
  pinMode(MotorEnableSol, OUTPUT);

 
  pinMode(infraredSensorPin1, INPUT);
  pinMode(infraredSensorPin2, INPUT);
  pinMode(infraredSensorPin3, INPUT);

 
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
    Serial.begin(9600);
  pinMode(buzzerPin, OUTPUT);
}

void loop() {

  ileriGit();
  DuvarMesafe = MesafeOlc();

  if (DuvarMesafe < 5){
    karsilasmaSayaci++;
    if(karsilasmaSayaci %2 == 1){
      sagaDon();
   
    }
    else {
      solaDon();
    }
  }

  else if (noktaAlgila()){
    motorlaridurdur();
    delay(1000);
    buzz();
  }


}


void ileriGit() {
  // Motorlar ileri
  digitalWrite(sagMotorileri, HIGH);
  digitalWrite(sagMotorGeri, LOW);
  analogWrite(MotorEnableSag, 255);

  digitalWrite(solMotorileri, HIGH);
  digitalWrite(solMotorGeri, LOW);
  analogWrite(MotorEnableSol, 255);

  // İleri giderken mesafe kontrolü ve nokta algılama
  while (DuvarMesafe >= 5 && !noktaAlgila()) {
    delay(100); // Mesafe ve nokta algılama kontrolünü sık aralıklarla yapmak için
    DuvarMesafe = MesafeOlc(); // Mesafe değerini güncelle
  }

  motorlaridurdur(); // Mesafe veya nokta algılama durumunda durdur

}

void sagaDon() {
// Sağa dön
  digitalWrite(sagMotorileri, LOW);
  digitalWrite(sagMotorGeri, HIGH);
  analogWrite(MotorEnableSag, 255);

  digitalWrite(solMotorileri, HIGH);
  digitalWrite(solMotorGeri, LOW);
  analogWrite(MotorEnableSol, 255);

  // Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
  delay(1000);
  motorlaridurdur();

  digitalWrite(sagMotorileri, HIGH);
  digitalWrite(sagMotorGeri, HIGH);
  analogWrite(MotorEnableSag, 255);

  digitalWrite(solMotorileri, HIGH);
  digitalWrite(solMotorGeri, HIGH);
  analogWrite(MotorEnableSol, 255);
  delay(700);

  motorlaridurdur();
    // Sola dön
  digitalWrite(sagMotorileri, LOW);
  digitalWrite(sagMotorGeri, HIGH);
  analogWrite(MotorEnableSag, 255);

  digitalWrite(solMotorileri, HIGH);
  digitalWrite(solMotorGeri, LOW);
  analogWrite(MotorEnableSol, 255);

  // Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
  delay(1000);
  motorlaridurdur();
}

void solaDon() {
  // Sola dön
  digitalWrite(sagMotorileri, HIGH);
  digitalWrite(sagMotorGeri, LOW);
  analogWrite(MotorEnableSag, 255);

  digitalWrite(solMotorileri, LOW);
  digitalWrite(solMotorGeri, HIGH);
  analogWrite(MotorEnableSol, 255);

  // Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
  delay(1000);
  motorlaridurdur();

  digitalWrite(sagMotorileri, HIGH); // biraz ,leri gidecek
  digitalWrite(sagMotorGeri, HIGH);
  analogWrite(MotorEnableSag, 255);

  digitalWrite(solMotorileri, HIGH);
  digitalWrite(solMotorGeri, HIGH);
  analogWrite(MotorEnableSol, 255);
  delay(700);

  motorlaridurdur();
    // Sola dön
  digitalWrite(sagMotorileri, HIGH);
  digitalWrite(sagMotorGeri, LOW);
  analogWrite(MotorEnableSag, 255);

  digitalWrite(solMotorileri, LOW);
  digitalWrite(solMotorGeri, HIGH);
  analogWrite(MotorEnableSol, 255);

  // Yaklaşık 90 derece dönmesi için gecikme (robot olduğu yerde dönücek)
  delay(1000);
  motorlaridurdur();


}

void motorlaridurdur() {
  // Motorları durdur
  digitalWrite(sagMotorileri, LOW);
  digitalWrite(sagMotorGeri, LOW);
  digitalWrite(solMotorileri, LOW);
  digitalWrite(solMotorGeri, LOW);
}

bool noktaAlgila() {
  // Kızılötesi sensörlerle siyah nokta kontrolü
  int infraredSensorValue1 = analogRead(infraredSensorPin1);
  int infraredSensorValue2 = analogRead(infraredSensorPin2);
  int infraredSensorValue3 = analogRead(infraredSensorPin3);

  // Eşik değeri sensör davranışlarına göre ayarla
  int infraredEsikDegeri = 500;

  // En az bir sensör siyah nokta algılarsa true döndür
  return (infraredSensorValue1 < infraredEsikDegeri) ||
         (infraredSensorValue2 < infraredEsikDegeri) ||
         (infraredSensorValue3 < infraredEsikDegeri);
}

void buzz() {

 
  digitalWrite(buzzerPin, HIGH);
  delay(2000);
  digitalWrite(buzzerPin, LOW);
}

int MesafeOlc() {
  // HC-SR04 ile mesafe ölçme
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  return pulseIn(echoPin, HIGH) * 0.0343 / 2;
}
 
Son düzenleme:

UnknownUser01

Yeni üye
18 Haz 2021
28
7
İstanbul
bütün sorunları başka yerlerden bakarak ve birkaç video izleyerek çözdüm çözümü paylaşmak istiyorum ihtiyacı olan olursa diye
NOT: değerler optimize edilMEmiştir.

Kod:
  int DuvarMesafe = 0;

  const int SagMotorileri = 9;
  const int SagMotorgeri = 10;
  const int MotorEnableSag = 4;

  const int SolMotorileri = 2;
  const int SolMotorgeri = 3;
  const int MotorEnableSol = 5;

  const int infraredSensorPin1 = A0;
  const int infraredSensorPin2 = A1;
  const int infraredSensorPin3 = A2;
  const int triggerPin = 7;      
  const int echoPin = 8;         
  const int buzzerPin = 11;

  int DuvarKarsilasmaSayaci = 0;  // Duvar ile karşılaşma sayısı



unsigned long OncekiMillis = 0;
const long aralik = 100; // aralığı gerektiği gibi ayarla

// state leri tanımla
enum RobotState {
  STATE_ILERI,
  STATE_SAGA_DON,
  STATE_SOLA_DON,
  STATE_DUR,
  STATE_BUZZ,
};

RobotState MevcutDurum = STATE_ILERI;

void DurumuGuncelle();
void DurumuUygula();
void ileriGit();
void SagaDon();
void SolaDon();
void MotorlariDurdur();
bool SiyahNoktaAlgila();
void buzz();
int MesafeOlc();

  void setup() {
 
    pinMode(SagMotorileri, OUTPUT);
    pinMode(SagMotorgeri, OUTPUT);
    pinMode(MotorEnableSag, OUTPUT);

    pinMode(SolMotorileri, OUTPUT);
    pinMode(SolMotorgeri, OUTPUT);
    pinMode(MotorEnableSol, OUTPUT);

    pinMode(infraredSensorPin1, INPUT);
    pinMode(infraredSensorPin2, INPUT);
    pinMode(infraredSensorPin3, INPUT);
    pinMode(triggerPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(buzzerPin, OUTPUT);
  }

  void loop() {
  unsigned long GecerliMillis = millis();

  // Durumu güncelleme zamanının gelip gelmediğini kontrol et
  if (GecerliMillis - OncekiMillis >= aralik) {
    OncekiMillis = GecerliMillis;

    // robotun durumunu güncelle
    DurumuGuncelle();
  }

  // mevcut durumu uygula
  DurumuUygula();
}

void DurumuGuncelle() {
  DuvarMesafe = MesafeOlc();

  switch (MevcutDurum) {
    case STATE_ILERI:
      if (DuvarMesafe < 5) {
        DuvarKarsilasmaSayaci++;
        MevcutDurum = (DuvarKarsilasmaSayaci % 2 == 1) ? STATE_SAGA_DON : STATE_SOLA_DON;
      } else if (SiyahNoktaAlgila()) {
        MevcutDurum = STATE_DUR;
      }
      break;

    case STATE_SAGA_DON:
      MevcutDurum = STATE_DUR; // Sağa dönmenin sabit bir zaman aldığını varsayalım
      break;

    case STATE_SOLA_DON:
      MevcutDurum = STATE_DUR; // Sağa dönmenin sabit bir zaman aldığını varsayalım
      break;

    case STATE_DUR:
      if (SiyahNoktaAlgila()) {
        MevcutDurum = STATE_BUZZ; // Transition to buzz only when DetectBlackDot() is true
      } else {
        MevcutDurum = STATE_ILERI; // Assume stopping takes a fixed amount of time
      }
      break;

    case STATE_BUZZ:
      MevcutDurum = STATE_ILERI; //  sesinin sabit bir süre sürdüğünü varsayalım
      break;
  }
}

void DurumuUygula() {
  switch (MevcutDurum) {
    case STATE_ILERI:
      ileriGit();
      break;

    case STATE_SAGA_DON:
      SagaDon();
      break;

    case STATE_SOLA_DON:
      SolaDon();
      break;

    case STATE_DUR:
      MotorlariDurdur();
      break;

    case STATE_BUZZ:
      buzz();
      break;
  }
}

  void ileriGit() {
    // Motorlar ileri
    digitalWrite(SagMotorileri, HIGH);
    digitalWrite(SagMotorgeri, LOW);
    analogWrite(MotorEnableSag, 255);

    digitalWrite(SolMotorileri, HIGH);
    digitalWrite(SolMotorgeri, LOW);
    analogWrite(MotorEnableSol, 255);
    // burada ILERIye iderken mesafe kontrolü ve nokta tespiti yapmasını sağlamaya çalışıyorum
    while (DuvarMesafe >= 5 && !SiyahNoktaAlgila()) {
      delay(100); // Mesafe ve nokta algılama kontrolünü sık aralıklarla yapmak için
      DuvarMesafe = MesafeOlc(); // Mesafe değerini güncelle
    }
  }

  void SagaDon() {
  // sağa dön
    MotorlariDurdur();
    delay(200);
    digitalWrite(SagMotorileri, LOW);
    digitalWrite(SagMotorgeri, HIGH);
    analogWrite(MotorEnableSag, 255);

    digitalWrite(SolMotorileri, HIGH);
    digitalWrite(SolMotorgeri, LOW);
    analogWrite(MotorEnableSol, 255);

    //yaklaşık90 derece döndürmek için gecikme(robot olduğu yerde dönecek)
    delay(1000);
    MotorlariDurdur();
    delay(200);

    digitalWrite(SagMotorileri, HIGH);
    digitalWrite(SagMotorgeri, HIGH);
    analogWrite(MotorEnableSag, 255);

    digitalWrite(SolMotorileri, HIGH);
    digitalWrite(SolMotorgeri, HIGH);
    analogWrite(MotorEnableSol, 255);
    delay(700);

    MotorlariDurdur();
    delay(200);
      // sağa dön
    digitalWrite(SagMotorileri, LOW);
    digitalWrite(SagMotorgeri, HIGH);
    analogWrite(MotorEnableSag, 255);

    digitalWrite(SolMotorileri, HIGH);
    digitalWrite(SolMotorgeri, LOW);
    analogWrite(MotorEnableSol, 255);

    //yaklaşık90 derece döndürmek için gecikme(robot olduğu yerde dönecek)
    delay(1000);
    MotorlariDurdur();
    delay(200);
  }

  void SolaDon() {
    // sola dön
    MotorlariDurdur();
    delay(200);
    digitalWrite(SagMotorileri, HIGH);
    digitalWrite(SagMotorgeri, LOW);
    analogWrite(MotorEnableSag, 255);

    digitalWrite(SolMotorileri, LOW);
    digitalWrite(SolMotorgeri, HIGH);
    analogWrite(MotorEnableSol, 255);

    //yaklaşık90 derece döndürmek için gecikme(robot olduğu yerde dönecek)
    delay(1000);
    MotorlariDurdur();
    delay(200);

    digitalWrite(SagMotorileri, HIGH); // biraz ,leri gidecek
    digitalWrite(SagMotorgeri, HIGH);
    analogWrite(MotorEnableSag, 255);

    digitalWrite(SolMotorileri, HIGH);
    digitalWrite(SolMotorgeri, HIGH);
    analogWrite(MotorEnableSol, 255);
    delay(700);

    MotorlariDurdur();
    delay(200);
      // sola dön
    digitalWrite(SagMotorileri, HIGH);
    digitalWrite(SagMotorgeri, LOW);
    analogWrite(MotorEnableSag, 255);

    digitalWrite(SolMotorileri, LOW);
    digitalWrite(SolMotorgeri, HIGH);
    analogWrite(MotorEnableSol, 255);
    //yaklaşık90 derece döndürmek için gecikme(robot olduğu yerde dönecek)
    delay(1000);
    MotorlariDurdur();
    delay(200);
  }

  void MotorlariDurdur() {
    digitalWrite(SagMotorileri, LOW);
    digitalWrite(SagMotorgeri, LOW);
    digitalWrite(SolMotorileri, LOW);
    digitalWrite(SolMotorgeri, LOW);
  }

  bool SiyahNoktaAlgila() {
    int infraredSensorValue1 = analogRead(infraredSensorPin1);
    int infraredSensorValue2 = analogRead(infraredSensorPin2);
    int infraredSensorValue3 = analogRead(infraredSensorPin3);
    int infraredEsikDegeri = 500; // Sensör davranışına göre eşik değerini ayarla
    return (infraredSensorValue1 < infraredEsikDegeri) || //En az bir sensör siyah nokta tespit ederse true olsun
          (infraredSensorValue2 < infraredEsikDegeri) ||
          (infraredSensorValue3 < infraredEsikDegeri);
  }

  void buzz() {
    digitalWrite(buzzerPin, HIGH);
    delay(2000);
    digitalWrite(buzzerPin, LOW);
  }

  int MesafeOlc() { //HC-SR04 ile mesafe ölç
    digitalWrite(triggerPin, LOW);
    delayMicroseconds(2);
    digitalWrite(triggerPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(triggerPin, LOW);

    return pulseIn(echoPin, HIGH) * 0.0343 / 2;
  }
[code]
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.