Articles

Sådan styres en stepper motor med A4988 driver og Arduino

Denne artikel indeholder alt hvad du behøver at vide om styring af en stepper motor med A4988 stepper motor driver og Arduino. Jeg har inkluderet et ledningsdiagram, en tutorial om, hvordan du indstiller den aktuelle grænse og mange eksempelkoder.

selvom du kan bruge denne driver uden et Arduino-bibliotek, anbefaler jeg stærkt, at du også kigger på eksempelkoden til AccelStepper-biblioteket i slutningen af denne tutorial. Dette bibliotek er ret nemt at bruge og kan i høj grad forbedre dit udstyrs ydeevne.

efter hvert eksempel bryder jeg ned og forklarer, hvordan koden fungerer, så du skal ikke have problemer med at ændre den, så den passer til dine behov.

Hvis du gerne vil lære mere om andre stepmotordrivere, kan artiklerne nedenfor være nyttige:

  • How to control a stepper motor with DRV8825 driver and Arduino
  • 28BYJ-48 Stepper Motor with ULN2003 Driver and Arduino Tutorial
  • How to control a Stepper Motor with Arduino Motor Shield Rev3
  • TB6600 Stepper Motor Driver with Arduino Tutorial

Supplies

Hardware components

A4988 stepper motor driver × 1 Amazon
AliExpress
NEMA 17 stepper motor × 1 Amazon
Arduino Uno Rev3 × 1 Amazon
Power supply (8-35 V) × 1 Amazon
AliExpress
Breadboard × 1 Amazon
Capacitor (100 µF) × 1 Amazon
Jumper wires ~ 10 Amazon
AliExpress
USB cable type A/B × 1

Jeg kan godt lide at bruge denne driver i kombination med et CNC-skjold eller udvidelseskort. Et sådant skjold indeholder allerede kondensatorer og giver en nem måde at vælge mikrostepping-opløsningen på. Det gør ledninger meget lettere og er en god mulighed, hvis du har brug for en mere permanent løsning end et brødbræt.

Tools

Small screwdriver Amazon
Multimeter Amazon
Alligator test leads (optional) Amazon

Software

Arduino IDE

Makerguides.com er en deltager i Services LLC Associates Program, en affiliate reklame program designet til at give et middel til steder at tjene reklame gebyrer ved reklame og linker til produkter på Amazon.com.

om driveren

i hjertet af A4988-driveren finder du en chip lavet af Allegro MicroSystems: A4988 Dmos Microstepping Driver med Oversætter og Overstrømsbeskyttelse. Denne integrerede motordriver gør interface med en mikrocontroller super let, da du kun har brug for to stifter til at kontrollere både hastigheden og retningen på trinmotoren.

driveren har en maksimal udgangseffekt på 35 V og 2 A, hvilket er fantastisk til at køre små til mellemstore stepmotorer som en NEMA 17 bipolær stepmotor.

Hvis du har brug for at styre større stepmotorer som NEMA 23, skal du kigge på TB6600 stepper motor driver. Denne driver kan bruges med samme kode som A4988 og har en nuværende rating på 3,5 A.

  • TB6600 Stepper Motor Driver med Arduino Tutorial

A4988 driver chip har flere sikkerhedsfunktioner indbygget som overstrøm, kortslutning, underspænding lockout og over-temperatur beskyttelse. Du kan finde flere specifikationer i nedenstående tabel.

A4988 Specifications

Minimum operating voltage 8 V
Maximum operating voltage 35 V
Continuous current per phase 1 A
Maximum current per phase 2 A
Minimum logic voltage 3 V
Maximum logic voltage 5.5 V
Microstep resolution full, 1/2, 1/4, 1/8 and 1/16
Reverse voltage protection? Nej
dimensioner 15.5-20.5 mm (0.6″ – 0.8″)
omkostninger Tjek pris

for mere information kan du tjekke databladet her.

forskelle mellem A4988 og DRV8825

DRV8825 ligner meget A4988, men der er nogle vigtige forskelle:

  • DRV8825 tilbyder 1/32 mikrostepping, mens A4988 kun går ned til 1/16-trin. Højere mikrostepping resulterer i glattere, mere støjsvage drift, men er ikke altid nødvendig.
  • det aktuelle grænsepotentiometer er på et andet sted
  • forholdet mellem referencespændingen og den aktuelle grænse er anderledes.
  • DRV8825 kræver en minimum TRINPULSVARIGHED på 1,9 liter; A4988 kræver minimum 1 liter.
  • DRV8825 kan bruges med en højere spænding motor strømforsyning (45 V vs 35 V). Det betyder, at det er mindre modtagelige for skader fra LC spænding pigge.DRV8825 kan levere lidt mere strøm end A4988 uden yderligere afkøling.

Bemærk, at pinout af DRV8825 er nøjagtig den samme som for A4988, så den kan bruges som en drop-in erstatning!

A4899 (venstre) vs DRV8825 (højre)

Microstep settings

stepmotorer har typisk en trinstørrelse på 1,8 liter eller 200 trin pr. En microstepping-driver som A4988 tillader højere opløsninger ved at tillade mellemliggende trinplaceringer. Dette opnås ved at aktivere spolerne med mellemliggende strømniveauer.

for eksempel vil Kørsel af en motor i kvart-trin-tilstand give 200-trin-per-revolution-motoren 800 mikrotrin pr.

A4988 pinout

opløsningen (trinstørrelse) vælgerstifter (MS1, MS2 og MS3) giver dig mulighed for vælg en af de fem trinopløsninger i henhold til nedenstående tabel.

MS1 MS2 MS3 Microstep resolution
Low Low Low Full step
High Low Low 1/2 step
Low High Low 1/4 step
High High Low 1/8 step
High High High 1/16 step

alle tre indgange har interne 100 k liter nedtrækningsmodstande, så de tre mikrostep-valgstifter afbrydes resulterer i fuldtrinstilstand.

Jeg bruger ofte et CNC-skjold eller udvidelseskort i kombination med disse drivere. Udvidelseskortet har 3 dip-kontakter til at indstille MS1 – MS3 højt eller lavt, og på CNC-skjoldet kan du installere jumpere. Hvis du bruger driveren med et brødbræt, kan du bare bruge jumperledninger til at forbinde vælgerstifterne til 5 V (dvs.gøre dem høje).

ledningsføring – tilslutning A4988 til Arduino og stepmotor

ledningsdiagram / skematisk for A4988 stepmotor driver med Arduino og stepmotor.

ledningsdiagrammet/skematisk ovenfor viser dig, hvordan du tilslutter a4899-driveren til en trinmotor og Arduino.

forbindelserne er også angivet i følgende tabel:

A4988 Connections

A4988 Connection
VMOT 8-35V
GND Motor ground
SLP RESET
RST SLP
VDD 5V
GND Logic ground
STP Pin 3
DIR Pin 2
1A, 1B, 2A, 2B Stepper motor
  • motorens strømforsyning er tilsluttet GND og VMOT (øverst til højre).
  • de to spoler på stepmotoren er forbundet til 1A, 1b og 2a, 2b (se nedenfor).
  • GND-stiften (nederst til højre) er forbundet til mikrocontrollerens jordstift, og VDD er forbundet til 5V.
  • STP (trin) og DIR (retning) stiften er forbundet til henholdsvis digital pin 3 og 2. Du kan vælge en anden digital pin-kode, hvis du vil, men det er dem, jeg brugte til denne tutorial og eksempelkoden.
  • SLP-stiften er en aktiv lav indgang. Betydning, at trække denne stift lavt sætter føreren i dvaletilstand, hvilket minimerer strømforbruget. RST er også et aktivt lavt input. Når du trækker lavt, ignoreres alle TRININDGANGE, indtil du trækker det højt. Hvis du ikke bruger pin-koden, kan du slutte den til den tilstødende SLP/SLEEP-pin for at bringe den høj og aktivere driveren.
  • en (enable) pin-koden kan efterlades frakoblet, den trækkes som standard lavt. Når denne pinkode er indstillet højt, er driveren deaktiveret.

i resten af denne tutorial har jeg forladt MS1, MS2 og MS3 afbrudt, så føreren opererer i fuldtrinstilstand. Dette gør det lettere at forklare koden. Normalt ville jeg bruge 1/8 eller 1/16 microstepping og forbinde de relevante stifter til 5V (se tabellen i indledningen).

advarsel

A4988-bærerkortet bruger keramiske kondensatorer med lav ESR, hvilket gør det modtageligt for destruktive LC-spændingsspidser, især når du bruger strømledninger længere end et par centimeter.

for at beskytte driveren kan du tilslutte en elektrolytkondensator mellem vmot og GND. Pololu foreslår en kondensator på 47 liter eller mere (jeg brugte en 100 liter kondensator). På denne måde har jeg altid nogle kondensatorer i den rigtige størrelse ved hånden.

hvordan til at bestemme den korrekte stepmotor ledninger?

Hvis du ikke kan finde databladet for din stepmotor, kan det være svært at finde ud af, hvordan du tilslutter din motor korrekt. Jeg bruger følgende trick til at bestemme, hvordan man tilslutter 4-trådede bipolære trinmotorer:

det eneste du skal identificere er de to par ledninger, der er forbundet til motorens to spoler. Ledningerne fra den ene spole bliver forbundet til 1A og 1b og den anden til 2a og 2b, polariteten betyder ikke noget.

for at finde de to ledninger fra en spole skal du gøre følgende med motoren frakoblet:

  1. prøv at dreje trinmotorens aksel manuelt og læg mærke til, hvor svært det er at dreje.
  2. Vælg nu et tilfældigt par ledninger fra motoren og rør de bare ender sammen.
  3. prøv derefter at dreje trinmotorens aksel igen.

Hvis du føler meget modstand, har du fundet et par ledninger fra samme spole. Hvis du kan dreje akslen frit, kan du prøve et andet par ledninger. Tilslut nu de to spoler til stifterne vist i ledningsdiagrammet ovenfor.

(Hvis det stadig er uklart, bedes du skrive en kommentar nedenfor, Mere info kan også findes på RepRap.org

Sådan indstilles den aktuelle grænse?

før du begynder at programmere din Arduino og begynde at bruge driveren, er der en meget vigtig ting, du skal gøre, som mange mennesker glemmer: indstil den aktuelle grænse!

dette trin er ikke meget kompliceret, men absolut nødvendigt for at beskytte din stepmotor og føreren. Hvis du ikke indstiller en passende strømgrænse, kan din motor trække mere strøm, end den eller din chauffør kan håndtere, dette vil sandsynligvis skade en eller begge af dem.

for at indstille den aktuelle grænse skal du måle en referencespænding og justere det indbyggede potentiometer i overensstemmelse hermed. Du skal bruge en lille skruetrækker, et multimeter til at måle referencespændingen og alligator testledninger (valgfri men meget praktisk).

nuværende grænse ledningsdiagram for A4988 driver.

for at måle referencespændingen skal føreren være tændt. A4988 har kun brug for strøm via VDD (5V), og du skal forbinde RST og SLP sammen, ellers vil føreren ikke tænde. Det er bedst at afbryde trinmotoren, mens du gør dette.

Hvis du allerede har tilsluttet driveren, kan du lade alt andet end trinmotoren være tilsluttet. Du kan anvende strøm via USB-porten på Arduino.

A4988 Connection
VDD 5V
RST SLP
SLP RESET
GND Ground
Required connections to set the current limit

Current limit formula

The next step is to calculate the current limit with the following formel:

Current Limit = VREF liter (8 liter RCS)

Rcs er den nuværende sansemodstand. Hvis du har købt en A4988-driver fra Pololu inden januar 2017,vil Rcs være 0,050. Drivere, der sælges efter det, har 0,068 liter nuværende sense modstande.

så det betyder, at for en nuværende grænse på 1a for et bord med 0,068 liter nuværende sense modstande, skal Vref være 540 mV.

nuværende sense modstand placeringer. Billede: Hr.pololu.com

for at vælge den rigtige strømgrænse skal du kigge på databladet for din trinmotor. Hvis du ikke kan finde den aktuelle vurdering af din motor, anbefaler jeg at starte med en nuværende grænse på 1a. du kan altid øge den senere, hvis din motor/driver mangler trin.

bonusinfo: når du bruger driveren i fuldtrinstilstand, er strømmen gennem hver spole begrænset til cirka 70% af den indstillede strømgrænse. Dette betyder, at du bliver nødt til at indstille den aktuelle grænse 40% højere eller 1,4 a i fuldtrinstilstand. Når du bruger microstepping, gælder formlen ovenfor.

Bemærk, at du skal kalibrere den aktuelle grænse igen, hvis du ændrer motorens strømforsyningsspænding. Hvis din motor laver meget støj, skal du prøve at sænke den aktuelle grænse. Det er bedst at indstille den aktuelle grænse lige høj nok, så motoren ikke går glip af trin.

måling af Vref

nu skal du måle referencespændingen (Vref) mellem de to punkter markeret på billedet nedenfor (GND og potentiometeret) og justere det til den værdi, du har beregnet.

Vref probe punkter (GND og potentiometer).

Jeg anbefaler at bruge alligator testledninger fastspændt til skruetrækkeren for at indstille den aktuelle grænse. Dette giver dig mulighed for at justere potentiometeret og måle referencespændingen på samme tid.

Bemærk: Der er en anden måde at måle den aktuelle grænse på, og det er direkte at måle trinmotorens aktuelle træk. Personligt finder jeg ovenstående metode meget lettere.

Pololu nævner følgende på deres hjemmeside:

Bemærk: spolestrømmen kan være meget forskellig fra strømforsyningsstrømmen, så du bør ikke bruge strømmen målt ved strømforsyningen til at indstille den aktuelle grænse. Det rette sted at placere din nuværende måler er i serie med en af dine trinmotorspoler.

Pololu

aktuelle grænse ofte stillede spørgsmål

skal jeg have trinmotoren tilsluttet eller ej?
Nej, du behøver ikke at tilslutte stepmotoren til driveren, når du indstiller den aktuelle grænse. For at være på den sikre side skal du frakoble din motor, det forstyrrer undertiden måling af VREF-spændingen.

skal jeg dreje motoren ved at køre Arduino motor sketch?
Nej, Se spørgsmål ovenfor.

skal jeg dreje potentiometeruret – eller mod uret for at hæve Vref?
dette afhænger af producenten af føreren. Hvis du har et ægte Polulu breakout-bord på DRV8825 eller A4988, drejer du potentiometeret med uret for at hæve Vref og mod uret for at sænke det.

køling af driveren

A4988 driver IC har en maksimal strømstyrke på 2 A pr.

driveren leveres normalt med en lille selvklæbende køleplade, som jeg anbefaler dig at installere med det samme. Du kan også købe en masse små kølelegemer fra til virkelig billig.

grundlæggende Arduino-eksempelkode for at styre en trinmotor

nu hvor du har tilsluttet driveren og indstillet den aktuelle grænse, er det tid til at forbinde Arduino til computeren og uploade noget kode. Du kan uploade følgende eksempelkode til din Arduino ved hjælp af Arduino IDE. I dette specifikke eksempel behøver du ikke installere nogen biblioteker.

denne skitse styrer både hastigheden, antallet af omdrejninger og trinmotorens drejningsretning.

Du kan kopiere koden ved at klikke på knappen i øverste højre hjørne af kodefeltet.

Sådan fungerer koden:

skitsen starter med at definere trin-og retningsstifterne. Jeg tilsluttede dem til Arduino pin 3 og 2.

udsagnet#define bruges til at give et navn til en konstant værdi. Kompilatoren erstatter alle henvisninger til denne konstant med den definerede værdi, når programmet kompileres. Så overalt du nævner dirPin, vil kompilatoren erstatte den med værdien 2, Når programmet er kompileret.

jeg definerede også enstepsPerRevolution konstant. Fordi jeg satte driveren i fuld trintilstand, satte jeg den til 200 trin pr. Skift denne værdi, hvis din opsætning er anderledes.

// Define stepper motor connections and steps per revolution:#define dirPin 2#define stepPin 3#define stepsPerRevolution 200

isetup() sektionen af koden erklæres alle motorstyringsstifter som digital udgang med funktionenpinMode().

void setup() { // Declare pins as output: pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT);}

iloop() sektionen af koden lader vi motoren dreje en revolution langsomt i CV-retningen og en revolution hurtigt i CCV-retningen. Dernæst lader vi motoren dreje 5 omdrejninger i hver retning med høj hastighed. Så hvordan styrer du hastigheden, spinningsretningen og antallet af omdrejninger?

kontrol spinning retning:

for at styre spinning retning af stepmotor vi indstille DIR (retning) pin enten høj eller lav. Til dette bruger vi funktionen digitalWrite(). Afhængigt af hvordan du tilsluttede trinmotoren, indstilling af DIR-stiften høj lader motoren dreje VV eller VVV.

kontrol antal trin eller omdrejninger:

i denne eksempelskitse styrer for loops antallet af trin, trinmotoren vil tage. Koden inden for for-sløjfen resulterer i 1 trin af trinmotoren. Fordi koden i løkken udføres 200 gange (stepsPerRevolution), resulterer dette i 1 revolution. I de sidste to sløjfer udføres koden inden for for-sløjfen 1000 gange, hvilket resulterer i 1000 trin eller 5 omdrejninger.

Bemærk, at du kan ændre det andet udtryk i for-sløjfen til det antal trin, du ønsker. for(int i = 0; i < 100; i++) ville resultere i 100 trin eller en halv revolution.

Kontrolhastighed:

trinmotorens hastighed bestemmes af frekvensen af de impulser, vi sender til TRINSTIFTEN. Jo højere frekvens, jo hurtigere kører motoren. Du kan styre frekvensen af pulserne ved at ændre delayMicroseconds() i koden. Jo kortere forsinkelse, jo højere frekvens, jo hurtigere kører motoren.

AccelStepper library tutorial

AccelStepper library skrevet af Mike McCauley er et fantastisk bibliotek at bruge til dit projekt. En af fordelene er, at den understøtter acceleration og deceleration, men den har også mange andre gode funktioner.

Du kan hente den nyeste version af dette bibliotek her eller klikke på knappen nedenfor.

Du kan installere biblioteket ved at gå til skitse>Inkluder Bibliotek> Tilføj .I Arduino IDE.

en anden mulighed er at navigere til værktøjer > Administrer biblioteker… eller skriv Ctrl + Shift + I På Vinduer. Biblioteksadministratoren åbner og opdaterer listen over installerede biblioteker.

Du kan søge efter ‘accelstepper’ og kigge efter biblioteket af Mike McCauley. Vælg den nyeste version, og klik derefter på Installer.

kontinuerlig rotation eksempelkode

følgende skitse kan bruges til at køre en eller flere trinmotorer kontinuerligt med konstant hastighed. (Der anvendes ingen acceleration eller deceleration).

Sådan fungerer koden:

det første trin er at inkludere biblioteket med#include <AccelStepper.h>.

// Include the AccelStepper library:#include <AccelStepper.h>

det næste trin er at definere A4988 til Arduino-forbindelserne og motorgrænsefladetypen. Motorgrænsefladetypen skal indstilles til 1, når du bruger en trin-og retningsdriver. Du kan finde de andre interfacetyper her.

udsagnet#define bruges til at give et navn til en konstant værdi. Kompilatoren erstatter alle henvisninger til denne konstant med den definerede værdi, når programmet kompileres. Så overalt du nævner dirPin, vil kompilatoren erstatte den med værdien 2, Når programmet er kompileret.

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:#define dirPin 2#define stepPin 3#define motorInterfaceType 1

Dernæst skal du oprette en ny forekomst af AccelStepper-klassen med den relevante motorgrænsefladetype og forbindelser.

i dette tilfælde kaldte jeg stepmotoren ‘stepper’, men du kan også bruge andre navne, som ‘s_motor’ eller ‘liftmotor’ osv. AccelStepper liftmotor = AccelStepper(motorInterfaceType, stepPin, dirPin);. Det navn, du giver til stepmotoren, bruges senere til at indstille hastighed, position og acceleration for den pågældende motor. Du kan oprette flere forekomster af AccelStepper-klassen med forskellige navne og pins. Dette giver dig mulighed for nemt at styre 2 eller flere trinmotorer på samme tid.

// Create a new instance of the AccelStepper class:AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

isetup() sektionen af koden definerer vi den maksimale hastighed i trin / sekund. Hastigheder på mere end 1000 trin i sekundet kan være upålidelige, så jeg sætter dette som maksimum. Bemærk, at jeg angiver navnet på stepmotoren (‘stepper’), som jeg vil definere den maksimale hastighed for. Hvis du har tilsluttet flere trinmotorer, kan du angive en anden hastighed for hver motor:

void setup() { // Set the maximum speed in steps per second: stepper.setMaxSpeed(1000); stepper2.setMaxSpeed(500);}

i loop() vi indstiller først den hastighed, som vi ønsker, at motoren skal køre ved. Til dette bruger vi funktionen setSpeed(). (du kan også placere dette i afsnittet Opsætning af koden).

stepper.runSpeed() afstemmer motoren, og når et trin skal udføres, udføres 1 trin. Dette afhænger af den indstillede hastighed og tiden siden sidste trin. Hvis du vil ændre motorens retning, kan du indstille en negativ hastighed: stepper.setSpeed(-400); drejer motoren den anden vej.

eksempelkode til styring af antal trin eller omdrejninger

for at lade motoren rotere et bestemt antal trin foretrækker jeg at bruge en Mens loop i kombination medstepper.currentPosition(). Du kan bruge følgende eksempelkode til at lade motoren køre frem og tilbage.

Kodeforklaring:

den første del af koden op til loop() sektionen er nøjagtig den samme som i det foregående eksempel.

i sløjfen bruger jeg en Mens loop i kombination medcurrentPosition() funktionen. Først indstiller jeg trinmotorens aktuelle position til nul med stepper.setCurrentPosition(0).

 // Set the current position to 0: stepper.setCurrentPosition(0);

næste bruger vi Mens loop. Et stykke tid loop vil loop kontinuerligt, og uendeligt, indtil udtrykket inde i parentesen, () bliver falsk. Så i dette tilfælde kontrollerer jeg, om trinmotorens aktuelle position ikke er lig med 400 trin (!= betyder: er ikke lig med). Selvom dette ikke er tilfældet, kører vi trinmotoren med en konstant hastighed som indstillet af setSpeed().

i resten af sløjfen gør vi nøjagtigt det samme, bare med en anden hastighed og målposition.

eksempelkode for Acceleration og deceleration

med følgende skitse kan du tilføje acceleration og deceleration til trinmotorens bevægelser uden nogen kompliceret kodning. I det følgende eksempel kører motoren frem og tilbage med en hastighed på 200 trin i sekundet og en acceleration på 30 trin i sekundet i sekundet.

Kodeforklaring:

i opsætningen () skal vi udover den maksimale hastighed definere accelerationen / decelerationen. Til dette bruger vi funktionen setAcceleration().

void setup() { // Set the maximum speed and acceleration: stepper.setMaxSpeed(200); stepper.setAcceleration(30);}

i loop-sektionen af koden brugte jeg en anden måde at lade motoren rotere et foruddefineret antal trin. Funktionen stepper.moveTo() bruges til at indstille målpositionen. Funktionen stepper.runToPostion() bevæger motoren (med acceleration / deceleration) til målpositionen og blokerer, indtil den er i målpositionen. Da denne funktion blokerer, bør du ikke bruge denne, når du har brug for at kontrollere andre ting på samme tid.

konklusion

i denne artikel har jeg vist dig, hvordan du styrer en trinmotor med A4988 stepper motor driver og Arduino. Jeg håber du fandt det nyttigt og informativt. Hvis du gjorde det, kan du dele det med en ven, der også kan lide elektronik og gøre ting!

Jeg har personligt brugt denne driver meget til en masse 3D-printere og andre CNC-relaterede projekter, men jeg vil meget gerne vide, hvilke projekter du planlægger at bygge (eller allerede har bygget) med denne driver. Hvis du har spørgsmål, forslag, eller hvis du mener, at der mangler ting i denne tutorial, bedes du efterlade en kommentar nedenunder.