piątek, 24 sierpnia 2012

Gra "teleturniej"

           W obliczu tego że przez dłuższy czas posiadałem kilka niepotrzebnych mikrokontroklerów Attiny2313 i dwa duże wyświetlacze LED postanowiłem je w jakiś twórczy sposób wykorzystać. W ten sposób wpadł mi do głowy pomysł na zbudowanie urządzenia przeznaczonego do przeprowadzania teleturniejów. Głównym jego zadaniem miało być wskazywanie który z graczy pierwszy zgłosił się do odpowiedzi na pytanie. Jednak jak się okazało zostało mi jeszcze sporo miejsca dlatego wprowadziłem parę efektów wizualnych , zapamiętywanie i dokonywanie zmian w aspekcie punktów posiadanych przez danego gracza (w przedziale od 0 - 99) ,a także funkcje pozwalającą wskazać przez urządzenie gracza który wygrał rozgrywkę (bądź też kilku zwycięzców  przypadku remisu) i możliwość uruchomienia sygnalizacji dźwiękowej po skończeniu czasu na odpowiedź (działa to w ten sposób że gdy ustawimy np. 5s to gdy dany gracz
zgłosi się to po 5s dojdzie do "piknięcia" sygnalizującego koniec czasu). Program napisałem w BASCOMIE.

Prezentowane urządzenie jest układem bardzo prostym ale oryginalnym. Nie znalazłem bowiem w internecie

tego typu projektu dlatego postanowiłem go tutaj przedstawić

Kontroler działa na wewnętrznym oscylatorze 8Mhz (m.in. dlatego że chciałem użyć jeszcze portu.a).

Jak wiadomo procesor Attny2313 posiada 17 nóżek uniwersalnego zastosowania. W związku z tym było mi trochę ciasno na podłączenie wszystkiego do uC. Teraz jak patrzę na to z perspektywy czasu (projekt robiłem miesiąc temu) to trochę przekombinowałem i dało by się to wszystko lepiej podłączyć ,ale już trudno (np. można by było przyciski podłączyć w formie matrycy).
Diody w wyświetlaczu oraz 4 diody 10mm steruje multipleksowo więc zajęło mi to w sumie 10 pinów. Ciekawostką jest tu fakt że do załączania tranzystorów kluczujących nie stosowałem 2 wyjść tylko 1 wyjście (ponieważ zbudowałem bramkę NOT przy jednym z tranzystorów kluczujących). Działa to w ten sposób ,że gdy na wyjściu pojawia się stan wysoki to zapala się lewa cyfra, gdy niski zapala się prawa. Dodatkowo 4 wejścia zostały użyte do podłączenia przycisków graczy, a jedno wyjście do buzera. Zostały mi
więc 2 wejścia a ja musiałem jeszcze podłączyć 3 przyciski do wprowadzania ustawień - w związku z tym zdecydowałem się podłączyć tak naprawdę 2 przyciski ,natomiast 3 przycisk zachowuje się tak że zwiera oba przyciski (za pośrednictwem diod prostowniczych).

Program pisałem w BASCOM-AVR, zajął 99% miejsca z pośród 2kb pamięci. Zawsze piszę programy tak aby zapełniały całą dostępną pamięć w procesorze (bo czemu mam nie korzystać z całej pamięci skoro za nią zapłaciłem). Gdy napisze jakiś program i zajmuje on mniej niż się spodziewałem to staram się dodawać nowe funkcje do urządzenia.Tak też było w tym przypadku. Poznałem też kilka trików pozwalających na zmniejszenie objętości programu w BASCOMie (np. kto by się spodziewał że

lepiej użyć kilku poleceń If...End niż logicznych funktorów).

Elektronika została wykonana na bazie dwóch płytek PCB (zaprojektowane w programie Design Spark PCB), jedna parowała katody wyświetlaczy do multipleksów, na drugiej znajdowała się cała elektronika. Urządzenie zasilam 4 bateriami AA (6V). Jak ktoś byłby zainteresowany to mogę udostępnić wzór PCB, ale mogą być problemy co gdzie trzeba podłączyć ponieważ nie posiadam schematu.


Filtr na wyświetlacz wykonałem z foli do przyciemniania szyb. Producent oraz poradnik na który akurat natrafiłem w internecie podawał aby najpierw oczyścić powierzchnię do której przyklejamy folie, następnie spryskać ją roztworem wodnym mydła/ detergentu, a następnie przykleić folię (z foli trzeba było zdjąć warstwę ochronną pod którą znajdował się klej, było to dość trudne i musiałem wspomóc się nożykiem do tapet).


Cała elektronika znajduje się w obudowie wykonanej z pomalowanej na czarno blaszanej puszcze po kremie. Przyciski dla (graczy również wykonane zostały z pojemników po jakiś kremach) połączone są z główną płytką za pomocą metrowych przewodów.


Jeśli chodzi o obsługę praktyczną to z grubsza widać to na filmie:
  FILM



 
"Jednostka centralna" urządzenia


                                               Urządzenie w całości - razem z przyciskami

Kiedy uruchomimy układ pojawia się kilku sekundowa animacja, następnie układ czeka (wyświetla wtedy 2 poziome kreski) na naciśnięcie przycisku przez któregoś z użytkowników.
W tym momencie mamy także możliwość ustawienia czasu jaki gracz będzie posiadał na dokonanie odpowiedzi (po jego minięciu usłyszymy "piknięcie"(można też ustawić "00" i wtedy czas na odpowiedź będzie nieograniczony). Służą do tego przyciski "góra" i "dół" obok wyświetlacza. Gdy naciśniemy któryś z tych przycisków układ na kilka sekund pokaże aktualną wartość po czym wróci dalej do trybu "czuwania" (pokaże znów poziome kreski). Jeśli jednak szybko zwolnimy przycisk i jeszcze raz go naciśniemy będziemy mogli dokonać zmiany. Na uwagę zasługuje tu system tzw. "inteligentnego przycisku". Rozbudowałem go nieco względem mojego wcześniejszego projektu.Działa on teraz tak że szybkie zmniejszanie/ zwiększanie wartości zmiennej odbywa się dopiero gdy użytkownik przytrzyma przycisk co najmniej sekundę. Zacznie ułatwia to precyzyjne wpisywanie danej wartości.

Kiedy natomiast w trybie "czuwania" naciśniemy środkowy przycisk urządzenie wyświetli animacje oraz wskaże który z uczestników otrzymał największą ilość punktów (może też wskazać remis) - zwycięzca wskazany jest za pomocą diod 10mm natomiast ilość punktów ,które zgromadził pokazuje wyświetlacz LED. W tym momencie przyciski "góra" i "dół" są nieaktywne natomiast przycisk "środkowy" przenosi nas znowu do trybu "czuwania".

Kiedy układ jest w trybie "czuwania" a któryś z graczy naciśnie swój przycisk,urządzenie pokazuje ilość punktów zgromadzoną przez tego gracza (i jednocześnie blokuje przyciski innym graczom dzięki czemu wykrywa różnice w zgłoszeniu się uczestników na poziomie kilku ms), przyciski "góra", "dół" służą do zmiany ilości punktów (tu też działa system "inteligentnego przycisku") a przycisk "środkowy" pozwala na powrót
do trybu "czuwania".

Starałem się wyeliminować wszystkie błędy mogące prowadzić do nieoczekiwanego zachowania układu bądź jego zawieszenia. Np. gdy kod był jeszcze "nie oczyszczony z wszelakich błędów" pojawiały się problemy tego typu że np. wciśnięcie kilku przycisków na raz (w konfiguracji nieprzewidzianej przez program) powodowało problemy w działaniu - teraz tego typu sytuacje są zażegnane.

Errata: Program posiada jedną wadę której nie udało się wykryć podczas testów (i tak już niestety zostanie, poza tym i tak nie wiem czy naprawa tego błędu zmieściła by się w programie). Wada ta związana jest z "piknięciem" sygnalizującym użytkownika o zakończeniu czasu na odpowiedź. Otóż gdy uruchomimy funkcję wskazującą zwycięzce to układ również piknie po żądanym czasie. 


Po opublikowaniu projektu na forum elektroda.pl poproszono mnie o udostępnienie wzoru PCB i programu. Wzór ścieżek w PDF i źródło programu zamieściłem w jednym ze swoich postów w temacie w którym opisuje to urządzenie na forum: LINK  
(proszę spojrzeć na post z 23 września) .