Skocz do zawartości

Obsługa modułu z dwoma przekaźnikami


Zbyszko125

Pomocna odpowiedź

Witam.

Po kilku godzinach walki jestem w ciemnej dziurze.

Po złożeniu prostego układu , moduł 2 przekaźników oraz dwoma włącznikami krańcowymi, i próbach napisania sketcha doszedłem do : krańcówką 1 włączę i załącza stycznik 1 , drugą krańcówkę włączę nic się nie dzieje, ale przytrzymanie drugiej krańcówki i naciśnięcie pierwszej wyłącza stycznik 1. Kilkakrotne przestudiowanie kursu podstaw Arduino, niestety nie udało mi się rozgryźć tego. Nie wiem co wpisać do kodu aby 2 krańcówka wyłączała przekaźnik który został wcześniej załączony przez krańcówkę 1.

Link do komentarza
Share on other sites

Masz błąd związany z nawiasami. Po pierwszym if-ie kończysz nawias {} dopiero na koniec pętli głównej, więc drugi if jest sprawdzany tylko wtedy, gdy pierwsza krańcówka jest wciśnięta.

Link do komentarza
Share on other sites

Dzieki za odzew. Jak widać dopiero ogarniam temat i długa droga przede mną.

Czyli nawiasy {} mają wpływ a raczej ich położenie na wykonanie kodu, jeszcze nie bardzo rozumiem na jakiej zasadzie one działają,czy jestem na dobrej drodze czy raczej dalej w czarnej dziurze? Analiza kodu i próby na samym kodzie i test na "żywca" z Arduino i podzespołami naprowadzi mnie gdzie mam błąd, jeszcze raz dzieki

Link do komentarza
Share on other sites

Zbyszko125, oczywiście, że położenie nawiasów ma znaczenie. Wewnątrz nawiasów obejmuje się bloki kodu, które wykonywane są np. w przypadku spełnienia jakiegoś warunku lub, które mają być wykonywane w danej pętli. Zerknij na spokojnie do naszego kursu Arduino i poczytaj podstawy - tam jest wszystko wyjaśnione od początku.

PS Temat wydzieliłem z kursu elektroniki i przeniosłem do odpowiedniego działu.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dzięki za podpowiedź. Kilka testów i krótka analiza kodu, choć jeszcze nie do końca rozumiem pewnych zależności, udało mi się zrobić że wciśnięcie krańcówki 1 włącza stycznik 1, naciśnięcie krańcówki 2 wyłącza stycznik 1 a załącza stycznik 2, ponowne wcisnięcie krańcówki 1 wyłącza stycznik 2 a załącza 1, generalnie tego oczekuje od układu. Kolejnym wątkiem jest dołożenie 1 sekundy do przęłaczania styczników aby nie prząłączały się jeden po drugim tylko po 1 sekundzie.

delay mi tu chyba nie pomoże bo "chyba" ta funkcja powoduje zawieszanie kodu na czas zawarty w tej funkcji( proszę mnie poprawić jeśli się mylę) i jeszcze jedna kwestia dołożenie przycisków

1 przycisk-start/stop 2 przycisk- przesuń w prawo 3 przycisk- przesuń w lewo.

A tak wygląda mój sketch:

Dodałem te 3 przyciski

Ustawienia czasu niestety na chwilę obecną nie wiem jak dodać jaką funkcją i w którym miejscu.

Z tymi przyciskami także na razie nie wiem jak podejść.

Link do komentarza
Share on other sites

Witam.

coś jednak robię nie tak, z funkcją millis udało się tylko zrobić coś takiego, że po wprowadzeniu czasu 1 sekundy wyszło mi że ta jedna sekunda została dołożona do krańcówki czyli po wciśnięciu krańcówki przez 1 s przełączało mi styczniki, a to jest niestety nie wskazane w układzie bo taka czynność zniszczy mi krańcówki. Nie mam bladego pojęcia co i gdzie wstawić w kodzie aby otrzymać zamierzony efekt, czyli po wciśnięciu krańcówki rozłącza stycznik czeka 1 sekundę i załącza drugi stycznik. Z tą biblioteką Timer nic nie uzyskałem. Z kursu o millis praktycznie znam go na pamieć przerobiłem wszystko i dalej nie do końca to rozumiem. Czy ktoś może podrzucić coś naprowadzającego abym załapał o co chodzi?

Link do komentarza
Share on other sites

W końcu udało mi się uzyskać zamierzony efekt z funkcją delay.

Dołączyłem także LCD, wyświetla mi w pierwszej linijce strzałki w lewo lub prawo zależnie od stycznika który aktualnie jest załączony oraz napis "tryb automat"w drugiej linijce.

Liczyłem na pomoc forumowiczów, jednak widać że nowicjusze są traktowani po macoszemu.

Choć "ślęczenie" po kilka godzin przy "zabawie" z kodem przynosi efekt w postaci nauki na zasadzie prób i błędów. Pozdrawiam

Link do komentarza
Share on other sites

Choć "ślęczenie" po kilka godzin przy "zabawie" z kodem przynosi efekt w postaci nauki na zasadzie prób i błędów.

To chyba lepsze rozwiązanie od takiego podanego na tacy? 🙂

Gratki, że udało Ci się rozwiązać problem we własnym zakresie.

Link do komentarza
Share on other sites

A pewnie, zawsze wychodzę z tego założenia za najlepszą nauka to samemu rozgryżć temat, ale czasem mała pomoc by się orzydala i nie nie mówię tu o gotowcu bo to niczemu nie służy. Zostało mi jeszcze rozpracowanie przycisków startstop,prawo i lewo.Jak narazie nie wiem jakiej funkcji użyć : ani if ani while mi nie wychodzi, kurs forbota przerobiłem, ale coś jeszcze mam nie tak.Bede dalej walczył.

Są fora gdzie zapytanie kończy się "zjechaniem" pytającego, odp typu nie wiesz to się nie zabieraj. Pozdro

Link do komentarza
Share on other sites

Zostało mi jeszcze rozpracowanie przycisków startstop,prawo i lewo.Jak narazie nie wiem jakiej funkcji użyć : ani if ani while mi nie wychodzi

A co Ci nie wychodzi? Wydaje mi się, że czasem problem z pomocą wynika z tego, że nie dokońca rozumiemy zamysł autora projektu (generalnie, w internetach). Ja np. nie wiem co to krańcówka i przekaźnik (tak! nie wiem, ale się wypowiem), bo nigdy te elementy nie były mi do niczego potrzebne. Ale wiem co to przycisk i dioda. 🙂

Dasz radę opisać swój problem na takich elementach? (w sensie problemu z logiką programu)?

np.: są 3 diody.

startStop (zakładam, że to jeden przycisk): włącza diodę 2. (jeśli wyłączona).

lewo: zapala diodę 1. (przytrzymanie, wcisniecie?), gdy dioda 2. włączona.

prawo: zapala diodę 3. (przytrzymanie, wcisniecie?), gdy dioda 2. włączona.

(tak tylko sobie myślę)

Link do komentarza
Share on other sites

Gość es2
Dzieki za odzew. Jak widać dopiero ogarniam temat i długa droga przede mną.

Czyli nawiasy {} mają wpływ a raczej ich położenie na wykonanie kodu, jeszcze nie bardzo rozumiem na jakiej zasadzie one działają,czy jestem na dobrej drodze czy raczej dalej w czarnej dziurze? Analiza kodu i próby na samym kodzie i test na "żywca" z Arduino i podzespołami naprowadzi mnie gdzie mam błąd, jeszcze raz dzieki

Poczytaj załączniki

_C.pdf

_C Programowanie w jezyku C.pdf

_C prof_mikolajczak_c.pdf

Link do komentarza
Share on other sites

Dzięki za zainteresowanie.

Temat wygląda tak:

Arduino UNO 3 (docelowo PRO MINI) klon ma sterować modułem 2 przekaźników, do tego 3 przyciski start-stop, prawo oraz lewo,2 wyłączniki krańcowe + wyświetlacz LCD 16x2 z I2C. Przyciskiem start-stop włączam przekaźnik nr1 który załącza stycznik silnika motoreduktora i korpus maszyny przesuwa się w lewo, na wyświetlaczu mam napis PRACA AUTOMAT i strzałki w lewo, po dojechaniu korpusu maszyny do krańcówki nr1 korpus maszyny zatrzymuje się czeka 1 sekundę i załącza się przekaźnik nr 2 i korpus maszyny przesuwa się w prawo, na wyświetlaczu strzałki w prawo i PRACA AUTOMAT. po dojechaniu do krańcówki nr 2 korpus zatrzymuje się czeka 1 sekundę i cykl się powtarza. Przycisk startstop daje możliwość zatrzymania całości w każdej chwili,na wyświetlaczu napis stop. Gdy układ jest w trybie stop przyciskami prawo /lewo możliwe załączenie przesuwu korpusu w prawo /lewo zależnie od tego który przycisk naciśnięty, i tu trzeba trzymać wciśnięty przycisk, puszczenie go zatrzymuje przesuw. Wyśietlacz pokazuje strzałki prawo lub lewo oraz tryb ręczny.

Co do opisania na przykładzie diod, raczej nie da się przenieść krańcówki na przykład diody.

Krańcówka to taki przycisk z trzema stykami, z tym że normalny przycisk ma generalnie 2 styki (COM,NO) po naciśnięciu NO robi się NC, krańcówka zaś ma styki COM,NO,NC i tu zależy jak są podłączone i np pod COM i NO ( nie przewodzi prądu) naciśnięcie krańcówki przełącza w tryb NC( przewodzi prąd) jeśli podłączymy COM i NC ( przewodzi prąd) po naciśnięciu przęłącza w tryb NO ( nie przewodzi prądu.) krańcówki są zazwyczaj monostabilne

i do zadziałania trzeba uzyć jakiejś siły gdy żadna siła nie działa wracają do swojej pozycji.

Styczniki zaś służą zazwyczaj do sterownia jakimś dużym odbiornikiem np silnikiem elektrycznym, niewielkim prądem.np do zadziałania stycznika wystarczy Arduino i 5V, i można załączyć jakiś obwód o dużo wyższym napięciu np 230V

Link do komentarza
Share on other sites

Gość es2

Zrób coś w tym stylu (w pętli głównej):

enum{ST_STOP, ST_LEWO, ST_WAIT_L, ST_PRAWO};
char stan=ST_STOP;


switch ( stan )
 {
   case STOP:
     printlcd("stop");
     if ( przycisk ) {
       stan = ST_LEWO;
       printlcd("PRACA AUTOMAT<");
       pk_lewo = on;
     }
     break;
   case ST_LEWO:
     if ( krancowka_L ) {
       stan = ST_WAIT_L;
       pk_lewo = pk_prawo = off;
       tim = 1000;
     }
     break;
   case ST_WAIT_L:
     if ( !tim ) {
       stan = ST_PRAWO;
       printlcd("PRACA AUTOMAT>");
       pk_prawo = on;
     }
     break;
   case ST_PRAWO:
     if ( krancowka_P ) {
       stan = ST_WAIT_R;
       pk_lewo = pk_prawo = off;
       tim = 1000;
     }
     break;
   case ST_WAIT_R:
     if ( !tim ) {
       stan = ST_LEWO;
       printlcd("PRACA AUTOMAT<");
       pk_lewo = on;
     }
     break;
   default: cos nie tak, wywołaj stan wyjątkowy
 }

 if( stan != ST_STOP && przycisk )
   {
       stan = ST_STOP;
       pk_lewo = pk_prawo = off;
   }
}

Musisz dodać zmianę tim w przerwaniu 1ms

uint16_t volatile tim; // <- deklaracja zmiennej globalnej więc nie w funkcji przerwania

if( tim ) tim--;

zakładam, że przycisk przyjmuje stan przycisku po wyeliminowaniu drżenia.

Zmienną tim możesz porównywać z zerem (!tim to samo co tim==0) bez ATOMIC_BLOCK, z innymi wartościami juz nie.

Masz juz funkcjonalność:

Przycisk start_stop uruchamia proces automatycznego sterowania i go zatrzymuje.

Jak byś wklejał kod a nie obrazki, to użyłbym (w miarę możliwości) nazw zmiennych z Twojego programu.

Jak kod jest zrozumiały to bez problemu dopiszesz resztę.

PS

Program pisałem "z palca" więc mogły się wkraść błędy.

Link do komentarza
Share on other sites

Zbyszko125, moim zdaniem brakuje Ci jedynie algorytmu (akurat to najważniejsze 🙂 ), który zepnie to wszystko w całość. Zaryzykuję, że przekaźnik i krańcówkę, można zasymulować zmiennymi logicznymi i model można wykonać na... diodach.

Ponieważ codziennie staram się pomajstrować trochę przy arduino (różne przypadkowe pierdy), chętnie zajmę się czymś "konretnym".

[ Dodano: 16-04-2018, 21:29 ]

W ramach swoich ćwiczeń spróbowałem zrealizować opisane powyżej zadanie, przy użyciu diod. Poniżej przedstawiam kod. Ok. Jest troszkę chamski, ale realizuje w miarę dokładnie przedstawiony problem (oczywiście nie do końca i jest duże pole do polepszenia - wyłączniki krańcowe działają tylko w automacie).

Wyświetlacz LCD na I2C, 5 przycisków (startStop, lewo, prawo, kr1, kr2). Moim przekaźnikiem są zmienne logiczne lewo, prawo (mogła to być jedna). Włączenie przekaźników mogłem zasymulować oddzielnymi diodami, ale jak to w projektach arduino bywa - skończyły się piny. (jeden z grzechów amatorów arduino, ale dziś na topie jest wątek o opóźnieniach ^^). By ośmieszyć się jeszcze bardziej - prezentację dałem na YT (bo nie oczekuję, że autor tego posta złoży całość do kupy, by przetestować).

Do tematu podszedłem (miej więcej tak):

- Sprawdzam czy program pracuje w automacie (jeśli tak, diody lecą od lewej do prawej i po powrocie do automatu też lecą w lewo); [zmienna logiczna tryb, gdy false program jest w AUTOMACIE]

-w miedzyczasie sprawdzam, czy jedna z krańcówek jest wciśnięta, jeżeli tak odpowiednio zmienia kierunek;

(brak tu obslugi bledów, co w przypadku, gdy diody lecą w lewo a włącza się prawa krańcówka, albo wcisnięte są obie - powinno zatrzymać urządzenie)

- sprawdzam, czy wcisniety jest przycisk startSTOP i zmieniam tryb pracy na przeciwny

- jeżeli urządzenie jest w trybie ręcznym, to gdy wciśnięty jest przycisk lewo, aż do pozycji 12 (12. dioda) i analogicznie w prawo do pozycji 1. [tu nie ma sprawdzania krańcówek - takie uproszczenie]

Zbyszko125, u Ciebie funkcja loop będzie bardziej elegancka, bo ja musiałem podpierać się diodami. Może bardziej doświadczenie koledzy pomogą, bo pewnie wstyd taki kod wypuszczać na widok publiczny, ale na razie zajęci są czymś innym (ostra dyskusja o delayach w sąsiednim wątku).

po namyśle 12 diod to przesada, wystarczyłyby 2 na reprezentację przekaźników (ech...oczekiwania kontra rzeczywistość)

#define kr1 0
#define kr2 13
#define przyciskL A0
#define startStop A1
#define przyciskP A2

#include <Wire.h>  
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

unsigned long previousMillis = 0;
const long interval = 1000;
int pozycja = 5;      // pozycja początkowa - coś trzeba wpisać 1 i 12 odpada 
                     //ze względu na wyłączniki krańcowe
boolean lewo = true;  //w automacie korpus rusza w lewo (przy starcie)
boolean prawo = false;
boolean tryb = true; //false {tryb AUTOMAT}; true {tryb RECZNY}


void setup() {
 lcd.begin(16,2);
 if (tryb == true) {
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("[ RECZNY]");
 } else {
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("[AUTOMAT]");
 }

 for(int i = 1; i < 13; i++) {   //szybka konfiguracja pinów podłączonych
   pinMode(i, OUTPUT);           //do "modelu" - 12 diod anody podłączone
 }                               //do 5V - włączenie diody odbywa się
 for(int i = 1; i < 13; i++) {   //przez ustawienie stanu LOW
   digitalWrite(i, HIGH);        //na odpowiednim pinie
 }


 pinMode(kr1, INPUT); // przyciski podłączone przez zewnętrzny rezystor
 pinMode(kr2, INPUT); // podciągający do 5V, gdy wciśnięte - stan NISKI
 pinMode(przyciskL, INPUT);
 pinMode(startStop, INPUT);
 pinMode(przyciskP, INPUT); 
}

void wylacznikKrancowyP() {
 if (digitalRead(kr1) == LOW) {
   delay(100); //debounce
   if (digitalRead(kr1) == LOW) {
     delay(2000);
     lewo = true;
     prawo = false;
   }
 }
}
void wylacznikKrancowyL() {
 if (digitalRead(kr2) == LOW) {
   delay(100); //debounce
   if (digitalRead(kr2) == LOW) {
     delay(2000);
     lewo = false;
     prawo = true;
   }
 }
}

void loop() {
 //sprawdzenie, czy StartStop wciśnięty, jeżeli TAK wyjdz z aktualnego trybu
 if(digitalRead(startStop) == LOW) {
   delay(100);
   if(digitalRead(startStop) == LOW) {
    if (tryb == true) {
     tryb = false; //{AUTOMAT}
     lewo = true;  //w automacie startujemy w LEWO
     prawo = false;
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("[AUTOMAT]");
     if  (lewo == true) {
       lcd.setCursor(0, 1);
       lcd.print("[LEWO     ]");
     } else {
       lcd.setCursor(0, 1); //to się nie wykona, ale niech będzie
       lcd.print("[    PRAWO]");
     }
    } else {
     tryb = true; //przełączenie na tryb {RĘCZNY}
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("[ RECZNY]");
     lcd.setCursor(0, 1);
     lcd.print("[         ]"); 
    }
 }
   delay(1000);
 }

 wylacznikKrancowyP(); //sprawdzenie, czy prawy wylacznik krancowy wcisniety
 wylacznikKrancowyL(); //sprawdzenie, czy lewy wylacznik krancowy wcisniety

 if (tryb == false) {  //jeżeli w trybie AUTOMATYCZNYM działaj na tym modelu
 //model na diodach - żeby coś się ruszało ;-)
 unsigned long currentMillis = millis();
 digitalWrite(pozycja, LOW);
 if (currentMillis - previousMillis >= interval) {
   previousMillis = currentMillis;
   digitalWrite(pozycja, HIGH);
   if (pozycja < 12 && lewo == true) {
     pozycja = pozycja + 1;
   } else if (pozycja > 1 && prawo == true) {
     pozycja = pozycja - 1;
   } else if (pozycja == 12) {
     lewo = false;
     prawo = true;
     pozycja = pozycja - 1;
   } else if (pozycja == 1) {
     lewo = true; 
     prawo = false;
     pozycja = pozycja + 1;
   }
  }
     if  (lewo == true) {
       lcd.setCursor(0, 1);
       lcd.print("[LEWO     ]");
     } else {
       lcd.setCursor(0, 1); //to się nie wykona, ale niech będzie
       lcd.print("[    PRAWO]");
 }
 }  else { //jeżeli tryb ręczny wskakujemy tutaj
   digitalWrite(pozycja, LOW);
   unsigned long currentMillis = millis(); 
   if (digitalRead(przyciskL) == LOW) {
     if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
       digitalWrite(pozycja, HIGH);
       if (pozycja < 12) {       //tu powinno być sprawdzenie czy wylacznik 
         pozycja = pozycja + 1;  //krancowy wcisniety, wylacz przekaznik 1
         lcd.clear();
         lcd.setCursor(0, 0);
         lcd.print("[ RECZNY]");
         lcd.setCursor(0, 1);
         lcd.print("[LEWO     ]"); 
       } else { 
         lcd.clear();
         lcd.setCursor(0, 0);
         lcd.print("[ RECZNY]");
         lcd.setCursor(0, 1);
         lcd.print("[         ]"); 

         }                
       }
   }
   if (digitalRead(przyciskP) == LOW) {
     if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
       digitalWrite(pozycja, HIGH);
       if (pozycja > 1) {       //tu powinno być sprawdzenie czy wylacznik 
         pozycja = pozycja - 1; //krancowy wcisniety, wylacz przekaznik 1
         lcd.clear();
         lcd.setCursor(0, 0);
         lcd.print("[ RECZNY]");
         lcd.setCursor(0, 1);
         lcd.print("[    PRAWO]");
       } else { 
         lcd.clear();
         lcd.setCursor(0, 0);
         lcd.print("[ RECZNY]");
         lcd.setCursor(0, 1);
         lcd.print("[         ]"); 
         }                
       }
   }
 }
 }
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.