Laboratorul 3 Echipamente de intrare

 

Joystick

1. Introducere

Joystick-ul este un echipament des intilnit in configuratia calculatoarelor personale alaturi de mouse, trackball , tableta de digitizare. Toate acestea sint echipamente de intrare care impreuna cu tastatura permit utilizatorului sa controleze procesele ce se desfasoara in interiorul masinii de calcul . Spre deosebire de celelalte echipamente mentionate mai sus , care au o importanta vitala in utilizarea unui sistem de calcul , joystick-ul nu este indispensabil deoarece principala lui utilizare este in domeniul programelor distractive .

Daca vom desface un joystick vom fi surprinsi de simplitatea lui constructiva deoarece in interiorul lui nu vom descoperi decit niste butoane "foc" ( simple comutatoare normal deschise ) si doua potentiometre ale caror cursoare sint cuplate prin intermediul unor mici angrenaje de plastic cu maneta joystick-ului . Astfel cind deplasam maneta inainte sau inapoi potentiometrul care traduce miscarea pe verticala isi va modifica rezistenta . Analog isi modifica rezistenta si celalalt potentiometru cind deplasam maneta la stinga sau la dreapta .

Ideea unei manete pentru jocuri nu este noua . Joystick-ul a aparut odata cu jocurile video pe calculator , jocuri pentru care tastatura nu erea suficient de ergonomica . Se stie ca vechile calculatoare de tip Spectrum , Comodore sau Amiga , calculatoare destinate in special jocurilor video , dispuneau de o maneta pentru jocuri asemanatoare din punct de vedere al aspectului exterior cu actualul joystick al calculatoarelor de tip PC . Acest tip de joystick nu poate fi utilizat de noile claculatoare PC decit cu o interfata speciala deoarece are doar un buton "foc" iar sesizarea deplasarii manetei pe cele patru directii se face prin patru contacte normal deschise . Cind impingem maneta inainte sau inapoi se vor inchide contactele pentru inainte respectiv inapoi . Analog se intimpla si in cazul in care impingem maneta la dreapte sau la stinga . Astazi acest tip de joystick poarta numele de "joystick digital" deoarece el sesizeaza deplasarea manetei joystick-ului prin nivele logice de "1" sau "0" spre deosebire de joystick-ul actula prezentat pe scurt anterior , care sesizeaza miscarea manetei prin variatia rezistentei unui potentiometru . Acest tip de joystick se mai numeste si "joystick analogic" tocmai din cauza acestui principiu de functionare .

In Figura 1 sunt date citeva tipuri constructive de joystick-uri .



Figura 1

2. Structura interna si functionarea joystick-ului

Joystick-ul se conecteaza la calculator printr-un cablu prevazut cu un conector de tip D - SHELL cu 15 pini . Configuratia pinilor acestui conector este prezentata in Figura 2.


Figura 2

Se observa ca la acest conector se pot conecta doua joystick-uri notate in Figura 3 cu A si B . Fiecare din aceste doua joystick-uri este compus din doua butoane "foc" ce sunt de fapt doua contacte normal deschise ( A1 si A2 pentru joystick-ul A ) , si doua potentiometre ale caror cursoare sunt actionate de mecanismul manetei ( AX si AY pentru joystick-ul A ) si al caror scop este de a sesiza miscarea manetei pe cele doua axe X si Y . Butoanele sunt cum am mai spus simple comutatoare normal deschise legate intre un pin de masa (pinul 4 si 5 pentru joystick-ul A , respectiv pinul 12 pentru joystick-ul B ) , si un pin de intrare specific ( A1 si A2 pentru joystick-ul A , respectiv B1 si B2 pentru joystick-ul B ) . Potentiometrele sunt cuplate intre niste pini de alimentare de +15 V ( care sunt pinii 1 si 8 pentru joystick-ul A si respectiv pinii 9 si 15 pentru joystick-ul B ) si niste pini speciali de intrare ( pinul 3 pentru AX , 6 pentru AY , 11 pentru BX , 13 pentru BY ) .


Figura 3

Schema electrica interna a joystick-ului este foarte simpla , astfel justificinduse pretul relativ redus al unui joystick . Un joystick contine in interior doar doua contactoare si doua rezistente variabile comandate prin niste mici pirghii din material plastic de maneta . Aceasta structura simpla este completata insa de circuitul electric implementat de controler-ul de joystick (care se poate gasi fie pe o placa separata , fie pe placa de sunet , fie pe controlerul Multi-I/O care contine controlerele pentru unitati floppy sau hard disk si pentru porturile seriale sau paralele ) . In figura de mai sus este prezentata schema electrica a acestui circuit .

Din punct de vedere tehnic este vorba despre patru monoflop-uri . Piesa principala a unui monoflop este comparatorul care urmareste diferenta de tensiune intre tensiunea de alimentare de 5V si tensiunea de la bornele condensatorului C ( vezi schema de mai sus ) . Acest condensator se incarca tot de la sursa de tensiune de 5V prin intermediul potentiometrului din joystick ( a carui rezistenta variaza intre 0 si 100 kohmi ) care este insa inseriat in game-controller cu o rezistenta limitatoare .

In stare de repaus , condensatorul C este incarcat la +5V . Prin intermediul software-ului , si anume printr-o comanda I/O , este activat un contactor electronic notat pe schema cu "Start" , care descarca brusc condensatorul . Tensiunea la bornele acestuia devine 0V .

Daca circuitul este redeschis , condensatorul incepe sa se incarce prin rezistenta potentiometrului . Durata acestui proces variaza in functie de marimea actuala a rezistentei , practic de pozitia manetei de joc . In aceeasi masura creste si tensiunea de la bornele condensatorului . Dupa cum am mai spus , tensiunea de pe condensator este comparata cu tensiunea de +5V de comarator . Daca tensiunea ( mai exact , diferenta de tensiune ) la intrarea in comparator este mai mica decit o valoare prestabilita ( cca. +5V ) , atunci la iesirea din comparator apare nivelul logic "0" . Daca insa tensiunea la intrare crete peste aceasta valoare , iesirea comuta pe nivelul logic "1" .

Varitia semnalelor prin circuit dupa declansarea unei masuratori se poate vedea tot in Figura 4 de mai jos .


Figura 4

Dupa activarea circuitului de start prin software , iesirea din comparator comuta brusc pe nivelul logic "0" si trece automat , dupa un timp prestabilit prin pozitia potentiometrului, la nivelul logic "1". Toate cele patru iesiri din comparator ale unui game-controller sint stabilite de la bitul 0 pina la 3 ai portului de joystick 201H ( numar in hexazecimal ) si pot fi valorificate acolo prin I/O-Read de un program sau de BIOS .

Procedura este urmatoarea : rutina de BIOS a joystick-ului sau un program ( joc ) declanseaza startul monoflop-ului printr-o operatie de scriere I/O ( orice informatie la adresa 201H ) . Imediat dupa aceea porneste un timer . Pe game-controller nu se afla asa ceva , de aceea se foloseste de obicei timer-ul de pe placa de baza a calculatorului . Rutina chestioneaza periodic bitul comparatorului ; daca el trece de la "0" la "1" inseamna ca monoflop-ul s-a derulat si poate fi citita valoarea indicata de temporizator . Aceasta chestionare a adresei joystick-ului nu poate fi evitata , deoarece game-controller-ul nu poate deservi un hardware-interrupt propriu . Rezistenta actuala a potentiometrului poate fi calculata conform formulei :

R = ( Timpul inregistrat - 24,2 µs ) / 0,011 µs

In realitate , nu au o linie carecteristica ideala , ceea ce inseamna ca in starea de repaus a manetei de joc potentiometrele X si Y nu prezinta exact jumatatea valorii potentiometrului ( 50 kohm ) . Nici valorile de inceput si de incheiere nu pot fi prevazute exact . In afara de aceasta valorile respective se modifica in timpul functionarii prin solicitare mecanica . De aceea , joystick-ul trebuie recalibrat din cind in cind .

Sub noul sistem de operare Windows 95 exista in acest sens o fereastra de n dialog dedicata acestui fapt , anume "Settings - Control pannel - Joystick - Calibration" . In cazul jocurilor DOS , acest proces este efectuat ori automat in timpul jocului , ori jocul dispune de un asemenea punct de meniu . In primul caz puteti sa cadem in capcana : daca software-ul ( jocul ) presupune in timpul unei calibrari ca maneta se afla in pozitie centrala in momentul in care tocmai am deplasat-o , rutina joystick-ului poate fi inselata si pozitia centrala este practic total dereglata .

Unele joystick-uri pot fi clibrate prin intermediul unor regulatoare de calibrare ( de fapt doua potentiometre suplimentare inseriate cu potentiometrele joystick-ului in interiorul acestuia ce permit ajustarea pozitiei de centru de 50kohmi ) . Programul DOS "Joy-read" ofera in acest sens servicii de calitate . Este bine de stiut si ca diferiti producatori aduc pe piata versiuni deosebite de joystick , care la prima vedere arata ca un instrument standard , insa interiorul este dominat de o electronica remarcabila . De exemplu , "Sidewinder 3D Pro" de la Microsoft : in interior se afla trei diode luminiscente LED minuscule ( doua la maneta si o dioda stabilizatoare ) , diode ce creaza puncte luminoase pe o matrice CCD . Un circuit controler in joystick calculeaza astfel pozitia curenta a manetei.

O alta solutie interesanta este "Grip" , produs de firma Gravis . Gameport-ul normal este legat prin cablu de o caseta , la care sint conectate doua joystick-uri sau patru gamepad-uri .

Totul este liber programabil , iar sub Windows 95 sustine interfata "Direct - Input" .

3. Software-ul de comanda

Bineinteles ca fiecare programator ( de jocuri ) poate realiza propria rutina joystick prin accesari I/O ale adresei 201H si prin programarea directa a temporizatorului . De obicei acest lucru nu este necesar , deoarece BIOS-ul dispune de facilitati confortabile . Interrupt-ul ( software ) de BIOS 15H, care pe vremuri era destinat unitatilor de banda , a fost extins , devenind in cazul calculatoarelor personale uzuale functia de joystick 84H.

Intreruperile software sint o specialitate a procesoarelor Intel sau compatibile . Ele reprezinta o tehnica relativ simpla de realizare a subprogramelor : practic , toate limbajele de programare au implementata o functie care permite declansarea unui interrupt software . Numarul intreruperilor dorite este pur si simplu indicat functiei respective . De regula pentru fiecare interrupt sint disponibile o sumedenie de functii si subfunctii . Numarul functiei principale este mai intii incarcat in registrul CPU - AH , iar numarul subfunctiei in registrul DX . In momentul in care subprogramul este incheiat , programatorul regaseste rezultatele in registrii CPU . Sintaxa pentru realizarea unor astfel de accesari ale sistemului difera de la un limbaj de programare la altul , dar urmeaza intotdeauna modelul prezentat mai sus .

Apelarea subfunctiei 00H a functiei principale 84H are ca rezultat indicarea starii tastelor . Dupa revenirea din aceasta finctie , in registrul AL procesorului se regaseste o valoare care corespunde starii celor patru taste . In cazul in care o tasta "foc" mai este apasata de utilizator , bit-ul corespunzator este pus pe "1" , in caz contrar pe "0" ( vezi Figura 5 ) .


Figura 5

In cazul in care Carry-Flag-ul unitatii CPU este activat dupa intoarcerea din aceasta subfunctie , este clar ca a aparut o eroare - de exemplu pe motiv ca nu a fost conectat nici un joystick .La nivel de limbaj de asamblare , citirea Carry-Flag-ului este foarte facila . Utilizarea acestei subfunctii aduce insa numai informatii privitoare la starea momentana a tastelor "foc" , dar nu spune nimic despre starile anterioare , intrucit gameport-ul nu efectueaza memorari intermediare ale starilor . De aceea cade in sarcina programatorului sa apeleze in mod regulat aceasta functie ( procedeu numit "polling" ) . Subfunctia 01H furnizeaza relatii despre starea momentana a potentiometrelor din joystick ( mai exact numarul de "batai" ale temporizatorului ) in registrii de procesor AX , BX , CX si DX (vezi Figura 6 ) .


Figura 6

Aceasta functie BIOS preia automat pornirea masuratorii ( deci descarcarea condensatoarelor , programarea temporizatorului , pornirea acestuia si citirea registrului ) . Si aceasta functie activeaza Carry-Flag-ul in cazul aparitiei unei erori .

4. Concluzii finale

Datorita faptului ca pringipala componenta a unui joystick este potentiometrul , este interesant faptul ca un gameport poate fi utilizat si pentru conectarea de diferiti senzori , de exemplu pentru masurarea unor parametrii ai mediului ambiant . Pe de o parte , intrarile pentru tastle "foc" pot fi utilizate pentru transmiterea de stari binare ( de exemplu daca o usa este inchisa sau deschisa ) . Pe de alta parte , senzori analogici , cum ar fi termistorii ( utilizati pentru masurarea unor temperaturi ) , fotorezistente (utilizate la masurarea gradului de iluminare al unei incaperi ) si senzori Hall ( utilizati ca senzori de proximitate ) , pot fi conectati in locul potentiometrelor . In plus , masurarea unor tensiuni este posibila prin intercalarea unui tranzistor cu efect de cimp . De asemenea este de apreciat ca la unii din pinii conectorului de gameport se gaseste tensiunea de 5V , tensiunea de lucru a calculatorului , si care poate fi utilizata si in exteriorul acestuia daca este preluata de aici . Desigur , nu trebuie sa ne asteptam la performante deosebite prin utilizarea unui gameport : precizia de conversie a monoflop-ului nu este nemaipomenita , iar frecventa limita se situeaza la numai 1kHz .

Ca observatie finala , pe piata exista o varietate imensa de joystick-uri pentru PC , care pot fi achizitionate la preturi cuprinse intre 10 si 100 USD . Spre exemplu "Sidewinder 3D Pro" de la Microsoft , costa cca. 86 USD , iar "Grips" de la Gravis , in doua seturi de jocuri , cca. 133 USD .