Styring og kontrol via printerport

Printerporten er først og fremmest lavet for at styre en printer. Men da printeren faktisk er en slags robot, er printerporten også velegnet til styring af hjemmelavede robotter og til at hente data-input.

Her vil vi kun se på meget simple tilfælde. Det kræver imidlertid lidt fingersnilde og elektronik for at lave det "interface" (mellemled), der skal være mellem computerens printerport og lamper, motorer, relæer og anden robotindmad. Det kommer der tegninger og ideer til senere.

Interfacet sørger for, at computer og robot taler samme sprog, og samtidig
virker det som beskyttelse af computeren, når der eksperimenteres på robotsiden
(en rigtig "robotmand" er måske ikke lige det, man skal begynde med at lave)

Styring - output (data ud)

En printerport har 25 ben:

ben signalnavn type   ben signalnavn type
1 -strobe output   10 -acknowledge input *
2 data bit output *   11 busy input
3 data bit output *   12 paper end input
4 data bit output *   13 select  
5 data bit output   14 -auto feed XT output
6 data bit output   15 -error input *
7 data bit output   16 -initialize output
8 data bit output   17 -select input output
9 data bit output   18-25 ground  

* dem vi bruger i det følgende

Det er uendelig simpelt at sende impulser ud på portens ben (ben 2, 3, 4, 5, 6, 7, 8 og 9 er output-ben). Man skriver blot et tal mellem 0 og 255 til den rigtige adresse i computeren, og der vil blive 0 V eller +5 V på de ben, der i to-talssystemet (binært) svarer til tallet. F.eks. vil vil tallet 27 giv følgende output: 00011011. Ben 4, 7, 8 og 9 vil være LAVE (0 V) og ben 2, 3, 5 og 6 vil være HØJE (+5 V).

En PCer kan have tre printerporte, og dermed er der tre mulige adresser at sende til, afhængigt af hvilken port man vil bruge. Adresserne er

LPT1: 888, LPT2: 632 og LPT3: 956.

Dette lille QBASIC-program vil sende tallet 27 ud på LPT1:

out 888,27

Simplere kan det da ikke være!

Med et BASIC-program kan du altså tænde og slukke udgangene, som du lyster: Du kan f.eks. lægge betingelser ind, så udgangene tænder og slukker i en bestemt orden og i et givet antal sekunder.

Der er en del QBASIC programeksempler til slut i dette afsnit. Dem kan du bruge direkte eller som inspiration til selv at lave mere spændende programmer.

Kontrol - input (data ind)

Det er næsten lige så simpelt at hente data, f.eks. impulser fra en geiger-tæller. Der er imidlertid kun fem velegnede in-ben på printerporten (ben 15, 13, 12, 10 og 11) og der er lidt mindre system i tingene end på out-benene.

Bit svarer til ben
3   15
4   13
5   12
6   10
7   11

Bit 0, 1 og 2 bruges ikke

Adressen for in-benene er én højere end grundadressen, på LPT1 altså 889.

Hvis man i et QBASIC-program skriver

a = inp(889)
PRINT a

vil a, være et tal mellem 0 og 255, og det vil fortælle om de otte inputbits tilstand (hvoraf bit 0, 1 og 2 er uinteressante).

Det er imidlertid lidt vanskeligt at fortolke resultatet.

I det følgende er der nogle meget enkle eksempler på styring og kontrol med computeren. For at få udbytte af dem, må man kende lidt til QBASIC, som er det programmeringssprog, der normalt følger med DOS og som derfor sandsynligvis ligger på computeren, eller i hvert fald er nemt at få fat på og lægge derind.

Elektrisk grej

Her kommer der tips til det praktiske arbejde med robotter. Har man mod på det, kan man naturligvis lave grej, der udnytter alle ud- og indgange på printerporten, men det er min erfaring, at tre udgange og to indgange dækker de flestes behov for at eksperimentere, og så er det overskueligt og forståeligt, hvad der foregår.

Det er ret nemt at ødelægge en printerport ved at lave forkerte tilslutninger. Derfor disse to forslag:

bulletSæt en ekstra printerport, som bare skal bruges til kontrol og styring, i computeren. Den koster under 150 kr og er let at montere. Den, computeren er født med, har som regel fælles IC'ere med harddisk og floppydrev, så den er dyr at ødelægge.
bulletVær omhyggelig med at lave kabler og interface til kontrol og styring. Når det først er gjort ordentligt, kan du næsten umuligt beskadige computeren (printerporten).

Er disse to ting o.k., kan du bare bikse med robotter, automatik osv. Der kan højest brænde et par stumper af på interfacet, det betyder ikke noget særligt.

Kablet mellem computer og interface

Hunstikket (det til at stikke i printeren) loddes af et almindeligt printerkabel. Man finder de ledninger, der går til ben 2, 3, 4, 10, 15 og 18 (de første tre er udgange, 10 og 11 indgange og 18 er 0-ledning (jord)) . Der står muligvis numre på hunstikket, men husk, at numrene, du skal bruge, svarer til dem på hanstikket, det til at stikke i computeren. Man kan bruge et ohmmeter eller bare en pære, et batteri og et par stumper ledning til sikre, at det er de rigtige, man har fat i. På hver af de seks ledninger sætter man et lille klistermærke med bennummer. De andre ledninger napper man væk, så fejltagelser i det videre forløb lettere undgås. Du vil nok lægge mærke til, at alle benene fra 18 til 25 er forbundet til 0.

Diagrammet

Diagrammet, der er vist her, er som nævnt for tre udgange og to indgange, men det er simpelt at udvide til alle otte udgange og fem indgange.

Ved at bruge fem optokoblere, skiller man elektrisk set kredsløbet, der går til computerens port, og det, der går til eksperimentsiden, fuldkomment ad. Alle impulser overføres begge veje via lysdioder (LEDs) og fototransistorer.

Man kan også få fire optokoblere bygget sammen i et chip, men jeg har valgt fem enkelte for at gøre kredsløbet mere overskueligt i undervisnings-sammenhæng.

Stumper:

bullet5 stk. optokoblere (typen ikke afgørende)
bullet3 stk. lysdioder (fx tre forsk. Farver)
bullet3 modstande 470 ohm
bullet3 modstande 100 ohm
bullet2 modstande 1,2 kohm
bulletloddeflige
bulletprintplade

Printpladen

Pladen er set fra kobbersiden, og tegningen kan udprintes og bruges direkte.

Printpladen er 5,5 x 10,0 cm. Det er tydeligt, at alle forbindelser til computeren er fuldstændigt adskilt fra det ydre kredsløb, hvor der eksperimenteres med allehånde "robotter", målinger osv.

På den måde kan man næsten ikke beskadige printerporten, blot man husker at slukke for computeren, før man sætter printerstikket i eller tager det ud.

Monteringen volder ingen vanskeligheder, hvis man har makket lidt med sådan noget tidligere. Det vil være en god ide at sætte det hele på en solid bundplade, det gør fremtidige eksperimenter lettere. Måske bør man afdække den del af printet, der har forbindelse med pc'eren, så vil en enhver risiko for computeren være udelukket.

Er det færdigtmonterede print afprøvet og fundet o.k., kan det uden videre bruges til printerporten på enhver pc'er. Computeren er fuldstændigt beskyttet, og det eneste, man kan "brænde af" er en lysdiode eller i værste fald en optokobler. Køber man et par ekstra hjem af hver, er der frit slag for ekeperimenter.

BASIC-programmer

I dette afsnit er nogle få eksempler på Qbasic programmer til at styre interfacet med. Kan du lidt BASIC-programering, er det nemt selv at lave nye og måske mere sammensatte programmer til specielle opstillinger.

Til nogle formål er BASIC ikke hurtigt nok, der må man ty til C eller måske endda maskinkode for at opnå tilstrækkelig hastighed. Det gælder fx. sådan noget som frekvensmåling.

Test af interface

Ved at køre det lille testprogram, "test.bas", kan du sikre dig, at interfacet er o.k.

Er der et punkt, hvor testen viser, der er fejl, er denne nu let at lokalisere, og med de få komponenter, der er, vil skaden være let at udbedre.

OUT 888, 0
OUT 632, 0
OUT 956, 0
CLS
PRINT " TEST AF INTERFACE"
PRINT
PRINT " Har du husket at sætte strøm til interfacet?"
PRINT
PRINT " Hvilken printer har du sat interfacet til? "
PRINT " 1) LPT1"
PRINT " 2) LPT2 "
PRINT " 3) LPT3 "
PRINT
PRINT " Tast 1,2 eller 3 + <ENTER>: "
INPUT b
IF b = 1 THEN lpt = 888
IF b = 2 THEN lpt = 632
IF b = 3 THEN lpt = 956
PRINT
PRINT " Når du taster <ENTER>, skal lysdiode ved udgang 1 lyse."
PRINT " Tast <ENTER>!"
DO
LOOP UNTIL INKEY$ = CHR$(13)
OUT lpt, 1
PRINT " Når du taster <ENTER>, skal lysdiode ved udgang 2 lyse."
PRINT " Tast <ENTER>!"
DO
LOOP UNTIL INKEY$ = CHR$(13)
OUT lpt, 2
PRINT " Når du taster <ENTER>, skal lysdiode ved udgang 3 lyse."
PRINT " Tast <ENTER>!"
DO
LOOP UNTIL INKEY$ = CHR$(13)
OUT lpt, 4
PRINT " Når du taster <ENTER>, skal alle tre lysdioder lyse."
PRINT " Tast <ENTER>!"
DO
LOOP UNTIL INKEY$ = CHR$(13)
OUT lpt, 7
PRINT
PRINT " Nu skal du forbinde indgang 1 med + "
PRINT
PRINT " Når du taster <ENTER>, skal lysdiode 1 slukkes."
PRINT " Tast <ENTER>!"
DO
LOOP UNTIL INKEY$ = CHR$(13)
a = INP(lpt + 1) AND 64
IF a = 0 THEN OUT lpt, 6
PRINT
PRINT " Nu skal du forbinde indgang 2 med + "
PRINT
PRINT " Når du taster <ENTER>, skal også lysdiode 2 slukkes."
PRINT " Tast <ENTER>!"
DO
LOOP UNTIL INKEY$ = CHR$(13)
a = INP(lpt + 1) AND 8
IF a = 0 THEN OUT lpt, 4
PRINT
PRINT " TESTEN ER GENNEMFØRT"
PRINT " Hvis testen forløb, som den skulle er interfacet o.k. "
PRINT " Ellers er det nu let at lokalisere og udbedre fejl"

Status

Ved at køre dette program får du at vide, om de tre udgange er tændte (HØJE) eller slukkede (LAVE) og om de tre indgange er passive (ingenting tilsluttet) eller aktive (sluttet til +). Altså en status for situationen på interfacet.

CLS
PRINT " STATUS"
PRINT
PRINT
PRINT " Hvilken printer har du sat interfacet til? "
PRINT " 1) LPT1"
PRINT " 2) LPT2 "
PRINT " 3) LPT3 "
PRINT
PRINT " Tast 1,2 eller 3 + <ENTER>: ",
INPUT b
IF b = 1 THEN lpt = 888
IF b = 2 THEN lpt = 632
IF b = 3 THEN lpt = 956
PRINT
PRINT
PRINT "Dette program viser den øjeblikkelige situation på de tre udgange"
PRINT " (ud1, ud2 og ud3) og de to indgange (ind1 og ind2)på interfacet"
PRINT
PRINT
PRINT
a = INP(lpt) AND 1
IF a = 1 THEN hl$ = "høj"
IF a = 0 THEN hl$ = "lav"
PRINT " Udgang 1 er: "; hl$
a = INP(lpt) AND 2
IF a = 2 THEN hl$ = "h›j"
IF a = 0 THEN hl$ = "lav"
PRINT " Udgang 2 er: "; hl$
a = INP(lpt) AND 4
IF a = 4 THEN hl$ = "h›j"
IF a = 0 THEN hl$ = "lav"
PRINT " Udgang 3 er: "; hl$
a = INP(lpt + 1) AND 64
IF a = 64 THEN hl$ = "passiv"
IF a = 0 THEN hl$ = "aktiv"
PRINT " Første indgang er: "; hl$;
a = INP(lpt + 1) AND 8
IF a = 8 THEN hl$ = "passiv"
IF a = 0 THEN hl$ = "aktiv"
PRINT " Anden indgang er: "; hl$;

Timer 1

Programmet kan fortælle, hvor længe en kontakt er tændt. Kontakten kan f.eks. være en såkaldt mikroswitch, der sidder i en låge, et apparat eller en maskine ("robot").

CLS
PRINT
PRINT
PRINT " TIMER 1"
PRINT
PRINT
PRINT " Hvilken printer har du sat interfacet til? "
PRINT " 1) LPT1"
PRINT " 2) LPT2 "
PRINT " 3) LPT3 "
PRINT
PRINT " Tast 1,2 eller 3 + <ENTER>: ",
INPUT b
IF b = 1 THEN lpT = 888
IF b = 2 THEN lpT = 632
IF b = 3 THEN lpT = 956
PRINT
PRINT
PRINT "Med dette program kan man med en kontakt mellem + og ind1 m†le,"
PRINT "hvor lang tid, der går, fra man tænder til man slukker for kontakten"
PRINT
PRINT
PRINT "Tænd og sluk for kontakten"
start = 0
DO
a = INP(lpT + 1) AND 64
IF a = 0 AND start = 0 THEN start = TIMER
LOOP UNTIL (a = 64 AND start > 0)
slut = TIMER
sek = slut - start
PRINT
PRINT
PRINT " Ind1 var aktiv i ", sek, " sek."

Timer 2

Denne timer sættes i gang med én kontakt (sw1)og slukkes med en anden (sw2). Den kan, som timer 1, bruges i mange sammenhænge. Med to mikroswitches er den f.eks. ideel til at måle den tid, det tager for en stålkugle at rulle ned ad et skråplan.

Pilene på tegningen viser hen til interfacet.

CLS
PRINT
PRINT
PRINT " TIMER 2"
PRINT
PRINT
PRINT " Hvilken printer har du sat interfacet til? "
PRINT " 1) LPT1"
PRINT " 2) LPT2 "
PRINT " 3) LPT3 "
PRINT
PRINT " Tast 1,2 eller 3 + <ENTER>: ",
INPUT b
IF b = 1 THEN lpt = 888
IF b = 2 THEN lpt = 632
IF b = 3 THEN lpt = 956
PRINT
PRINT
PRINT "For at bruge dette program, skal man have en kontakt mellem"
PRINT "+ og ind1 samt mellem + og ind2 (henholdsvis S1 og S2)."
PRINT "Trykker man på kontakt et og senere på kontakt to,"
PRINT "vises tiden mellem de to tryk"
PRINT
PRINT
PRINT " Du kan nu trykke på kontakt et"
start = 0
DO
a = INP(lpt + 1) AND 64: 'ben 10 læses
IF a = 0 AND start = 0 THEN start = TIMER: 'timer startes
LOOP UNTIL (a = 64 AND start > 0)
DO
a = INP(lpt + 1) AND 8: 'ben 15 læses
IF a = 0 THEN slut = TIMER: 'timer stoppes
LOOP UNTIL (a = 0 AND start > 0)
sek = slut - start
PRINT
PRINT
PRINT "Der er gået ", sek, " sek. fra S1 blev tændt til S2 blev tændt"

Reaktionstid

Et simpelt program til at måle reaktionstid med. Det er nemt at simulere reaktionstid ved bilkørsel. Man laver blot en opstilling, hvor kontakten er en "bremsepedal", så man måler reaktionstiden, når man må flytte foden fra speeder til bremsepedal.

CLS
PRINT
PRINT
PRINT
PRINT " MÅL DIN REAKTIONSTID"
PRINT
PRINT
PRINT " Hvilken printer har du sat interfacet til? "
PRINT " 1) LPT1"
PRINT " 2) LPT2 "
PRINT " 3) LPT3 "
PRINT
PRINT " Tast 1,2 eller 3 + <ENTER>: ",
INPUT b
IF b = 1 THEN lpt = 888
IF b = 2 THEN lpt = 632
IF b = 3 THEN lpt = 956
PRINT
PRINT " Når du hører et 'bip', skal du trykke på kontakten"
omigen:
RANDOMIZE TIMER: 'I disse tre linier laves et tilfældigt
a = INT(RND * 10) 'tal mellem 5 og 9
IF NOT a > 2 THEN GOTO omigen
b = TIMER 'Så aflæses computerens timer, og der
DO 'går mellem 5 og 9 sek.,
LOOP UNTIL INT(TIMER - b) = a
BEEP 'før computeren beeper. Offeret skal nu
OUT lpt, 1
c = TIMER 'forbinde + og ind1 (med kontakt). Når hun har
DO
LOOP UNTIL (INP(lpt + 1) AND 64) = 0 'gjort det, standser timeren på værdien d
d = TIMER
OUT lpt, 2
PRINT
PRINT
PRINT
PRINT " Din reaktionstid er: "; d - c; "sek."

Treblink eller løbelys

Programmet her er uden særligt indhold, men kan måske inspirere til nye opfindelser. Det er i hver fald nemt at gennemskue, så man selv kan lave BASIC-programmer til styring.

CLS
PRINT " TREBLINK"
PRINT
PRINT " Hvilken printer har du sat interfacet til? "
PRINT " 1) LPT1"
PRINT " 2) LPT2 "
PRINT " 3) LPT3 "
PRINT
PRINT " Tast 1,2 eller 3 + <ENTER>: ",
INPUT b
IF b = 1 THEN lpt = 888
IF b = 2 THEN lpt = 632
IF b = 3 THEN lpt = 956
PRINT
PRINT
PRINT " Dette program laver 'løbelys' på de tre udgange på interfacet,"
PRINT " hvis batteriet ellers er tilsluttet"
FOR x = 1 TO 10000
OUT (lpt), 1
FOR e = 1 TO 10000: NEXT
OUT (lpt), 2
FOR u = 1 TO 10000: NEXT
OUT (lpt), 4
FOR t = 1 TO 10000: NEXT
NEXT x

Hårde og bløde sager til styring og kontrol

Når man skal styre en robot, er der tre faser, man må tænke igennem:

  1. Man skal kunne hente oplysninger fra robotten. Det foregår i vort tilfælde på ind1 og ind2 på interfacet. Det simpleste er at tilslutte en almindelig kontakt mellem + og ind1 eller ind2. Computeren vil så registrere, om kontakten er tændt eller slukket.
  2. Jeg vil foreslå, at skolen anskaffer sig nogle mikroswitches. De er uforlignelige til masser af eksperimenter. Desuden ville det være fint med én eller et par lydstyrede kontakter samt et par lysstyrede og fotocellekontakter (opskrifter følger).
  3. Man må kunne få robotten til at "gøre noget" (bevæge sig, lyse, hyle eller lignende), her får robotten besked gennem ud1, ud2 og ud3. Beskederne kan sætte gang i motorer eller tænde lamper og apparater.
    Punkt 1 og 2 udgøre sammen med selve computeren hardwaredelen.
    Det kan være en god ide at koble udgangene til relæer, effekttransistorer eller tyristorer afhængigt af, hvad den enkelte udgang skal styre (opskrifter følger).
  4. Et program i computeren (software) bestemmer, hvad robotten skal gøre og på hvilke betingelser. Her bruger vi BASIC-programmer som software, men i mange tilfælde ville det være bedre med C-programmer eller maskinkode-programmer, da de arbejder hurtigere. BASIC er imidlertid særdeles nemt at lære sig blot ved at studere programmerne i denne artikel og evt. udbygge lidt ved at lege med sproget.

Til selve "robotten" er det godt med små jævnstrømsmotorer (f.eks. fra kasseret legetøj), stepmotorer, pærer, lysdioder, hylere…..ja, en hel rodekasse med elektrisk, elektronisk og mekanisk grej fra kasseret legetøj, printere, stereoanlæg osv. Desuden skal der stort set kun snilde og tålmodighed til at lokke computerstyret automatik ud af grejet. Det er billigt på den måde, og det er godt, men naturligvis ikke så bekvemt som at købe noget færdiglavet. Her sætter prisen blot hurtigt en grænse for fantasien.

Lydstyret kontakt

Ud og 0 på denne lydstyrede kontakt kan tilsluttes ind1eller ind2 og 0 på vores interface. En kraftig lydpåvirkning (et klap eller to pinde, der slås sammen) vil aktivere tyristoren (Ty) og ud vil blive LAV og dermed også indgangen ind1 (ind2).

Med en lystyret kontakt til begge indgange kan man registrere lydforsinkelsen mellem de to kontakter, når de anbringes 1-2 meter fra hinanden, og man klapper lige over den ene højttaler. Med det BASIC-program, der er vist her, kan man dog ikke beregne lydens hastighed særlig nøjagtigt.

Stumper:

bulletR1: modstand 2,2 M
bulletR2 modstand 4,7 k
bulletR3: modstand 1 k
bulletR4: modstand 1 k
bulletC1: kondensator 500 nF
bulletC2: kondensator 500 nF
bulletC3: elektrolytkondensator 1000 m F
bulletTr1: transistor, NPN BC 547
bulletTr2: transistor, PNP BC 557
bulletP: drejemodst. (potmeter) 1 k
bulletTy: tyristor 2N5060
bulletHt: højttaler (gerne 75W ,men 8W o.k.)

Lysstyret kontakt

Stumper:

bulletP: potmeter 500 k
bulletLDR: lysfølsom modstand ("bamseøje")
bulletR1: modstand 10 k
bulletR2: modstand 4,7 k
bulletR3: modstand 1 k
bulletTr: NPN transistor BC 547
bulletTy: tyristor 2N5060