Skip to main content

Pomaknite određeni broj koraka

Što ovaj primjer prikazuje​

Pomicanje motora na preciznu udaljenost i zaustavljanje, pri čemu biblioteka postupno povećava i smanjuje brzinu kako motor ne bi preskakao korake na oba kraja. Ovo je ono što želite za sve što mora završiti negdje: os, hranitelj, rotirajuća ploča.

Priložena skica koristi BasicStepper stepper;, što glava biblioteke definira kao AccelStepper::FULL4WIRE na pinovima 2, 3, 4 i 5. To izravno pokreće namotaje motora i ne odgovara ovoj ploči. Izradite je s BasicStepper::DRIVER i vaše pinove STEP i DIR, kao što je prikazano u nastavku.

Primjer koda​

Select Board
Blocking.ino
#include <Basic-Stepper-Driver-SOLDERED.h>

#define dirPin 4
#define stepPin 5

BasicStepper stepper(BasicStepper::DRIVER, stepPin, dirPin);

void setup()
{
stepper.setMaxSpeed(200.0);
stepper.setAcceleration(100.0);
}

void loop()
{
stepper.runToNewPosition(0);
stepper.runToNewPosition(500);
stepper.runToNewPosition(100);
stepper.runToNewPosition(120);
}

Očekivani rezultat:

Motor se kreće na poziciju 500, natrag na 100, naprijed na 120, zatim se vraća na 0 i ponavlja. Svaki se pokret ubrzava pri odlasku i usporava pri dolasku u odredište. Na Motor od 200 koraka u punom koraku, 500 koraka je dva i pol okretaja.

Nema serijskog izlaza. runToNewPosition() blokira dok se svaki pokret ne završi, pa ništa drugo ne može raditi dok se motor kreće.

Izvođenje bez blokiranja​

runToNewPosition() je praktična i potpuno neprimjerena za skicu koja također mora čitati senzor ili reagirati na gumb. Neblokirajući oblik postavlja odredište i kreće prema njemu iz loop():

Select Board
Blocking.ino
#include <Basic-Stepper-Driver-SOLDERED.h>

#define dirPin 4
#define stepPin 5

BasicStepper stepper(BasicStepper::DRIVER, stepPin, dirPin);

void setup()
{
stepper.setMaxSpeed(1000);
stepper.setAcceleration(50);
}

void loop()
{
stepper.move(100);
while (stepper.run()) {}
delay(2000);
stepper.move(50);
while (stepper.run()) {}
delay(2000);
}

move() je relativna, pa na motoru od 200 koraka ovo okreće pola rotacije, čeka dvije sekunde, okreće dodatnu četvrtinu rotacije i ponovno čeka. Zamijenite while petlje običnim pozivom run() za svaki prolaz kroz loop() i skica više neće blokirati.

Ako želite konstانتnu brzinu do pozicije, a ne ubrzanu, moveTo() praćeno funkcijom run() to neće postići: u zaglavlju je napomenuto da moveTo() ponovno izračunava brzinu za sljedeći korak, a run() zatim primjenjuje svoju krivulju ubrzanja na vrhu. Koristite moveTo(), zatim setSpeed(), pa runSpeedToPosition(), koja je dokumentirana kao da radi pri odabranoj brzini i ne implementira nikakva ubrzanja.

Koristene funkcije​

BasicStepper(uint8_t interface, uint8_t pin1, uint8_t pin2)returns None

Konstruira stepper na zadanoj sučelju. Proslijedite BasicStepper::DRIVER za ovu ploču, zatim pin STEP i pin DIR, tim redoslijedom. Naslijeđeno od AccelSteppera, koji također prihvaća još dva pina i oznaku omogućavanja za sučelja s izravnim pogonom.

ReturnsKonstruktorska funkcija; nema povratnu vrijednost.

Parametri

TipNazivOpis
uint8_tinterfaceTip motornog sučelja. BasicStepper::DRIVER (1) za upravljač korak/smjer. Zadano je FULL4WIRE (4).
uint8_tpin1S DRIVER, STEP pin. Zadano je 2.
uint8_tpin2S DRIVER, DIR pin. Zadano je 3.
setMaxSpeed(float speed)returns void

Postavlja najveću brzinu koju motor smije doseći. Ubrzanje se povećava do ove vrijednosti i ne prelazi dalje.

ReturnsNišta.

Parametri

TipNazivOpis
floatspeedMaksimalna brzina u koracima po sekundi.
setAcceleration(float acceleration)returns void

Postavlja koliko brzo motor mijenja brzinu, koristi se i za ubrzavanje i za usporavanje. Za razliku od runSpeed(), ovo ovdje doista vrijedi: run(), runToPosition() i runToNewPosition() svi prate rampu.

ReturnsNišta.

Parametri

TipImeOpis
floatakceleracijaAkceleracija u koracima na kvadrat po sekundi.
runToNewPosition(long position)returns void

Pomiče se prema apsolutnom odredištu s ubrzanjem i usporavanjem te blokira dok motor ne stigne. Jednostavno za korištenje, ali tijekom pomicanja ništa drugo u vašoj skici ne radi, stoga ga držite izvan petlji događaja.

ReturnsNišta. Vraća se kad je motor u položaju.

Parametri

TipNazivOpis
longpositionApsolutna ciljana pozicija u koracima.
move(long relative)returns void

Postavlja cilj na zadani broj koraka od trenutne pozicije motora. Sam po sebi ništa ne pomiče; run() izvršava pomicanje. Negativan broj označava pomicanje suprotno smjeru kazaljki na satu od trenutne pozicije.

ReturnsNišta.

Parametri

TipNazivOpis
longrelativnaCiljani pomak u koracima od trenutne pozicije.
moveTo(long absolute)returns void

Postavlja apsolutnu ciljanu poziciju, računatu od mjesta gdje je motor započeo. Također preračunava brzinu za sljedeći korak, zbog čega kod pomaka konstantnom brzinom treba ponovno pozvati setSpeed().

ReturnsNišta.

Parametri

TipNazivOpis
longapsolutnaApsolutna ciljana pozicija u koracima. Negativna vrijednost označava smjer suprotan kazaljci na satu od pozicije 0.
run()returns boolean

Pokreće motor najviše jednom, prateći krivulju ubrzanja prema cilju. Mora se pozivati više puta; sve što blokira u funkciji loop() usporava motor.

ReturnsIstina dok motor još putuje prema svom odredištu.

Parametri

Ova funkcija ne prima parametre.

distanceToGo()returns long

Koliko je koraka preostalo do postizanja cilja. Nula znači da je motor stigao, što je uobičajen način da se označi završetak pomaka bez blokiranja na njemu.

ReturnsJoš koraka do cilja. Negativno kada je cilj iza trenutne pozicije.

Parametri

Ova funkcija ne prima parametre.

stop()returns void

Postavlja novu odredišnu točku što je moguće bliže trenutnoj poziciji, koliko to brzina usporavanja dopušta, kako bi motor zaustavio kontrolirano umjesto da izgubi poziciju. Nakon toga pozovite runToPosition() kako biste dovršili zaustavljanje.

ReturnsNišta.

Parametri

Ova funkcija ne prima parametre.

Sklapanje​

Postavite brzinu i ubrzanje jednom, zatim odaberite poziv koji odgovara razini kontrole koju trebate. runToNewPosition() za brzu skicu gdje je blokiranje u redu. move() ili moveTo() plus run() u loop() kada druge stvari moraju nastaviti raditi. distanceToGo() == 0 da biste primijetili da je pomak završen, i stop() kada trebate prekinuti pomak bez gubitka praćenja položaja motora.

Postupno ubrzavanje je svrha svega ovoga. Koračni motor kojemu se naloži da odjednom dosegne brzinu pod opterećenjem preskače korake, a preskočen korak znači da položaj za koji biblioteka misli da se nalazi više nije položaj u kojem se osovina zaista nalazi. Ne postoji povratna sprega koja bi to otkrila, pa ostaje u pogrešnom položaju sve dok ga ponovno ne centrirate.

Varijacije u biblioteci​

Još četiri priložene skice izvršavaju pomake položaja na isti način, sa istim ograničenjem konstruktora. Vrijedi ih pročitati zbog obrazaca, a ne zbog ishoda: