Reakčná hra pre dvoch hráčov – Arduino Uno


Reakčná hra pre dvoch hráčov – Arduino Uno

Princíp fungovania:

Obaja hráči čakajú na štartovací signál a snažia sa stlačiť svoje tlačidlo čo najrýchlejši.

Ako bude hra prebiehať?:

  • LED postupne bliknú dvakrát ako uvítanie na začiatku hry.
  • Hra náhodne čaká 2–6 sekúnd. Ak niekto stlačí tlačidlo príliš skoro, kolo sa zruší.
  • Všetkých 5 LED sa rozsvieti — to je signál na reakciu.
  • Po 3 sekundách sa rozsvieti krajné LED víťaza na 3 sekundy.
  • LED zhasnú a hra sa pripraví na ďalšie kolo.
  • Ak obaja stlačia tlačidlo v tom istom čase, hra to vyhodnotí ako remízu a zablikajú obe krajné LED.

Súčiastky:

  • 5× LED
  • 5× 470R resistor
  • Dupont M-M prepojovacie vodiče 10cm a 2× 20cm
  • 2× tlačidlo 6×6mm

Zapojenie:

Komponenta:

Pin Arduino:

LED 1 (ľavá) – anóda cez rezistor

D3

LED 2 – anóda cez rezistor

D4

LED 3 – anóda cez rezistor

D5

LED 4 – anóda cez rezistor

D6

LED 5 (pravá) – anóda cez rezistor

D7

Katóda každej LED

GND

Tlačidlo ľavého hráča – jeden kontakt

D2

Tlačidlo pravého hráča – jeden kontakt

D8

Druhý kontakt oboch tlačidiel

GND

Program pro Arduino:

const int ledPins[] = {3, 4, 5, 6, 7};
const int pocetLED = 5;

const int tlacidloLavy = 2;
const int tlacidloPravy = 8;

const int ledLavyVitaz = 3;
const int ledPravyVitaz = 7;

void zhasniVsetkyLED() {
  for (int i = 0; i < pocetLED; i++) {
    digitalWrite(ledPins[i], LOW);
  }
}

void rozsvietVsetkyLED() {
  for (int i = 0; i < pocetLED; i++) {
    digitalWrite(ledPins[i], HIGH);
  }
}

void pockajNaUvolnenieTlacidiel() {
  while (digitalRead(tlacidloLavy) == LOW ||
         digitalRead(tlacidloPravy) == LOW) {
    delay(10);
  }
}

void uvodnaAnimacia() {
  zhasniVsetkyLED();

  // Kazda LED postupne blikne dvakrat
  for (int i = 0; i < pocetLED; i++) {
    for (int blik = 0; blik < 2; blik++) {
      digitalWrite(ledPins[i], HIGH);
      delay(200);
      digitalWrite(ledPins[i], LOW);
      delay(200);
    }
  }
}

void setup() {
  for (int i = 0; i < pocetLED; i++) {
    pinMode(ledPins[i], OUTPUT);
  }

  pinMode(tlacidloLavy, INPUT_PULLUP);
  pinMode(tlacidloPravy, INPUT_PULLUP);

  randomSeed(analogRead(A0));

  uvodnaAnimacia();
}

void loop() {
  zhasniVsetkyLED();

  // Hra sa zacne, az ked su obe tlacidla uvolnene
  pockajNaUvolnenieTlacidiel();

  // Nahodne cakanie 2 az 6 sekund
  unsigned long cakanie = random(2000, 6001);
  unsigned long zaciatokCakania = millis();

  while (millis() - zaciatokCakania < cakanie) {
    bool lavyStlaceny =
      digitalRead(tlacidloLavy) == LOW;
    bool pravyStlaceny =
      digitalRead(tlacidloPravy) == LOW;

    // Predcasne stlacenie zrusi kolo
    if (lavyStlaceny || pravyStlaceny) {
      zhasniVsetkyLED();
      pockajNaUvolnenieTlacidiel();
      delay(1000);
      return;
    }
  }

  // Startovaci signal
  rozsvietVsetkyLED();

  int vitaz = 0;
  // 1 = lavy, 2 = pravy, 3 = takmer sucasne stlacenie

  while (vitaz == 0) {
    bool lavyStlaceny =
      digitalRead(tlacidloLavy) == LOW;
    bool pravyStlaceny =
      digitalRead(tlacidloPravy) == LOW;

    if (lavyStlaceny & pravyStlaceny) {
      vitaz = 3;
    } else if (lavyStlaceny) {
      vitaz = 1;
    } else if (pravyStlaceny) {
      vitaz = 2;
    }
  }

  zhasniVsetkyLED();

  // Pauza 3 sekundy pred oznamenim vitaza
  delay(3000);

  if (vitaz == 1) {
    digitalWrite(ledLavyVitaz, HIGH);
  } else if (vitaz == 2) {
    digitalWrite(ledPravyVitaz, HIGH);
  } else {
    // Pri takmer sucasnom stlaceni bliknu obe krajné LED
    for (int i = 0; i < 3; i++) {
      digitalWrite(ledLavyVitaz, HIGH);
      digitalWrite(ledPravyVitaz, HIGH);
      delay(250);
      digitalWrite(ledLavyVitaz, LOW);
      digitalWrite(ledPravyVitaz, LOW);
      delay(250);
    }
  }

  // Vitazna LED svieti 3 sekundy
  delay(3000);
  zhasniVsetkyLED();

  // Pauza pred dalsim kolom
  pockajNaUvolnenieTlacidiel();
  delay(1000);
}

Další podobné články

OVLÁDÁNÍ LED NEBO ZÁSUVKY S MODULEM CC1101 433.92Mhz

Po prvních pokusech s moduly CC1101 433.92Mhz jsem se po čase rozhodl si vyzkoušet napsat program na jednoduché ovládání led diody tak aby jeden modul pravidelně vysílal hodnoty které se na druhém modulu vyhodnotí a tento pak bude pravidelně blikat led diodou. Po tomto programu a jeho odzkoušení jsem se rozhodl si napsat další program na zjištění číselných hodnot tlačítek na dálkovém ovladači pro bezdrátové zásuvky 433Mhz, a tyto pak ovládat dalším napsaným programem na zapínání a vypínání zásuvky. Pro ovládání jsem použil Arduino Nano které jsem pro testování osadil do Arduino IO shieldu, pro komunikaci mezi Arduino a modulem CC1101 jsem použit 8 – kanálový obousměrný převodník logických úrovní (5V – 3.3V) a pro napájení celé sestavy jsem použil vyrobený napájecí zdroj s výstupním napětím 8V pro napájení  Arduino Nano,  5V a 3.3V pro napájení převodníku a modulu CC1101. Uvedené přípravky rozšiřují zapojení uveřejněná v [1].

Servo ovládané rotačním enkodérem

Cílem tohoto projektu je vytvořit systém pro vzdálené a přesné polohování servomotoru pomocí rotačního enkodéru (tzv. "digitální ruční kolečko"). Projekt demonstruje využití hardwarových přerušení (interrupts) Arduina a přímé řízení šířky impulsu v mikrosekundách pro dosažení maximální plynulosti pohybu.