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
#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():
#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 NoneKonstruira 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
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | interface | Tip motornog sučelja. BasicStepper::DRIVER (1) za upravljač korak/smjer. Zadano je FULL4WIRE (4). |
uint8_t | pin1 | S DRIVER, STEP pin. Zadano je 2. |
uint8_t | pin2 | S DRIVER, DIR pin. Zadano je 3. |
setMaxSpeed(float speed)returns voidPostavlja najveću brzinu koju motor smije doseći. Ubrzanje se povećava do ove vrijednosti i ne prelazi dalje.
ReturnsNišta.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
float | speed | Maksimalna brzina u koracima po sekundi. |
setAcceleration(float acceleration)returns voidPostavlja 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
| Tip | Ime | Opis |
|---|---|---|
float | akceleracija | Akceleracija u koracima na kvadrat po sekundi. |
runToNewPosition(long position)returns voidPomič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
| Tip | Naziv | Opis |
|---|---|---|
long | position | Apsolutna ciljana pozicija u koracima. |
move(long relative)returns voidPostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
long | relativna | Ciljani pomak u koracima od trenutne pozicije. |
moveTo(long absolute)returns voidPostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
long | apsolutna | Apsolutna ciljana pozicija u koracima. Negativna vrijednost označava smjer suprotan kazaljci na satu od pozicije 0. |
run()returns booleanPokreć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 longKoliko 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 voidPostavlja 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: