Skocz do zawartości

Samoczynne wyzwolenie programu


Michal94

Pomocna odpowiedź

Witam,

Mam problem z mikrokontrolerem arduino uno. Mam napisany program który podczas włączonego przełącznika ma wykonywać program, po wyłączeniu przełącznika cały układ ma stać. Do mikrokontrolera podłączony jest sterownik od silnika krokowego oraz przekaźnik wysyłający sygnał do elektrozaworu. Program polega na tym że silnik ma wykonać 1/10 obrotu zatrzymać a następnie wysłać sygnał do elektrozaworu w celu wywołania reakcji siłowników pneumatycznych. Niestety zdarzają się momenty kiedy przycisk jest wyłączony a cały układ zaczyna wykonywać ruch. Zamieniłem obecnie przycisk na czujnik podczerwieni, podczas przerwania wiązki program ma ruszyć, kiedy wiązka jest nie przerwana to ma stać, niestety problem nadal występuję. Wszystkie elementy znajdują się w skrzynce z tworzywa umieszczone na metalowej płycie podłączonej do masy. Czy ktoś mógłby mi powiedzieć skąd mogą brać się zakłócenia wywołujące program z mikrokontrolera bądź czy ktoś mógłby doradzić jak to zniwelować.

#include <AccelStepper.h>

AccelStepper stepper(1, 10, 11);
#define PRZYCISK 7            
#define CZUJNIK 5
#define PRZEKAZNIK 4


void setup()
{      
   Serial.begin(9600);
   stepper.setMaxSpeed(8000);
   stepper.setAcceleration(4000);
   pinMode(PRZYCISK, INPUT_PULLUP);
   pinMode(LED_BUILTIN, OUTPUT);
   pinMode(CZUJNIK, INPUT_PULLUP);
   pinMode(PRZEKAZNIK, OUTPUT);
}

void loop()
{  
    //if (digitalRead (PRZYCISK) == LOW) {
    if (digitalRead (CZUJNIK)== LOW) {
    delay(200);
    stepper.move(-1280);
    stepper.runToPosition();
    delay(200);
    digitalWrite(PRZEKAZNIK, HIGH);
    delay(300);                    
    digitalWrite(PRZEKAZNIK, LOW);
    delay(200);
    }
}

"Kod co prawda nie jest arcydziełem ale powinien działać. Daj 100nF między pinem CZUJNIK i masą, jeśli nie pomoże to pomyślimy dalej ale już publicznie." - ethanak

Czy zna Pan jeszcze jakieś inne rozwiązanie takiego problemu jeśli dodanie kondensatora nie pomoże ?

Z góry wielkie dzięki

Link do komentarza
Share on other sites

@Michal94, kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu programy są odpowiednio formatowane i kolorowane, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Poprawiłem za Ciebie, ale pamiętaj o tym w przyszłości - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum 🚀

Link do komentarza
Share on other sites

Zanim zrobisz program użytkowy zapoznaj się z kursem Arduino na tym forum, ba nawet naucz się wszystkiego co tam jest. Zapoznaj się z millis(), jest mnóstwo przykładów jak je wykorzystać tak by nie korzystać z delay. Nieważne czy używasz czujnika czy przycisku powinieneś wiedzieć dokładnie, ile trwa takie "pewne" wciśnięcie, jaki generuje impulse, ile on trwa.To samo dla takiego "przycisku" optycznego. Najlepiej to zmierzyć oscyloskopem, można też metodą prób i błędów. Załóżmy że impulse niski powinien trwać co najmniej 20ms. Powinieneś sprawdzać w pętli nie zatrzymywanej przez żaden delay, co np. 1ms czy przez kolejnych 20 pomiarów jest to stan niski, wtedy masz większe szanse, że nie zmierzyłeś przypadkowego zakłócenia. Po każdym pomiarze "0" możesz zwiększać zmienną, a gdy masz "1" zerować. Gdy zmienna przekroczy 20 to znaczy, że masz swój impuls - wykonaj działanie. Trzeba też sprawdzać, czy to jest "nowe wciśnięcie". Są do tego też gotowe biblioteki, np. debounce2.

 

Link do komentarza
Share on other sites

Układ do którego napisany jest ten program ma działać tak: Do silnika przyłączony jest wał na którym znajduje się bęben przypominający magazynek rewolwerowy, kiedy do bębna wpadnie element i przetnie wiązkę czujnika bęben ma wykonać 1/10 obrotu i się zatrzymać. Następnie przez przekaźnik idzie sygnał do elektrozaworu który powoduje ruch siłowników pneumatycznych ( elektrozawór sam powoduje powrót siłowników do pozycji wyjściowej). Takie jest główne założenie urządzenia. Podczas kiedy mamy elementy w bębnie nie występują żadne błędy. Czasami sam układ zaczyna wykonywać pętle tylko jeden raz. Czy da się zniwelować to dodając do układy np. coś takiego jak dławik przeciwzakłóceniowy ?

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

Może zacznij od ustalenia kiedy te błędy się pojawiają. Jeśli tego nie wiesz, to jak będziesz mógł przetestować zmiany i ustalić, że problem został rozwiązany? A nie np. zakłócenia ustały przypadkowo na godzinę.

Jeśli będziesz wiedział od czego pojawianie się błędów zależy, powinno być łatwiej doradzić rozwiązanie. To co przychodzi do głowy "na szybko" to:

1) problemy z zasilaniem

2) brak rezystorów podciągających

3) brak filtracji sygnałów od czujnika

4) EMC

Punkty 2 i 3 mają wiele wspólnego - dodanie rezystora oraz kondensatora to filtr RC, ale można dodatkowo jeszcze pomyśleć o zmianie programu. Z drugiej strony takie strzelanie "na ślepo" jest bez sensu. Więc ustal kiedy pojawia sie problem, albo najlepiej jak go wywołać i wtedy będziesz mógł szukać dalej. Przy okazji poszukaj odpowiedniego sprzętu, wspomniany oscyloskop to na pewno niezbędne narzędzie.

Link do komentarza
Share on other sites

Problem występuje losowo, czasami całość ruszy sama z siebie, czasami wystarczy dotknąć jakiegoś elementu by go wywołać (np, bębna, przewodu, ramy urządzenia), czasami występuje kilka przejść pętli a nie kiedy wywołuje się tylko raz. Są też momenty gdzie błąd się w ogóle nie pojawia więc nie mam za bardzo jak sprawdzić co może go wywoływać, więc na razie strzelam na ślepo próbując wyeliminować poszczególne elementy który mogły by być temu winne.

Link do komentarza
Share on other sites

To jest bardzo złe podejście, bo możesz po prostu zmniejszyć częstotliwość występowania błędu i wcale nie wyeliminować jego przyczyny. Skoro występuje przy dotykaniu to może spróbuj pójść tym tropem? Czego dotykanie powoduje ten błąd? Które elementy są bardziej "wrażliwe"?

Link do komentarza
Share on other sites

Losowych elementów maszyny którą arduino ma sterować. Tylko tak jak wcześniej pisałem, problem nie pojawia się zawsze przy kontakcie z jakimiś elementami. Obecnie mogę mieć za dużo czynników które mogą powodować ten problem. Ciężko mi będzie znaleźć akurat ten jeden (może więcej czynników powoduje ten problem), który wywołuje wykonanie pętli.

Link do komentarza
Share on other sites

No skoro nie chce Ci się szukać jak wywołać błąd, to nie wymagaj żeby ktoś telepatycznie znalazł rozwiązanie. Sam program jest poprawny, chociaż podatny na zakłócenia. Ale nie wiedząc jak one wyglądają ciężko jest cokolwiek pomóc.

Jak znajdziesz oscyloskop albo chociaż analizator logiczny to będziesz mógł ustalić jak długo trwa impuls z czujnika. Wtedy prosta filtracja to dwukrotne sprawdzenie wyzwalania, czyli zamiast:

    if (digitalRead (CZUJNIK)== LOW) {
      ...

coś takiego:

    if (digitalRead (CZUJNIK)== LOW) {
      delay( <szerokość_fałszywych_impulsów> );
      if (digitalRead (CZUJNIK)== LOW) {
        ...

Oczywiście można to dużo lepiej napisać, chociażby z milis. Ale skoro i tak nie wiemy co jest przyczyną błędu, szkoda czasu na pisanie ładniejszego kodu.

Edytowano przez Elvis
  • Lubię! 1
Link do komentarza
Share on other sites

Ale jak mam sprawdzić kiedy występują błąd skoro występuje w losowych sytuacjach. Na 9 poprawnych przejść pętli będę dotykał w przerwie bębna i nic się nie stanie a dotknę za 10 i układ się poruszy. Mogę włączyć zasilanie odejść niczego nie dotykać a układ ruszy albo nie. Czasami pojawiała się również sytuacja że pin przycisku lub czujnika został wypięty a układ i tak ruszył.

Link do komentarza
Share on other sites

Wbrew pozorom to już coś - przykładowo to że pin czujnika jest odłączony a układ rusza jest bardzo ważne. Proponowałbym na początek dodać porządne rezystory podciągające. Używanie wbudowanych jest dobre w kursach programowania, ale nie przemysłowych zastosowaniach. Kolejna sprawa to wykrywanie problemów z zasilaniem oraz resetu Arduino - dodaj na początku programu coś co łatwo zauważyć, np. 20 mignięć diodą, lub pełny obrót bębna (o ile to nic nie uszkodzi oczywiście). Wtedy będziesz mógł sprawdzić, czy program po prostu źle działa, czy cały układ się resetuje.

  • Lubię! 1
Link do komentarza
Share on other sites

@ethanak Twój post zniknął dlatego, że autor dodał później brakujący kod i dodatkowo wkleił w swojej wiadomości ręcznie cytat jakiejś Twojej wypowiedź, której nigdzie indziej tu nie było. Całość więc wprowadzała zamieszanie, głównie dlatego Twój post zniknął.

Po drugie, forma Twojej wypowiedzi też nie była chyba zbyt trafna?

1 godzinę temu, ethanak napisał:

Czyżby powodem był zakaz umieszczania w poście określenia "walet trefl"?

Nie, nie ma takiego zakazu, cytuję jednak fragment Twojej wiadomości: "as dzwońcy na ósemce to pewnie zasilanie, a dupek żołędny na czerwiennej damie to jakiś syf na kablach.". Rozumiem, że to potoczna nazwa waleta trefl, ale nie sugeruj (umieszczając w apostrofach), że dokładnie tak to napisałeś. Wystarczyło zwyczajnie dać znać autorowi, że brakuje kodu bez dodatkowych komentarzy, które wiele nie wnoszą do dyskusji.

  • Lubię! 1
Link do komentarza
Share on other sites

Zamieniłem delay na millis czy ktoś mógłby spojrzeć i napisać czy według niego kod jest poprawny ?

#include <AccelStepper.h>


AccelStepper stepper(1, 10, 11);
#define PRZYCISK 7            
#define CZUJNIK 5
#define PRZEKAZNIK 4

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasSILNIK = 0;
unsigned long zapamietanyCzasWEJSCIE = 0;
unsigned long zapamietanyCzasSILOWNIK1 = 0;
unsigned long zapamietanyCzasSILOWNIK2 = 0;


void setup()
{      
   Serial.begin(9600);
   stepper.setMaxSpeed(8000);
   stepper.setAcceleration(4000); 
   pinMode(PRZYCISK, INPUT_PULLUP);
   pinMode(LED_BUILTIN, OUTPUT); 
   pinMode(CZUJNIK, INPUT_PULLUP);
   pinMode(PRZEKAZNIK, OUTPUT); 
}

void loop(){

    if (digitalRead (CZUJNIK)== LOW) { 
      aktualnyCzas = millis();  
        if (aktualnyCzas - zapamietanyCzasWEJSCIE >=200UL){
          zapamietanyCzasWEJSCIE = aktualnyCzas;
          stepper.move(-1280);
          stepper.runToPosition();
        } 
        if (aktualnyCzas - zapamietanyCzasSILNIK >=200UL){
          zapamietanyCzasSILNIK = aktualnyCzas;
          digitalWrite(PRZEKAZNIK, HIGH);
        }
        if (aktualnyCzas - zapamietanyCzasSILOWNIK1 >= 300UL){  
          zapamietanyCzasSILOWNIK1 = aktualnyCzas;                  
          digitalWrite(PRZEKAZNIK, LOW);
        }
        if (aktualnyCzas - zapamietanyCzasSILOWNIK2 >=200UL){
        zapamietanyCzasSILOWNIK2 = aktualnyCzas;
        }
   }
}    
    

 

Link do komentarza
Share on other sites

23 godziny temu, Michal94 napisał:

Problem występuje losowo, czasami całość ruszy sama z siebie, czasami wystarczy dotknąć jakiegoś elementu by go wywołać

Szukaj pod hasłami: pętla masy, ESD, uziemienie, optoizolacja, pullup, ekranowanie.

Pokaż schemat. Napisz jak długie i jakie są przewody od czujnika. Jak są ułożone (czy w pobliżu nie ma innych przewodów).

Edytowano przez es2
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.