Dva motora, jedan kontroler
Što ovaj primjer prikazuje
Dva steper motora koja rade s jednim kontrolerom, svaki sa svojom DRV8825 pločicom. Oba motora se kreću prema ciljanoj poziciji, a kada stignu, okreću se u suprotnom smjeru kako bi je ogledalo, te se tako kreću naprijed-natrag u nedogled. Ubrzanje je riješeno za vas: motori se postupno ubrzavaju i usporavaju pri približavanju cilju, umjesto da naglo kreću i zaustavljaju se.
Trebate dvije takve ploče, po jednu za svaki motor, i četiri pin-a kontrolera.
Unatoč nazivu svoje datoteke, DualMotorShield.ino ne koristi motorni štit. On stvara dva primjerka klase BasicStepper na sučelju DRIVER, što je upravo način na koji se upravlja ovim pločicom.
Primjer koda
Četiri broja pinova su dodjela NULA DeepSleep ESP32-S3. Priloženi skica koristi 2, 3, 6 i 7, što je numeracija Arduino Una; ostatak je nepromijenjen.
#include "Basic-Stepper-Driver-SOLDERED.h"
// The X Stepper pins
#define STEPPER1_DIR_PIN 4
#define STEPPER1_STEP_PIN 5
// The Y stepper pins
#define STEPPER2_DIR_PIN 6
#define STEPPER2_STEP_PIN 7
// Define some steppers and the pins the will use
BasicStepper stepper1(BasicStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);
BasicStepper stepper2(BasicStepper::DRIVER, STEPPER2_STEP_PIN, STEPPER2_DIR_PIN);
void setup()
{
stepper1.setMaxSpeed(200.0);
stepper1.setAcceleration(200.0);
stepper1.moveTo(100);
stepper2.setMaxSpeed(100.0);
stepper2.setAcceleration(100.0);
stepper2.moveTo(100);
}
void loop()
{
// Change direction at the limits
if (stepper1.distanceToGo() == 0)
stepper1.moveTo(-stepper1.currentPosition());
if (stepper2.distanceToGo() == 0)
stepper2.moveTo(-stepper2.currentPosition());
stepper1.run();
stepper2.run();
}
Očekivani rezultat:
Oba motora se pomiču na položaj 100, zatim se vraćaju na -100, pa opet natrag, i tako neprestano. Svaki se pokret ubrzava i usporava pri zaustavljanju. Prvi motor radi brzinom do 200 koraka u sekundi, a drugi do 100, pa mu je vidljivo potrebno otprilike dvostruko više vremena da prijeđe istu udaljenost i motori gube sinkronizaciju.
Nema serijskog izlaza.
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.
ReturnsKonstruktor; nema povratne vrijednosti.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | interface | Tip motornog sučelja. BasicStepper::DRIVER (1) za upravljač koraka/smjera. Zadano je FULL4WIRE (4). |
uint8_t | pin1 | S DRIVER, pin STEP. 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 voidOdređuje koliko brzo motor mijenja brzinu, koristi se i za ubrzavanje i za usporavanje. To omogućuje motoru da se nježno smjesti u ciljanu poziciju umjesto da naglo stane.
ReturnsNišta.
Parametri
| Tip | Ime | Opis |
|---|---|---|
float | akceleracija | Akceleracija u koracima na sekundu u kvadratu. |
moveTo(long absolute)returns voidPostavlja apsolutnu ciljanu poziciju u koracima. Ne pomiče motor samostalno; run() izvršava pomicanje u koracima. Pozivanje s negativnom vrijednošću trenutačne pozicije, kao u ovom primjeru, vraća motor istim putem kojim je došao.
ReturnsNišta.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
long | absolute | Ciljana pozicija u koracima, relativno u odnosu na početnu poziciju motora. |
distanceToGo()returns longKoliko koraka ostaje prije nego što se dostigne ciljana pozicija. Nula znači da je motor stigao, što ovom primjeru omogućuje da zna kada se treba preokrenuti.
ReturnsJoš koraka do cilja. Negativno kada je cilj iza trenutne pozicije.
Parametri
Ova funkcija nema parametara.
currentPosition()returns longPozicija motora u koracima, brojena od početka.
ReturnsTrenutni položaj u koracima.
Parametri
Ova funkcija nema parametara.
run()returns booleanPokreće motor najviše jednom, primjenjujući krivulju ubrzanja. Mora se pozivati iznova i iznova da bi se motor nastavio pomicati, zbog čega se nalazi u funkciji loop() bez ikakvih blokada.
ReturnsIstina dok motor još putuje prema svom odredištu.
Parametri
Ova funkcija nema parametara.
Sklapanje
Šablona je ista za jedan ili više motora. Konfigurirajte brzinu i
ubrzanje jednom u setup(), postavite cilj, a zatim pozovite run() pri svakom
prolasku kroz loop(). Budući da se run() izvršava najviše jednom po pozivu, sve što blokira, poput delay() ili sporog očitavanja senzora, zaustavlja motor. Držite loop() brzim i dopustite da distanceToGo() kaže kada je kretanje završeno.
Oba pogona trebaju vlastitu ploču, vlastito napajanje za motor i vlastito podešavanje ograničenja struje na trimeru. Mogu dijeliti uzemljenje kontrolera.