Postupno povećavanje i smanjenje stope
Što ovaj primjer prikazuje
Motor se ubrzava, a zatim usporava. Modul nema ugrađenu krivulju ubrzanja, pa primjer stvara jednu na jednostavan način: svaki put malo skraćuje vrijeme odgode između koraka, a zatim ga ponovno produžuje.
Ovdje se koriste samo DIR i STEP. ENABLE, RESET i SLEEP su izostavljeni iz
begin(), stoga moraju biti hardverski spojeni na visoku razinu da bi ova skica
radila: oba imaju interne povlačne otpornike prema masi i inače bi držali upravljač u resetu
i uspavanom stanju.
Brojevi pinova u primjeru, GPIO4 za DIR i GPIO5 za STEP, oboje su izvedeni na pločici NULA DeepSleep ESP32-S3, pa ovaj kôd radi nepromijenjeno.
Kôd primjera
from drv8825 import DRV8825 # Import the DRV8825 motor driver module
from time import sleep # Import sleep function for timing delays
# Define GPIO pins for motor control
DIR_PIN = 4 # GPIO pin used for direction control
STEP_PIN = 5 # GPIO pin used for step pulses
# Create a DRV8825 motor instance
motor = DRV8825()
# Initialize the motor with the specified DIR and STEP pins
motor.begin(DIR=DIR_PIN, STEP=STEP_PIN)
# Set the number of steps the motor takes per full rotation (usually 200 for a 1.8° stepper motor)
motor.setStepsPerRotation(200)
# Set the length of each step pulse in microseconds
motor.setStepPulseLength(1000)
# Set motor rotation direction to clockwise
motor.setDirection(DRV8825.CLOCK_WISE)
# Enable the motor driver (turns on output)
motor.enable()
print("Accelerating")
# Gradually increase the step frequency (i.e., speed up the motor)
accelerationFactor = 1
while accelerationFactor < 2000:
motor.step() # Send a single step pulse to the motor
sleep(
1 / accelerationFactor
) # Delay inversely proportional to the factor (higher = faster)
accelerationFactor += 1 # Increase acceleration factor
print(accelerationFactor) # Print current acceleration factor
# Gradually decrease the step frequency (i.e., slow down the motor)
while accelerationFactor > 1:
motor.step() # Send a single step pulse
sleep(1 / accelerationFactor) # Delay increases as acceleration factor decreases
accelerationFactor -= 1 # Decrease acceleration factor
print(accelerationFactor) # Print current acceleration factor
Očekivani rezultat:
Accelerating
2
3
4
...
2000
1999
1998
...
2
Primjer ispisuje brojčanicu na svakom koraku, tako da je oblik točan: ona raste od 2 do 2000, a zatim se vraća natrag na 2.
Motor započinje gotovo u mirovanju i ubrzava. Prvi korak čeka punu sekundu, a zatim se tempo brzo ubrzava, tako da se veći dio vremena izvođenja provede u prvih nekoliko koraka. Očekujte da će cijelo ubrzanje trajati desetke sekundi, a ne tren.
Ovaj primjer poziva enable() ali nikada ne prosljeđuje pin za omogućavanje begin()-u, pa
taj poziv vraća False i ne radi ništa. To ovdje nije važno: ulaz ENABLE upravljača je aktivan nisko s internim povlačenjem prema dolje, pa nevezani
pin je u niskom stanju i izlazi su ionako omogućeni.
Koristene funkcije
DRV8825()returns DRV8825Stvara objekt upravljača. Sam po sebi ništa ne konfigurira; svaki pin se postavlja pomoću begin().
ReturnsNova instanca upravljača bez dodijeljenih pinova.
Parametri
Ovaj konstruktor ne prima parametre.
begin(DIR, STEP, EN=None, RST=None, SLP=None)returns boolDodjeljuje kontrolne pinove i konfigurira ih kao izlaze. Ovdje se poziva samo s DIR i STEP, što ostavlja EN, RST i SLP neuređene. RESET i SLEEP tada moraju biti u hardveru držani na visokoj razini.
ReturnsIstina kad su pinovi konfigurirani.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | DIR | Broj GPIO-a za pin smjera. |
int | STEP | broj GPIO-a za pin koraka. |
int | EN | broj GPIO-a za pin omogućavanja. Neobavezno, zadano je None. |
int | RST | broj GPIO-a za pin resetiranja. Neobavezno, zadano je None. |
int | SLP | Broj GPIO pinova za pin za spavanje. Neobavezno, zadano je None. |
setStepsPerRotation(steps)returns NoneModulu govori koliko koraka čini jedno puno okretanje, kako bi mogao pratiti položaj unutar okretanja. Motor od 1,8 stupnjeva pri punom koraku ima 200 koraka. To ne mijenja način na koji se motor pogoni.
ReturnsNišta.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | steps | Koraci po punom okretu. |
setStepPulseLength(length)returns NonePostavlja koliko dugo se STEP pin drži visok, a zatim nizak, unutar svakog poziva step(), u mikrosekundama. Ovo je donja granica brzine kojom se motor može koraknuti: pri 1000 mikrosekundi svaki step() zauzima najmanje 2 ms, prije bilo kakvog odgađanja koje dodate.
ReturnsNišta.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | length | Duljina impulsa u mikrosekundama. |
setDirection(direction)returns boolPostavlja smjer pina. Koristite klase konstante DRV8825.CLOCK_WISE i DRV8825.COUNTER_CLOCK_WISE umjesto sirovih brojeva. Svaka druga vrijednost se odbacuje i pin ostaje nepromijenjen. Nazivi konstanti opisuju DIR razinu, a ne zajamčenu smjer osovine, koji ovisi o žičanju vaše zavojnice.
ReturnsIstinito ako je smjer valjan, inače netočno.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | smjer | DRV8825.PO SATU (1) ili DRV8825.PROTIV SATU (0). |
enable()returns boolOmogućuje izlaze upravljača povlačenjem ENABLE pina na nisku razinu. Vraća False ako begin() nije primio pin za omogućavanje.
ReturnsIstina ako je pin omogućen, lažno ako nije konfiguriran pin za omogućavanje.
Parametri
Ova funkcija nema parametara.
step()returns NonePomakne motor za jedan korak: impulsi STEP visoki, zatim niski, čekajući konfiguriranu duljinu impulsa na svakoj razini. Pozivanje u petlji s sve manjom odgodom stvara rampu.
ReturnsNišta.
Parametri
Ova funkcija nema parametara.
getSteps()returns intBroj koraka poduzetih otkako je brojač zadnji put resetiran. Korisno za provjeru koliko je rampu zapravo prešlo.
ReturnsUkupno prebrojanih koraka.
Parametri
Ova funkcija nema parametara.
resetSteps(s=0)returns intResetira brojač koraka i vraća ga u prethodno stanje, pa možete izmjeriti jedan korak bez gubitka prethodnog ukupnog broja.
ReturnsBroj koraka kao što je bio prije resetiranja.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | s | Nova vrijednost za brojač. Neobavezno, zadano je 0. |
Sklapanje
sleep(1 / accelerationFactor) je cijela krivulja ubrzanja. Na početku je faktor 1, pa motor čeka punu sekundu između koraka. Na kraju je 2000 i čekanje je pola milisekunde.
U tom trenutku odgoda više nije ono što određuje brzinu.
setStepPulseLength(1000) drži STEP visok 1 ms i nizak 1 ms unutar svakog
poziva step(), pa bez obzira na to koliko se vrijeme čekanja smanji, korak ne može trajati kraće od otprilike 2 ms. Posljednjih nekoliko stotina iteracija postupnog ubrzavanja jedva se razlikuju jedna od druge. Ako želite da krajnja brzina doista bude velika, skratite duljinu impulsa kao i vrijeme čekanja.
Naglo ubrzavanje je važno kod stepenastih motora. Ako od opterećenog motora zatražite da odjednom prijeđe na punu brzinu, on će preskakati korake, a preskočeni koraci znače da se ne nalazite na poziciji za koju mislite da jeste. Polako kretanje i postepeno ubrzavanje to sprječava.
Ako želite znati koliko je motor priješao, pozovite resetSteps() prije
akceleracije i getSteps() nakon nje.