PC:n peliohjainportti ja omatekoiset anturit

PC:n peliohjain ja peliohjainportti

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

Peliohjainportin nastajärjestys

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.

Peliportin toiminta, omien anturien kytkeminen

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.

Oikosulkuvaaran välttäminen

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.

Potentiometritulojen käyttö

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.


Kytkintulojen käyttö

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.


Peliohjainportin lukeminen QBASICilla

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.

Potentiometritulojen lukeminen

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.

Kytkintulojen lukeminen

QBASICin funktio STRIG(n%)on tarkoitettu peliohjaimen nappien tilan lukemiseen.

Nappi
A1
A2
B1
B2
n%
1
5
3
7

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 lukeminen muilla ohjelmointikielillä

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.

Bitti7 65 432 10
signaaliB2 B1A2 A1BYBX AYAX

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.

Sovellusesimerkkejä

Piirturi

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

Hälytys

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$ <> ""


Omien antureiden käyttö kaupallisten ohjelmien kanssa

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