Skocz do zawartości

Czas Arduino start silnika


betepok

Pomocna odpowiedź

Witam

Staram się rozwiązać temat czasu, przerwania w wykonywaniu kodu.

Program ma wykryć stan LOW i dopiero jeśli stan LOW utrzyma się np dwie sekundy wykonuje kod "START silnika" Jeśli w czasie dwóch sekund stan zmieni na HIGH nic się nie dziej.

W tym momencie program startuje natychmiast i przy stanie HIGH zatrzymuje silnik po pięciu sekundach.

jak ugryźć temat ruszania po określonym czasie?

//Silnik A

 int detect = digitalRead(12); // wykrywa stan HIGH/LOW 
      if(detect == LOW){
             CzasStartuSilnika_A = aktualnyCzas;

  TurnOnMotorA(); //START silnika 

 }

//zatrzymanie po 5 sek. do wykrycia stanu HIGH
if (detect == HIGH && aktualnyCzas - CzasStartuSilnika_A >= 5000UL){ 


  TurnOffMotorA(); //STOP silnika
}
Link do komentarza
Share on other sites

Gość es2

Czas 2 sekund jest długi więc nie trzeba angażować (bezpośrednio) przerwań. W pętli głównej sprawdzaj stan wejścia, jeśli nieaktywny zapamiętaj w zmiennej static czas odczytany z millis(). Jeśli aktywny i millis >= zapamietany_czas+2000 to oznacza, że wejście było aktywne ponad 2 sekundy.

Link do komentarza
Share on other sites

Jak to często bywa musisz zacząć od dobrego planu (zamiast pisania koślawego kodu na czuja). Opisz więc jasno, koniecznie w punktach co program ma robić. Jedno po drugim, od warunków początkowych, poprzez zachowania w trakcie pracy aż do końca. Nie jest to przepis dla mnie - choć mi też pomoże zrozumieć co chcesz z robić - tylko dla Ciebie, byś nauczył się pochodzić systematycznie do takich problemów. Nawet jeśli ten uda Ci się rozwiązać metodą prób i błędów, to nie będzie dobra nauczka na przyszłość. Tak więc prosimy o plan/przepis/algorytm wyrażony w prostych żołnierskich słowach ułożonych w punkty. Samych metod programistycznych rozwiązania Twojego zadania jest pewnie kilka z tych najbardziej oczywistych i wiele innych - może trochę bardziej zagmatwanych, ale bardziej ogólnych. Zobaczmy wspólnie co da się zrobić.

Link do komentarza
Share on other sites

Podajnik kulek

Silnik obraca podajnikiem, który podaje kulki do rurki wyposażonej w czujnik IR. Kulki układają się jedna za drugą jeśli kulka przerwie wiązkę IR silnik po 5 sekundach zatrzymuje się.

Pięć sekund jest ustawione celowo aby po uruchomieniu zawsze podał trochę więcej kulek. Dzięki temu silnik nie podaje co chwilę po jednej kulce.

Problem występuje kiedy kulki się przesuwają w rurce. Przez chwilę wiązka IR zmienia stan na LOW silnik działa kolejne pięć sekund co wypełnia rurkę na kulki.

Nie było by problemu gdyby zamiast kulek dać WAŁECZKI! 🙂

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

Ok, to już rozumiemy, ale to jeszcze nie jest algorytm pracy a bez tego nie napiszesz programu. Na razie dostaliśmy Twoje oczekiwania i chęci. Miały być punkty po których ktoś, kto nie musi znać problemu od strony kulek i rurek wykona swoją pracę dobrze. Jak rozumiem masz do dyspozycji:

Wejścia:

1. Czujnik optyczny coś tam wykrywający, dający stany 0 i 1.

Wyjścia:

1. Driver silnika sterowany dwustanowo on/off.

Plus pomiar czasu.

No to teraz ponawiam prośbę tylko wyraźniej: napisz w numerowanych punktach co ma robić procesor (możesz myśleć o nim jak o bezmyślnym pracowniku w fabryce) "patrzący" na wejście z czujnika i obsługujący "wajhę" sterowania silnikiem. Napisz po prostu instrukcję. Masz do dyspozycji tylko jeden sygnał wejściowy i sporo niezależnych timerów - takich jak do gotowania jajek, które możesz dowolnie nakręcać i słuchać ich dzwonienia po dojściu do zera. Jeśli sposobu pracy tego urządzenia nie umiesz opisać słowami w języku naturalnym, to jak chcesz to zrobić przy pomocy języka programowania, który znasz pewnie słabiej niż polski?

Link do komentarza
Share on other sites

1 Włączam urządzenie

2 Czujnik nie widzi kulek

3 Silnik start

4 Silnik pracuje do czasu zakrycia czujnika plus 5 sekund

5 Silnik stop

6 Czujnik nie widzi kulek

7 Odlicza czas 2 sekundy

8 Jeżeli czujnik nie widzi kulek

9 Silnik start

10 Jeżeli czujunik widzi kulki

11 Silnik Stop

Link do komentarza
Share on other sites

No teraz wyobraź sobie, że jesteś tym pracownikiem dla którego to napisałeś. W pierwszym dniu pracy przychodzisz (punkt 1), czytasz i starasz się sumiennie postępować wg instrukcji. A tu masz w drugim punkcie:

2. Czujnik nie widzi kulek

A co jeśli widzi? Stajesz w kropce i wołasz managera? Nie możesz wstawiać zdań oznajmujących jeśli chodzi o wejścia. W przypadku sygnałów które odczytujesz, możesz co najwyżej na ich podstawie podejmować decyzje, np:

2. Jeśli czujnik nie widzi kulek, przejdź do pkt. xx

albo:

3. Czekaj dopóki czujnik zobaczy kulkę. itp.

Możesz założyć, że pracownik posługuje się regułą w której jeśli warunek nie jest spełniony, przechodzi do realizacji następnego punktu.

Podobnie w pkt. 8:

8 Jeżeli czujnik nie widzi kulek

To co? Mamy czekać, przejść do następnego punktu czy wyjść zajarać?

No i co zrobić gdy dojdziemy jakimś sposobem do ostatniego punktu? Fajrant? Idziemy do domu? Procesor się wyłącza?

Może Ty wiesz coś więcej na temat tego urządzenia, ale my (ani pracownik) nie, więc skup się i zawrzyj całą swoją wiedzę w tych punktach tak by żadne dodatkowe tłumaczenia nie były potrzebne.

Do roboty, czekamy na podejście nr. 2. Szkółka pisania algorytmów wystartowała.

Link do komentarza
Share on other sites

Widzę to tak.

1) Włączam urządzenie

2)Odczytanie stanu czujnika. Stan czujnika widzi/nie widzi

a)Jeśłi czujnik nie widzi kulek. Odmierza czas 2 sekundy, Silnik START (Silnik pracuje do czasu kiedy czujnik zobaczy kulki plus 5 sekund)

b)Jełśi czujnik widzi kulki, Silnik STOP

3)Czujnik nie widzi kulek. Odmierza czas 2 sekundy, Silnik START

4)Czujnik widzi kulki. Odmierza czas 5 sekund, Silnik STOP

5)Czujnik nie widzi kulek. Odmierza czas 2 sekundy, Silnik START

6)Czujnik widzi kulki. Odmierza czas 5 sekund, Silnik STOP

Link do komentarza
Share on other sites

Nadaj nie jest dobrze, choć zmierzasz w dobrym kierunku.

Pracownik wykonuje jeden punkt w jednej chwili i nie możesz umieszczać kilku czynności w jednym miejscu, no bo co to oznacza:

"a) Jeśłi czujnik nie widzi kulek. Odmierza czas 2 sekundy, Silnik START (Silnik pracuje do czasu kiedy czujnik zobaczy kulki plus 5 sekund)"

Czy mam odmierzyć czas i dopiero po tym czasie silnik START, czy zaczynam odmierzać czas i jednocześnie silnik START? W jednym punkcie nie zawierasz sekwencji zdarzeń. Możesz robić tylko jedną czynność na raz a jeśli musisz zrobić kilka, umieszczasz je w kolejnych punktach. Nie oszczędzaj na zdaniach, to może się rozrosnąć i tego się nie obawiaj.

Dlaczego powtarzasz sekwencję dwóch punktów w 3-4 i 5-6. Co się dzieje później? Niczego nie zostawiaj domysłowi pracownika. Napisz wszystko czarno na białym. Jeśli ma coś zrobić, niech robi, jeśli w jakiejś sytuacji ma czytać instrukcję od innego punktu, też to napisz, używaj słowa "Jeżeli" bo to oznacza testowanie jakiegoś warunku. Miało nie być zdań oznajmujących na sygnałach wejściowych - to nie są tytuły akapitów, a wciąż są. Spróbuj np. tak (pamiętając, że niespełnienie warunku oznacza przejście do następnego punktu):

3) Jeżeli czujnik nie widzi kulek, idź do pkt. 8.

4) Silnik START

5) Odmierzaj czas 5 sekund

6) Silnik STOP

7) Idź do pkt.3

8) Odmierzaj czas 2 sekundy

9) Jeżeli czujnik nie widzi kulek, idź do pkt. 3

10) Silnik START

11) Odmierzaj 2 sekundy

12) Silnik STOP

13) Idź do pkt. 3

Ja nie wiem czy ten plan ma sens - popraw to jeśli niewiele zrozumiałem, ale pracownik wpuszczony w takie coś nie pójdzie Ci do domu, bo nigdzie się nie zatnie. Plan przewiduje pracę aż do śmierci, jest nieskończoną pętlą tak jak Twój procesor ma działać aż do wyłączenia zasilania.

Czy już jakoś czujesz, że dopiero tak szczegółowy i pozbawiony martwych uliczek plan przekłada się na program pracy procesora? No to czekamy na Plan 3.0 🙂

Link do komentarza
Share on other sites

Gość es2
1)Start

2)Czujnik 0 idź do 4

3)Czujnik 1 idź do 9

4)Odmierzanie czasu 2 sekundy

5)Silnik START

6)Rurka pełna - Czujnik 1

7)Odmierzanie czasu 5 sekundy

8)Silnik STOP

9)Idź do 1

Lubisz ganiać pracownika:

3)Czujnik 1 idź do 9

9)Idź do 1

Dlaczego nie?:

3)Czujnik 1 idź do 1

Nie chcesz rysować co byłoby czytelniejsze, lubisz pisać, ok. Pisz więc zrozumiale:

1) Strat programu

2) Jeśli stan czujnika=1 skocz do pkt. 2

3) Czekaj 2 sekundy

4) Silnik START

...dalej uzupełnij sam.

UWAGI!

Daj swój algorytm innej osobie czy bedzie dla niej zrozumiały, gwarantuje, ze nie.

Używaj aktywny/nieaktywny zamiast 0 i 1 bo trzeba się domyślać czy 1 to aktywny czy nie.

Nie pisz Czujnik 1, bo nie wiadomo czy chodzi o aktywny czujnik nr 1 czy coś innego.

Gdyś narysował swoje "wypociny":

To widziałbyś, że program według algorytmu nie zadziała tak jak chcesz, tylko tak jak mu każesz. Dwie sekundy od wykrycia elementu przez czujnik włączy sie silnik. Chyba, nie o to chodziło, prawda?

Link do komentarza
Share on other sites

1)Start programu

2)Odczytanie stanu czujnika aktywny/nieaktywny

a)Czujnik aktywny idź do pkt. 3

b)Czujnik nieaktywny idź do pkt. 1

3)Odmierzanie czasu 2 sekundy

4)Silnik START

5)Rurka pełna - Czujnik nieaktywny

6)Odmierzanie czasu 5 sekundy

7)Silnik STOP Idź do pkt.1

Link do komentarza
Share on other sites

Nie wiem jak się czujesz mając na karku już dwóch krytyków, ale jeżeli to jest cały algorytm to naprawdę jest nieźle. Mam jeszcze tylko jedną uwagę: znów wstawiłeś zdanie oznajmujące o czujniku:

"6)Rurka pełna - Czujnik 1"

Co to znaczy? Ja nie rozumiem i pewnie większość czytających także. Co ma zrobić pracownik napotykający to zdanie? Jeszcze raz: możesz mu wydawać albo proste rozkazy (włącz silnik) albo kazać sprawdzać warunki (jeżeli czujnik 0 idź do ..). Nie możesz mu pisać, że "czujnik 1", bo to nie od niego zależy. Zawsze jeśli chcesz sprawdzić jakiś warunek, używasz słowa "Jeżeli". Jeżeli 😉 chcesz np. poczekać na sygnał w stanie 1, piszesz:

6. Jeżeli czujnik 0, idź do 6.

Taka konstrukcja kręci się w kółko aż sygnał z czujnika zrobi się wysoki - wtedy pójdzie dalej, oczywiście do następnego punktu. Pracownik czyta to zdanie: "Jeżeli czujnik 0", rzuca okiem na wejście czujnikowe, widzi że jest tam stan niski i bezmyślnie wykonuje polecenie "idź do 6". Znowu czyta punkt 6 i tak w kółko. Procesory to tacy pracownicy, którzy się nie zużywają od powtarzania miliony razy tego samego ani nie irytują od takich - wydawałoby się idiotycznych - instrukcji.

Spróbuj to jeszcze raz przepisać, jest naprawdę nieźle, widać postęp. Już trochę się bałem, że odpuściłeś. Takie ćwiczenia zmuszają do wielokrotnego przechodzenia algorytmu w myślach i sprawdzania wszystkich dróg - a to jest właśnie wstępny etap testowania. Jeśli tu coś jest źle, program lepszy nie będzie więc musimy (a Ty przede wszystkim) mieć pewność, że podany przepis robi dokładnie to co miał robić. I dlatego ważne jest, by zapisać go możliwie jak najbardziej formalnie bez żadnych niepotrzebnych opisów (rurka pełna) i szans na błędne interpretacje. Każdy kto pisze program robi takie rzeczy z definicji. Przy dużej wprawie będziesz mógł bezpośrednio przekładać pomysł z głowy na linie języka programowania, ale to sprawdza się tylko w prostych przypadkach. Nawet najlepsi tworzą takie algorytmy, no może o niebo bardziej skomplikowane. Do jednych bardziej przemawia rysowanie (to też pewien formalny język, coś jak schematy elektroniczne lub warsztatowy rysunek techniczny), do innych teksty pisane.

W każdym razie czekamy na kolejną wersję.

EDIT: Trochę nie zdążyłem, ale moje uwagi są niestety wciąż aktulane. Nie ma podpunktów. Samo zdanie (przykładowo):

3. Jeżeli czujnik jest w stanie 0 idź do pkt. 7

jest przecież odczytaniem stanu. To proste rozgałęzienie: albo idziesz do pkt. 7 albo wykonujesz następny czyli 4. Nie musisz sprawdzać warunku przeciwnego. Jeżeli ten jest spełniony to drugi na pewno nie. Jeszcze raz, tylko skup się i przemyśl układ zdań, to nie wyścig na czas. Opublikuj wersję z której będziesz zadowolony i która spełnia opisane wyżej wymagania. Przecież to chyba nic wielkiego, dawaj.

Link do komentarza
Share on other sites

Gość es2

...

a)Czujnik aktywny idź do pkt. 3

...

3)Odmierzanie czasu 2 sekundy

4)Silnik START

...

Na pewno tak ma być? Po uaktywnieniu czujnika opóźnienie dwie sekundy przed uruchomieniem silnika? Co to daje?

Wcześniej pisałeś:

Program ma wykryć stan LOW i dopiero jeśli stan LOW utrzyma się np dwie sekundy wykonuje kod "START silnika"

Wydaje mi się, że nie czytasz tego co piszesz w algorytmie.

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.