Sterowanie wyjściami układu z aparatury RC

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
osa05
Młodszy majsterkowicz
Posty: 9
Rejestracja: 1 kwie 2019, 16:57

Sterowanie wyjściami układu z aparatury RC

Post autor: osa05 » 1 kwie 2019, 17:21

Cześć.
jakiś czas temu wpadłem na pomysł by zbudować przełącznik urządzeń w modelu za pomocą wolnego kanału.
Mam wolny kanał na przełączniku chwilowym i chciałbym nim włączać 3 urządzenia w kolejności 1->2->3 i wyłączać 3->2->1 za pomocą kliknięć przełącznika w radiu. Na pinie 3 układu mam sygnał 1000ms a przełączenie przełącznika w aparaturze powoduje zwiększenie sygnału do 1800ms.
W Arduino wstawiam pierwsze kroki ale efektem moich dotychczasowych bojów jest taki oto kod:

Kod: Zaznacz cały

int duration;
void setup() 
{
  pinMode(0, OUTPUT); //out 1
  pinMode(1, OUTPUT); //Out 2
  pinMode(2, OUTPUT); //Out 3
  pinMode(3, INPUT); // sygnał z odbiornika
 
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
}
 
void loop()
{
  duration = pulseIn(3, HIGH);
 
  digitalWrite(0, LOW); // Out 1
  digitalWrite(1, LOW); // Out 2
  digitalWrite(2, LOW); // Out 3
  
  while (duration > 1500 == HIGH )// Sygnał powyżej 1500ms

  digitalWrite(0, HIGH); // Out 1
  digitalWrite(1, LOW); // Out 2
  digitalWrite(2, LOW); // Out 3 
-----------------------------------------------------------------------------
  
  while (duration > 1500 == HIGH )// Sygnał powyżej 1500ms
  
  digitalWrite(0, LOW); // Out 1
  digitalWrite(1, HIGH); // Out 2
  digitalWrite(2, LOW); // Out 3
  
  while (duration > 1500 == HIGH )// Sygnał powyżej 1500ms
 
  digitalWrite(0, LOW); // Out 1
  digitalWrite(1, LOW); // Out 2
  digitalWrite(2, HIGH); // Out 3

  while (duration > 1500 == HIGH )// Sygnał powyżej 1500ms
 
  digitalWrite(0, LOW); // Out 1
  digitalWrite(1, HIGH); // Out 2
  digitalWrite(2, LOW); // Out 3

  while (duration > 1500 == HIGH )// Sygnał powyżej 1500ms
 
  digitalWrite(0, HIGH); // Out 1
  digitalWrite(1, LOW); // Out 2
  digitalWrite(2, LOW); // Out 3
  
  while (duration > 1500 == HIGH )// Sygnał powyżej 1500ms
  
  digitalWrite(0, LOW); // Out 1
  digitalWrite(1, LOW); // Out 2
  digitalWrite(2, LOW); // Out 3

  }
Od razu powiem że nie wiem czy dobrze to napisałem ale program działa tylko do momentu zaznaczonego kreskami.
Znaczy się kiedy układ dostanie sygnał powyżej 1500ms załącza wyjście 1 i stoi, kolejne podawanie sygnału nie robi nic ciągle jest aktywne wyjście 1.
Prosił bym o pomoc kolegów bardziej doświadczonych w temacie programowania w Arduino.
Pozdrawiam.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


uzi18
Majsterkowicz
Posty: 97
Rejestracja: 10 maja 2018, 05:06

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: uzi18 » 1 kwie 2019, 18:04

czy po 321 ma wszystko zgasnac?

zamiast while powinno byc uzyte if

w warunku duration > 1500 ==HIGH
powinno zostać tylko duration >1500
inaczej jest bez sensu bo to 2 warunki w jednym

co do sekwencji najlepiej byloby zrobic zmienna ktora zmienialaby wartosc 0,1,2,3 po kazdym impulsie i odpowiednio zmieniala w warunku wyjscia, a to mozna zrobic na if/else if lub switch/case





Wysłane z mojego MI MAX przy użyciu Tapatalka

osa05
Młodszy majsterkowicz
Posty: 9
Rejestracja: 1 kwie 2019, 16:57

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: osa05 » 1 kwie 2019, 18:17

Tak po sekwencji 3,2,1 powinno zgasnąć by móc od nowa włączać urządzenia w opisanej kolejności.
Dziękuje za sugestie, przetestuje je i dam znać o efektach.
uzi18
Majsterkowicz
Posty: 97
Rejestracja: 10 maja 2018, 05:06

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: uzi18 » 1 kwie 2019, 18:18

wklej pozniej nowa wersje ciekaw jestem co tam sklecisz

Wysłane z mojego MI MAX przy użyciu Tapatalka

osa05
Młodszy majsterkowicz
Posty: 9
Rejestracja: 1 kwie 2019, 16:57

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: osa05 » 2 kwie 2019, 17:56

Po licznych bojach stworzyłem taki kod przy okazji rozbudowując układ o kolejny kanał

Kod: Zaznacz cały

int duration;
void setup() {
  pinMode(4, OUTPUT); //Out 1
  pinMode(0, OUTPUT); //out 2
  pinMode(1, OUTPUT); //Out 3
  pinMode(2, OUTPUT); //Out 4
  pinMode(3, INPUT); // sygnał RC
 
  digitalWrite(4, LOW); 
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
}
 
void loop()
{
  duration = pulseIn(3, HIGH);
  {
  digitalWrite(4, LOW); // Out 1
  digitalWrite(0, LOW); // Out 2
  digitalWrite(1, LOW); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
  delay (1000);
  if (duration > 1500)
  {
  digitalWrite(4, HIGH); //Out 1
  digitalWrite(0, LOW); // Out 2
  digitalWrite(1, LOW); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
    delay (1000);
  if (duration > 1500)
 {
  digitalWrite(4, LOW); //Out 1
  digitalWrite(0, HIGH); // Out 2
  digitalWrite(1, LOW); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
    delay (1000);
  if (duration > 1500)
  {
  digitalWrite(4, LOW); //Out 1
  digitalWrite(0, LOW); // Out 2
  digitalWrite(1, HIGH); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
    delay (10);
  if (duration > 1500)
  {
  digitalWrite(4, LOW); //Out 1
  digitalWrite(0, LOW); // Out 2
  digitalWrite(1, LOW); // Out 3
  digitalWrite(2, HIGH); // Out 4
  }
    delay (1000);
  if (duration > 1500)
  {
  digitalWrite(4, LOW); //Out 1
  digitalWrite(0, LOW); // Out 2
  digitalWrite(1, HIGH); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
    delay (1000);
  if (duration > 1500)
  {
  digitalWrite(4, LOW); //Out 1
  digitalWrite(0, HIGH); // Out 2
  digitalWrite(1, LOW); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
    delay (1000);
  if (duration > 1500)
  {
  digitalWrite(4, HIGH); //Out 1
  digitalWrite(0, LOW); // Out 2
  digitalWrite(1, LOW); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
    delay (1000);
  if (duration > 1500)
  {
  digitalWrite(4, LOW); // Out 1
  digitalWrite(0, LOW); // Out 2
  digitalWrite(1, LOW); // Out 3
  digitalWrite(2, LOW); // Out 4
  }
    delay (1000);
  if (duration > 1500){}

  }

Ale niestety nie wiem jak zmusić ten program by po pierwszym sygnale staną przed włączeniem kolejnego kanału czekając na kolejny sygnał.
Obecnie przeleci wszystkie wyjścia i dopiero się zatrzymuje
Ostatnio zmieniony 2 kwie 2019, 21:31 przez osa05, łącznie zmieniany 1 raz.
uzi18
Majsterkowicz
Posty: 97
Rejestracja: 10 maja 2018, 05:06

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: uzi18 » 2 kwie 2019, 18:15

pieszym. sygnale?

Wysłane z mojego MI MAX przy użyciu Tapatalka

uzi18
Majsterkowicz
Posty: 97
Rejestracja: 10 maja 2018, 05:06

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: uzi18 » 2 kwie 2019, 18:49

Spróbuj czegoś takiego :

Kod: Zaznacz cały

int duration;
int krok = 0;

const int out1 = 4;
const int out2 = 0;
const int out3 = 1;
const int out4 = 2;
const int in_rc= 3;

void setup() {
  pinMode(out1, OUTPUT); //Out 1
  pinMode(out2, OUTPUT); //out 2
  pinMode(out3, OUTPUT); //Out 3
  pinMode(out4, OUTPUT); //Out 4

  pinMode(in_rc, INPUT_PULLUP); // sygnał RC

  digitalWrite(out1, LOW);
  digitalWrite(out2, LOW);
  digitalWrite(out3, LOW);
  digitalWrite(out4, LOW);
}

void loop()
{
  duration = pulseIn(in_rc, HIGH);
  if (duration > 1500) {
    krok++;
	if (krok > 7) krok = 0;

	if (krok == 1  || krok == 7)
	  digitalWrite(out1, HIGH);
	else
	  digitalWrite(out1, LOW);

    if (krok == 2 || krok == 6)
	  digitalWrite(out2, HIGH);
	else
	  digitalWrite(out2, LOW);

    if (krok == 3 || krok == 5)
	  digitalWrite(out3, HIGH);
	else
	  digitalWrite(out3, LOW);

    if (krok == 4)
	  digitalWrite(out4, HIGH);
	else
	  digitalWrite(out4, LOW);

  }
}
osa05
Młodszy majsterkowicz
Posty: 9
Rejestracja: 1 kwie 2019, 16:57

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: osa05 » 3 kwie 2019, 12:42

Dziękuje bardzo za kod działa rewelacyjnie o to mi właśnie chodziło.
Jedyną zmianą jaką naniosłem było dodanie opóźnienia 600ms od momentu dostania sygnału

Kod: Zaznacz cały

if (krok > 7) krok = 0;
delay(600);
  if (krok == 1  || krok == 7)
W przeciwny razie nawet bardzo krótki sygnał powodował bardzo szybkie przełączanie pomiędzy wyjściami.
Jeszcze raz wielkie dzięki za pomoc.
uzi18
Majsterkowicz
Posty: 97
Rejestracja: 10 maja 2018, 05:06

Re: Sterowanie wyjściami układu z aparatury RC

Post autor: uzi18 » 3 kwie 2019, 16:02

pulsein daje wynik w mikrosekundach wiec zamiast 1500 w warunku powinno byc 1500000UL, wtedy opoznienie nie powinno byc potrzebne

albo lepiej zrob tak:

Kod: Zaznacz cały

duration = pulseIn(in_rc, HIGH)/1000;
Wysłane z mojego MI MAX przy użyciu Tapatalka
ODPOWIEDZ

Strony partnerskie: