Do czego to służy? - elektroniczna kostka do gry
Elektroniczne kostki do gry od wielu lat są opisywane na łamach prasy i w książkach poświęconych elektronice (np. w kultowej D. Nuhrmanna „Elektronika łatwiejsza niż przypuszczasz. Układy scalone”). Często elektroniczna kostka do gry to jeden z pierwszych układów elektronicznych w karierze młodego adepta elektroniki. Nic dziwnego – jest to układ prosty w budowie, niedrogi, mający praktyczne zastosowanie w postaci uprzyjemniania zabawy z grami planszowymi.
Niezależnie od rozwiązania elektronicznego zastępuje ona klasyczną sześciościenną kostkę do gry. No właśnie – sześciościenną kostkę, która faktycznie jest najpopularniejszą kostką do gier planszowych – ale niejedyną. Istnieją też inne kości do gry np. dwunastościenne. Jedną z nich, wymagającą dwóch dwunastościenych kości do gry, wymyśloną przez polskiego matematyka prof. Karola Borsuka w czasie II wojny światowej, jest gra „Hodowla zwierzątek”, rozpowszechniona pod nazwą „Superfarmer”.
Na fotografii 1 przedstawione są oryginalne kostki wyprodukowane przez firmę Granna Sp. z o.o. dla Muzeum Powstania Warszawskiego. Nie wchodząc w szczegóły, celem rozgrywki jest utworzenie stada składającego się ze zwierzęcia każdego rodzaju. Rozmnażania stada dokonuje się, rzucając dwoma dwunastościennymi kośćmi, na których umieszczone są obrazy – symbole różnych zwierząt hodowlanych, ale także drapieżników powodujących utratę posiadanych w stadzie zwierzaków.
Podstawowym problemem podczas gry, szczególnie wieczorem, jest to, że rzucanie dwoma dużymi kośćmi powoduje hałas zakłócający spokój osób nieuczestniczących w rozgrywce. Drugim problemem jest stopniowe zmazywanie się naklejek z wizerunkami zwierzątek na kostkach. Tych dwóch wad można uniknąć, budując opisane w tym artykule urządzenie zastępujące dwie dwunastościenne kości.
Dodatkowa zaleta elektronicznego rozwiązania objawia się w sytuacji, gdy powierzchnia, którą dysponujemy, nie nadaje się do rzucania kośćmi. Aby od razu zrozumieć ideę działania kostki, polecam zapoznać się z filmikiem dostępnym w Elportalu w materiałach dodatkowych do tego numeru EdW (gdzie dostępna jest też dokumentacja płytki).
Jak to działa - elektroniczna kostka do gry?
Układ elektroniczny kostki jest bardzo prosty i możemy go zobaczyć na rysunku 1. Zrezygnowano nawet z kondensatora elektrolitycznego, ponieważ zastosowano zasilanie bateryjne z dwóch baterii R6 (lub innego bateryjnego źródła napięcia 3V). Sercem układu jest popularny, tani i znany mikrokontroler ATmega 8. Do zaprogramowania układu służy złącze JP1, do którego można podłączyć standardowy programator typu USB-ASP za pomocą złącza IDC bez konieczności wyciągania procesora z układu.
Rozpoczęcia i zakończenia procesu losowania można dokonać za pomocą przycisku S1. Podłączone do niego wejście PD7 jest przez rezystor R11 podciągnięte do napięcia zasilającego. Za wizualizację wyniku losowania odpowiadają diody świecące wraz z rezystorami ograniczającymi prąd. Diody LED6–LED10 odpowiadają za wyświetlanie wyniku „wyrzuconego pierwszą kostką”, diody LED1–LED5 drugą.
Dlaczego pięć diod wystarczy do wyświetlania wyniku z kostki 12-ściennej? Wynika to ze specyfiki gry „Hodowla zwierzątek” i zostanie opisane dalej. Jak widzimy, układ elektroniczny kostki („hardware”) jest uproszczony do minimum, a większość treści projektu jest zawarta w oprogramowaniu mikrokontrolera („software”), o którym teraz zostanie napisane kilka słów. Program został napisany w języku C, bez wykorzystania specjalizowanych bibliotek i skompilowany kompilatorem GCC. W pierwszej kolejności musimy wyjaśnić, jakie pola występują na poszczególnych kostkach. Zostało to przedstawione w tabeli 1.
Jak widzimy, w każdej kostce występuje zaledwie 5 rodzajów zwierząt. Dzięki temu, pomimo że kostki mają 12 ścian, wystarczy pięć diod do wskazywania wyniku losowania. Ważne jest jednak, że prawdopodobieństwo wylosowania określonego zwierzęcia nie jest jednakowe i fakt ten musi być uwzględniony w programie. W tym celu dla każdej kostki została stworzona w pamięci flash tablica 12-elementowa. W każdym elemencie tablicy jest zapisana liczba, która po wpisaniu do rejestru danych portu wejścia/ wyjścia (PORTC dla kostki 2 lub PORTD dla kostki 1) powoduje zaświecenie diody LED odpowiadającej danemu zwierzęciu.
Oczywiście przy każdej diodzie LED powinien znajdować się rysunek lub napis, jakie zwierze zostało wylosowane. W zrealizowanym modelu pozycji królika odpowiada w kostce 1. dioda LED1, a w kostce 2. LED10. W związku z tym wartość liczbowa powodująca zaświecenie diody LED1 to w zapisie binarnym 0b00000001, a diody LED10 – 0b10000000. Aby prawdopodobieństwo wylosowania królika odpowiadało temu w klasycznej kostce, wartości te są umieszczone w pierwszych sześciu elementach dwóch tablic. Na identycznej zasadzie są umieszczane „zwierzęta” w kolejnych elementach tablic. W tabeli 2 przedstawiono zawartość dwóch tablic oraz odpowiadające im diody LED i przypisane im rodzaje zwierząt.
Przy takiej zawartości tablic wylosowanie z nich danego zwierzęcia jest równie prawdopodobne jak w „analogowej” kostce. Proces losowania zrealizowano za pomocą dwóch timerów: TIM2 i TIM0. Pracują one z różną częstotliwością, a po przepełnieniu zgłaszają przerwanie, w którym zostaje zwiększona odpowiednio zmienna globalna j lub i. Po osiągnięciu wartości 12 zmienna jest zerowana i proces zaczyna się od początku. Timery pracują przez cały czas pracy układu, tzn. dopóki jest dołączone napięcie zasilające.
Po pierwszym naciśnięciu przycisku uruchomiony zostaje system przerwań z aktywnymi przerwaniami od TIM2 i TIM0. Dodatkowo zastosowano efekt szybkiego migania diod symulujący „losowanie”.
Po kolejnym naciśnięciu przycisku system przerwań jest wyłączany, a aktualne wartości zmiennych j oraz i wskazują, który element tablic kostka_ 1 lub kostka_2 został wylosowany. Aby zwiększyć poziom emocji podczas gry, został zastosowany mechanizm znany z „koła fortuny”. Polega on na tym, że po zatrzymaniu procesu losowania przez naciśnięcie przycisku i wyłączenie systemu przerwań wartość wylosowanego elementu tablicy nie jest od razu wpisywana do portów wyjściowych.
Zamiast tego szybkie miganie diod powoli zwalnia, aby w końcu zatrzymać się i wskazać ostateczny wynik. Jest on wyświetlany przez około 15 sekund, po czym następuje wyłączenie diod LED, w celu oszczędzania energii baterii. Aby rozpocząć ponowne losowanie, należy powtórnie nacisnąć przycisk. Całość algorytmu została przedstawiona na schemacie blokowym na rysunku 2.
Montaż i uruchomienie elektronicznej kostki do gry
Kostka składa się z dwóch zasadniczych elementów: płytki drukowanej z elementami elektronicznymi oraz płytki czołowej, które połączone są ze sobą za pomocą 4 plastikowych dystansówek. Na fotografii 2 możemy zobaczyć układ ze zdjętą płytką czołową, na której nie ma jeszcze naniesionych symboli zwierzątek. W płytce czołowej należy wykonać otwory o średnicy 3mm na diody LED oraz otwór na przycisk S1, który z płytką drukowaną łączony jest za pomocą przewodów.
Projekt płytki drukowanej pokazany jest na rysunku 3. Standardowo montujemy układ, zaczynając od elementów najmniejszych, a kończąc na największych. W projekcie zastosowano elementy przewlekane, dlatego montaż nie powinien sprawić problemu nawet najbardziej początkującym. Oczywiście pod mikrokontroler warto zastosować podstawkę.
Nieco uwagi należy poświęcić równemu przylutowaniu diod LED. W moim przekonaniu najwygodniej jest najpierw wykonać płytkę czołową (ja wykonałem ją ze starego kawałka laminatu), czyli dociąć ją do odpowiednich rozmiarów i wywiercić otwory. Ich rozkład jest dostępny w materiałach do tego numeru EdW.
W pliku kostka.brd należy pozostawić jedynie warstwy Dimension, tPlace i Drills, tak przygotowany plik wydrukować i przykleić do płytki czołowej jako szablon do wiercenia (otwór na przycisk nie jest zaznaczony, należy go dobrać w zależności od wymiarów i miejsca położenia). Można też wykorzystać któryś z gotowych rysunków płytki PDF z Elportalu. Na płytkę czołową należy nanieść nazwy lub rysunki zwierzątek. Wzór, odpowiadający napisanemu programowi, widzimy na rysunku 4.
Następnie diody LED umieszczamy w otworkach płytki drukowanej (nie czołowej), ale nie lutujemy. Za pomocą plastikowych dystansów montujemy płytkę czołową i teraz po kolei każdą z diod dosuwamy do płytki czołowej, lutujemy i obcinamy końcówki. Ten proces możemy zobaczyć na fotografii 3. Do złącza X1 (którego można nie montować, tylko wlutować przewody zasilające bezpośrednio) dołączamy koszyczek z bateriami R6 lub inne źródło napięcia 3V.
Pomiary wykazały, że przy takim zasilaniu w stanie pracy układ pobiera około 7,5–7,8mA, natomiast w spoczynku, kiedy diody zostają wygaszone, około 1,7mA. Przed włożeniem mikrokontrolera do podstawki sprawdzamy, czy na pewno na pinach zasilania występuje odpowiednia wartość napięcia o odpowiedniej polaryzacji. Po zakończeniu montażu podłączamy programator typu USB-ASP do złącza JP1 na płytce głównej i wgrywamy gotowy plik hex: „kostka.hex” np. za pomocą AVR-DUDE lub innego programu wgrywającego. Urządzenie powinno działać od razu. Zastosowanie dystansów o długości 20mm pozwala na podłączenie przewodu IDC bez ściągania płytki czołowej.
Widać to na fotografii 4, natomiast na fotografii 5 przedstawiony jest zmontowany model podczas programowania. Fotografia tytułowa pokazuje gotową do gry kostkę elektroniczną z naniesionymi na płytkę czołową wizerunkami zwierzątek podobnymi do tych z oryginalnej gry „Hodowla zwierzątek”. Obok widoczne są starsze, „analogowe” siostry naszej kostki z oryginalnej gry firmy Granna Sp.z o.o.
Modyfikacje elektronicznej kostki do gry
Interesującym doświadczeniem może być bardzo proste w realizacji zmodyfikowanie zawartości tablic kostka_1 i kostka_2, a co za tym idzie, zmienienie prawdopodobieństw losowania poszczególnych zwierząt i obserwacja, jak taki zabieg wpłynie na rozgrywkę. O takiej możliwości właściciele kostek analogowych mogą jedynie pomarzyć. W materiałach dodatkowych do tego numeru znajduje się plik źródłowy kostka.c, który można dowolnie modyfikować. Pomocne będą zawarte tam liczne komentarze tłumaczące rolę poszczególnych elementów kodu. Można również spróbować dostosować układ tak, aby zastępował kostki w innych grach, choć takich prób nie przeprowadzałem.