• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie RC
#1
Cześć

Od kilku miesięcy uczę się programować.
Powoli robię coraz bardziej skomplikowane kody.
Zaczynałem od świecącej diody, potem przycisk, miganie, dwie diody oddzielnie, buzzer.
Jakiś czas temu syn kupił sobie auto zdalnie sterowane. Bez bajerów. Pomyślałem, że zrobię kod do sterowania oświetleniem i buzzerem.
Na razie dla jednego kanału wszystko działa, ale jak próbuje dwa kody połączyć w jeden by na jednym kanałem włączyć diodę a drugim wlaczyć buzzer to nie mogę tego ogarnać.
Osobno na oddzielnych kodach wszystko działa poprawnie.
Kod poniżej:
Kod:
const int pinRC5 = 5;   // Kanał 5
const int pinRC6 = 6;   // Kanał 6
const int led1 = 8;
const int led2 = 9;
const int buzzerPin = 12;   // Pin buzzera
const int buttonPin = 2;     // pin przycisku – nie używany - testowy
int buttonState = 0;         // zmienna do odczytu stanu przycisku - testowy

unsigned long czas4, czas5, czas6;
unsigned long previousMillis = 0;
const unsigned long interval = 40; // czas między zmianami stanu diody

int stepCounter = 0; // krok sekwencji
bool ledState = false;

// Parametry syreny
unsigned long lastToneChange = 0;
unsigned long toneInterval   = 5; // co ile ms zmieniać częstotliwość
int toneFreq = 400;                // aktualna częstotliwość
int toneStep = 15;                  // krok zmiany częstotliwości
int minFreq  = 400;                 // dolny zakres
int maxFreq  = 1000;                // górny zakres
bool freqUp  = true;                 // kierunek zmiany częstotliwości

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(pinRC5, INPUT);
  pinMode(pinRC6, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);

}

void loop()
{
czas5 = pulseIn(pinRC5, HIGH, 25000);
czas6 = pulseIn(pinRC6, HIGH, 25000);
unsigned long currentMillis = millis();
buttonState = digitalRead(buttonPin); // testowy

if (czas5 > 1700)
  {
    if (currentMillis - previousMillis >= interval)
    {
    previousMillis = currentMillis;

    switch (stepCounter)
      {
      case 0: case 2: // dioda 1 miga dwa razy
        ledState = !ledState;
        digitalWrite(led1, ledState);
        if (!ledState) stepCounter++;
        break;

      case 4: case 6: // dioda 2 miga dwa razy
        ledState = !ledState;
        digitalWrite(led2, ledState);
        if (!ledState) stepCounter++;
        break;

      default:
        stepCounter++;
        if (stepCounter > 7) stepCounter = 0; // restart sekwencji
        break;
      }
    }
else {digitalWrite(led1, LOW);
      digitalWrite(led2, LOW);
      }
  }

if (czas6 > 1700)
  {  if (currentMillis - lastToneChange >= toneInterval) {
    lastToneChange = currentMillis;

    // Zmiana częstotliwości w górę/dół
    if (freqUp) {
      toneFreq += toneStep;
      if (toneFreq >= maxFreq) freqUp = false;
    } else {
      toneFreq -= toneStep;
      if (toneFreq <= minFreq) freqUp = true;
    }
    // Generowanie tonu
    tone(buzzerPin, toneFreq);
  }
  }
else {noTone(buzzerPin);}
}
Co poprawić by dwa kanały działały niezależnie?
Potem będę próbował dodać kolejne.
Serwo i ślinik steruje bezpośrednio z odbiornika 8 kanałowego nie będę przepuszczał przez zestaw Arduino.
 
Odpowiedź
#2
Wrzuć sobie do kodu miganie led co 10ms, taki też na millis. Jak zauważysz, że miganie led jest zakłócane, to żaden program czasu rzeczywistego nie będzie działał w pełni poprawnie. Takie sterowanie najprościej ogarnąć na modułach wyższego poziomu, nie używasz wtedy procka to pomiarów impulsów, co go blokuje, a tylko przesyłasz co np. 10ms prosty komunikat tekstowy z pilota, auto dekoduje komunikat i reaguje na zestaw poleceń. W jednym komunikacie możesz przesłać dziesiątki bajtów i wysterować autka jak tylko wyobraźnia pozwala. Jeśli przez 50ms nie dostanie kolejnego komunikatu, bo np. pilot jest poza zasięgiem możesz odpalić funkcję bezpiecznego zatrzymania. Moduły radiowe to np. nRF24L01+.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości