This is an old revision of the document!
Acest proiect consta in realizarea unei console de jocuri retro (asemanatoare clasicului GameBoy), construita “from scratch” pe un breadboard in jurul unui microcontroler ATmega328P standalone.
* Ce face: Consola ruleaza jocuri clasice (precum Snake, Pong etc.) care nu sunt stocate in mod permanent in memoria procesorului, ci sunt incarcate dinamic de pe carduri MicroSD, acestea actionand asemenea “casetelor” fizice din anii '90. * Scopul lui: Depasirea limitarilor hardware ale arhitecturii Harvard (separarea memoriei de date de cea de program) de pe ATmega328P, prin implementarea unui SD Bootloader custom care permite auto-reprogramarea (self-programming) microcontrolerului pe loc. * Ideea de la care am pornit: Nostalgia consolelor clasice si dorinta de a crea un sistem modular, in care schimbarea jocului sa presupuna o actiune fizica (schimbarea cardului), fara a mai conecta placa la un laptop pentru scriere de cod. * De ce este util: Pentru mine este un exercitiu excelent de intelegere a memoriei flash, protocolului SPI si sistemelor de fisiere (FAT32) la nivel bare-metal. Pentru ceilalti, poate servi ca platforma educationala de dezvoltare a jocurilor embedded cu resurse extrem de limitate.
Arhitectura sistemului se bazeaza pe o unitate centrala de procesare minimala, a carei functionalitate se extinde prin periferice de intrare (butoane), iesire (display) si memorie (card SD).
Module si interactiune: - Unitatea de procesare: Microcontrolerul ATmega328P. Acesta orchestreaza intregul sistem. La pornire (reset), executa codul din sectiunea de bootloader. - Sistemul de memorie (SPI): Modulul MicroSD comunica pe magistrala SPI. Bootloader-ul monteaza sistemul FAT, cauta un fisier binar (.HEX sau .BIN) si, daca gaseste o “caseta” noua, scrie continutul in memoria Flash interna a MCU, dupa care cedeaza controlul jocului. - Sistemul grafic (I2C): Un ecran OLED de 0.96 inch (sau 1.3 inch) primeste bufferele de pixeli prin protocolul I2C. Consuma doar doi pini (SDA, SCL) si ofera un contrast perfect pentru jocurile retro pixel-art. - Interfata de control (Digital IO): Un set de butoane configurate in format D-Pad (Sus, Jos, Stanga, Dreapta + Actiune). Acestea folosesc rezistentele interne de pull-up ale MCU-ului si comuta in LOW la apasare, eliminand nevoia componentelor externe. - Modulul de alimentare: O sursa externa (baterie 9V) este stabilizata la 5V curat de un regulator liniar L7805CV, protejat de condensatori de decuplare, oferind curentul necesar atat cipului, cat si ecranului si modulului SD.
Design-ul fizic a fost conceput pentru a fi cat mai compact si stabil, folosind fire rigide pe breadboard pentru a minimiza “padurea” de cabluri si a oferi un aspect curat.
Lista de piese: * 1 x Microcontroler Microchip ATmega328P-PU (fara placa Arduino) * 1 x Cristal oscilator de 16 MHz si 2 x Condensatori ceramici de 22pF * 1 x Regulator de tensiune L7805CV + Condensatori filtrare (10uF / 100uF) * 1 x Display OLED 0.96” (sau 1.3”) I2C (Driver SSD1306/SH1106) * 1 x Modul cititor MicroSD Card (Interfata SPI) * 5/6 x Micro-switch-uri (Butoane tip push pentru D-Pad si comenzi) * 1 x Breadboard 830 puncte * Fire de conexiune rigide si flexibile * 1 x Conector baterie 9V
Dezvoltarea software este impartita in doua mari categorii: Bootloader-ul de sistem (care gestioneaza memoria) si Engine-ul jocurilor (firmware-ul efectiv).
* Mediu de dezvoltare: PlatformIO. * Librarii: Se vor folosi biblioteci adecvate pentru ecranul OLED si pentru citirea sistemului de fisiere FAT de pe cardul SD. * Bootloader-ul (Miezul proiectului): Se foloseste o varianta derivata din 2000-Lines-of-Code SD Bootloader (sau zbm-h/sd-bootloader). Acesta ocupa primii octeti din Flash si implementeaza direct functiile SPM (Store Program Memory) ale AVR-ului. * Logica jocului (Ex: Snake): Foloseste un sistem de tip Game Loop (Update & Draw). Memoria RAM de doar 2KB a ATmega328P limiteaza buffer-ul grafic, motiv pentru care randarea se face prin paginare sau direct pe componente bloc (8×8 pixeli) pentru a salva memorie. Butoanele sunt citite pe baza de polling in bucla principala sau prin Pin Change Interrupts.
(Sectiunea va fi completata pe masura ce avanseaza asamblarea componentelor si primele teste pe breadboard.)
(Sectiunea va fi completata la finalizarea proiectului.)
(Aici va fi adaugata arhiva cu fisierele sursa dupa finalizare.)
* Saptamana 1: Achizitionarea pieselor hardware. Planificarea pinilor. Realizarea montajului de baza (circuitul de alimentare pe breadboard si testarea functionarii cipului ATmega328P “in gol”). * Urmeaza: Conectarea ecranului OLED si implementarea butoanelor de control pentru a testa partea vizuala a proiectului.
* Datasheet-ul pentru ATmega328P. * Documentatia modulelor OLED si SD Card. * Resursele si laboratoarele din cadrul materiei de Proiectare cu Microprocesoare (I2C, SPI).