Med NXT komponenter med en mikro-Controller (3 / 6 steg)
Steg 3: Motorn
Stift 1 och 2 är leads för DC-motor. Tillämpa en potential, och motorn visar. Switch stift och motorn vänder åt andra hållet. Det är så enkelt. Jag använder en H bro för detta.
Kodaren är nästan lika enkelt. Stift 3 är marken och stift 4 är Vcc (5V). Dessa leverera ström till kodaren. Stift 5 och Pin 6 är de två utgångarna för kodare. I fall någon är obekant med dubbel pulsgivare, är här hur de fungerar:
Bifogat till motor växellådan är någonstans en encoder hjul som har en massa radiella platser i den. Det visar med resten av växellådan. Två infraröda sensorer placeras så att den radiella slots och ekrar alternativt bryta och återställa den IR-strålen, orsakar alternerande 1 och 0 är. Så, när motorn vänder, antingen linje kommer att läsa 101010101010 med en hastighet som bestäms av graden av motorn. Detta är användbart för hastighet och översättning. Mer 1 och 0 är, ju längre du har gått. Ju snabbare det växlar, ju snabbare du kommer.
Så varför behöver vi två pulsgivare? För att bestämma riktning. Eftersom de två IR-sensorerna är förskjutna, utgång de ett mönster som är specifik för rotationsriktning. Om motorn visar ett sätt, de kommer ut (Pin 5 Pin 6) 10-11, 00, 01, upprepa. Om motorn vänder åt andra hållet, mönstret är omvänd: 11, 00, 01, 10, upprepa. Genom att titta på mönstret, kan du bestämma riktningen av rotation. Jag skulle få specifika om medurs och moturs, men det beror på hur du håller motorn och är verkligen lätt att räkna ut på din egen genom experiment.
Kodning grundläggande stämpeln för att använda kodaren:
För att bestämma hastigheten på motorn, använda jag funktionen antal. Helt enkelt räkna antalet impulser från antingen encoder stift för en viss tid och du kommer att få ett antal proportionellt mot hastigheten på motorn.
GREVE Pin5, 100, hastighet
För att vänta på ett visst antal cykler, jag använder ett PULSIN kommando inuti en for-loop. PULSIN gör BS2 vänta nästa puls från kodaren innan du fortsätter till nästa steg av slingan. Denna kod kommer vänta n pulser. Variabeln "variabel" är inte viktigt, men kan också användas för att bestämma hastigheten i teorin.
FÖR i = 1 till n
PULSIN Pin5, 1, variabel
NÄSTA
Avgörande är lite svårare. Jag har stämpeln vänta tills kodaren når ett konkret steg i cykeln som 11 genom att använda en if uttalande i en loop. När ett steg har nåtts, jag kollar för att se vilka steg kommer nästa (i detta fall, antingen 10 eller 01) med ett par av om uttalanden i en annan slinga. Beroende på vilket steg kommer nästa, kan du bestämma hur motorn vänder.
Det är också möjligt att använda denna metod att passivt mäta absolut förskjutningen av motorn. Turning en riktning kommer att lägga till förskjutningen, medan vrida åt andra hållet kommer att subtrahera. Detta sätt, om du börjar på 0, vrid motorn en viss vinkel, och vända det, bör du gå tillbaka till 0 snarare än avståndet omfattas. Denna kod kontrollerar riktning en gång per cykel och sedan lägger till eller tas bort 1 från deplacement därmed. Det fungerar vid måttliga varvtal, men inte vid höga hastigheter på grund av den stämpeln klockfrekvens.
pin5 PIN 1
pin6 PIN 0
Disp VAR ordet
loop1:
OM pin5 = 1 och pin6 = 1 då riktning ' vänta 11 encoder steg
Gå till loop1
riktning:
OM pin5 = 0 då cw ' se vilka stift går låg först att bestämma riktning
OM pin6 = 0 då ccw
Gå till riktning
CW:
Disp = disp + 1 ' i det här exemplet jag gjorde medurs positiva och moturs negativ.
FELSÖKA? disp
Gå till loop1
CCW:
Disp = disp-1
FELSÖKA? disp
Gå till loop1
Jag försökte skriva kod för att göra detta på grundval av steg för steg så att istället för att vänta 11 att komma, det skulle kontrollera riktning vid varje steg 4 gånger noggrannhet. Tyvärr, stämpeln inte kör tillräckligt snabbt för att. En snabbare mikrokontroller skulle kunna hantera den. Här är koden, men igen det fungerar bara med mycket låga hastigheter.
Första fastställs koden vilket steg kodaren börjar på och leder till subrutinen motsvarar det steget.
Deplacement börjar på 1 på grund av en inneboende fencepost fel.
Varje subrutin ser på vad föregående steg. Om det föregående steget var CCW av detta steg sedan motorn vände CW och 1 läggs. Annars CCW är standard och 1 dras. (Fencepost fel inträffar här men är inte alltför viktigt)
Nästa, subrutinen väntar nästa steg och går sedan till subrutinen motsvarar det steget.
Det fungerar bra i teorin men det finns alltför många kommandon för varje steg så BS2 inte kan hantera det tillräckligt snabbt.
en PIN 0
b PIN 1
lasta VAR lite
lastb VAR lite
Disp VAR ordet
DEP = 1
INPUT en
INPUT b
lasta = en
lastb = b
OM en = 1 då a1
OM b = 1 sedan S01
GÅ TILL S00
a1:
OM b = 1 sedan S11
GÅ TILL S10
S01:
Disp = disp-1
OM lasta = 1 och lastb = 1 då disp = disp + 2
FELSÖKA? disp
lasta = 0
lastb = 1
S01Loop:
OM en = 1 och b = 1 sedan S11
OM en = 0 och b = 0 då S00
Gå till S01Loop
S11:
Disp = disp-1
OM lasta = 1 och lastb = 0 då disp = disp + 2
FELSÖKA? disp
lasta = 1
lastb = 1
S11Loop:
OM en = 1 och b = 0 då S10
OM en = 0 och b = 1 sedan S01
Gå till S11Loop
S10:
Disp = disp-1
OM lasta = 0 AND lastb = 0 då disp = disp + 2
FELSÖKA? disp
lasta = 1
lastb = 0
S10Loop:
OM en = 1 och b = 1 sedan S11
OM en = 0 och b = 0 då S00
Gå till S10Loop
S00:
Disp = disp-1
OM lasta = 0 AND lastb = 1 då disp = disp + 2
FELSÖKA? disp
lasta = 0
lastb = 0
S00Loop:
OM en = 1 och b = 0 då S10
OM en = 0 och b = 1 sedan S01
Gå till S00Loop