Autorul poate fi contactat la adresa: Login pentru adresa
Ce face?
Acest proiect implementeaza clasicul joc X si 0. Jocul consta in completarea unei placute cu leduri (aprinderea lor), pana cand unul din cei 2 jucatori are 3 leduri aprinse pe diagonala, orizontala sau verticala.
Aprinderea led-urilor este insotita de buzzer. Pe langa cele 25 de perechi de leduri rosii si verzi(unul pentru fiecare jucator), se mai gasesc 2 led-uri de selectie, care anunta ce jucator este la rand. Se folosesc si doua butoane: unul clasic pentru exprimarea dorintei jucatorului de a selecta un led, si butonul de la touch pentru navigarea prin placuta a unui jucator inainte de alegerea ledului ce doreste a fi aprins.
Scopul lui?
Deprinderea anumitor competente de proiectare si folosirea cat mai multor lucruri invatate la PM(pentru mine), jocul (deci scop de relaxare) pentru cine il va folosi.
Jocul porneste la alimentarea cu energie. LA inceput nu este aprins niciun led, decat cel ce anunta ce jucator este la rand(unul din cele 2 leduri de selectie). Cu ajutorul qtouch-ului, jucatorul navigheaza prin placa de joc si poate alege unul din cele 25 de unitati care nu au fost deja alese. La apasarea butonului clasic, are loc selectia, un sunet specific, dupa care se inatampla acelasi lucru pentru celalalt jucator. Asta se intampla pana cand un jucator castiga(are 3 leduri aprinse la rand pe diagonala, orizontala, verticala)
Lista de piese:
Avand la dispozitie 26 de pini liberi pe placa de baza, nu puteam controla individual 52 led-uri + buzzer. Asa ca am avut nevoie de multiplexare. Ledurile se vor aprinde pe rand, dar la frecventa microcontrollerului com avea impresia ca sunt toate aprinse inacelasi timp.(de accea am avut nevoie doar de o rezistenta, pusa spre masa totutror ledurilor.
Aceasta este schema celor 8 multiplexoare 1:8 necesare mulitplexarii semnalului, controlului celor 52 leduri. Acestea sunt asezate in cascada, M0 facand selectia intre celelalte multiplexoare. Fiecare multiplexor, pe langa alimentare, etc. are un pin de activare si 3 de selectie. Avand 8 multiplexoare, avem pentru
In total, avem 25 de pini necesari. Acestia sunt disponibili pe placa de baza. Pe langa acesta, am mai avut nevoie de 1 pin pentru buzzer. Acesta nu l-am inclus in schema multiplexoarelor, pentru un mai bun control(PVM).
Observam ca M3 are doar 4 pini de iesire pentru leduri, deoarece avem nevoie de doar 50 de leduri pe tabla si 2 de selectie, si nu de 7*8 = 56, capacitatea reala a asezarii multiplexoarelor.
Deasemenea, avand doar 7 multiplexoare sub controlul M0, acesta din urma are un pin liber. Detaliile despre fiecare led in parte si succesiunea de pini ce il controleaza sunt in fisierul de software. Am realizat acolo o structura de date board, care contie elemente de tip led_t. Acestea din urma contin starea, si pinii din cele 4 porturi ce trebuie activti pentru a se aprinde ledul respectiv. In modul acesta am control asupra tuturor ledurilor.
Schema de mai sus este legata, cum am spus, cu pinii de selectie(cei albastri) la pinii de control ai microcontrelerului. Pe langa aceste multiplexoare, mai folosim un pin de selectie pentru buzzer, iar touch-ul si celalalt buton erau integrate in paca de baza.
Pinii exacti ce controleaza fiecare multiplexor sunt prezenti in documentele software.
Mediu de dezvoltare
Am folosit AVR Studio.
Surse si functii implementate
Nu a fost nevoie de librarii sau surse 3rd-party si nici nu aveam nevoie de vreun algoritm special. Partea mai complicata a fost maparea pinilor pe fiecare led, si anume retinearea pentru fiecare led a pinilor ce trebuie aprinsi, pentru a activa multiplexoarele necesare aprinderii led-ului.
Astfel, trebuia selectia de la M0 pe multiplexorul aferentledului,plus selectie la multiplexorul aferent ledului. Asa ca am facut o structutra led ce contine starea si valorile PORTA, PORTB, PORTC SI PORTD necesare aprinderii. Acestea au fost integrate intr-o alta structura board ce contine cele 50 de leduri(2 pentru fiecare element din matrice 5×5 - verde si rosu). Pe langa acestea, am integrat ledurile de selectie.
Astfel, am obtinu o matrice 5X5X2 de leduri usor controlabile software. Restul este exident.
Functii:
Nu am reusit sa termin, desi m-am apucat din timp. Problema a fost ca a a fost nevoie de aproximativ 14 m de fir de legatura, in 500-700 de luipituri. Inainte de lipiturile finale, legare mux in cascada, am verificat si toate ledurile functionau corect. Am lipit si mux-urile in cascada, deasemenea, functioneaza corect. Insa la lapirea cu placa principala am avut ceva probleme. Desi am stat muuulte ore pe la laborator in ultimele saptamani, nu am reusit sa vad ce nu merge. Cel mai probabil am niste scurturi, insa cum acum laboratorul este foarte ocupat nu am avut acces la multimetru. Ideea e ca m-am uitat foarte atent la care ar fi greseala, dar urmeaza o sectiune de poze din care o sa intelegeti dificultatea aflarii bug-ului. Probabil daca mai aveam cateva ore cu toate materialele necesare puse la dispozitite reuseam, dar asta e:)
Oricum, ideea e ca hardware-ul e complet, iar software-ul jumatate. Doar un mic bug, pasii necesari au fost urmati.
Asta e multitudinea de fire. Ce e ciudat e ca toate cele de pe placa de test sunt legate bine, le-am testat. Problema e la cele ce leaga placa de test de placa de baza. Cum am mai spus, nu am mai avut ocazia sa testez.
Si asta e fata placutei, spatiul de joc.
Datasheeturile pentru elementele folosite in circuit(prezente in arhiva)
Laboratoarele de PM.