Arduino Uno ile birden fazla geçersiz döngü yapabilir miyim?

Bir problemim var. Motorlu, ön ve arka farlarla bir araba yapmak istiyorum. Onları aynı anda ama farklı döngülerde çalıştırmak istiyorum.

Bu benim kodum.

const int red1 = 10;
const int red2 = 11;
const int blue1 = 12;
const int blue2 = 13;
const int front1 = 3;
const int front2 = 4;
const int back1 = 5;
const int back2 = 6;
const int enablePWMPin = 9;
const int controlPinA = 8;
const int controlPinB = 7;
int buzzer = A0;

void setup() {
  pinMode(red1, OUTPUT);
  pinMode(red2, OUTPUT);
  pinMode(blue1, OUTPUT);
  pinMode(blue2, OUTPUT);
  pinMode(front1, OUTPUT);
  pinMode(front2, OUTPUT);
  pinMode(back1, OUTPUT);
  pinMode(back2, OUTPUT);
  pinMode(enablePWMPin, OUTPUT);
  pinMode(controlPinA, OUTPUT);
  pinMode(controlPinB, OUTPUT);

  digitalWrite(enablePWMPin, LOW);
  digitalWrite(front1, LOW);
  digitalWrite(front2, LOW);
  digitalWrite(back1, LOW);
  digitalWrite(back2, LOW);
  digitalWrite(red1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(blue1, LOW);
  digitalWrite(blue2, LOW);
  noTone(buzzer);
}

void loop() {
  digitalWrite(enablePWMPin, HIGH);
  digitalWrite(controlPinA, HIGH);
  digitalWrite(controlPinB, LOW);
  delay(3000);
  digitalWrite(controlPinA, LOW);
  digitalWrite(controlPinB, HIGH);
  delay(3000);
} 

void loop() {
  digitalWrite(red1, HIGH);
  digitalWrite(red2, HIGH);
  digitalWrite(blue1, LOW);
  digitalWrite(blue2, LOW);
  delay(250);
  digitalWrite(red1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(blue1, HIGH);
  digitalWrite(blue2, HIGH);
  delay(250);
}

void loop() {
  int directionA = digitalRead(controlPinA);
  int directionB = digitalRead(controlPinB);
  if (directionA == HIGH && directionB == LOW) {
    digitalWrite(front1, HIGH);
    digitalWrite(front2, HIGH);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  } else if (directionA == LOW && directionB == HIGH) {
    digitalWrite(back1, HIGH);
    digitalWrite(back2, HIGH);
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
  } else {
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  }
}

Arduino Uno kullanıyorum. Tüm boş döngülere aynı anda başlayabilir miyim?

2
Sadece derlemeye çalışıyorum, size bir cevap vermeli ...
katma yazar Louis Rhys, kaynak

5 cevap

Diğerlerinin de belirttiği gibi, hayır çoklu döngü fonksiyonuna sahip olamazsınız. Yapmanız gereken, yaklaşımınızı değiştirmeye çalışmaktır, böylece yapmaya çalıştığınız her şey, bloke olmadan sırayla yapılabilir (yani: gecikme işlevi kullanımını kaldırın). JRobert'in bazı önerilerini genişleterek, İşte bu işlevleri "aynı anda çalıştırmayı" nasıl yapacağımı şöyle:

void loop() {

    lights1(); 
    lights2();
    motor();

}

void lights1() {

  static unsigned long lastTime = 0;
  const long interval = 3000;
  static bool state = 0;

  unsigned long now = millis();

  if ( now - lastTime > interval && state == 0) {
    state = 1;
    lastTime = now;
    digitalWrite(enablePWMPin, HIGH);
    digitalWrite(controlPinA, HIGH);
    digitalWrite(controlPinB, LOW);
  }

  if ( now - lastTime > interval && state == 1) {
    state = 0;
    lastTime = now;
    digitalWrite(controlPinA, LOW);
    digitalWrite(controlPinB, HIGH);
  }
}

void lights2() {

  static unsigned long lastTime = 0;
  const long interval = 250;
  static bool state = 0;

  unsigned long now = millis();

  if ( now - lastTime > interval && state == 0) {
    state = 1;
    lastTime = now;
    digitalWrite(red1, HIGH);
    digitalWrite(red2, HIGH);
    digitalWrite(blue1, LOW);
    digitalWrite(blue2, LOW);
  }

  if ( now - lastTime > interval && state == 1) {
    state = 0;
    lastTime = now;
    digitalWrite(red1, LOW);
    digitalWrite(red2, LOW);
    digitalWrite(blue1, HIGH);
    digitalWrite(blue2, HIGH);
  }

}

void motor() {
  int directionA = digitalRead(controlPinA);
  int directionB = digitalRead(controlPinB);
  if (directionA == HIGH && directionB == LOW) {
    digitalWrite(front1, HIGH);
    digitalWrite(front2, HIGH);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  } else if (directionA == LOW && directionB == HIGH) {
    digitalWrite(back1, HIGH);
    digitalWrite(back2, HIGH);
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
  } else {
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  }
}

Bu yaklaşım aynı anda her üç fonksiyonun çalışmasını simüle edecektir. Her işlev bir seferde bir tane çalıştırır. Ancak, gecikme ışık1/2 işlevlerinden kaldırıldığından, yürütmeyi duraklatmak yerine 'bekleme' süresi boyunca hızla sona erer. Bu, motorların çalışmasına ve ışıkların aynı anda yanıp sönmesine izin verecektir.

2
katma

Ne yapmaya çalışıyorsun? Bu döngüler aynı anda çalışması mı gerekiyor (mümkün değil)? Veya birbiri ardına? "Gerçek hızlı" yeterince iyi ise "eşzamanlı" ile oldukça yakınlaşabilirsiniz. İhtiyacın olacak

  • Her döngü işlevine yeni, benzersiz bir ad verin;
  • İlk iki döngüden her birini, toplam 5 işlev için delay() s'de bölün;
  • İşlevlerin her birini gereksinim duyduğunuz oranda çalıştırmak için SimpleTimer gibi bir zamanlayıcı kitaplığı kullanın.
  • ve tek döngü() işlevinden, her şeyi devam ettirmek için SimpleTimer'ın '.run ()' işlevini çağırmaya devam edin.

DigitalRead() ve digitalWrite() çağrılarını doğrudan okumak ve yazmak istediğiniz port ve bit ile yazmak için bireysel işlevlerin hızını artırabilirsiniz.

1
katma

Bunları aynı anda ancak farklı bir döngüde çalıştırmak istiyorum.

Her şeyden önce, bir seferde sadece bir şey yapabilirsiniz. Yani bu dışarıda.

İkincisi, art arda birden çok döngü çalıştırmak için (her seferinde bir tane), bu oldukça kolaydır:

void loop1(void) {...}
void loop2(void) {...}
...

void loop(void) {
  loop1(); //run loop1
  loop2(); //run loop2
  ...
  loopn(); //run loopn
}

İşe yarayıp yaramadığını bu döngüleri nasıl kodladığınıza bağlı olacaktır.

1
katma

Hayır yapamazsın.

Birden fazla aynı işleve sahip olmak uygun bir C/C ++ değil, yani derlemeyecektir (jfpoilpret'in yorumunun önerdiği gibi). Arduino dünyasında program akışı düşüncesiyle de uyumlu değil - çizimler - en yüksek (kullanıcı tarafından erişilebilir) seviyede iki yöntemin olduğu yerler: void setup() ve void loop() . setup , programınızın başında tam olarak bir kez çalıştırılır. Bundan sonra döngü sonsuza dek ilmeklenir (dolayısıyla ad). Amaçlanan program akışını uygulamak için kodunuzu doğru şekilde yapılandırmanız gerekir, yani kendi işlevlerinizi loop 'dan çağırın. Çalışmaya değer dersler içeren www.arduino.cc hakkında daha fazla bilgi edinin.

1
katma

Birden fazla döngüyü aynı anda iptal etmek için bir Arduino Due Boarduna ihtiyacınız var. Bu #include kütüphanesiyle uyumlu tek kart

see : https://www.arduino.cc/en/Tutorial/MultipleBlinks

1
katma