Sterowanie ruchomą strzelnicą - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica) +--- Wątek: Sterowanie ruchomą strzelnicą (/watek-sterowanie-ruchom%C4%85-strzelnic%C4%85) |
Sterowanie ruchomą strzelnicą - greg801 - 16-09-2020 Witajcie Od niedawna poznaję Arduino i w tym celu zakupiłem Arduino Mega. Mianowicie wpadł mi na pomysł wykonanie ruchomej strzelnicy. Zabawa dla syna na ćwiczenie szybkości reakcji, strzelanie z gumowych nabojów z Nerfa. Urządzenia: + Arduino Mega + komputer gdzie wpisuje parametry Opóźnienia STARTU w sekundach , opóźnienia i czasie trwania w milisekundach załączania kanałów, + do Arduino są podłączone przekażniki i dalej podpięte są elektrozawory sterujące siłownikami pneumatycznymi ( wyskakujące tarcze lub wyrzutnia małych przedmiotów) Zasada działania: - w komputerze wpisuje parametry w milisekundach, wgrywam kod do Arduino, -Na kabelku wciskam przycisk START. -wykonuje odliczanie (tu ustawiam zakres od 0 do 30 sekund) + miga dioda led odliczająca - do momentu odliczania Arduino wykonuje akcje na każdych kanałach, - po wykonaniu akcji Arduino zatrzymuje się. Przykład działania jak na rysunkach: Znam się na elektronice, mam dostęp do pneumatyki, ale niestety programowanie jeszcze czarna magia Wklejam kod którego zrobiłem z rożnych tutoriali, jak narazie Arduino nie reaguje na przycisk (podłączony GND + PIN 2) oraz podłączona płytka z przekaźnikami (narazie PINy 13,12,11 do testów). Nie wiem co robię źle w kodzie. Dziękuję Kod: //opoznienie i czas trwania w ms dla kanału 1 RE: Sterowanie ruchomą strzelnicą - Jarewa0606 - 16-09-2020 Pokaż schemat podłączenia przycisku... Nie rozumiem jednego na zapiskach masz czasy "ms" a np.//opóźnienie i czas trwania w ms dla kanału 1 const int opoznienie1 = 2000; =2sekundy const int czas1 = 50000; = 50sekund tak ma być?? i po trzecie najważniejsze dlaczego nie działa zmienna const int jest błędem ma być unsinged long , RE: Sterowanie ruchomą strzelnicą - greg801 - 16-09-2020 EDIT: Już poprawiłem połączenie przycisku, reaguje na wciśniecie przycisku. Jak teraz zrobić aby akcja zaczęła z opóźnieniem np 5 sekund i było odliczanie za pomocą diody LED? Aha. po wgraniu kodu Arduino ze zmienionymi parametrami czasu i opóźnień najpierw zapalają wszystkie diody i potem gasną i wtedy czekają na uruchomienie przyciskiem. Jak to zrobić żeby na początku nie zapalały diody po wgraniu kodu? //opoznienie i czas trwania w ms dla kanału 1 unsigned long opoznienie1 = 500; unsigned long czas1 = 500; //opoznienie i czas trwania w ms dla kanału 2 unsigned long opoznienie2 = 500; unsigned long czas2 = 300; //opoznienie i czas trwania w ms dla kanału 3 unsigned long opoznienie3 = 500; unsigned long czas3 = 200; //pin cyfrowy, pod który podłączony jest przycisk START const int buttonPin = 2; int buttonState = 0; unsigned long int last_millis; void setup() { //tutaj wpisujemy instrukcje pinMode dla wszystkich kanałów pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(buttonPin, INPUT); //itd. } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { last_millis = millis(); } if( millis() >= (last_millis + opoznienie1 + czas1)) { //tutaj wyłączamy urządzenia kanału 1 digitalWrite(13, HIGH); } else if( millis() >= (last_millis + opoznienie1)) { //tutaj uruchamiamy urządzenia dla kanału 1 digitalWrite(13, LOW); } if( millis() >= (last_millis + opoznienie2 + czas2)) { //tutaj wyłączamy urządzenia kanału 2 digitalWrite(12, HIGH); } else if( millis() >= (last_millis + opoznienie2)) { //tutaj uruchamiamy urządzenia dla kanału 2 digitalWrite(12, LOW); } if( millis() >= (last_millis + opoznienie3 + czas3)) { //tutaj wyłączamy urządzenia kanału 3 digitalWrite(11, HIGH); } else if( millis() >= (last_millis + opoznienie3)) { //tutaj uruchamiamy urządzenia dla kanału 3 digitalWrite(11, LOW); } //analogicznie tworzymy stałe const int dla pozostałych kanałów, oraz kopiujemy powyższe instrukcje warunkowe i zmieniamy zmienne } RE: Sterowanie ruchomą strzelnicą - Jarewa0606 - 16-09-2020 Po pierwsze to jest błąd w przycisku, albo daj pull-up w setup i wykrywaj stan niski albo jak teraz tylko daj na wejściu rezystor 10k do masy, nie wolno zostawić wejscia przycisku bez niczego bo będa cyrki pin wolny zmienia Stany sam z siebie czasem... A co do kodu wieczorem powiem... Przyczyna w millis bo jak startuje program to nie przypisałeś... RE: Sterowanie ruchomą strzelnicą - Jarewa0606 - 16-09-2020 Najprościej najszybciej dodać dodatkowo flagi przed setup bool flaga1=false; { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { last_millis = millis(); flaga1 = true; } if( millis() >= (last_millis + opoznienie1 + czas1) && flaga1) { //tutaj wyłączamy urządzenia kanału 1 digitalWrite(13, HIGH); flaga1=false; } else if( millis() >= (last_millis + opoznienie1)) { //tutaj uruchamiamy urządzenia dla kanału 1 digitalWrite(13, LOW); } i tak osobno dla każdego kanału Po prostu twoje if( millis() >= (last_millis + opoznienie1 + czas1)) po uruchomieniu jest spełnione zawsze bez względu na przycisk.... if( millis() >= (last_millis + opoznienie2 + czas2)) { //tutaj wyłączamy urządzenia kanału 2 digitalWrite(12, HIGH); } else if( millis() >= (last_millis + opoznienie2)) { //tutaj uruchamiamy urządzenia dla kanału 2 digitalWrite(12, LOW); } ten zapis jest nie poprawny RE: Sterowanie ruchomą strzelnicą - greg801 - 17-09-2020 @Jarewa0606 Zrobiłem na podstawie propozycji twojego kodu niestety nic nie działa, nie reaguje na wcisniecie przycisku. Mój aktualny kod działa , reaguje na wciśniecie przycisku tylko kombinuje jak dodać funkcję migania diody w odliczaniu do startu akcji. Jak narazie dodałem delay(5000) wtedy uruchamia sie po 5 sekundach tylko nie wiem jak z diodą LED void loop() { buttonState = digitalRead(buttonPin); //reakcja na przycisk if (buttonState == HIGH) { delay(5000); last_millis = millis(); } |