Introducere

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.

Descriere generală

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ă.

Hardware Design

Listă piese/prețuri:

  • ATMEGA16 (placa standard din etapa 1 a proiectului)
  • 36 de leduri (12 portocalii, 12 roșii, 12 verzi) 36*0.16 RON
  • 13 butoane (12 pentru selectarea variantelor, 1 pentru SUBMIT) 13*0.15 RON
  • 4 rezistențe de 1k, 9 rezistențe de 330 și 4 tranzistoare NPN pentru matricea de leduri 4*0.1+9*0.1+4*0.1 RON
  • 4 senzori foto (slotted opto sensor) RPI-574 (photointerrupter) pentru cititor 4*1.07 RON
  • 4 rezistențe de 10K și 4 condensatoare 150pF pentru senzori 4*0.1+4*0.05 RON
  • 4 sockeți pentru conectarea la porturile microcontroller-ului 4*0.5 RON
  • bandă conectori 2 RON
  • PCB 11.2 RON

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).

Software Design

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:

  • Inițializări
  • Se așteaptă până când se citește codul cartelei (ca valoare a pinilor legați la output-ul senzorilor)
  • Se scanează matricea de leduri.

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

}

  • În paralel, se aprind în contratimp ledurile portocalii din dreptul răspunsurilor selectate
  • După apăsarea butonului submit se va aprinde în dreptul răspunsurilor selectate un led roșu sau verde în funcție de corectitudinea răspunsului dat

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.

Rezultate Obţinute

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.

Concluzii

Download

Arhiva ce conține codul și schemele.

332cb_pricochianamaria.zip

Bibliografie/Resurse

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

pm/prj2010/amocanu/tester.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