Radu - Cristian SEZCIUC - X si 0 cu matrice de LED-uri

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Ce face?

Proiectul format de mine se bazeaza pe o matrice de LED-uri ce reprezinta suprafata pe care se desfasoara jocul X si 0. Matricea contine 6×3 led-uri, reprezentand 3×3 perechi de led-uri de culori diferite. Acesta poate fi jucat de catre doua persoane, una dintre ele putand opera doar pe matricea de LED-uri de culoare verde (ca reprezentand X-ul) iar cealalta putand opera pe matricea de LED-uri de culoare alba ( ce reprezinta 0-ul).

Pe placa sunt prezente doua butoane, primul dintre ele folosind la selectia LED-ului iar al doilea la marcarea spatiului ocupat de unul dintre cei doi jucatori. Avand in vedere ca un jucator va fi reprezentat de o culoare (alb sau verde), in cadrul unei perechi de doua led-uri (LED verde- LED alb) nu poate fi selectat ca fiind aprins maxim unul dintre cele doua. Altfel spus, o casuta din cele 9 va fi marcata doar o data, niciodata doua led-uri din aceeasi pereche neputand fi aprinse simultan.

Randul fiecarui jucator este schimbat automat de placuta de baza dupa apasarea butonului de marcare a LED-ului. In momentul in care in cadrul a 3 perechi alaturate de LED-uri (linie, coloana sau diagonala), LED-urile aprinse sunt de aceeasi culoare, un jucator castiga.

Scopul proiectului

Din punctul meu de vedere, scopul proiectului a fost implementarea unei tehnici de multiplexare asupra unei matrice de leduri si coordonarea acestora la nivel de cod sub forma unui joc. Nu in ultimul rand, scopul acestuia a fost destinderea celor care il practica.

Descriere generală

Schema bloc a proiectului:

Cand jocul incepe, este randul jucatorului alb. Acesta poate folosi primul buton pentru a lumina unul dintre cele 9 led-uri albe pe care le poate controla, iar apoi al doilea pentru a-l marca, a-l lumina definitiv. Selectia acestuia se materializeaza prin luminarea led-ului selectat pana la sfarsitul jocului. Dupa selectie, randul revine celuilalt jucator, care reia procesul.

Dupa fiecare selectie, se testeaza daca au fost luminate 3 led-uri de aceeasi culoare consecutive pe diagonala, linie sau coloana. Daca da, atunci se alege castigatorul.

Hardware Design

Lista de piese:

  • 18 LED-uri de 5mm
  • Placuta de baza
  • 9 tranzistoare de tip 2n3904
  • 2 butoane
  • 15 rezistente de 1Kohm
  • Placuta de test
  • fire de legatura

Am efectuat multiplexarea conectand catozii led-urilor de pe fiecare linie intre ei si anozii led-urilor de pe fiecare coloana. Fiecare linie astfel duce la un tranzistor cu baza la Pinii din portul A, si emitorul la masa. De asemenea, fiecare din cele 6 coloane duc la 6 tranzistori cu baza la pinii din portul C si colectorul la Vcc. Am adaugat, desigur, rezistente unde a fost nevoie. Butoanele au fost conectate la 2 pini din portul A.

Desi pentru 18 led-uri am avut suficienti pini la porturile microncontroller-ului, am vrut sa efectue multiplexarea led-urilor pentru ca mi s-a parut o tehnica interesanta. Astfel, am avut nevoie doar de 9 pini din porturile microcontroller-ului.

Software Design

Software folosit:

  • Eagle
  • WinAvr
  • Programmer's Notepad

Pentru a exprima la nivel de cod starea ledurilor, m-am folosit de o matrice de 6×3 care retine valoarea 1 pentru un LED aprins si valoarea 0 daca este stins. Astfel, pot decide foarte usor cand unul dintre jucatori castiga si jocul se termina.

Deoarece am multiplexat led-urile folosite, aprinderea unuia dintre ele se face setand pinii asociati liniei si coloanei din care face parte LED-ul pe 1. Pentru asta, am avut nevoie de doua functii ce setau acesti pini, aprinzand sau stingand un anumit led. Functiile primeau ca parametru indexul ledului din cadrul matricii, de la 0 la 17. Prin urmare functiile folosite, au fost: deseneaza_matrice(), aprinde_led(int index), si stinge_led(int index).

Nu am avut nevoie de librarii sau surse 3rd-party. In functia principala, in cadrul unei bucle infinite, testam permanent starea butoanelor. In caz ca unul dintre ele era apasat, valorile din matricea de leduri era schimbata in functie de proprietatile fiecarui buton. La finalul buclei, se scana matricea apelandu-se functia deseneaza_matrice(), cea care imi aprinde efectiv grupul de leduri dorit.

Nu am avut nevoie nici de algoritmi speciali, dificultatea acestui joc constand in aprinderea fiecarui LED independent de ceilalti. Acest lucru este imposibil simultan, deoarece toate LEDurile sunt conectate pe linii si pe coloane, dar datorita notiunii de “Persistence of vision” se poate da impresia ca doua leduri alaturate sunt aprinse simultan fara ca celelalte leduri legate la aceiasi pini sa nu se aprinda. Explicatia sta in faptul ca daca cele doua leduri se aprind pe rand, foarte repede, frecventa schimbarii lor este mai rapida decat poate detecta ochiul uman.

Rezultate Obţinute

Lipire componente pe placuta de test:

Din pacate, proiectul nu a fost finalizat, existand cateva buguri in codul sursa al acestuia.

Concluzii

Desi lucrurile nu au mers poate la fel de bine asa cum ma asteptam, consider acest proiect unul nepretuit deoarece am putut sa aprofundez cunostintele legate de microcontrollere, dar mai ales pentru ca am avut ocazia realizarii unui proiect foarte practic, placut de realizat si care necesita multa indemanare: atat in a scrie cod cat si in a aplica cunostintele invatate la materiile ce graviteaza in jurul PM-Electronica.

Download

Bibliografie/Resurse

  • Laboratoarele efectuate in cadrul materiei Proiectarea cu Microprocesare.
  • Datasheet-urile elementelor din circuit folosite.
pm/prj2013/avoinescu/x-si-0-baza-pe-matrice-de-led-uri.txt · Last modified: 2021/04/14 17:07 (external edit)
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