Stap 3: De Motor
Pin 1 en 2 zijn de leads voor de DC-motor. Het toepassen van een potentieel, en de motor draait. Schakelaar pinnen en de motor draait de andere kant. Het is zo eenvoudig. Ik gebruik een H-brug voor dit.
Het coderingsprogramma is bijna net zo eenvoudig. Pin 3 is grond en Pin 4 is Vcc (5V). Deze leveren de macht met het coderingsprogramma. Pin 5 en Pin 6 zijn de twee uitgangen van de encoder. In het geval iemand onbekend met dubbele encoders is, is hier hoe ze werken:
Gekoppeld aan de motorreductor is ergens een encoder wiel die een bos van radiale "slots" erin heeft. Het blijkt met de rest van de versnellingsbak. Twee infrarood sensoren worden geplaatst zodat de radiale "slots" en de spaken ook breken en herstellen van de IR-straal, waardoor afwisselend 1's en 0's. Dus, wanneer de motor draait, zal ofwel lijn lezen van 101010101010 tegen een tarief bepaald door de snelheid van de motor. Dit is handig voor de controle van de snelheid en vertaling. De meer 1's en 0's, hoe verder u bent gegaan. Hoe sneller het wisselt, hoe sneller je gaat.
Dus waarom moeten we twee encoders? Voor de bepaling van richting. Omdat de twee IR-sensoren worden gesaldeerd, uitgang ze een patroon dat specifiek is voor de draairichting. Als de motor unidirectioneel draait, zij zal de uitgang (Pin 5 Pin 6) 11, 10, 00, 01, herhalen. Als de motor de andere kant draait, het patroon is omgekeerd: 11, 00, 01 10, herhalen. Door te kijken naar het patroon, kunt u de draairichting bepalen. Ik zou krijgen specifieke over met de klok mee en tegen de klok in, maar het hangt af van hoe u de motor houdt en is echt gemakkelijk om erachter te komen op uw eigen door middel van experimenten.
Codering van de basic stamp voor het gebruik van het coderingsprogramma:
Om te bepalen van de snelheid van de motor, gebruik ik de functie count. Gewoon tellen het aantal pulsen van een van de encoder pinnen voor een bepaalde periode van tijd en je krijgt een aantal evenredig met de snelheid van de motor.
Graaf Pin5, 100, snelheid
Te wachten op een bepaald aantal cycli, ik gebruik een PULSIN commando in een for-lus. De PULSIN maakt de BS2 wachten voor de volgende pulse vanuit het coderingsprogramma voordat u verdergaat met de volgende stap van de lus. Deze code zal wachten op n pulsen. De variabele 'variable' is niet belangrijk, maar kan ook worden gebruikt om te bepalen van de snelheid in theorie.
VOOR i = 1 tot n
PULSIN Pin5, 1, variabele
VOLGENDE
Bepalende richting is een beetje lastiger. Ik heb de stempel wachten totdat het coderingsprogramma een concrete stap in de cyclus zoals 11 bereikt met behulp van een if-instructie in een lus. Zodra de stap is bereikt, ik check om te zien welke stap komt volgende (in dit geval, hetzij 10 of 01) met behulp van een paar als verklaringen in een andere lus. Afhankelijk van welke stap daarna komt, kunt u bepalen welke kant de motor draait.
Het is ook mogelijk met behulp van deze methode te passief meten de absolute verschuiving van de motor. Één richting draaien zal toevoegen aan de verplaatsing, terwijl de andere richting draaien wordt afgetrokken. Op deze manier, als u beginnen bij 0, schakelt de motor een bepaalde hoek en het terug, u moet teruggaan naar 0 in plaats van de afgelegde afstand. Deze code controleert richting eenmaal per cyclus en vervolgens toegevoegd of afgetrokken 1 van verplaatsing dienovereenkomstig. Het werkt op gematigde toerentallen, maar niet op hoge snelheden als gevolg van de stempel de kloksnelheid.
pin5 PIN 1
pin6 PIN 0
DISP VAR Word
LOOP1:
Als pin5 = 1 en pin6 = 1 dan richting ' wachten op 11 encoder stap
GOTO loop1
richting:
Als pin5 = 0 dan cw ' zien welke pin gaat laag eerst om te bepalen van de richting
Als pin6 = 0 dan ccw
GOTO richting
CW:
DISP = disp + 1 ' In dit voorbeeld maakte ik met de klok mee positieve en linksom negatief.
DEBUG? disp
GOTO loop1
CCW:
DISP = disp-1
DEBUG? disp
GOTO loop1
Ik heb geprobeerd voor het schrijven van code om dit te doen op basis van stapsgewijze zodat in plaats van te wachten voor 11 rond te komen, zou het richting bij elke stap voor 4 keer de juistheid controleren. Helaas werkt de stempel niet snel genoeg voor dat. Een snellere microcontroller mogelijk te verwerken. Hier is de code, maar opnieuw het werkt alleen bij zeer lage snelheden.
Eerst, stelt de code vast welke stap het coderingsprogramma begint op en stuurt aan de subroutine die overeenkomt met die stap.
Verplaatsing begint bij 1 als gevolg van een inherente fencepost fout.
Elke subroutine wordt gekeken naar wat de vorige stap was. Als de vorige stap CCW van deze stap was draaide de motor CW en 1 is toegevoegd. Anders CCW is standaard en 1 wordt afgetrokken. (Fencepost fout gebeurt hier maar niet ook belangrijk)
Vervolgens de subroutine wacht op de volgende stap en gaat dan naar de subroutine die overeenkomt met die stap.
Het werkt heel mooi in theorie maar er zijn ook veel opdrachten zijn specifiek voor elke stap dus de BS2 niet overweg kan met het snel genoeg.
een PIN-code 0
b PIN 1
lasta VAR bits
lastb VAR bits
DISP VAR Word
DISP = 1
INPUT een
INGANG b
lasta = een
lastb = b
Als een = 1 dan a1
Als b = 1 dan S01
GOTO S00
a1:
Als b = 1 dan S11
GOTO S10
S01:
DISP = disp-1
IF lasta = 1 en lastb = 1 dan disp disp + 2 =
DEBUG? disp
lasta = 0
lastb = 1
S01Loop:
Als een = 1 en b = 1 dan S11
Als een = 0 en b = 0 dan S00
GOTO S01Loop
S11:
DISP = disp-1
IF lasta = 1 en lastb = 0 dan disp disp + 2 =
DEBUG? disp
lasta = 1
lastb = 1
S11Loop:
Als een = 1 en b = 0 dan S10
Als een = 0 en b = 1 dan S01
GOTO S11Loop
S10:
DISP = disp-1
IF lasta = 0 en lastb = 0 dan disp disp + 2 =
DEBUG? disp
lasta = 1
lastb = 0
S10Loop:
Als een = 1 en b = 1 dan S11
Als een = 0 en b = 0 dan S00
GOTO S10Loop
S00:
DISP = disp-1
IF lasta = 0 en lastb = 1 dan disp disp + 2 =
DEBUG? disp
lasta = 0
lastb = 0
S00Loop:
Als een = 1 en b = 0 dan S10
Als een = 0 en b = 1 dan S01
GOTO S00Loop