Kostka do gry na Arduino
Ostatnio 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

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

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?

