Trinnmotor
Beskriving
Trinnmotorar har eit unikt design som gjer at dei kan styrast svært nøyaktig utan nokre tilbakemeldingsmekanismar frå motoren.

Funksjonsmåte
Akselen i ein trinnmotor er kopla til ein rotor med magnetar. Dei kan vere magnetiske polar eller permanente magnetar. Rotoren blir styrt av elektromagnetiske spolar i statoren som blir aktiverte i ei bestemd rekkefølge. Då blir det danna magnetfelt som trekker rotoren framover eller bakover i små, nøyaktige trinn (såkalla indeksar).
Rotasjonsretninga blir bestemd av rekkefølga spolane blir aktiverte i. Ved å endre på rekkefølga kan vi få motoren til å rotere anten med eller mot klokka.
Indeksering
Kor mange ulike stopp-posisjonar (indeksar) ein trinnmotor kan ha, varierer. Vanlegvis har trinnmotorar 200 stopp-posisjonar, og vi seier då at motoren har ei indeksering på 200. Med 200 stopp-posisjonar kan vi styre motoren med ei nøyaktigheit på 1,8 gradar av ein sirkel.
Det finst motorar og styringsmodular som kan ha inntil 1600 stopp-posisjonar per omdreiing. Då kan vi styre motoren i trinn på 0,225 gradar.
Unipolare og bipolare trinnmotorar
Det finst to typar trinnmotorar, unipolare og bipolare. Ein unipolar trinnmotor har éin magnetspole på kvart kontaktpunkt, mens ein bipolar trinnmotor har to spolar på kvart kontaktpunkt.

Det er veldig viktig at vi veit kva type trinnmotor vi jobbar med, for dei to motortypane må koplast opp med ulike IC-modular eller motorstyringsskjold.
Val av trinnmotor avheng av fleire forhold. For det første må vi ta omsyn til krava til dreiemoment og presisjon. I tillegg er kostnader og kompleksiteten til systemet faktorer vi må ta omsyn til.
Unipolare trinnmotorar kan passe til enklare applikasjonar der låg kostnad og enklare kretsløysingar er viktige. Bipolare trinnmotorar er betre eigna for applikasjonar som krev høgare presisjon og dreiemoment. Her kan det vere nødvendig med meir avansert elektronikk og kabling.
Bruksområde
Trinnmotorar har eit breitt bruksområde. Vi finn dei i 3D-printerar, på CNC-styrte maskiner, robotar, cd- og dvd-spelarar og på nesten alt elektronisk utstyr som treng kontrollerte, svært nøyaktige rørsler.

Denne trinnmotoren er kopla til ein kuleskrue som skal styre ein laserskjerar. Veit du om det finst slike komponentar på andre maskiner på verkstaden?
Kopling
Når vi koplar opp ein trinnmotor, treng vi vanlegvis ei ekstern straumforsyning som kan drive motoren. Desse motorane er kraftige og treng større straumstyrke enn det eit arduinokort kan levere. Vi må òg bruke ein IC-modul (dvs. ei styringsbrikke i koplinga) for å indeksere rørsla på motoren.
Både unipolare og bipolare motorar blir styrte med dei digitale pinnane 8, 9, 10 og 11. Forskjellen ligg i IC-modulen eller motorskjoldet vi må bruke for å kontrollere motoren. Bruker vi ein unipolar motor, kan vi til dømes kople ei L293D-brikke til Arduinoen, bruker vi ein bipolar motor, passar til dømes ein SN754410NE H-bridge.
Det finst òg spesialbygde skjold eller utvidingsmodular for å kontrollere trinnmotorar som kan koplast direkte på Arduinoen. Bruker vi slike skjold, treng vi ikkje nokon IC-modul på koplingsbrettet. I illustrasjonen under er Arduinoen kopla til ein unipolar trinnmotor gjennom IC-modulen L293D:

Koplingsskjema
Nedanfor ser du eit enkelt koplingsskjema for oppkopling av ein trinnmotor. Arduinoen er merkt med U1, IC-modulen er merkt med U2 og motoren er merkt med M1. IC-modulen er kopla til dei digitale utgangane D8 til D11. Kjenner du igjen symbolet for batteri?

Programmering
Programmering av ein trinnmotor krev at vi hentar inn eit førehandsdefinert bibliotek som styrer trinnmotoren. Dette biblioteket heiter "Stepper.h".
Vi kan bruke dei fleste programma på begge typar motorar. I dømeprogrammet under fortel vi Arduinoen at motoren har ei indeksering på 200 punkt.
Dømeprogrammet roterer ein trinnmotor med 11 o/min (omdreiingar i minuttet). Vi bestemmer farten ved å justere verdien setSpeed, som indikerer kor lang pause motoren skal ta mellom kvart trinn han beveger seg.
#include <Stepper.h>:
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount = 0;
void setup() {}
void loop() {
int sensorReading = analogRead(A0);
int motorSpeed = map(sensorReading, 0, 1023, 0, 250);
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
myStepper.step(stepsPerRevolution / 100);
}
}