This is an old revision of the document!


Arduino Graphix

Nume: Popa Andrei

Grupă: 333CA

Introducere

Arduino Graphix este un demo de pipeline grafic software implementat pe microcontrolerul ATmega328P. Se afișează pe un ecran LCD un mediu 3D, iar utilizatorul se poate folosi de un keypad pentru a modifica perspectiva de vizualiare (pentru a mișca camera).

Sistemul este format din 2 plăcuțe cu microcontroler ATmega328P:

  • plăcuța 1 joacă rolul unui GPU: va fi responsabilă să deseneze scena pe un ecran LCD într-un timp cât mai scurt.
  • plăcuța 2 joacă rolul unui CPU: va ține cont despre obiectele din scenă și despre cameră și va transmite informațiile relevante către “GPU” și va procesa inputul de la keypad (utilizator).

Motivul pentru care am ales acest proiect este interesul meu față de modul de funcționare a procesoarelor video și modul prin care acestea interacționează cu restul sistemului de calcul pentru a prezenta/desena informații pe un display.

Scopul meu principal este de a învăța prin experiență cum se implementează un pipeline grafic (chiar dacă este un model software foarte limitat și simplificat) și totodată, ca scop secundar, să scriu de mână un “driver” simplu pentru ecranul LCD.

Ca utilitate pentru mine (și alții), vreau ca proiectul să servească ca un exemplu de compromisuri ce trebuie făcute pentru a obține un pipeline grafic 3D funcțional, dar și utilizabil (cu framerate decent) pe un sistem hardware foarte limitat.

Schemă bloc

Hardware Design

Bill of Materials

Componentă Cantitate Link Preț unitar (RON)
Placă dezvoltare Arduino Uno AtMega 328p 2 Link30.93
Display LCD SPI 1 Link 40.62
Breadboard 1 Link 6.62
Tastatură membrană 3×4 1 Link 4.30
Fire Dupont Tată-Tată 10cm 21 Link0.15
Rezistențe 1k 5 Link0.19
Rezistențe 100k 1 Link0.19
Preț total 117.69 RON

Schema electrică

Pinout

Display LCD:

Pin Display Pin Arduino Pin ATmega328p
BL 5V
RST 5V
DC D10 PB2
CS GND
CLK D13 PB5 / SCK
DIN D11 PB3 / MOSI
GND GND
VCC 5V

Deoarece există doar un singur periferic conectat prin SPI, am conectat pinul de CS (chip select) la GND, astfel acesta este selectat continuu. Pinul de RST (reset) este conectat la 5V (acesta funcționează în logică negată), deoarece nu am nevoie să resetez software display-ul.

Keypad 4×4:

Pin Keypad Pin Arduino PinATmega328p
1 (Column) D2 PD2 / PCINT18
2 (Column) D3 PD3 / PCINT19
3 (Column) D4 PD4 / PCINT20
4 (Column) D5 PD5 / PCINT21
5 (Row) D6 PD6
6 (Row) D7 PD7
7 (Row) D8 PB0
8 (ROW) D9 PB1

Ținând doar câte o coloană a keypad-ului pe high la un moment dat, în funcție de care rând este pe low, obținem ce buton a fost apăsat. Am ales pinii pentru coloană pentru a primi întreruperi în momentul apăsării unui buton. Am ales pinii pentru rând pentru că sunt următorii pini pe plăcuță.

ATmega328P:

Pin Arduino (1) Pin ATmega(1) Pin Arduino(2) Pin ATmega (2)
D0 PD0 / RXD D1 PD1 / TXD
D1 PD1 / TXD D0 PD0 / RXD
GND GND GND GND

Pinii aleși sunt pinii pentru USART și sunt legați RX ↔ TX.

Software Design

Mediu de dezvoltare: Editor de text: Sublime, și atât.

Biblioteci utilizate:

  • avr/io.h
  • avr/interrupt.h
  • util/delay.h
  • stdint.h

Justificarea utilizării funcționalităților din laborator:

  • Timer 1 in mod CTC: Prescaler CLK/64, Top=250 ⇒ Numărător cu frecvență de 1kHz, folosit pentru a număra milisecunde.
  • Întreruperi Hardware Pin Change (Laborator Întreruperi): activate prin regiștrii PCICR și PCMSK2 pe Pinul 2 → permit citirea asincronă a butoanelor din matrice.
  • Modul SPI: comunicarea cu display-ul se face prin SPI
  • Modul USART: comunicarea între plăcuțe se face prin UART.

Scheletul proiectului și interacțiunea funcționalităților: programul este structurat ca un Automat de Stări Finit (FSM) rulat în loop() printr-un bloc “switch-case”:

  • B_IDLE: scanează tastatura pentru stocarea codului, oferă opțiunea de mascare a caracterelor (Hidden / Visible Mode) înainte de armare și gestionează întreruperea de reset.
  • B_ARMED: monitorizează decrementarea cronometrului, sincronizează pulsațiile LED-ului RGB și, la detectarea asincronă a apăsării butonului, randează progresul dezamorsării pe ecran în paralel cu generarea sunetului secundar intercalat.
  • B_EXPLODED / B_DEFUSED: reprezintă stările terminale în care sistemul rulează secvențele audio-vizuale de final (zgomot alb bazat pe frecvențe aleatorii sau melodie de succes), după care reinițializează automat toate variabilele pentru revenirea în starea inițială.

Calibrarea perifericelor și sincronizarea I/O:

  • Stabilizarea electrică a intrării: calibrarea butonului s-a realizat prin activarea hardware a rezistenței interne de Pull-Up a microcontrolerului, fixând o stare stabilă de HIGH în repaus și eliminând zgomotul de fond (efectul de pin flotant).
  • Sincronizarea progresului vizual: calibrarea barei de defuse s-a efectuat prin corelarea timpului fizic de acționare (5 secunde) cu densitatea de pixeli a ecranului. Împărțirea simetrică a intervalului la cele 7 caractere ale codului a determinat o rată de eșantionare de exact 714 ms per segment, asigurând o actualizare fluidă și liniară pe LCD.

Optimizări arhitecturale realizate:

  • Optimizare de timp (Hardware Multitasking): înlocuirea totală a funcției software standard millis() cu un ceas intern generat pe baza Timerului 2. Prin mutarea contorului direct într-o rutină de întrerupere hardware (ISR) la fiecare o milisecundă, s-a eliminat overhead-ul software și s-a redus masiv timpul de ocupare a procesorului.
  • Optimizare de calcul (Eficiență computațională): în cadrul algoritmului de generare a frecvențelor PWM pentru buzzer, operațiile matematice costisitoare (înmulțiri și împărțiri repetitive de numere mari) au fost simplificate direct prin constante pre-calculate hardware în cod. Astfel, procesorul execută o singură operație aritmetică de bază per apel, salvând cicluri critice de ceas în momentele de alertă maximă (mai ales în ultimele 10 secunde până la explozie).

Rezultate Obţinute

Concluzii

Download

Jurnal

  • 7.04.2026 - Alegere tema proiect si confirmare.
  • 7.05.2026 - Creare pagină ocw pentru proiect.

Bibliografie/Resurse

Resurse Hardware

Resurse Software

Export to PDF

pm/prj2026/victor.stoica0203/andrei.popa0810.1779633344.txt.gz · Last modified: 2026/05/24 17:35 by andrei.popa0810
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0