• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie ruchomą strzelnicą
#1
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:

[Obrazek: 5150067400_1600207073_thumb.jpg] [Obrazek: 7155722500_1600207073_thumb.jpg]

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
const int opoznienie1 = 2000;
const int czas1 = 50000;

//opoznienie i czas trwania w ms dla kanału 2
const int opoznienie2 = 4000;
const int czas2 = 3000;

//opoznienie i czas trwania w ms dla kanału 3
const int opoznienie3 = 7000;
const int czas3 = 1000;




//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, LOW);
  }
  else if( millis() >= (last_millis + opoznienie2))
  {
    //tutaj uruchamiamy urządzenia dla kanału 2
    digitalWrite(12, HIGH);
  }

 
  if( millis() >= (last_millis + opoznienie3 + czas3))
  {
    //tutaj wyłączamy urządzenia kanału 3
    digitalWrite(11, LOW);
  }
  else if( millis() >= (last_millis + opoznienie3))
  {
    //tutaj uruchamiamy urządzenia dla kanału 3
    digitalWrite(11, HIGH);
  }



  //analogicznie tworzymy stałe const int dla pozostałych kanałów, oraz kopiujemy powyższe instrukcje warunkowe i zmieniamy zmienne
 

}
 
Odpowiedź
#2
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 ,
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
[Obrazek: 3743956600_1600232648_thumb.jpg]

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


}
 
Odpowiedź
#4
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ś...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
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
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#6
@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();
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości