Kostka do gry na Arduino

Wpis w kategorii [ Arduino ]

Kostki do gryOstatnio zebrało mi się na gry planszowe. W hurtowni z zabawkami, przy okazji innych zakupów, nabyłem więc chińczyka. Klasyczna, sprawdzona gra – takie lubię najbardziej. Kosztowała kilkanaście złotych, a dostarcza fajnej rozrywki przesączonej sentymentami.

W zestawie była plansza, pionki oraz kostka. Podczas gry okazało się jednak, że dołączona kostka zachowuje się dość dziwnie – nie chciała się kulać tak jak powinna.

W takiej sytuacji, korzystając z wolnej chwili, postanowiłem zbudować sobie kostkę elektroniczną. Nie wiem, czy będę jej używał, ponieważ zwykła kostka tworzy część klimatu związanego z grami planszowymi, ale fajnie sobie coś takiego zbudować, poświęcając na to zaledwie kilkanaście minut.

Kostka

Kostka zbudowana została z wykorzystaniem:

  • Boarduino (może być zwykłe Arduino, Freeduino itp.),
  • stykowej płytki prototypowej,
  • przycisku,
  • wyświetlacza siedmiosegmentowego (pierwsza wersja), 7 LEDów (druga wersja),
  • rezystorów,
  • przewodów

Pierwsza wersja

Opis / wygląd

Pierwsza wersja kostki zbudowana została z wykorzystaniem wyświetlacza siedmiosegmentowego. Na poniższym obrazku możesz zobaczyć, który segment wyświetlacza, połączony jest z którym z wyjść cyfrowych Boarduino (przez rezystory). Zastosowany wyświetlacz jest wyświetlaczem o wspólnej anodzie. Stanem zapalającym dany segment jest więc logiczne zero.

Połączenia

Połączenia

Kostka do gry na Arduino - wersja z wyświetlaczem siedmiosegmentowym

Kostka do gry na Arduino - wersja z wyświetlaczem siedmiosegmentowym

Dodatkowo do pinu 12 podłączony jest przycisk. Pin 12 skonfigurowany jest jako pin wejściowy z wewnętrznym podciąganiem do zasilania (wewnętrzny pullup włącza instrukcja: digitalWrite(buttonPin, HIGH)).

Kod

int ledPin =  13;
int buttonPin = 12;
 
int i = 0;
 
char seg[] = {0x04,0x57,0x0A,0x03,0x51,0x21,0x20,0x17,0x00,0x01};
 
void setup()   {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);  
 
  DDRD = 0xFF; 
 
  randomSeed(analogRead(0));
  PORTD = seg[0];
}
 
void loop()
{
  while(digitalRead(buttonPin) == LOW);
  while(digitalRead(buttonPin) == HIGH);
 
  digitalWrite(ledPin, LOW);
 
  for(int r = 0; r < 30; r++)
  {
    PORTD = seg[random(1,7)];
    delay(50 * (r >> 3));
  }
 
  digitalWrite(ledPin, HIGH);
}

Jak widać kod nie jest skomplikowany. Dla uproszenia, wykorzystany został bezpośredni dostęp do portów mikrokontrolera (bez korzystania z funkcji typu digitalWrite, digitalRead). Dzięki instrukcji delay(50 * (r >> 3)) wyrzucona kostka niejako zwalnia tzn. na początku liczba zmienia się szybko, następnie coraz wolniej, aż w końcu zatrzymuje się i możemy odczytać wylosowaną liczbę. Miałem nagrać filmik i pokazać jak to działa, ale mój aparat coś kiepsko działa i nic z tego nie wyszło.

Druga wersja

Opis / wygląd

Druga wersja kostki zbudowana została z wykorzystaniem diod LED. Połączenia widoczne są poniżej. Stanem zapalającym daną diodę LED jest logiczne zero.

Połączenia

Połączenia

Kostka do gry na Arduino - wersja z diodami LED

Kostka do gry na Arduino - wersja z diodami LED

Kod

Fajne jest to, że kod drugiej wersji kostki prawie nie różni się od pierwszej wersji. Jedyna zmiana to linia definiująca stan portu dla danej liczby:

char seg[] = {0x04,0x57,0x0A,0x03,0x51,0x21,0x20,0x17,0x00,0x01};

została zmieniona na:

char seg[] = {0xFF,0xBF,0x77,0x37,0x71,0x31,0x41};

Podsumowanie

Fajnie byłoby zrobić do tego jakąś obudowę, zaprojektować płytkę itd. Można też trochę poeksperymentować z animacją rzutu kostką. A Ty masz jakieś pomysły, a może własne projekty związane z grami planszowymi?

Oceń ten wpis:
1 gwiazdka2 gwiazdki3 gwiazdki4 gwiazdki5 gwiazdek (głosów: 3, średnia ocen: 3,00)
Loading ... Loading ...
Wyświetleń: 5 123

Podobne artykuły

Możesz śledzić komentarze do tego wpisu poprzez kanał RSS 2.0. Możesz także dodać własny komentarz, lub trackback z własnej strony WWW.

Dodaj komentarz