Peliohjain (sauvaohjain, joystick, game controller) hankitaan PC-mikron varusteeksi silloin, kun tietyntyyppisiin peleihin halutaan parempaa ohjaustuntumaa. Jotta peliohjainta voitaisiin käyttää, PC-mikrossa on oltava sopiva liitäntä, peliohjainportti (peliohjainkortti, game card, joystick interface). Peliohjainportti ei kuulu kaikkien PC-tietokoneiden varustukseen. Jos mikrossa on äänikortti, siinä on myös peliportti. Joka tapauksessa kaikkiin ISA-väylällä varustettuihin PC-mikroihin voidaan hankkia jälkikäteen peliportti tai äänikortti peliportteineen sangen halpaan (alle 200 mk) hintaan.
Peruspeliohjaimessa on ohjaussauva ja kaksi "tulitusnappia". Sauva ohjaa kahta potentiometria (X- ja Y-suunta; alue 0-100 k). Napit ovat sulkeutuvia painokytkimiä.
PC-tietokoneen peliohjainportti on fyysisesti 15-napainen D-liitin. Portin liittimessä on signaalit kahta peliohjainta varten. Jos peleissä halutaan käyttää kahta ohjainta yhtä aikaa, tarvitaan Y-johto.
Kahdessa peliohjaimessa (A ja B) on yhteensä
neljä potentiometria ja neljä nappia. Peliohjainportin
liittimessä on siis nastat neljälle resistiiviselle
tulolle (AX, AY, BX, BY) ja neljälle kytkintulolle (A1, A2,
B1, B2).
Peliohjainportin naarasliitin kosketinpuolelta TAI peliohjaimen johdon urosliitin juotospuolelta
Jos peliportti on äänikortissa, liittimen nastat 12 ja 15 on varattu ulkoisten midi-standardin mukaisten äänilaitteiden kytkemiseen.
Peliohjainporttia voidaan käyttää omatekoisten antureiden liittämiseen tietokoneeseen. Peliportti toimii tällöin yleiskäyttöisenä I/O-porttina, jossa on neljä analogista (resistiivistä) tuloa ja neljä digitaalista kytkintuloa.
Rakennettaessa omia, peliohjainporttia käyttäviä liitäntöjä on huomattava, että porttiin tuleva +5 V jännite tulee mikron omasta virtalähteestä. Tämä on erinomainen seikka sikäli, että saadaan valmis reguloitu jännite käytettäväksi omissa kytkennöissä. PC:n verkkolaite on yleensä tarpeeksi tehokas kestämään jopa muutaman ampeerin ylimääräisen kuorman. Mutta tähän liittyy myös vaara: jos +5 V johto joutuu suoraan oikosulkuun, ts. kosketukseen maajohtoon, voi tapahtua ikäviä. Virtalähde saattaa särkyä, tai sitten suuri virta voi sulattaa johtimia poikki, pahimmassa tapauksessa kalliilta äänikortilta tai vielä kalliimmalta emolevyltä.
Kannattaa siis ehdottomasti sijoittaa peliohjainporttiin kytkettävän liittimen yhteyteen, siihen +5 V johtimeen josta käyttöjännite omiin kytkentöihin otetaan, joko sulake (virtakestoisuus esim. 500 mA) tai noin 10-20 vastus. Vastukseksi kannattanee valita 0,5 watin tyyppi, joka mahtuu D-liittimen kuoren sisään. Tällöin vastuksen voi juottaa suoraan liittimen +5 V nastaan.
Resistiivisten tai kytkintulojen kytkeminen +5 V johtoihin tai maajohtoihin ei ole vaarallista.
Peliohjaimen potentiometrit on kytketty resistiivisen tulon ja +5 V välille. Potentiometri voidaan korvata komponentilla, jonka resistanssi muuttuu suunnilleen 0-100 k alueella. Komponentti voi olla vaikkapa tavallinen kiertyvä potentiometri, lämpötilan mukaan resistanssia muuttava termistori, tai valaistukseen reagoiva valovastus. Peliohjainkortin elektroniikka ja sopiva ohjelma muuttavat potentiometrin resistanssin luvuksi, joka on verrannollinen resistanssin kulloiseenkin arvoon.
Tiettyä resistanssia vastaava luku riippuu tavasta, jolla porttia lukeva ohjelma on toteutettu; luku saattaa riippua myös käytettävän mikron nopeudesta. Peliohjainkorttien välillä on myös yksilöllisiä eroja, koska korttien komponenttien toleranssit ovat suuret. Näistä syistä potentiometrisisäänmenoja kvantitatiivisiin mittauksiin käyttävää (esimerkiksi lämpötilan mittaukseen tarkoitettua) mittausohjelmaa ei voi suoraan siirtää mikrosta toiseen, vaan ohjelma on aina kalibroitava toimimaan oikein juuri kyseisessä mikrossa.
Peliohjainportin kytkintulot on kytketty peliohjaimen nappeihin siten, että kun nappi painetaan alas, tulo kytkeytyy maahan, eli 0 volttiin. Napin ollessa ylhäällä kytkintulonasta on +5 V jännitteessä, koska nämä nastat on kytketty peliohjainohjainkortilla +5 V jännitteeseen 1 k vastuksen kautta, eli digitaalieletroniikan slangilla nastat on "vedetty ylös". Napin paikalle voidaan omissa kytkennöissä laittaa jokin kytkintyyppinen anturi, esimerkiksi mekaaninen sähkökytkin tai valotransistori. Anturi kytketään siten, että se aktivoituessaan yhdistää kytkintulon maahan.
MS-DOS -käyttöjärjestelmän varusohjelmiin on aina kuulunut basic-ohjelmointikieli, joka versiosta 5 lähtien on ollut QBASIC. Se on helppokäyttöinen ohjelmointikieli, joka sopii hyvin pienien DOS-ohjelmien laatimiseen. QBASIC mahdollistaa rakenteisen ohjelmoinnin paljon paremmin kuin vanhat rivinumeropohjaiset basicit, tosin laajojen ohjelmaprojektien laatimiseen on syytä valita jokin muu kieli.
Myös Windows 95 -käyttöjärjestelmän mukana toimitetaan QBASIC. Sitä ei tosin kopioda kiintolevylle järjestelmän oletusasennuksessa, mutta ohjelma löytyy Win95-CD:n kansiosta OTHER\OLDMSDOS .
QBASIC sisältää valmiit funktiot peliohjainportin lukemiseen.
QBASICin funktiolla STICK(n%) luetaan peliohjaimen sauvan asento. n% voi saada arvot 0..3, jolloin STICK(n%) palauttaa vastaavasti koordinaatit AX, AY, BX ja BY. STICK(n%) palauttaa luvun, joka on suoraan verrannollinen potentiometrisisäänmenoon N liitetyn vastuksen resistanssiin.
DO PRINT STICK(0), STICK(1) LOOP UNTIL INKEY$ <> ""
Funktion palauttama luku on välillä 0..255. Tietyllä resistanssin arvolla saatava luku vaihtelee PC:stä toiseen. Tähän vaikuttaa PC:n nopeus, sekä peliohjainportin elektroniikka. Joissain ohjainkorteissa on jopa "nopeussäätö", joka vaikuttaa STICK-funktion palauttamaan arvoon. STICK -funktiota käyttävä mittaussovellus on siis aina kokeiltava ja kalibroitava siinä koneessa, jossa sovellusta tullaan käyttämään.
QBASICin funktio STRIG(n%)on tarkoitettu peliohjaimen nappien tilan lukemiseen.
| Nappi | ||||
| n% |
STRIG(n%) palauttaa arvon -1, jos nappi on painettuna, muuten arvon 0. Parametri n% määrää luettavan napin viereisen taulukon kertomalla tavalla.
DO PRINT STRIG(1), STRIG(5) LOOP UNTIL INKEY$ <> ""
Käskyillä ON STRIG, STRIG ON, STRIG OFF ja STRIG STOP on mahdollista laatia "tapahtumaohjattu" ohjelma, jonka suorittaa aliohjelmia sen mukaan mitä peliohjaimen nappeja painetaan. Näidn käskyjen käyttöä ei esitellä tässä tarkemmin, niihin voi tutustus QBASICin helpistä.
Vanhoissa basic-versioissa STRIG(n%) ei toimi kunnolla. Silloin kannattaa määritellä oma funktio seuraavasti:
DEF FNBUTTON(X) = (INP(513) AND (16*(2^X))) = 0
X voi saada arvot 0..3, jotka vastaavat nappeja A1..B2. FNBUTTON(X) palauttaa arvon -1, jos ko. nappi on kutsuhetkellä alhaalla; muuten arvon 0.
DEF FNBUTTON (X) = (INP(513) AND (16 * (2 ^ X))) = 0 DO PRINT FNBUTTON(0), FNBUTTON(1) LOOP UNTIL INKEY$ <> ""
Peliohjainportin lukemisesta sellaisilla ohjelmointikielillä, joissa ei ole tarkoitukseen valmista funktiota, mainitaan tässä vain periaatteet.
Peliohjainportti sijaitsee PC:n I/O-osoitteessa 201h (desimaalisena 513). Portista luettavan tavun neljä eniten merkitsevää bittiä vastaavat kytkintuloja, neljä vähiten merkitsevää bittiä vastaavat resistiivisiä tuloja.
| Bitti | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| signaali | B2 | B1 | A2 | A1 | BY | BX | AY | AX |
Kytkintuloja vastaavat bitit vastaavat suoraan ao. signaalien tilaa: 0 = nappi alhaalla. Kun resitiivisiä tuloja luetaan, osoitteeseen 201h kirjoitetaan ensin jotain, jolloin bitit 0..3 muuttuvat nolliksi. Bitit vaihtuvat ykkösiksi ao. nastaan kytketyn vastuksen resistansin määräämän ajan kuluttua. Ajat ovat hyvin lyhyitä, millisekuntiluokkaa, eikä ole aivan helppoa laatia ohjelmaa joka pystyy mikrosekuntitarkkuuden ajoitukseen.
IBM AT:sta lähtien PC-yhteensopivien BIOS-ohjemiin on kuulunut peliohjaimen lukurutiini. Sitä kannattaa käyttää niissä ohjelmointikielissä, joissa BIOS-kutsujen teko on helppoa.
INT 15 - BIOS - JOYSTICK SUPPORT (XT after 11/8/82,AT,XT286,PS)
AH = 84h
DX = subfunction
0000h read joystick switches
Return: AL bits 7-4 = switch settings
0001h read positions of joysticks
Return: AX = X position of joystick A
BX = Y position of joystick A
CX = X position of joystick B
DX = Y position of joystick B
Return: CF set on error
AH = status
80h invalid command (PC,PCjr)
86h function not supported (other)
CF clear if successful
Notes: if no game port is installed, subfunction 0000h returns AL=00h (all
switches open) and subfunction 0001h returns AX=BX=CX=DX=0000h
a 250kOhm joystick typically returns 0000h-01A0h
Windows-ohjelmointikielille on olemassa kaupallisia VBX/OCX -kontrolleja peliohjaimen lukemiseen. Kts. http://www.objecttiger.com/details/mabry/joystk.htm, josta löytyy myös ilmainen demoversio.
Rakenteluprojekteja suunnittelevien kannattaa ehdottomasti poiketa Tomi Engdahlin elektroniikkasivulle. Sieltä löytyy paljon lisätietoa, mm Turbo Pascalilla ja C:llä laaditut esimerkkiohjelmat peliportin lukemiseen.
Ohjelma piirtää graafisen kuvaajan tuloon AX kytketyn vastuksen resistanssista.
'plotter
ScrWidth = 500 'horizontal scale
flag = 0
SCREEN 12 'graphics mode
WINDOW (0, 0)-(ScrWidth, 255) 'coordinate system
DO
CLS
PSET (0, STICK(0)) 'plot 1st point
FOR x = 1 TO ScrWidth
LINE -(x, STICK(0)) 'line to next point
IF INKEY$ <> "" THEN
flag = 1
EXIT FOR
END IF
NEXT
LOOP UNTIL flag = 1
Kun tuloon A1 kytketty valotransistori pimenee, ohjelma antaa hälytysäänen ja näyttää hälytyksen tapahtumisajan.
'alarm
CLS
DO
IF NOT (STRIG(1)) THEN
PRINT "ALARM!", TIME$
BEEP
END IF
LOOP UNTIL INKEY$ <> ""
Vernierillä ja Pascolla on kaupallisia peliporttia käyttäviä mittausvälineitä.
Omatekoisia valotransistorista rakennettuja valoportteja
voidaan käyttää esim. Pascon Smart Pulley Timer
-ohjelman kanssa. On huomattava, että ohjelma tulkitsee suoraan
kytkintuloon kytketyn valotransistorin tilat "väärin
päin". Jos tämä haittaa, tila voidaan kääntää
alla esitetyllä transistorikytkennällä.