Acest proiect are ca scop dezvoltarea unui dispozitiv ce permite efectuarea de teste grilă.
Dispozitivului poate înlocui metodele clasice de efectuare a testelor grilă (pe hârtie), dar și pe cele moderne (calculator).
Poate fi util în cazul în care testele sunt efectuate de persoane fără abilități de utilizare a calculatorului datorită simplității funcționalităților sale. De asemenea poate fi utilizat atunci când, din diverse motive, nu se dorește utilizarea calculatorului în acest scop.
Dispozitivul folosește seturi de până la 16 cartele pentru un anumit test. Fiecare cartelă are 4 întrebări cu 3 variante de răspuns (maxim 64 întrebări pe test) și este identificată printr-un cod de 4 biți. Utilizatorul selectează răspunsul corect apăsând butonul din dreptul variantei pe care o consideră potrivită. Un led îi semnalează răspunsul corect. Există posibilitatea de a modifica răspunsul, corectarea variantelor alese nefăcându-se decât la apăsarea tastei SUBMIT. Abia după aceea se va semnala (prin aprinderea unui led verde sau roșu) dacă a răspuns corect sau nu.
Următoare imagine reprezintă o schemă de ansamblu a modului cum va arăta hardware-ul, cât și o cartelă de test grilă.
Listă piese/prețuri:
Piesele au fost cumpărate de la Comet Electronics.
Schema proiectului (în Proteus) [incompletă, mai trebuie partea de cititor]
Schema părții de cititor [Nu am găsit în Proteus RPI-574, așa că am încercat să realizez schema echivalentă și să desenez capsula pentru a exista cel puțin o imagine de ansamblu]
Senzorul, dacă este alimentat, va da pe ieșire 1 în caz că fanta este acoperită și 0 dacă raza inflaroșu trece.
Pentru aprindera ledurilor și citirea butoanelor folosesc matrici de componente; astfel folosesc mai multe leduri și butoane decât mi-ar permite microcontroller-ul.
Un led se aprinde dacă ieșirea pinilor microcontroller-ului este atât pe coloană cât și pe linie 1.
Pentru a verifica dacă un buton este aprins se folosește un algoritm de scanare a tastaturii (matrix keyboard decoder).
Proiectul va fi dezvoltat in C, folosind avr-gcc. Pentru simulare am folosit Proteus.
Una dintre problemele întâlnite a fost că în momentul aprinderii ledurilor de pe o diagonală se aprindeau și cele de pe diagonală opusă (ambele perechi de leduri fiind comandate de același set de două linii și două coloane). Am rezolvat această problemă în software aprinzând pe rând în continuu ledurile ce trebuie să fie aprise la un moment dat (pentru o viteză a schimbărilor destul de mare se poate ochiul uman putând chiar să nu perceapă stingerile și aprinderile succesive, ci să aibă impresia că ledurile sunt mereu aprinse).
Algoritmul are următorii pași:
Algoritm de scanare a ledurilor
unsigned char get_key() {
unsigned char i, key=1; for(i=0;i<4;i++){ //pentru fiecare din cele 4 linii PORTA &=~(0x80>>i); //devine pe rand fiecare linie 0 //verificam prima coloana if(!(PINA & (1<<PA0))){ //stim ca e butonul de pe prima coloana key += 0; //asteapta pana se elibereaza butonul while(!(PINA & (1<<PA0))); return key; } //verificam a doua coloana if(!(PINA & (1<<PA1))){ //stim ca e butonul de pe a doua coloana key += 1; //asteapta pana se elibereaza butonul while(!(PINA & (1<<PA1))); return key; } //verificam a treia coloana if(!(PINA & (1<<PA2))){ //stim ca e butonul de pe a treia coloana key += 2; //asteapta pana se elibereaza butonul while(!(PINA & (1<<PA2))); return key; } key +=3; //urmatorul rand //linia ce era pe 0 redevine 1 PORTA |= 0x80>>i; } return FALSE; //intoarce FALSE daca nu am apasat niciun buton
}
Notă: Am adăugat în această secțiune doar codul pentru funcția de scanare a matricii pentru că restul sunt doar inițializări porturi, aprinderi și stingeri de leduri în funcție de niște condiții, citirea unui buton, verificarea input-ului pe un pin, neavând o mare importanță algoritmică. Întregul cod se găsește în secțiunea de download.
Inițial am încercat să dezvolt partea de cod și să o testez folosind Proteus. Deși Proteus poate fi o unealtă utilă, are limitări sale (nu permite utilizarea ca input a tuturor pinilor, eroarea „timestep to small”, etc.). Am reușit să testez codul pe funcționalități în cea mai mare măsura, pentru a mă asigura că software-ul rulează corect (cel puțin în principiu).
Am pornit de la următoarele componente + fludor + cablu utp
Următoarele imagini reprezintă partea de matrice de butoane, matrice de leduri și buton submit, față și verso
Ar fi fost o idee mult mai bună să lucrez cu o plăcuță corodată. În varianta cu plăcuța de test a fost nevoie de multe fire, care s-au tot adunat până la rezultatul acesta. Cablul UTP n-a fost iarăși cea mai inspirată alegere; pe măsură ce lucram, izolația avea tendința să se decojească în unele locuri de la căldura letconului, chiar și la câțiva centimetri distanță. În zonele în care am detectat atingeri am reacoperit firele folosind învelișul UTP. Încercările de a schimba cablu nu făceau decât să producă mai multe pagube, pentru că se adunaseră fire în jur.
Am testat conexiunile cu multimetrul și totul pare a fi în ordine, toate liniile de circuit au continuitate, ledurile se aprind la comanda pe linie si coloana.
Partea de senzor am făcut-o separat. Astfel există un plus de mobilitate, nelimitând zona în care pot dispune codul.
Arhiva ce conține codul și schemele.
Key Switch Encoding/Decoding: keyswitch.htm
Matrix Keyboard Decoder: doc2532.pdf
Datasheet RPI-574: RPI-574.html
Photointerrupters (tipuri si aplicații): viewer
Circuite care îmbunătățesc performanțele dispozitivelor optice: viewer