Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przenośna konsola do gier - atmega8 + lcd3310.

w1941s 22 Lip 2015 16:31 3933 24
  • Przenośna konsola do gier - atmega8 + lcd3310.

    Witam. Przedstawiam projekt konsoli do gier na bazie uC atmega8 i wyświetlacza z nokii 3310. Zanim zebrałem się za zaprezentowanie mojej konstrukcji w dziale DIY, konsola przeleżała nieużywana w szafie około rok. Konstrukcja powstała dla własnej satysfakcji i nie jest już rozwijana.

    Na konsole powstały dwie gry:
    Pierwsza gra to zwykły Snake. Druga gra to pseudo klon Mario. Opis będzie dotyczył samej konsoli jak i drugiej gry.

    Jak już pisałem sercem konsoli jest uC atmega8 taktowana wewnętrznym zegarem 8Mhz, wyświetlacz pochodzi z telefonu nokia 3310 84x48, joystick pochodzi z telefonu SE (nie wiem jaki model), całość zapakowana w uniwersalną obudowę. Jest to moja druga konsola, tu opisałem pierwszą.

    Wymiary:
    - szerokość: około 6,5 cm
    - długość: około 10 cm
    - wysokość: około 3 cm

    Głównym problemem podczas tworzenia konsoli była mała ilość pamięci ram(1KB). Jako, że grafika generowana jest na bieżąco i trzeba zapalać pojedyncze piksele (wyświetlacz nie pozwala na taki czyn bez gaszenia uprzednio zapalonych pikseli) musiałem stworzyć bufor dla wyświetlacza w pamięci uC. Niestety nie można sobie pozwolić na tablice 2D o rozmiarze 84x48 bajtów(razem 4032B) ponieważ zabraknie nam pamięci. Wpadłem na pomysł stworzenia tablicy 1D o rozmiarze 504B. Wiadomo jeden piksel ma dwie współrzędne X,Y a więc jak zapisać go w tablicy jednowymiarowej? Trzeba użyć funkcji która dokonuje konwersji współrzędnych 2D na 1D :D. Po całej konwersji program "wypluwa" tablice o rozmiarze 504B, gotową na wysłanie do wyświetlacza. Do samej komunikacji z LCD użyłem gotowej biblioteki ze strony XYZ Hobby Robot.

    Wygląd postaci oraz wygląd kafelków z których zbudowany jest dany poziom zapisane są w pamięci FLASH uC.

    Poziom w grze zbudowany jest z 70 segmentów, każdy segment przechowuje id bloku, który ma się w nim znaleźć. Na chwile obecną gra zbudowana jest z 5 poziomów (ograniczenie można łatwo usunąć edytując kod w funkcji SELECT_LVL).

    System kolizji w grze oparty jest na metodzie AABB.
    W programie znajdują się dwie funkcje do wykrywania kolizji:
    1- sprawdza kolizje obiektów interaktywnych (pociski, gracz,potwory) z innymi obiektami interaktywnymi
    2- sprawdza kolizje obiektów interaktywnych z mapą.




    Każda z funkcji zwraca informacje z, której strony nastąpiła kolizja(góra,lewo,prawo,dół).

    W każdej lokacji może znajdować się max. 8 potworków. Można to bardzo łatwo zmienić edytując stałe w kodzie :).

    Do tworzenia poziomów w grze napisałem prosty generator map na PC.

    Wygląd postaci i kafelków powstał w programie Micro LCD Bitmap Editor.

    Jest to moja pierwsza płytka w której użyłem elementów smd.

    Samą konsolę uważam za ukończoną, natomiast gra posiada parę błędów.
    Nie pamiętam w jakiej cenie zamkną się projekt, ale myślę że około 20zł.
    Uważam, że konsola fajnie sprawuje się podczas nauki programowania.

    W załączniku znajdują się kody źródłowe w C i schematy.

    Zdjęcia:
    Przenośna konsola do gier - atmega8 + lcd3310. Przenośna konsola do gier - atmega8 + lcd3310. Przenośna konsola do gier - atmega8 + lcd3310. Przenośna konsola do gier - atmega8 + lcd3310.

    Wideo:


    Link


    Link


    Fajne!
  • #2 22 Lip 2015 17:47
    Steryd3
    Poziom 31  

    Jestem zachwycony- w końcu coś innego niż zegarek czy termometr.
    Wykonanie mechaniczne zostawiam bez komentarza ale przecież nie o to tu chodzi.
    Jak dla mnie jeden z ciekawszych projektów ostatnich miesięcy (choć nie wiem czy oz A do Z własny) mimo, że to jest raczej projekt o walorach edukacyjnych niż praktycznych.
    Gratuluje pomysłu i wykonania!

  • #3 22 Lip 2015 18:00
    w1941s
    Poziom 14  

    Sam wszystko pisałem i wykonałem, za wyjątkiem biblioteki do komunikacji z LCD o czym wspomniałem w temacie. Dokładnie, projekt nie miał być praktyczny lecz edukacyjny. Cieszę się, że się podoba :).

  • #4 22 Lip 2015 18:07
    lekto
    Poziom 35  

    Fajne, od jakiegoś czasu chodzi mi po głowie coś podobnego tylko z ekranem z tych gier "bazarowych" z dzieciństwa. W jaki sposób rozwiązałeś synchronizację, w sensie żeby gra nie działała raz za szybko, a raz za wolno? Zwykła pętla czasu rzeczywistego wystarczyła, czy jakaś "dziwna" kombinacja?

  • #5 22 Lip 2015 18:19
    w1941s
    Poziom 14  

    lekto napisał:
    Fajne, od jakiegoś czasu chodzi mi po głowie coś podobnego tylko z ekranem z tych gier "bazarowych" z dzieciństwa. W jaki sposób rozwiązałeś synchronizację, w sensie żeby gra nie działała raz za szybko, a raz za wolno? Zwykła pętla czasu rzeczywistego wystarczyła, czy jakaś "dziwna" kombinacja?


    Bardzo prosty sposób. Mamy dwie zmienne które po każdym obiegu pętli głównej są zwiększane o 1(inkrementacja) do określonej wartości, po czym wykonuje się cały kod sprawdzania kolizji, wyświetlania itd. Dlatego np. player porusza się szybciej od potworów. Prostota :D.

    O tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #6 22 Lip 2015 18:26
    Bartek_Wosik
    Poziom 27  

    w1941s napisał:
    Samą konsolę uważam za ukończoną, natomiast gra posiada parę błędów.

    Popraw chociaż ten jeden który od razu rzuca się w oczy, czyli splash screen z napisem "WONSZ" :|

  • #7 22 Lip 2015 18:31
    w1941s
    Poziom 14  

    Bartek_Wosik napisał:
    w1941s napisał:
    Samą konsolę uważam za ukończoną, natomiast gra posiada parę błędów.

    Popraw chociaż ten jeden który od razu rzuca się w oczy, czyli splash screen z napisem "WONSZ" :|


    Filmik z gry Snake powstał jakieś 10 miesięcy temu :P. Wonsz już jest nie rozwijany.Taka ciekawostka dlaczego napis wciśnij A? Już odpowiadam, do konsoli miała być dodana obsługa klawiatury na PS2(działający kod jest), tylko niestety napięcia klawiatury i uC są rożnej wartości i stwierdziłem, że dam sobie z tym spokój.

    EDIT:
    Proszę tak jest w aktualnej wersji pliku .hex:
    Przenośna konsola do gier - atmega8 + lcd3310.

  • #8 22 Lip 2015 19:32
    lekto
    Poziom 35  

    w1941s napisał:
    Bardzo prosty sposób. Mamy dwie zmienne które po każdym obiegu pętli głównej są zwiększane o 1(inkrementacja) do określonej wartości, po czym wykonuje się cały kod sprawdzania kolizji, wyświetlania itd. Dlatego np. player porusza się szybciej od potworów. Prostota :D.

    Czyli może wystąpić efekt gdzie czym mniej do obliczenia (kolizje i ruch) tym gra szybciej chodzi, jest to odczuwalne? Orientujesz się ile masz obiegów pętli na sekundę?

  • #9 22 Lip 2015 19:54
    w1941s
    Poziom 14  

    Nie odczuwam spowolnień. Gra cały czas ma coś do roboty :D więc nie ma jakichś radykalnych momentów gdzie jest dużo więcej obliczeń, tak aby spowolnić grę. Postaram się sprawdzić ile będzie tych obiegów :) odpalę jakiś TIMER i dam ci znać.

    EDIT:

    Ok, sprawdziłem. Standardowo ilość obiegów waha się od ~22200 do ~24400. Przy wystrzale pocisku ilość obiegów spada do ~17000(tylko chwilowo). Bez potworów i w bezruchu ~23200. Czasem wyniki skaczą tak w postoju do ~18000 (podejrzewam, że to jakiś bug).

    Metoda sprawdzania:
    Timer0 taktowanie 31250Hz. Co 123 przepełnienia timera (około 1,007s ) sprawdzamy stan licznika z głównej pętli i wypisujemy wynik na wyświetlaczu, zerujemy TCNT0, licznik przepełnień, oraz licznik obiegu pętli. I tak do znudzenia.

  • #10 22 Lip 2015 21:26
    Bartek_Wosik
    Poziom 27  

    w1941s napisał:
    Filmik z gry Snake powstał jakieś 10 miesięcy temu . Wonsz już jest nie rozwijany.Taka ciekawostka dlaczego napis wciśnij A? Już odpowiadam, do konsoli miała być dodana obsługa klawiatury na PS2(działający kod jest), tylko niestety napięcia klawiatury i uC są rożnej wartości i stwierdziłem, że dam sobie z tym spokój.

    Akurat nie miałem na myśli napisu "wciśnij A" a fakt, że słowo snake po polsku to wąż a nie wonsz.
    Może dla niektórych to drobnostka, bo sam projekt jest ciekawy, ale nieco kłuje w oczy.

  • #11 22 Lip 2015 21:35
    w1941s
    Poziom 14  

    Specjalnie nazwałem grę "WONSZ" a nie "WĄŻ". To jest celowy zabieg. :cunning:

  • #13 22 Lip 2015 22:14
    w1941s
    Poziom 14  

    lekto napisał:
    Albo po prostu brak polskich znaków. :D

    Akurat intro to zwykła bitmapa :D więc nie problem narysować ą lub ż.

  • #14 23 Lip 2015 10:00
    Samuraj
    Poziom 34  

    Ostatnio nastała jakaś moda na tego typu gierki. Sam swojego czasu z nudów zrobiłem coś podobnego.
    Przenośna konsola do gier - atmega8 + lcd3310.

    Mam pytanie do autora, co to za joystick zastosowany w projekcie ?

  • #15 23 Lip 2015 11:18
    w1941s
    Poziom 14  

    Joystick pochodzi najprawdopodobniej z jakiegoś telefonu Sony Ericsson np. k300i, k310i i jeszcze kilka modeli miało ten joy. Idzie znaleźć bez nakładki na allegro za złotówkę
    joy-sony-ericsson-k800-k750-k700-k510-k310-nowy-

    Moderowany przez ANUBIS:

    3.1.18. Nie wysyłaj linków, które po pewnym czasie przestaną być aktywne. To spowoduje, że dyskusja straci jakikolwiek sens.


    Tylko trzeba multipleksować joystick :). I jest jeszcze jeden bajer, niezależnie który kierunek wciskamy zwierają się piny na obrazku oznaczone jako IRQ(nie wiem czy dobrze oznaczyłem, mogą to być te prostopadłe do pinów IRQ). Rysunek z pamięci i przy pomocy google.

    Przenośna konsola do gier - atmega8 + lcd3310.

  • #16 23 Lip 2015 15:46
    Jaremka
    Poziom 14  

    Fajny projekt ,ale schemat nie czytelny nie wiadomo jakie złącze do czego jest .

  • #17 25 Lip 2015 13:08
    Atreyu Makiavel
    Poziom 34  

    w1941s napisał:
    I jest jeszcze jeden bajer, niezależnie który kierunek wciskamy zwierają się piny na obrazku oznaczone jako IRQ(nie wiem czy dobrze oznaczyłem, mogą to być te prostopadłe do pinów IRQ)

    Tam jest jeszcze przycisk centralny reagujący na wciśnięcie joysticka.

  • #18 25 Lip 2015 13:11
    w1941s
    Poziom 14  

    Zgadzam się. Zapomniałem oznaczyć na rysunku. ;)

    EDIT:
    To jest ten pin IRQ, o ile się nie mylę. ;)

  • #19 25 Lip 2015 13:36
    Atreyu Makiavel
    Poziom 34  

    w1941s napisał:
    Zgadzam się. Zapomniałem oznaczyć na rysunku. ;)

    To to nie jest żaden "bajer" niezależnie który kierunek wciskamy... to jest osobny kierunek - centralny.

  • #20 25 Lip 2015 13:47
    w1941s
    Poziom 14  

    Dobrze zgadzam się, jest to jeszcze jeden kierunek :) (nazywam go IRQ), ale mimo to wciskając joystick(np. lewo, prawo, góra, dół) piny od kierunku IRQ zawsze zostają zwarte.

    Poprawiony schemacik:
    Przenośna konsola do gier - atmega8 + lcd3310.

  • #21 25 Lip 2015 14:01
    Atreyu Makiavel
    Poziom 34  

    To znaczy, że wciskasz joystick podczas wybierania kierunku. Da się bez wciskania wybrać kierunek, trzeba zwyczajnie mniej siły przykładać do nacisku a bardziej skupić się na wychyleniu joysticka.

  • #22 25 Lip 2015 14:24
    w1941s
    Poziom 14  

    Sprawdzę i dam znać.

    EDIT:
    Faktycznie, ale trzeba naprawdę delikatnie wcisnąć, żeby nie załączyć CENTER, przy normalnym użytkowaniu bardzo trudne przynajmniej u mnie. Może mam wyrobiony joy.

  • #23 26 Lip 2015 23:32
    Atreyu Makiavel
    Poziom 34  

    To teraz popraw te bzdury na schematach...

  • #24 27 Lip 2015 16:28
    w1941s
    Poziom 14  

    Proszę bardzo, poprawione :).
    Przenośna konsola do gier - atmega8 + lcd3310.

  • #25 27 Lip 2015 16:48
    Atreyu Makiavel
    Poziom 34  

    Zamiast poprawić lub usunąć poprzednie wprowadzające w błąd to zamieściłeś kolejny oczywisty i znany każdemu zainteresowanemu takim joystickiem.

TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo