Dziś opiszę jak zrobić prostą gierkę w sudoku na atmedze 328p i kolorowym wyświetlaczu ze sterownikiem ILI9341. Może się przydać na nudnym wykładzie itp :)
Materiały
Do wykonania tego projektu będą potrzebne:
– atmega 328p
– wyświetlacz 2,2” ILI9341
– 6 switchy
– kawałek laminatu jednostronnego
– garść podstawowych elementów (rezystory, kondensatory itp. wszystko widać na schemacie)
– jako źródło zasilania użyłem baterii ze starego tabletu, daje ona napięcie ok 3,7V
Wykonanie:
Płytkę wytrawiamy według schematu:
Na schemacie oraz płytce znajduje się miejsce na kwarc, jednak okazało się, że jest on zbędny i taktowanie 8MHz w zupełności wystarcza.
Osobiście stosuję metodę termotransferu. Poniżej kilka zdjęć z przebiegu:
Następnie pocynowałem płytkę stopem Lichtenberga:
Po polutowaniu i uruchomieniu wygląda to tak:
Z takiej baterii zasilam swój układ.
Na schemacie trzeba też uwzględnić jedną poprawkę – myślałem, że mogę wykorzystać pin MISO do innych celów, jednak byłem w błędzie i musiałem dorobić zworkę od pinu MOSI do PB0.
Do programowania układu wykorzystane są wyprowadzenia wyświetlacza i dodatkowy pin do resetu ( nad czerwonym przyciskiem resetu).
Działanie:
Muszę przeprosić za jakość zdjęć – kolory są całkiem inne w rzeczywistości, tylko niestety mój aparat tego nie ogarnia.
Po uruchomieniu wita nas krótka animacja i ekran startowy:
Następnie musimy wybrać nr planszy. W moim kodzie jest ich 5 – kolejne możecie dodać na ich podstawie wytłumaczę co i jak w części opisującej kod:
Tutaj po wczytaniu planszy:
Teraz przemieszczamy się “strzałkami” po planszy, środkowy przycisk to “enter”. Po jego wciśnięciu możemy przyciskami lewo/prawo wybrać jaką cyferkę mamy wstawić w polu na którym się znajdujemy. Możemy wtedy wcisnąć też dolny przycisk – spowoduje to wymazanie wartości z komórki, natomiast w przypadku górnego przycisku – jego podwójne wciśnięcie to sprawdzenie planszy – podświetlają się na zielono pola poprawnie wypełnione, potrójne wciśnięcie to zakończenie gry i wybór nowej planszy.
Widać to trochę lepiej na poniższym filmiku:
Program
Program napisany został w języku C w środowisku Eclipse LUNA.
Zajmuje on 5592B więc bez problemu wejdzie też na atmegę8, jednak nie miałem pod ręką wersji na niższe napięcie.
Dodawanie własnych plansz:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const char tab0[] PROGMEM = {3,0,0,0,4,0,2,0,0,2,5,0,0,0,3,7,4,0,0,0,4,0,5,1,0,8,0,0,3,0,0,6,0,9,0,7,0,4,0,8,0,7,0,0,0,0,6,0,0,0,5,4,2,0,7,0,0,0,2,8,6,0,0,0,9,0,3,0,0,0,5,2,4,2,0,0,1,0,0,7,0}; const char tab1[] PROGMEM = {0,0,4,0,5,2,1,0,8,0,2,7,1,0,0,4,0,0,9,0,0,0,7,0,0,6,0,0,5,0,7,0,9,0,4,0,0,8,1,0,4,0,5,0,0,4,0,0,8,0,0,3,1,0,0,7,0,0,9,0,0,0,2,2,0,0,0,0,7,9,3,0,5,0,3,2,6,0,7,0,0}; const char tab2[] PROGMEM = {0,0,3,4,0,0,8,0,9,0,1,6,8,2,0,3,0,0,4,0,0,0,6,0,0,0,2,0,0,0,0,0,4,0,3,7,6,9,8,0,3,0,5,1,0,0,0,4,9,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,7,5,9,6,4,2,0,5,0,2,0,7,0,6,0,0}; const char tab3[] PROGMEM = {0,3,0,8,0,5,4,0,1,0,0,2,0,0,1,0,8,0,8,0,9,0,2,0,0,0,6,0,6,8,0,0,3,2,0,0,0,0,7,0,5,0,0,0,0,0,5,0,2,0,9,6,3,7,6,0,4,0,3,0,7,0,0,0,9,0,5,0,7,1,4,0,1,0,0,0,0,8,0,6,2}; const char tab4[] PROGMEM = {0,1,5,0,7,0,0,0,9,0,4,0,5,6,9,0,0,1,2,0,0,0,0,0,0,5,3,0,6,0,0,9,0,0,1,4,4,0,1,0,0,5,0,0,2,3,0,0,2,1,0,0,6,0,0,3,0,4,0,0,0,0,7,1,5,0,7,0,3,0,9,0,6,0,0,0,8,0,4,3,0}; const char tab_0[] PROGMEM = {3,8,1,7,4,9,2,6,5,2,5,9,6,8,3,7,4,1,6,7,4,2,5,1,3,8,9,5,3,8,4,6,2,9,1,7,1,4,2,8,9,7,5,3,6,9,6,7,1,3,5,4,2,8,7,1,3,5,2,8,6,9,4,8,9,6,3,7,4,1,5,2,4,2,5,9,1,6,8,7,3}; const char tab_1[] PROGMEM = {6,3,4,9,5,2,1,7,8,8,2,7,1,3,6,4,9,5,9,1,5,4,7,8,2,6,3,3,5,2,7,1,9,8,4,6,7,8,1,6,4,3,5,2,9,4,6,9,8,2,5,3,1,7,1,7,8,3,9,4,6,5,2,2,4,6,5,8,7,9,3,1,5,9,3,2,6,1,7,8,4}; const char tab_2[] PROGMEM = {7,2,3,4,5,1,8,6,9,9,1,6,8,2,7,3,4,5,4,8,5,3,6,9,1,7,2,2,5,1,6,8,4,9,3,7,6,9,8,7,3,2,5,1,4,3,7,4,9,1,5,2,8,6,8,6,9,2,4,3,7,5,1,1,3,7,5,9,6,4,2,8,5,4,2,1,7,8,6,9,3}; const char tab_3[] PROGMEM = {7,3,6,8,9,5,4,2,1,5,4,2,6,7,1,9,8,3,8,1,9,3,2,4,5,7,6,9,6,8,7,1,3,2,5,4,3,2,7,4,5,6,8,1,9,4,5,1,2,8,9,6,3,7,6,8,4,1,3,2,7,9,5,2,9,3,5,6,7,1,4,8,1,7,5,9,4,8,3,6,2}; const char tab_4[] PROGMEM = {8,1,5,3,7,2,6,4,9,7,4,3,5,6,9,2,8,1,2,9,6,1,4,8,7,5,3,5,6,2,8,9,7,3,1,4,4,8,1,6,3,5,9,7,2,3,7,9,2,1,4,5,6,8,9,3,8,4,5,6,1,2,7,1,5,4,7,2,3,8,9,6,6,2,7,9,8,1,4,3,5}; char* tablica_wskaznikow[9] = {tab0,tab1,tab2,tab3,tab4}; char* tablica_wskaznikow2[9] = {tab_0,tab_1,tab_2,tab_3,tab_4}; |
Tak wyglądają moje wgrane plansze. Tablice tab0-tab4 zawierają elementy, które mają się wyświetlić przy rozpoczęciu nowej gry dla danej planszy. Tablice tab_0-tab_4 zawierają ich pełne rozwiązania zakładając, że prawdziwe sudoku ma tylko jedno rozwiązanie. Tablice wskaźników do nich przekazywane są do odpowiednich funkcji wyświetlających.
Zapisywane są one do pamięci flash mikrokontrolera, stąd te atrybuty “PROGMEM” przy nich.
Wszystkie pliki można pobrać tutaj: pliki.
Dałbym 5, ale za tekst
/garść podstawowych elementów (rezystory, kondensatory itp. wszystko widać na schemacie)/
daję 3.
Czemu tak nisko oceniasz kolegę za to, że pominął coś co jest oczywiste – minimalne podłączenie pinów procesora ?
Dlatego, że (garść podstawowych elementów) nie jest niczym jasnym dla początkującego który to czyta. Jedni są bardziej w temacie inni mniej. Więc publikując wpis liczyć się też trzeba z innymi użytkownikami. Oczywiście pomijając to że na schemacie można to znaleźć. Myślę, że autor nie ma mi tego za złe.
Początkujący raczej nie zabiera się za robienie sudoku na atmedze i obsługę wyświetlacza graficznego
Obsługa wyświetlacza to autorski kod czy przetłumaczony gotowiec ?
Sposób inicjalizacji pozlepiany ze znalezionych przykładów. Reszta funkcji przerobiona z mojej biblioteki do wyświetlacza z nokii 5110.
Skoro korzystasz już z SPI, nie myślałeś o wpakowaniu tam karty SD ? Oczywiście zawierającej dużą liczbę plansz.
Jedna plansza zajmuje ok 162B, więc na atmedze 328p można zmieścić ich sporo.
Ale nie jest tak łatwo zmienić plansze :) jak na karcie
A jak rozwiązałeś problem migotania ekranu przy odświeżaniu.
Bo na tym samym wyświetlaczu ma termometr i przy każdym odświeżeniu temp . ekran mi miga.
Nie zauważyłem u siebie migania – nawet przy odświeżaniu całego ekranu. Może to kwestia filtracji zasilania ?
Co innego miganie na filmikach – ono nie jest widoczne gołym okiem.
Proponuje pójść dalej – ten ekran jest (chyba) dotykowy, o wiele user-friendly byłoby wprowadzanie rysikiem w miejsce kursorów.
Niestety nie jest to ekran dotykowy. W przyszłości muszę sobie taki sprawić :)
Gadżet bez obudowy. Bez obudowy to widać, a gadżet bo każdy ma to przy sobie (w telefonie).
Jako przenośne urządzenie to może nie bardzo ale jako efekt nauki i zajawki to pełen szacunek. 5 gwiazdek i bez gadania.
Swietny projekt. Atmelowskie AVR-ki maja ogromone mozliwosci, wszystko zalezy od konstruktora, ogranicza go jedynie poziom kreatywnosci. Co do propozycji wykorzystania sudoku przez autora, na nudne wyklady zgodze sie, sam klepalem wielokrotnie (papierowe oloweczkiem :D) ale za te glosne microswitch’e moj wykladowca wywalil by mnie za drzwi od razu :D, jak udawac ze sie slucha to dyskretnie.
Mogę się pochwalić, że projekt przeszedł na kolejny poziom i nawet został opisany w Elektronice praktycznej – numer EP07/17 :)